U Ph<@sRdZddlmZddlZddlmZddlmZddlm Z ddl m Z ddl m Z mZmZdd d d d d ddgZGddde ZddZedddZedddZedddZedddZedddZedddZedd d!d"d#d$Zed%e jed&d d'd"d(d)Zed*d d+d"d,d-Zed.d/d0Zed1e j ed2e j!ed3e j"ed4e j#ed5e j$j%ed6e j$j&ed7e j$j'ed8e j$j(ed9e j$j)ed:e j$j*ed;e j$j+ede j$j.ed?e j$j/ed@e j$j0edAdBdCZ1edDdEdFZ2edGdHdIZ3edJdKdLZ4edMd dNd"dOdPZ5edQd dRd"dSdTZ6edUd dVd"dWdXZ7edYd dZd"d[d\Z8ed]d d^d"d_d`Z9edad dbd"dcddZ:eded dfd"dgdhZ;edid djd"dkdlZhz0LayerFactory.add_factory_class..)Nr*)rrr,r!rr/radd_factory_classdszLayerFactory.add_factory_class)rrcsdddfdd }|S)zN Decorator for adding a factory function with the given name. r)r rcs||Sr-r2)r rrrr_addos z+LayerFactory.factory_function.._addr)rrr5rr4rfactory_functionjszLayerFactory.factory_functionr) factory_namercGs:t|ts tdt|jdt||j}|j|S)z Get the constructor for the given factory name and arguments. Raises: TypeError: When ``factory_name`` is not a ``str``. zfactory_name must a str but is .) isinstancer TypeErrorr+__name__rr& componentsvalue)rr7args componentrrrget_constructorus zLayerFactory.get_constructor)rcCs:t|r |St|tr"|d}}n|^}}|j|f|S)z Get the given name or name/arguments pair. If `args` is a callable it is assumed to be the constructor itself and is returned, otherwise it should be the factory name or a pair containing the name and arguments. r)callabler9rr@)rr>name_objrrr __getitem__s   zLayerFactory.__getitem__cs||jkr|St|S)z If `key` is a factory name, return it, otherwise behave as inherited. This allows referring to factory names as if they were constants, eg. `Fact.FOO` for a factory Fact with factory function foo. )r<r__getattribute__)rkeyrrr __getattr__s zLayerFactory.__getattr__)N)N) r; __module__ __qualname__rrr*r3r6r@rCrF __classcell__rrrrr Ls  cCsJt|tr|ifS|\}}t|ts,t|r6t|tsBd}t|||fS)a Split arguments in a way to be suitable for using with the factory types. If `args` is a string it's interpreted as the type name. Args: args (str or a tuple of object name and kwarg dict): input arguments to be parsed. Raises: TypeError: When ``args`` type is not in ``Union[str, Tuple[Union[str, Callable], dict]]``. Examples:: >>> act_type, args = split_args("PRELU") >>> monai.networks.layers.Act[act_type] >>> act_type, args = split_args(("PRELU", {"num_parameters": 1, "init": 0.25})) >>> monai.networks.layers.Act[act_type](**args) PReLU(num_parameters=1) z_Layer specifiers must be single strings or pairs of the form (name/object-types, argument dict))r9rrAdictr:)r>rBZ name_argsmsgrrrrs zDropout layersz$Factory for creating dropout layers.)rrzNormalization layersz*Factory for creating normalization layers.zActivation layersz'Factory for creating activation layers.zConvolution layersz(Factory for creating convolution layers.zPooling layersz$Factory for creating pooling layers.zPadding layersz$Factory for creating padding layers.dropoutintz.type[nn.Dropout | nn.Dropout2d | nn.Dropout3d])dimrcCstjtjtjf}||dS)z Dropout layers in 1,2,3 dimensions. Args: dim: desired dimension of the dropout layer Returns: Dropout[dim]d r#)nnr Dropout2d Dropout3drNtypesrrrdropout_factorys rTZ alphadropoutinstancez?type[nn.InstanceNorm1d | nn.InstanceNorm2d | nn.InstanceNorm3d]cCstjtjtjf}||dS)z Instance normalization layers in 1,2,3 dimensions. Args: dim: desired dimension of the instance normalization layer Returns: InstanceNorm[dim]d r#)rOInstanceNorm1dInstanceNorm2dInstanceNorm3drRrrrinstance_factorys rYbatchz6type[nn.BatchNorm1d | nn.BatchNorm2d | nn.BatchNorm3d]cCstjtjtjf}||dS)z Batch normalization layers in 1,2,3 dimensions. Args: dim: desired dimension of the batch normalization layer Returns: BatchNorm[dim]d r#)rO BatchNorm1d BatchNorm2d BatchNorm3drRrrr batch_factorys r^Zinstance_nvfusercCs`|dkr:tjtjf}td||dd||dStsPtdtjStdddd S) a `InstanceNorm3dNVFuser` is a faster version of InstanceNorm layer and implemented in `apex`. It only supports 3d tensors as the input. It also requires to use with CUDA and non-Windows OS. In this function, if the required library `apex.normalization.InstanceNorm3dNVFuser` does not exist, `nn.InstanceNorm3d` will be returned instead. This layer is based on a customized autograd function, which is not supported in TorchScript currently. Please switch to use `nn.InstanceNorm3d` if TorchScript is necessary. Please check the following link for more details about how to install `apex`: https://github.com/NVIDIA/apex#installation z4`InstanceNorm3dNVFuser` only supports 3d cases, use r#z instead.zd`apex.normalization.InstanceNorm3dNVFuser` is not installed properly, use nn.InstanceNorm3d instead.zapex.normalizationInstanceNorm3dNVFuser)rr)rOrVrWwarningswarnrrXrrRrrrinstance_nvfuser_factorys  rcgrouplayerZ localresponseZ syncbatchelureluZ leakyreluprelurelu6selucelugelusigmoidtanhsoftmaxZ logsoftmaxZswishcCsddlm}|S)z= Swish activation layer. Returns: Swish rSwish) monai.networks.blocks.activationrqrprrr swish_factory-s rsZmemswishcCsddlm}|S)z] Memory efficient swish activation layer. Returns: MemoryEfficientSwish rMemoryEfficientSwish)rrrurtrrrmemswish_factory:s rvmishcCsddlm}|S)z; Mish activation layer. Returns: Mish rMish)rrryrxrrr mish_factoryGs rzZgeglucCsddlm}|S)z= GEGLU activation layer. Returns: GEGLU rGEGLU)rrr|r{rrr geglu_factoryTs r}convz'type[nn.Conv1d | nn.Conv2d | nn.Conv3d]cCstjtjtjf}||dS)z Convolutional layers in 1,2,3 dimensions. Args: dim: desired dimension of the convolutional layer Returns: Conv[dim]d r#)rOConv1dConv2dConv3drRrrr conv_factoryas rZ convtranszBtype[nn.ConvTranspose1d | nn.ConvTranspose2d | nn.ConvTranspose3d]cCstjtjtjf}||dS)z Transposed convolutional layers in 1,2,3 dimensions. Args: dim: desired dimension of the transposed convolutional layer Returns: ConvTranspose[dim]d r#)rOConvTranspose1dConvTranspose2dConvTranspose3drRrrrconvtrans_factoryps rmaxz0type[nn.MaxPool1d | nn.MaxPool2d | nn.MaxPool3d]cCstjtjtjf}||dS)z Max pooling layers in 1,2,3 dimensions. Args: dim: desired dimension of the max pooling layer Returns: MaxPool[dim]d r#)rO MaxPool1d MaxPool2d MaxPool3drRrrrmaxpooling_factorys rZ adaptivemaxzHtype[nn.AdaptiveMaxPool1d | nn.AdaptiveMaxPool2d | nn.AdaptiveMaxPool3d]cCstjtjtjf}||dS)z Adaptive max pooling layers in 1,2,3 dimensions. Args: dim: desired dimension of the adaptive max pooling layer Returns: AdaptiveMaxPool[dim]d r#)rOAdaptiveMaxPool1dAdaptiveMaxPool2dAdaptiveMaxPool3drRrrradaptive_maxpooling_factorys ravgz0type[nn.AvgPool1d | nn.AvgPool2d | nn.AvgPool3d]cCstjtjtjf}||dS)z Average pooling layers in 1,2,3 dimensions. Args: dim: desired dimension of the average pooling layer Returns: AvgPool[dim]d r#)rO AvgPool1d AvgPool2d AvgPool3drRrrravgpooling_factorys rZ adaptiveavgzHtype[nn.AdaptiveAvgPool1d | nn.AdaptiveAvgPool2d | nn.AdaptiveAvgPool3d]cCstjtjtjf}||dS)z Adaptive average pooling layers in 1,2,3 dimensions. Args: dim: desired dimension of the adaptive average pooling layer Returns: AdaptiveAvgPool[dim]d r#)rOAdaptiveAvgPool1dAdaptiveAvgPool2dAdaptiveAvgPool3drRrrradaptive_avgpooling_factorys rZreplicationpadzEtype[nn.ReplicationPad1d | nn.ReplicationPad2d | nn.ReplicationPad3d]cCstjtjtjf}||dS)z Replication padding layers in 1,2,3 dimensions. Args: dim: desired dimension of the replication padding layer Returns: ReplicationPad[dim]d r#)rOReplicationPad1dReplicationPad2dReplicationPad3drRrrrreplication_pad_factorys rZ constantpadz s3     W#