
    Ng)                     n   d dl Zd dlZd dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
mZmZmZmZ d dlZd dlmZ d dlmZ g dZd)d	ej        d
efdZ	 	 	 d*de	dej        dededej        f
dZ	 	 	 d*dej        dededefdZ	 	 	 d*dej        dededefdZdZ	 	 d+deeeef                  dee
e	f         dedefdZ	 	 d+dej        dedefdZ	 	 d+dej        dedefdZ	 	 	 d,d!eeeej        f                  d"ed#eeeed$f         f         d%eeeeej                          f         fd&Z 	 	 	 	 d-d'Z!d( Z"dS ).    N)defaultdict)chain)AnyCallableDictIteratorTupleTypeUnion)nn)
checkpoint)
model_parametersnamed_applynamed_modulesnamed_modules_with_paramsadapt_input_convgroup_with_matchergroup_modulesgroup_parametersflatten_modulescheckpoint_seqFmodelexclude_headc                 z    |r&d |                                  D             d d         S |                                  S )Nc                     g | ]}|S  r   ).0ps     S/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/models/_manipulate.py
<listcomp>z$model_parameters.<locals>.<listcomp>   s    ...a...    )
parameters)r   r   s     r   r   r      sE     "..5++--...ss33!!!r!    Tfnmoduledepth_firstinclude_rootreturnc                     |s|r | ||           |                                 D ]4\  }}|rd                    ||f          n|}t          | |||d           5|r|r | ||           |S )N)r&   name.T)r%   r&   r+   r'   r(   )named_childrenjoinr   )r%   r&   r+   r'   r(   
child_namechild_modules          r   r   r      s      %< %
&t$$$$$*$9$9$;$; m m 
L59ISXXtZ0111z
r,Z[gklllll %| %
&t$$$$Mr!   r+   c              #      K   |s|r|| fV  |                                  D ]9\  }}|rd                    ||f          n|}t          |||d          E d {V  :|r
|r
|| fV  d S d S d S Nr,   T)r&   r+   r'   r(   )r-   r.   r   r&   r+   r'   r(   r/   r0   s         r   r   r   (   s        < Fl$*$9$9$;$; ^ ^ 
L59ISXXtZ0111z
 jkX\^ ^ ^ 	^ 	^ 	^ 	^ 	^ 	^ 	^ 	^ | Fl   r!   c              #      K   | j         r
|s|r|| fV  |                                 D ]9\  }}|rd                    ||f          n|}t          |||d          E d {V  :| j         r|r|r|| fV  d S d S d S d S r2   )_parametersr-   r.   r   r3   s         r   r   r   8   s       + , Fl$*$9$9$;$; ^ ^ 
L59ISXXtZ0111z
,jkX\^ ^ ^ 	^ 	^ 	^ 	^ 	^ 	^ 	^ 	^ k l Fl     r!   )i named_objectsgroup_matcherreturn_valuesreversec                 v   t          t                    rg }t                                                    D ]q\  }\  }}|t          |t          t
          f          r.|D ]*}|t          j        |d                   |f|d         fgz  }+U|t          j        |          |fd fgz  }r|fd}	t          t
                    }
| D ]-\  }}|
 |	|                   	                    |r|n|           .t          t
                    }d}t          t          d |
                                                    D ]E}|dk     s|d         t          d         k    r|dz  }||                             |
|                    F|r4|r
J d            i }|                                D ]\  }}|D ]}|||<   |S |S )Nr      c                    t          t          t          f          rD ]x\  }}}|                    |           }|r[||                                |f}t          t          t          t          j        t          d |                                        c S yt          d          fS  |           }t          |t          j        j                  s|fS t          |          S )Ninf)
isinstancelisttuplematchgroupsmapfloatr   from_iterablefiltercollectionsabcIterable)r+   match_fnprefixsuffixrpartsordr7   s          r   _get_groupingz)group_with_matcher.<locals>._get_grouping`   s    mdE]33 	,9 W W(&&NN4(( W#QXXZZ8E UE,?tU@S@S,T,T!U!UVVVVVW <<= -%%Cc;?#;<< t::r!   c                 
    | d uS )Nr   )xs    r   <lambda>z$group_with_matcher.<locals>.<lambda>w   s
    Qd] r!   z-reverse mapping only sensible for name output)r>   dict	enumerateitemsr@   r?   recompiler   appendsortedrF   keysMATCH_PREV_GROUPextend)r6   r7   r8   r9   compiledgroup_ordinal
group_namemspecsspecrP   groupingkvlayer_id_to_paramlidparam_to_layer_idlmns    `                r   r   r   K   s;    -&& !2;M<O<O<Q<Q2R2R 		J 		J.M.J}%%// J" U UE"*U1X"6"68H%PQ(!S TTHHU bj//-1A4HII       4  H E E1q!!"))}*C!!!DDDD $D))
CF22HMMOODDEE 3 377ae/2221HC#%%hqk2222 ! QQ"QQQQ(..00 	+ 	+GC + +'*!!$$+  r!   c                 L    t          |                                 |||          S N)r8   r9   )r   named_parametersr&   r7   r8   r9   s       r   r   r      s5     !!=W^` ` ` `r!   c                 B    t          t          |           |||          S rm   )r   r   ro   s       r   r   r      s1     !&))=_fh h h hr!   r;   
sequentialr   depthrK   .module_typesc              #     K   t          |t                    }t          |t                    r7|dk    r$t          j        t          j        t          j        f}nt          j        f}| D ]y\  }}|rDt          ||          r4t          |                                |dz
  |r|fn||          E d {V  K|r||fz   }||fV  Z|rd	                    ||g          }||fV  zd S )N	containerr;   )rK   rs   r,   )
