Ë
    éÓ^j  ã                   ó¶   — d Z ddlZddlmZ ddlmZmZ ddlZddlmZ ddl	m
Z ddlmZ dd	lmZ dd
lmZ ddlmZ d„ Ze G d„ dej(                  «      «       Zy)zå PyTorch Conditionally Parameterized Convolution (CondConv)

Paper: CondConv: Conditionally Parameterized Convolutions for Efficient Inference
(https://arxiv.org/abs/1904.04971)

Hacked together by / Copyright 2020 Ross Wightman
é    N)Úpartial)ÚUnionÚTuple)Únn)Ú
functionalé   )Úregister_notrace_module)Ú	to_2tuple)Úconv2d_same)Úget_padding_valuec                 ó   ‡ ‡‡— ˆˆ ˆfd„}|S )Nc                 ó  •— t        j                  ‰«      }t        | j                  «      dk7  s$| j                  d   ‰k7  s| j                  d   |k7  rt	        d«      ‚t        ‰«      D ]  } ‰| |   j                  ‰«      «       Œ y)zCondConv initializer function.é   r   r   z<CondConv variables must have shape [num_experts, num_params]N)ÚmathÚprodÚlenÚshapeÚ
ValueErrorÚrangeÚview)ÚweightÚ
num_paramsÚiÚexpert_shapeÚinitializerÚnum_expertss      €€€úb/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/layers/cond_conv2d.pyÚcondconv_initializerz6get_condconv_initializer.<locals>.condconv_initializer   s|   ø€ ä—Y‘Y˜|Ó,ˆ
Ü�—‘Ó Ò" f§l¡l°1¡o¸Ò&DØ—‘˜Q‘ :Ò-ÜØNóPð Qä�{Ó#ò 	6ˆAÙ˜˜q™	Ÿ™ |Ó4Õ5ñ	6ó    © )r   r   r   r   s   ``` r   Úget_condconv_initializerr!      s   ú€ ö6ð  Ðr   c                   óÂ   ‡ — e Zd ZdZg d¢Z	 	 	 	 	 	 	 	 	 ddededeeeeef   f   deeeeef   f   deeeeef   ef   deeeeef   f   d	ed
e	defˆ fd„Z
d„ Zd„ Zˆ xZS )Ú
CondConv2daO   Conditionally Parameterized Convolution
    Inspired by: https://github.com/tensorflow/tpu/blob/master/models/official/efficientnet/condconv/condconv_layers.py

    Grouped convolution hackery for parallel execution of the per-sample kernel filters inspired by this discussion:
    https://github.com/pytorch/pytorch/issues/17983
    )Úin_channelsÚout_channelsÚdynamic_paddingr$   r%   Úkernel_sizeÚstrideÚpaddingÚdilationÚgroupsÚbiasr   c                 óB  •— |
|dœ}t         ‰| �  «        || _        || _        t	        |«      | _        t	        |«      | _        t        ||||¬«      \  }}|| _        t	        |«      | _	        t	        |«      | _
        || _        |	| _        | j                  | j                  | j                  z  f| j
                  z   | _        d}| j                  D ]  }||z  }Œ	 t        j                  j!                  t        j"                  | j                  |fi |¤Ž«      | _        |r`| j                  f| _        t        j                  j!                  t        j"                  | j                  | j                  fi |¤Ž«      | _        n| j+                  dd «       | j-                  «        y )N)ÚdeviceÚdtype)r(   r*   r   r,   )ÚsuperÚ__init__r$   r%   r
   r'   r(   r   r&   r)   r*   r+   r   Úweight_shapeÚtorchr   Ú	ParameterÚemptyr   Ú
