
    RЦi                     `    S SK r S SKrS SKJr  S SKJr  S SKJrJrJ	r	  / SQr
S rS rS rS	 rg)
    N)deepcopy)nn)
Conv2dSameBatchNormAct2dLinear)extract_layer	set_layeradapt_model_from_stringadapt_model_from_filec                 P   UR                  S5      nU n[        U S5      (       a  US   S:w  a  U R                  n[        U S5      (       d  US   S:X  a  USS nU HG  n[        X#5      (       a2  UR                  5       (       d  [	        X#5      nM5  U[        U5         nME  Us  $    U$ )zExtract a layer from a model using dot-separated path.

Args:
    model: PyTorch model.
    layer: Dot-separated layer path (e.g., 'layer1.0.conv1').

Returns:
    Extracted module.
.moduler      N)splithasattrr   isdigitgetattrint)modellayerr   ls       Q/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/models/_prune.pyr   r      s     KKEFuhE!H$85(##aH(<ab	699;; +AM  M    c                    UR                  S5      nU n[        U S5      (       a  US   S:w  a  U R                  nSnUnU HI  n[        XV5      (       d  M  UR                  5       (       d  [	        XV5      nOU[        U5         nUS-  nMK     US-  nUSU  H3  nUR                  5       (       d  [	        X65      nM%  U[        U5         nM5     X   n[        X6U5        g)zSet a layer in a model using dot-separated path.

Args:
    model: PyTorch model.
    layer: Dot-separated layer path.
    val: New value for the layer.
r   r   r   r   N)r   r   r   r   r   r   setattr)r   r   valr   	lst_indexmodule2r   s          r   r	   r	   '   s     KKEFuhE!H$8IG799;;!'-!#a&/NI  NI:Iyy{{V'FCF^F	 
 	AFsr   c                    Sn0 nUR                  U5      nU HY  nUR                  S5      nUS   nUS   SS R                  S5      nUS   S:w  d  M;  U Vs/ s H  n[        U5      PM     snX6'   M[     [        U R                  5       5      R                  n	[        U R                  5       5      R
                  n
XS.n[        U 5      nU R                  5        GHr  u  p[        X5      n[        U[        R                  5      (       d  [        U[        5      (       a  [        U[        5      (       a  [        nO[        R                  nX=S	-      nUS   nUS   nSnUR                  S:  a  UnUnU" SUUUR                  UR                  S
LUR                   UR"                  UUR$                  S.UD6n['        XU5        M  [        U[(        5      (       ah  [)        X=S	-      S   4UR*                  UR,                  UR.                  SS.UD6nUR0                  Ul        UR2                  Ul        ['        XU5        GMh  [        U[        R4                  5      (       aQ  [        R4                  " SX=S	-      S   UR*                  UR,                  UR.                  SS.UD6n['        XU5        GM  [        U[        R6                  5      (       d  GM  X=S	-      S   n[7        SUUR8                  UR                  S
LS.UD6n['        XU5        [;        US5      (       d  GMI  [=        USS5      UR>                  :X  a  UUl         UUl        GMu     URC                  5         U RC                  5         U$ s  snf )zAdapt a model to pruned structure from string specification.

Args:
    parent_module: Original model to adapt.
    model_string: String containing layer shapes for pruned model.

Returns:
    Adapted model with pruned layer dimensions.
z***:r   r   , )devicedtypez.weightN)in_channelsout_channelskernel_sizebiaspaddingdilationgroupsstrideT)epsmomentumaffinetrack_running_stats)num_featuresr.   r/   r0   r1   )in_featuresout_featuresr)   r2   head_hidden_size )"r   r   next
parametersr$   r%   r   named_modulesr   
isinstancer   Conv2dr   r,   r(   r)   r*   r+   r-   r	   r   r.   r/   r0   dropactBatchNorm2dr   r4   r   r   r2   r5   eval)parent_modulemodel_string	separator
state_dict	lst_shapekkeyshapeir$   r%   dd
new_modulenm
old_moduleconvsr&   r'   gnew_convnew_bnr2   new_fcs                            r   r
   r
   F   sE    IJ""9-IGGCLd!Qr
  %8r>/45u!s1vu5JO  -**,-44F))+,22E	+B-(J++-"=4
j")),,
:z0R0R*j11!yyy=)AA$KQ4LA  1$* 
')&22__D0"**#,,!((
 
H jX.
N33#y=)!,NN#,,!(($( F %//FK#FJjV,
BNN33^^ 'I6q9NN#,,!(($( F jV,
BII..%)m4Q7L ('44__D0 	F jV,z>22:'91=AXAXX2>J/*6
'{ .~ OOU 6s   M3c                     [         R                  " [        [        R                  R                  SUS-   5      5      n[        XR                  S5      R                  5       5      $ )zAdapt a model to pruned structure from file specification.

Args:
    parent_module: Original model to adapt.
    model_variant: Name of pruned model variant file.

Returns:
    Adapted model with pruned layer dimensions.
_prunedz.txtzutf-8)	pkgutilget_data__name__ospathjoinr
   decodestrip)r@   model_variant
adapt_datas      r   r   r      sJ     !!(BGGLLMTZDZ,[\J"=2C2CG2L2R2R2TUUr   )rY   rV   copyr   torchr   timm.layersr   r   r   __all__r   r	   r
   r   r6   r   r   <module>rd      s3    	    : :
\6>\~Vr   