r>   r@   strr   
Sequential
ModuleList
ModuleDictr   r-   r.   )r   rr   rK   rs   prefix_is_tupler+   r&   s          r   r   r      sB      !//O,$$ ,;&&M2="-HLLM+L% # #f 	#Z55 	#&%%''	"1;wwt)	            #'Fl"""" 488VTN33DFl""""# #r!   c                    d }t          | t          j        j                  r|                                 } |rt          j        |           } t          | t          t          f          st          |           } t          |           }|r|dz  }d}t          d||          D ]8}	t          |	|z   dz
  |dz
            }t           ||	||           ||          }9|r)  ||dz   t          |           dz
  |           |          S |S )a  A helper function for checkpointing sequential models.

    Sequential models execute a list of modules/functions in order
    (sequentially). Therefore, we can divide such a sequence into segments
    and checkpoint each segment. All segments except run in :func:`torch.no_grad`
    manner, i.e., not storing the intermediate activations. The inputs of each
    checkpointed segment will be saved for re-running the segment in the backward pass.

    See :func:`~torch.utils.checkpoint.checkpoint` on how checkpointing works.

    .. warning::
        Checkpointing currently only supports :func:`torch.autograd.backward`
        and only if its `inputs` argument is not passed. :func:`torch.autograd.grad`
        is not supported.

    .. warning:
        At least one of the inputs needs to have :code:`requires_grad=True` if
        grads are needed for model inputs, otherwise the checkpointed part of the
        model won't have gradients.

    Args:
        functions: A :class:`torch.nn.Sequential` or the list of modules or functions to run sequentially.
        x: A Tensor that is input to :attr:`functions`
        every: checkpoint every-n functions (default: 1)
        flatten (bool): flatten nn.Sequential of nn.Sequentials
        skip_last (bool): skip checkpointing the last function in the sequence if True
        preserve_rng_state (bool, optional, default=True):  Omit stashing and restoring
            the RNG state during each checkpoint.

    Returns:
        Output of running :attr:`functions` sequentially on :attr:`*inputs`

    Example:
        >>> model = nn.Sequential(...)
        >>> input_var = checkpoint_seq(model, input_var, every=2)
    c                       fd}|S )Nc                 V    t          dz             D ]} |         |           } | S )Nr;   )range)_xjend	functionsstarts     r   forwardz5checkpoint_seq.<locals>.run_function.<locals>.forward   s:    5#'** & &!Yq\"%%Ir!   r   )r   r   r   r   s   ``` r   run_functionz$checkpoint_seq.<locals>.run_function   s/    	 	 	 	 	 	 	 r!   r;   rQ   r   )preserve_rng_state)r>   torchr   rw   childrenr   rE   r@   r?   lenr~   minr   )
r   rS   everyflatten	skip_lastr   r   num_checkpointedr   r   s
             r   r   r      s7   X   )UX011 )&&((	 3'	22	i%// %)$$	9~~ A
Cq*E22 f f%%-!#%5%9::||E3	::ARdeee GC||C!GS^^a%7CCAFFFHr!   c                 V   |j         }|                                }|j        \  }}}}| dk    rh|dk    rJ|j        d         dz  dk    sJ |                    ||dz  d||          }|                    dd          }n|                    dd          }n~| dk    rx|dk    rt          d          t          t          j        | dz                      }|	                    d|dd          d d d | d d d d f         }|dt          |           z  z  }|
                    |          }|S )	Nr;      r      F)dimkeepdimTz*Weight format not supported by conversion.)dtyperD   shapereshapesumNotImplementedErrorintmathceilrepeatto)in_chansconv_weight	conv_typeOIJKr   s           r   r   r      sI   !I##%%K"JAq!Q1}}q55$Q'!+q0000%--aaAqAAK%//a/??KK%//a/>>KK	Q66%&RSSS 8a<0011F%,,Q1==aaa(AAAqqq>PQKAh/0K..++Kr!   )F)r$   TF)FF)r;   r$   rq   )r;   FFT)#collections.abcrG   r   rX   r   	itertoolsr   typingr   r   r   r   r	   r
   r   r   r   torch.utils.checkpointr   __all__Moduleboolr   r   rv   r   r   r]   r   r   r   r   r   r   r   r   r!   r   <module>r      s        				 # # # # # #       D D D D D D D D D D D D D D D D D D        - - - - - -k k k" "BI "T " " " " !# "	 	  	
 Y   $  "	 	  	   $  "	 	  	       $	: :c3h0:T8^,: : 	: : : :@ $	` `	` ` 	` ` ` ` $	h h	h h 	h h h h .0;G	# #c29n 56## c5c?*+# CtBI!778	# # # #B C C C CL    r!   