
    ^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|    YY|,
"fll1o&DQ:-NP Q{# 	6A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@DKK0OPSWScScc## 	#B"	#hh((T5E5EGW)^[])^_#002DO**5;;t7G7GIZIZ+a^`+abDI##FD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    .BGG,,		!=t?O?OQUQbQbdDKK 99 YYt0045F		&))E0((UFe<d>N>NPTP_P_aIdii  !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   WW
1aot{{; 1 1143C3Ct{{3RSVZVfVff-.99 <<;D99Q!2!223D IIaQ1%64T\\t{{Q@C ((64T\\t{{Q@C kk,',,Q0A0A399R=RUR[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 89238:45 ) )  )  sE#s(O34	) 
 #uS#X./)  3c3h45)  CsCx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   