bias_shaper,   Úregister_parameterÚreset_parameters)Úselfr$   r%   r'   r(   r)   r*   r+   r,   r   r.   r/   ÚddÚpadding_valÚis_padding_dynamicÚweight_num_paramÚwdÚ	__class__s                    €r   r1   zCondConv2d.__init__.   sp  ø€ ð ¨Ñ/ˆÜ‰ÑÔà&ˆÔØ(ˆÔÜ$ [Ó1ˆÔÜ Ó'ˆŒÜ*;Ø�[¨¸(ô+DÑ'ˆÐ'à1ˆÔÜ  Ó-ˆŒÜ! (Ó+ˆŒØˆŒØ&ˆÔà!×.Ñ.°×0@Ñ0@ÀDÇKÁKÑ0OÐPÐSW×ScÑScÑcˆÔØÐØ×#Ñ#ò 	#ˆBØ Ñ"Ñð	#ä—h‘h×(Ñ(¬¯©°T×5EÑ5EÐGWÑ)^Ð[]Ñ)^Ó_ˆŒáØ#×0Ñ0Ð2ˆDŒOÜŸ™×*Ñ*¬5¯;©;°t×7GÑ7GÈ×IZÑIZÑ+aÐ^`Ñ+aÓbˆD�Ià×#Ñ# F¨DÔ1à×ÑÕr   c                 ó  — t        t        t        j                  j                  t        j                  d«      ¬«      | j                  | j                  «      } || j                  «       | j                  �“t        j                  | j                  dd  «      }dt        j                  |«      z  }t        t        t        j                  j                  | |¬«      | j                  | j                  «      } || j                  «       y y )Né   )Úar   )rB   Úb)r!   r   r   ÚinitÚkaiming_uniform_r   Úsqrtr   r2   r   r,   r   Úuniform_r6   )r9   Úinit_weightÚfan_inÚboundÚ	init_biass        r   r8   zCondConv2d.reset_parametersY   sÃ   € Ü.Ü”B—G‘G×,Ñ,´·	±	¸!³Ô=¸t×?OÑ?OÐQU×QbÑQbódˆá�D—K‘KÔ Ø�9‰9Ð Ü—Y‘Y˜t×0Ñ0°°Ð4Ó5ˆFØœŸ	™	 &Ó)Ñ)ˆEÜ0ÜœŸ™×(Ñ(¨U¨F°eÔ<¸d×>NÑ>NÐPT×P_ÑP_óaˆIá�d—i‘iÕ ð !r   c           
      ón  — |j                   \  }}}}t        j                  || j                  «      }|| j                  z  | j
                  | j                  z  f| j                  z   }|j                  |«      }d }	| j                  �>t        j                  || j                  «      }	|	j                  || j                  z  «      }	|j                  d||z  ||«      }| j                  r>t        |||	| j                  | j                  | j                  | j                  |z  ¬«      }
nGt!        j"                  |||	| j                  | j                  | j                  | j                  |z  ¬«      }
|
j%                  g d¢«      j                  || j                  |
j                   d   |
j                   d   «      }
|
S )Nr   )r(   r)   r*   r+   )r   r   r   é   éþÿÿÿéÿÿÿÿ)r   r3   Úmatmulr   r%   r$   r+   r'   r   r,   Úreshaper&   r   r(   r)   r*   ÚFÚconv2dÚpermute)r9   ÚxÚrouting_weightsÚBÚCÚHÚWr   Únew_weight_shaper,   Úouts              r   ÚforwardzCondConv2d.forwardd   sm  € Ø—W‘W‰
ˆˆ1ˆa�Ü—‘˜o¨t¯{©{Ó;ˆØ × 1Ñ 1Ñ1°4×3CÑ3CÀtÇ{Á{Ñ3RÐSÐVZ×VfÑVfÑfÐØ—‘Ð-Ó.ˆØˆØ�9‰9Ð Ü—<‘< °·±Ó;ˆDØ—9‘9˜Q ×!2Ñ!2Ñ2Ó3ˆDð �I‰I�a˜˜Q™  1Ó%ˆØ×ÒÜØ�6˜4¨¯©¸T¿\¹\ØŸ™¨t¯{©{¸Q©ô@‰Cô —(‘(Ø�6˜4¨¯©¸T¿\¹\ØŸ™¨t¯{©{¸Q©ô@ˆCð �k‰kš,Ó'×,Ñ,¨Q°×0AÑ0AÀ3Ç9Á9ÈRÁ=ÐRU×R[ÑR[Ð\^ÑR_Ó`ˆð& ˆ
r   )	rM   r   Ú r   r   Fé   NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__constants__Úintr   r   ÚstrÚboolr1   r8   r]   Ú__classcell__)r?   s   @r   r#   r#   $   sß   ø„ ñò G€Mð 89Ø23Ø8:Ø45ØØØ ØØñ) àð) ð ð) ð ˜s E¨#¨s¨(¡OÐ3Ñ4ð	) ð
 ˜#˜u S¨# X™Ð.Ñ/ð) ð ˜3  c¨3 h¡°Ð4Ñ5ð) ð ˜C  s¨C x¡Ð0Ñ1ð) ð ð) ð ð) ð õ) òV	!ö'r   r#   )rc   r   Ú	functoolsr   Útypingr   r   r3   r   Útorch.nnr   rR   Ú_fxr	   Úhelpersr
   r   r)   r   r!   ÚModuler#   r    r   r   ú<module>ro      sQ   ðñó Ý ß ã Ý Ý $å (Ý Ý $Ý &ò
 ð ôf�—‘ó fó ñfr   