
    RЦi                         S r SSKrSSKJr  SSKJrJr  SSKrSSKJr  SSK	J
r  SSKJr  SS	KJr  SS
KJr  SSKJr  S r\ " S S\R(                  5      5       rg)zPyTorch 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                    ^ ^^ UU U4S jnU$ )Nc                   > [         R                  " T5      n[        U R                  5      S:w  d&  U R                  S   T:w  d  U R                  S   U:w  a  [	        S5      e[        T5       H  nT" X   R                  T5      5        M     g)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      V/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/layers/cond_conv2d.pycondconv_initializer6get_condconv_initializer.<locals>.condconv_initializer   su    YY|,
"fll1o&DQ:-NP Q{#A	|45 $     )r   r   r   r   s   ``` r   get_condconv_initializerr"      s    6  r    c                      ^  \ rS rSrSr/ SQr         SS\S\S\\\\\4   4   S\\\\\4   4   S\\\\\4   \	4   S	\\\\\4   4   S
\S\
S\4U 4S jjjrS rS rSrU =r$ )
CondConv2d$   a>  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                 <  > XS.n[         TU ]  5         Xl        X l        [	        U5      U l        [	        U5      U l        [        XSXFS9u  pXl        [	        U5      U l	        [	        U5      U l
        Xpl        Xl        U R                  U R                  U R                  -  4U R
                  -   U l        SnU R                   H  nUU-  nM
     [        R                  R!                  [        R"                  " U R                  U40 UD65      U l        U(       aa  U R                  4U l        [        R                  R!                  [        R"                  " U R                  U R                  40 UD65      U l        OU R+                  SS 5        U R-                  5         g )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   r0   r1   ddpadding_valis_padding_dynamicweight_num_paramwd	__class__s                    r   r3   CondConv2d.__init__.   sX    /&($[1'*;+D'1 -!(+&!..0@0@DKK0OPSWScScc##B" $hh((T5E5EGW)^[])^_#002DO**5;;t7G7GIZIZ+a^`+abDI##FD1r    c                    [        [        [        R                  R                  [
        R                  " S5      S9U R                  U R                  5      nU" U R                  5        U R                  b  [
        R                  " U R                  SS  5      nS[
        R                  " U5      -  n[        [        [        R                  R                  U* US9U R                  U R                  5      nU" U R                  5        g g )N   )ar   )rE   b)r"   r   r   initkaiming_uniform_r   sqrtr   r4   r   r.   r   uniform_r8   )r;   init_weightfan_inbound	init_biass        r   r:   CondConv2d.reset_parametersY   s    .BGG,,		!=t?O?OQUQbQbdDKK 99 YYt0045F		&))E0((UFe<d>N>NPTP_P_aIdii  !r    c           
      Z   UR                   u  p4pV[        R                  " X R                  5      nX0R                  -  U R
                  U R                  -  4U R                  -   nUR                  U5      nS n	U R                  b=  [        R                  " X R                  5      n	U	R                  X0R                  -  5      n	UR                  SX4-  XV5      nU R                  (       a9  [        XXR                  U R                  U R                  U R                  U-  S9n
OC[         R"                  " XXR                  U R                  U R                  U R                  U-  S9n
U
R%                  / SQ5      R                  X0R                  U
R                   S   U
R                   S   5      n
U
$ )Nr   )r*   r+   r,   r-   )r   r   r      )r   r5   matmulr   r'   r&   r-   r)   r   r.   reshaper(   r   r*   r+   r,   Fconv2dpermute)r;   xrouting_weightsBCHWr   new_weight_shaper.   outs              r   forwardCondConv2d.forwardd   sS   WW
ao{{; 1 1143C3Ct{{3RSVZVfVff-.99 <<;D99Q!2!223D IIa%4T\\t{{Q@C ((4T\\t{{Q@C kk,',,Q0A0A399R=RUR[R[\^R_`& 
r    )r.   r8   r,   r(   r-   r&   r)   r   r'   r+   r*   r   r4   )	rQ   r    r   r   F   NN)__name__
__module____qualname____firstlineno____doc____constants__intr   r   strboolr3   r:   ra   __static_attributes____classcell__)rA   s   @r   r$   r$   $   s     GM 89238:45 ) )  )  sE#s(O34	) 
 #uS#X./)  3c3h45)  CsCx01)  )  )  )  ) V	!' 'r    r$   )ri   r   	functoolsr   typingr   r   r5   r   torch.nnr   rV   _fxr	   helpersr
   r   r+   r   r"   Moduler$   r!   r    r   <module>rv      sQ         $ (  $ &
  f f fr    