
    9iu                        S SK r S SKrS SKrS SKrS SKrS SKrS SK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JrJr  S SKrS SKrS SKrS SKrS SKJr  SS	KJr   " S
 S5      r " S S\5      rS\R<                  S\R<                  4S jrSS jr S r!  SS\R<                  4S jjr"  SS\R<                  4S jjr#  SS\R<                  4S jjr$S S jr%  S!S jr& S S jr' " S S5      r(g)"    N)OrderedDict)Mapping)Path)FunctionType)AnyDictUnion)nn   )compare_arguments_nestedc                       \ rS rSrSr   SS\S\S\4S jjrS rS	 r	\
R                    SS
\R                  S\4S jj5       r\
R                        SS\\\4   4S jj5       rSrg)RegressTool   zThis class is used to stop inference/training results from changing by some unaware affections by unittests.

Firstly, run a baseline test to create a result file, then changes can be observed between
the latest version and the baseline file.
Nbaseline
store_func	load_funcc                 j    Xl         X l        X0l        [        S[        R
                  " 5        35        g)zPA func to store the baseline file and a func to load the baseline file.
        zCurrent working dir is: N)r   r   r   printr   cwd)selfr   r   r   s       c/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/utils/regress_test_utils.py__init__RegressTool.__init__!   s)     !$"(56    c                 x   U R                   b  U R                  X5        g [        R                  R                  [        R                  R	                  [
        R                  " 5       SSS5      5      n[        R                  " USS9  [        R                  " U[        R                  R	                  X25      5        g )Ndatatest
regressionT)exist_ok)
r   ospathabspathjoinr   r   makedirsshutilcopy)r   localremoter!   s       r   storeRegressTool.store,   sp    ??&OOE*77??TXXZFHDKKt,KKrww||D9:r   c                    U R                   b  U R                  X5        g [        R                  R                  [        R                  R	                  [
        R                  " 5       SSS5      5      n[        R                  R	                  X25      n[        R                  R                  U5      (       d  [        SU S35      e[        SU S[        R                  " [        US5      R                  5       5      R                  5        35        [        R                  R                  U5      (       a  [        R                  " U5        [        R                   " XAS	S
9  g )Nr   r   r   zbase line file z
 not existzlocal file found:z, md5:rbF)target_is_directory)r   r    r!   r"   r#   r   r   exists
ValueErrorr   hashlibmd5openread	hexdigestremovesymlink)r   r'   r(   r!   r   s        r   loadRegressTool.load5   s    >>%NN5)77??TXXZFHDww||D1H77>>(++ ?8*J!GHH#H:VGKKXd@S@X@X@Z4[4e4e4g3hi ww~~e$$		% JJxEBr   module	file_namec              +     #    [         R                  " S5      nUb  U R                  c  Sv   gU R                  n0 nSU S3n[        U[        R
                  5      (       d  [        US5      (       d   eUR                  n[        XU5        [        X5        Sv   [        USSSS9  [        USSS9  U(       aV  [        US5       n	[        R                  " Xy5        SSS5        U R                  X S35        [         R                  " U5        g[         R                  R!                  U5      n
[         R                  R#                  [$        R&                  " 5       U
5      nU R)                  Xj5        [        US	5       n	[        R(                  " U	5      nSSS5         " S
 S[*        R,                  5      nU(       a  [/        S5        WR1                  5        VVs0 s H  u  pX:X  d  M  X_M     nnnUR1                  5        H  u  pSSS.US'   M     UR1                  5        VVs0 s H  u  pX:X  d  M  X_M     nnnUR1                  5        H  u  pSSS.US'   M     [/        S[*        R2                  " WUS9 35        [/        S[*        R2                  " X|S9 35        [5        XU40 UD6(       d  [7        S5      eg! , (       d  f       GN= f! , (       d  f       GNC= fs  snnf s  snnf 7f)aI  Monitor a pytorch module in a single forward.

Args:
    module: A torch module
    file_name: The file_name to store or load file
    compare_fn: A custom fn used to compare the results manually.
    compare_model_output: Only compare the input module's output, skip all other tensors

>>> def compare_fn(v1, v2, key, type):
>>>     return None

v1 is the baseline value
v2 is the value of current version
key is the key of submodules
type is in one of 'input', 'output'

    kwargs:
    atol: The absolute gap between two np arrays.
    rtol: The relative gap between two np arrays.
REGRESSION_BASELINEN./.binmodelTrestorewbr,   c                        \ rS rSrS rS rSrg)CRegressTool.monitor_module_single_forward.<locals>.SafeNumpyEncoder}   c                 F   [        U[        R                  5      (       a  UR                  5       $ [        U[        R                  5      (       a  [        U5      $ [        U[        R                  5      (       a  [        U5      $ [        R                  R                  X5      $ N)
isinstancenpndarraytolistfloatingfloatintegerintjsonJSONEncoderdefaultr   objs     r   parse_defaultQRegressTool.monitor_module_single_forward.<locals>.SafeNumpyEncoder.parse_default   sk    !#rzz22"zz|+!#r{{33$Sz)!#rzz22"3x++33D>>r   c                 x     U R                  U5      $ ! [         a    [        SUR                   S35         g f = f)NzType z! cannot be serialized and printed)rR   	Exceptionr   	__class__rS   s     r   rR   KRegressTool.monitor_module_single_forward.<locals>.SafeNumpyEncoder.default   sC    $#||C00$ $#CMM?2ST  $	$s    #99 N)__name__
__module____qualname____firstlineno__rU   rR   __static_attributes__r[   r   r   SafeNumpyEncoderrD   }   s    
?$r   ra   zDIgnore inner modules, only the output of the model will be verified.argskwargsinputz
baseline: )clsz
latest  : zResult not match!)r    getenvr   rH   r
   Modulehasattrr?   hack_forwardintercept_moduler2   pickledumpr)   r5   r!   basenamer#   tempfile
gettempdirr7   rP   rQ   r   itemsdumpscompare_io_and_printr/   )r   r9   r:   
compare_fncompare_model_outputrd   r   io_jsonabsolute_pathfnamebasera   keyvalues                  r   monitor_module_single_forward)RegressTool.monitor_module_single_forwardE   s}    6 9923t}}4==YKt,&")),,67++++\\FV0)VT46t4mT*aG' +JJ}4&89IIm$77##M2Dww||H$7$7$94@HIIh%h%{{1~ &$4#3#3 $. $Z
 '+jjl&2
c6F CJ&2   #'**,JC.2d%CE'N #/ '.mmo&5
9I CJ&5   #*--/JC.2d%CE'N #2 Jtzz$4DEFGHJtzz'HIJK'zLVL !455 Mk +* &%<s]   CK/J?B"K/>KAK/K#*K#07K/'K)6K)<BK/?
K	K/
K K/trainerc	           
   +   	  ^#    [         R                  " S5      n
U
b  U R                  c  Sv   gU R                  n
0 n0 nSU S3nUS:X  a  [        S5        [	        US5      (       d  SU;   d   S5       e[        U[        5      (       a  US   OUR                  n[        U[        R                  5      (       d  [	        US5      (       d   eUR                  n[	        US	5      (       d  S	U;   d   S
5       e[	        US5      (       d  SU;   d   S5       e[        U[        5      (       a  US	   OUR                  n[        U[        5      (       a  US   OUR                  n[        [        R                  " 5       5      n[        R                   R#                  5       n[         R$                  " 5       n[	        US5      (       a  UR&                  O[	        US5      (       a  UR(                  OSnU(       a,  [        R*                  " 5          U4S jmT" U5        SSS5        US:X  a  [-        XU5        [/        X5        [1        XXS9  Sv   [1        XSSS9  US:X  a  [-        USSSS9  [/        USSS9  UR3                  5       nUR5                  SS5        UUUR6                  R8                  UR:                  US.UR6                  R8                  UR3                  5       S.[	        US5      (       a  UR<                  R?                  5       OSUUUUS.S.nU
(       aW  [A        US5       n[B        RD                  " UU5        SSS5        U RG                  X S35        [         RH                  " U5        g[         RJ                  RM                  U5      n[         RJ                  RO                  [P        RR                  " 5       U5      n
U RU                  U
U5        [A        U
S5       n[B        RT                  " U5      nSSS5        US:X  a   [W        WS   X40 U	D6(       d  [Y        S5      e[[        WS   U4UUUS.U	D6(       d  [Y        S5      eUS	   US   US   U(       d  SOUS   S .nUS	   US   US   U(       d  SOUS   S .n[]        UUU40 U	D6(       d  [Y        S!5      eg! , (       d  f       GN= f! , (       d  f       GN|= f! , (       d  f       N= f7f)"a  Monitor a pytorch module's backward data and cfg data within a step of the optimizer.

This is usually useful when you try to change some dangerous code
which has the risk of affecting the training loop.

Args:
    trainer: A dict or an object contains the model/optimizer/lr_scheduler
    file_name: The file_name to store or load file
    level: The regression level.
    'strict' for matching every single tensor.
             Please make sure the parameters of head are fixed
             and the drop-out rate is zero.
    'config' for matching the initial config, like cfg file, optimizer param_groups,
             lr_scheduler params and the random seed.
    'metric' for compare the best metrics in the evaluation loop.
    compare_fn: A custom fn used to compare the results manually.
    ignore_keys: The keys to ignore of the named_parameters.
    compare_random: If to compare random setttings, default True.
    reset_dropout: Reset all dropout modules to 0.0.
    lazy_stop_callback: A callback passed in, when the moniting is over, this callback will be called.
    kwargs:
    atol: The absolute gap between two np arrays.
    rtol: The relative gap between two np arrays.

>>> def compare_fn(v1, v2, key, type):
>>>     return None

v1 is the baseline value
v2 is the value of current version
key is the key of modules/parameters
type is in one of 'input', 'output', 'backward', 'optimizer', 'lr_scheduler', 'cfg', 'state'
r<   Nr=   r>   strictz[Important] The level of regression is 'strict', please make sure your model's parameters are fixed and all drop-out rates have been set to zero.r?   zmodel must be in trainer	optimizerzoptimizer must be in trainerlr_schedulerzlr_scheduler must be in trainer_seedseedc                    > U R                  5        Ha  u  p[        U[        R                  R                  5      (       a+  [        X[        R                  R	                  S5      5        MY  T" U5        Mc     g )Ng        )named_childrenrH   torchr
   Dropoutsetattr)_modulery   	submodulereinit_dropouts      r   r   8RegressTool.monitor_module_train.<locals>.reinit_dropout  sQ    +2+A+A+C%i1A1ABB#G5883C3CB3GH*95	 ,Dr   )lazy_stop_callbackTr@   state)typedefaults
state_dict)r   r   cfg)torch_statenp_staterandom_seedr   )forwardbackwardr   r   r   r   rB   r,   r   zForward not match!r   )rt   ignore_keyslevelzBackward not match!)r   r   r   r   zCfg or optimizers not match!)/r    rg   r   r   ri   rH   dictr?   r
   rh   r   r   numpify_tensor_nestedr   get_rng_staterI   random	get_stategetstater   r   no_gradrj   rk   hack_backwardr   poprY   r\   r   r   to_dictr2   rl   rm   r)   r5   r!   rn   r#   ro   rp   r7   rs   RuntimeErrorcompare_backward_and_printcompare_cfg_and_optimizers)r   r   r:   r   rt   r   compare_randomreset_dropoutr   rd   r   rv   bw_jsonrw   r9   r   r   r   r   r   r   optimizer_dictsummaryrx   ry   baseline_jsoncfg_opt1cfg_opt2r   s                               @r   monitor_module_train RegressTool.monitor_module_train   s    V 9923t}}4==YKt,HFG W !(G!3	P5O	P 4%/04&6 &6!;B== 	&")),,67++++\\F[
 
G#	D%C	D $ ^
 
w&	J(I	J ' DNTD D7;+? ' 1 1 	YcdkmqYrYrgn>U%% 	+E,?,?,AB99&&(oo' '! !w}}*1'6*B*B',, 	 6 v& ! HG4V-w	Oft<HtT:VT48"--/7D)!++44%.., %..77*557 -4GU,C,C7;;&&(*$*	
* mT*aGQ' +JJ}4&89IIm$77##M2Dww||H$7$7$94@HIIh%h% &A &  )=!),g*MEK*M"#788-!*-  * +  ##899*;7 -n =$U+%3w9O	H %[1 ' 7u~%39I	H .h* 8068"#ABB8a !\ +* &%sQ   HS	R#DS(R5 B#S#S:B)S#
R2-S5
S?S
SS)r   r   r   )NNNNT)configNNTTN)r\   r]   r^   r_   __doc__boolr   r   r)   r7   
contextlibcontextmanagerr
   rh   strr}   r	   r   r   r   r`   r[   r   r   r   r      s     #',0+/	7	7)	7 )	7;C   26;?	b6.0iib614b6 b6H  $,(,)-,0+/04fC&+D#I&6fC fCr   r   c                   \    \ rS rSr " S S\5      r\R                       SS j5       rSr	g)MsRegressTooliT  c                       \ rS rSrSrg)MsRegressTool.EarlyStopErroriV  r[   N)r\   r]   r^   r_   r`   r[   r   r   EarlyStopErrorr   V  s    r   r   Nc              +      ^ ^^^^^^^^#    Tc  U4S jmUUUUUUUU 4S jn	TR                   [        TR                   5      " U	T5      sTl        Tl         S v   g 7f)Nc                  F   >  " S S5      n TR                  U " 5       5        g )Nc                       \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rSrg)QMsRegressTool.monitor_ms_train.<locals>.lazy_stop_callback.<locals>.EarlyStopHookih  Z   c                     g rG   r[   r   r   s     r   
before_run\MsRegressTool.monitor_ms_train.<locals>.lazy_stop_callback.<locals>.EarlyStopHook.before_runk      r   c                     g rG   r[   r   s     r   	after_run[MsRegressTool.monitor_ms_train.<locals>.lazy_stop_callback.<locals>.EarlyStopHook.after_runn  r   r   c                     g rG   r[   r   s     r   before_epoch^MsRegressTool.monitor_ms_train.<locals>.lazy_stop_callback.<locals>.EarlyStopHook.before_epochq  r   r   c                     g rG   r[   r   s     r   after_epoch]MsRegressTool.monitor_ms_train.<locals>.lazy_stop_callback.<locals>.EarlyStopHook.after_epocht  r   r   c                     g rG   r[   r   s     r   before_iter]MsRegressTool.monitor_ms_train.<locals>.lazy_stop_callback.<locals>.EarlyStopHook.before_iterw  r   r   c                 &    U R                  U5        g rG   r   r   s     r   before_train_epochdMsRegressTool.monitor_ms_train.<locals>.lazy_stop_callback.<locals>.EarlyStopHook.before_train_epochz      ))'2r   c                 &    U R                  U5        g rG   r   r   s     r   before_val_epochbMsRegressTool.monitor_ms_train.<locals>.lazy_stop_callback.<locals>.EarlyStopHook.before_val_epoch}  r   r   c                 &    U R                  U5        g rG   r   r   s     r   after_train_epochcMsRegressTool.monitor_ms_train.<locals>.lazy_stop_callback.<locals>.EarlyStopHook.after_train_epoch      ((1r   c                 &    U R                  U5        g rG   r   r   s     r   after_val_epochaMsRegressTool.monitor_ms_train.<locals>.lazy_stop_callback.<locals>.EarlyStopHook.after_val_epoch  r   r   c                 &    U R                  U5        g rG   r   r   s     r   before_train_itercMsRegressTool.monitor_ms_train.<locals>.lazy_stop_callback.<locals>.EarlyStopHook.before_train_iter  r   r   c                 &    U R                  U5        g rG   r   r   s     r   before_val_iteraMsRegressTool.monitor_ms_train.<locals>.lazy_stop_callback.<locals>.EarlyStopHook.before_val_iter  r   r   c                 &    U R                  U5        g rG   
after_iterr   s     r   after_train_iterbMsRegressTool.monitor_ms_train.<locals>.lazy_stop_callback.<locals>.EarlyStopHook.after_train_iter      0r   c                 &    U R                  U5        g rG   r   r   s     r   after_val_iter`MsRegressTool.monitor_ms_train.<locals>.lazy_stop_callback.<locals>.EarlyStopHook.after_val_iter  r   r   c                 <    US:  a  UR                   S-   U-  S:H  $ S$ Nr   r   F)epochr   r   ns      r   every_n_epochs`MsRegressTool.monitor_ms_train.<locals>.lazy_stop_callback.<locals>.EarlyStopHook.every_n_epochs  s&    ?@1u 1Q6!;O%Or   c                 <    US:  a  UR                   S-   U-  S:H  $ S$ r   )
inner_iter)r   runnerr   s      r   every_n_inner_iterseMsRegressTool.monitor_ms_train.<locals>.lazy_stop_callback.<locals>.EarlyStopHook.every_n_inner_iters  s;    12Q !' 1 1"#!$'( ),- . B<ABr   c                 <    US:  a  UR                   S-   U-  S:H  $ S$ r   )iterr   s      r   every_n_iters_MsRegressTool.monitor_ms_train.<locals>.lazy_stop_callback.<locals>.EarlyStopHook.every_n_iters  s&    >?!eq 0A5:NNr   c                 :    UR                   S-   UR                  :H  $ Nr   )r   iters_per_epochr   s     r   end_of_epoch^MsRegressTool.monitor_ms_train.<locals>.lazy_stop_callback.<locals>.EarlyStopHook.end_of_epoch  s    &11A59P9PPPr   c                 :    UR                   S-   UR                  :H  $ r  )r   
max_epochsr   s     r   is_last_epoch_MsRegressTool.monitor_ms_train.<locals>.lazy_stop_callback.<locals>.EarlyStopHook.is_last_epoch  s    &}}q0G4F4FFFr   c                 :    UR                   S-   UR                  :H  $ r  )r  	max_itersr   s     r   is_last_iter^MsRegressTool.monitor_ms_train.<locals>.lazy_stop_callback.<locals>.EarlyStopHook.is_last_iter  s    &||a/73D3DDDr   c                     / $ rG   r[   r   s    r   get_triggered_stagesfMsRegressTool.monitor_ms_train.<locals>.lazy_stop_callback.<locals>.EarlyStopHook.get_triggered_stages      !	r   c                     0 $ rG   r[   r  s    r   r   \MsRegressTool.monitor_ms_train.<locals>.lazy_stop_callback.<locals>.EarlyStopHook.state_dict  r  r   c                     g rG   r[   )r   r   s     r   load_state_dictaMsRegressTool.monitor_ms_train.<locals>.lazy_stop_callback.<locals>.EarlyStopHook.load_state_dict  r   r   c                 ,    [         R                  S5      e)NzTest finished.)r   r   r   s     r   r   \MsRegressTool.monitor_ms_train.<locals>.lazy_stop_callback.<locals>.EarlyStopHook.after_iter  s    +::;KLLr   r[   N)r\   r]   r^   r_   PRIORITYr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r   r  r   r`   r[   r   r   EarlyStopHookr   h  s    !H33222211PBOQGE""Mr   r  )register_hook)r  r   s    r   r   :MsRegressTool.monitor_ms_train.<locals>.lazy_stop_callbackf  s$    GM GMR %%mo6r   c                    > T
R                   " U TT	4TTTTS.TD6    U R                  " U0 UD6sS S S 5        $ ! [        R                   a     Of = f S S S 5        g ! , (       d  f       g = f)N)rt   r   r   r   )r   train_loop_originr   r   )r   
args_trainkwargs_trainrt   r   r:   r   rd   r   r   r   s      r   _train_loop3MsRegressTool.monitor_ms_train.<locals>._train_loop  s    **  * +#1'9 "44j E7CE  %33   s&   A9AAAA
A+)
train_loopr   r#  )
r   r   r:   r   rt   r   r   r   rd   r&  s
   ````````` r   monitor_ms_trainMsRegressTool.monitor_ms_trainY  sQ      %K7Z	 	" W%7%7 8g N 	6!7#5s   AAr[   )r   NNTN)
r\   r]   r^   r_   rX   r   r   r   r)  r`   r[   r   r   r   r   T  s;        ($(%)(,,0k kr   r   module1module2c                     [        U R                  5       UR                  5       5       H>  u  p#UR                  R                  UR                  5      R	                  5       S:  d  M>    g   g)Nr   FT)zip
parametersr   nesum)r+  r,  p1p2s       r   compare_moduler4    sR    g((*G,>,>,@A77::bgg""$q( B r   c                   ^^  SSK Jn   [	        U [
        U45      (       a:  [        U R                  5        VVs0 s H  u  pEU[        UTT5      _M     snn5      $ [	        U [        5      (       a  [        UU4S jU  5       5      $ [	        U [        5      (       a  [        UU4S jU  5       5      $ [	        U [        R                  5      (       a  U R                  5       R                  5       nTb8  [        R                   " UT:  TU5      n[        R                   " UT* :  T* U5      nTS:X  a  UR#                  [$        S9$ TS:X  a  UR'                  [$        S9$ U$ U $ ! [         a
    [        n GNif = fs  snnf )Nr   ModelOutputBasec              3   >   >#    U  H  n[        UTT5      v   M     g 7frG   r   .0t
clip_value	reductions     r   	<genexpr>(numpify_tensor_nested.<locals>.<genexpr>  s"      NEL!!Y
;;W   c              3   >   >#    U  H  n[        UTT5      v   M     g 7frG   r9  r:  s     r   r?  r@    s"      NEL!!Y
;;WrA  r1  )dtypemean)modelscope.outputsr7  ImportErrorr   rH   r   r   rq   r   listtupler   TensorcpunumpyrI   wherer1  rM   rD  )tensorsr>  r=  r7  kr<  s    ``   r   r   r     sk   6 G'G_566
' $Q	:>>'
  	 '4   NELN N 	N'5!! NELN N 	N'5<<((++-!ZQ7Aj[:+q9A55u5%%& 666&&N1  
s   E  E7
 E43E4c           
          SSK Jn   [	        U [
        U45      (       a8  [        U R                  5        VVs0 s H  u  p#U[        U5      _M     snn5      $ [	        U [        5      (       a  [        S U  5       5      $ [	        U [        5      (       a  [        S U  5       5      $ [	        U [        R                  5      (       a  U R                  5       $ U $ ! [         a	    [        n Nf = fs  snnf )Nr   r6  c              3   8   #    U  H  n[        U5      v   M     g 7frG   detach_tensor_nestedr;  r<  s     r   r?  'detach_tensor_nested.<locals>.<genexpr>  s     =W(++W   c              3   8   #    U  H  n[        U5      v   M     g 7frG   rQ  rS  s     r   r?  rT    s     >g)!,,grU  )rE  r7  rF  r   rH   r   r   rq   rR  rG  rH  r   rI  detach)rM  r7  rN  r<  s       r   rR  rR    s    6 F'G_566 *( $Q''(*+ 	+ '4  =W==='5!!>g>>>'5<<((~~N  
*s   C C-
C*)C*r9   c                   ^^^ UUU4S jnU(       dC  [        U S5      (       d2  U R                  [        U R                  5      " XP5      sU l        U l        U(       a&  [        U S5      (       a  U R                  U l        U ?g g g )Nc                   > U R                   " U0 UD6nT(       a=  [        [        U5      5      n[        [        U5      5      n[        [        U5      5      nOu[        [        U5      SS9[        [        U5      SS9S.n[        [        U5      SS9[        [        U5      SS9S.n[        [        U5      SS9[        [        U5      SS9S.nUUS.US.TT'   U$ )Nr1  r>  rD  r1  rD  rb   )re   output)forward_originr   rR  )r   rc   rd   retr\  rv   keep_tensorsry   s        r   _forwardhack_forward.<locals>._forward  s   !!4262()=d)CDD*+?+GHF*+?+DEF &(.%A &(.&BD &(0EC &(0FDF &(-@ &(-AF   
 
r   r]  )ri   r   r   r]  )r9   ry   rv   rA   r_  r`  s    `` ` r   rj   rj      sp    'R 76+;<<06NNA$A.-v~76#344..! 5wr   c                   ^ ^^ UUU 4S jnU(       dC  [        US5      (       d2  UR                  [        UR                  5      " XQ5      sUl        Ul        U(       a&  [        US5      (       a  UR                  Ul        U?g g g )Nc                   > TR                  5        H  u  p4[        [        UR                  5      SS9[        [        UR                  5      SS9S.[        [        UR                  5      SS9[        [        UR                  5      SS9S.S.TU'   M     U R
                  " U0 UD6nTR                  5        HF  u  p4[        [        UR                  5      SS9[        [        UR                  5      SS9S.TU   S'   MH     Tb  T" 5         U$ )Nr1  rZ  rD  r[  )r   grad
data_after)named_parametersr   rR  r   rd  step_origin)	r   rc   rd   ry   paramr^  rv   r   r9   s	         r   _stephack_backward.<locals>._step=  s   !224KD *,UZZ8EK *,UZZ8FL *,UZZ8EK *,UZZ8FLGDM 5& //!224KD &(4G &(4H+GDM,' 5 ) 
r   rg  )ri   stepr   r   rg  )r9   r   rv   rA   r   ri  s   ` ` ` r   r   r   7  sp     D 79m<<09  A""'A4-	y~79m44"..	! 5wr   c                     U R                  5        H*  u  p@Ub  US-   U-   OUn[        XX5        [        XXS5        M,     g )N.)r   rj   rk   )r9   rv   parent_namerA   ry   	full_names         r   rk   rk   g  sC     --/0;0GK#%,T	V9)= 0r   c                    Uc  S n[        U R                  5       5      n[        UR                  5       5      nXE-
  nXT-
  n[        SU SU 35        UR                  U5      nSn	U H  n
X
   nX   n[	        US   5      n[	        US   5      nU" XU
S5      nUb  [        SU
 SU S35        U	=(       a    Un	OB[        S	U
 S
3US   US   40 UD6=(       a    U	n	[        S	U
 S3US   US   40 UD6=(       a    U	n	[	        US   5      n[	        US   5      nU" UUU
S5      nUb  [        SU
 SU S35        U	=(       a    Un	M  [        S	U
 S34UUS.UD6=(       a    U	n	M     U	$ )Nc                      g rG   r[   rb   s     r   rt   (compare_io_and_print.<locals>.compare_fnt      r   zunmatched keys: , Tre   z	input of + compared with user compare_fn with result:
unmatched module z input argsrc   z input kwargsrd   r\  z
output of z outputsarg1arg2)setkeysr   intersectionr   r   )r   rv   rt   rd   keys1keys2addedremovedshared_keysmatchr{   v1v2v1inputv2inputresv1outputv2outputs                     r   rs   rs   q  s   	 ""$%EEMEmG	UG2gY
/0$$U+KE\'74'7438?C5 KC5PRS McE,#C54gfo+#)+ 5/4  -#C568I!-%+- 716  )H6(H68S(;?SE!LSEQST McE,#C51 	 $ $	 9 B Lr   c                 ^   Uc  S n[        U R                  5       5      n[        UR                  5       5      nXg-
  nXv-
  n	[        SU SU	 35        UR                  U5      n
SnU
 H  nUb  X;   a  M  U" X   X   US5      nUb  [        SU SU S35        U=(       a    UnM>  X   S	   X   S
   X   S   npX   S	   X   S
   X   S   nnn[	        SU S34UUS.UD6=(       a    UnUS:X  d  M  [	        SU S34UUS.UD6=(       a    Un[	        SU S3UU40 UD6=(       a    UnM     U$ )Nc                      g rG   r[   rb   s     r   rt   .compare_backward_and_print.<locals>.compare_fn  rs  r   zunmatched backward keys: rt  Tr   zbackward data of ru  rv  r   rd  re  rw  z tensor datarx  r   z
 grad dataz data after step)r{  r|  r   r}  r   )r   r   r   r   rt   rd   r~  r  r  r  r  r  r{   r  data1grad1data_after1data2grad2data_after2s                       r   r   r     s    	 ""$%EEMEmG	%eWBwi
89$$U+KE"s'9+W\3
K?%cU +114R9 :McE(5(:)&+F3]5G 6" &5 )0V(<gl? l3 &5E,#C55 	 $ $	 
  0'uJ7 	 ( #(	 
 1'u,<={+#)+ 5/4 5 : Lr   c                 B   Uc  S nU S   U S   U S   U S   4u  pEpgUS   US   US   U S   4u  ppSnU" XHS S5      nUb  [        SU S35        U=(       a    UnO]US	   US	   :w  a  [        S
US	    SUS	    35        [        SUS   US   40 UD6=(       a    Un[        SUS   US   40 UD6=(       a    UnU" XYS S5      nUb  [        SU S35        U=(       a    UnO@US	   U	S	   :w  a  [        S
US	    SU	S	    35        [        SUS   U	S   40 UD6=(       a    UnU" XjS S5      nUb  [        SU S35        U=(       a    UnO[         SXjS.UD6=(       a    UnU" X{S S5      nUb  [        SU S35        U=(       a    UnU$ [        SUU40 UD6=(       a    UnU$ )Nc                      g rG   r[   rb   s     r   rt   .compare_cfg_and_optimizers.<locals>.compare_fn  rs  r   r   r   r   r   Tz4optimizer compared with user compare_fn with result:rv  r   zOptimizer type not equal:z and zunmatched optimizer defaultsr   zunmatched optimizer state_dictr   z7lr_scheduler compared with user compare_fn with result:z!unmatched lr_scheduler state_dictz.cfg compared with user compare_fn with result:rx  z7random state compared with user compare_fn with result:zunmatched random state)zunmatched cfg)r   r   )r   cfg_jsonrt   rd   
optimizer1lr_scheduler1cfg1state1
optimizer2lr_scheduler2cfg2state2r  r  s                 r   r   r     s    	 /</#N3]6!'*/++Jt /7{.CXF!%-*@/A+Jt E
ZT;
?C
DSELM#fF!33+Jv,>+?uZPVEWDXY )*Jz,Bz".&,. 827 	 ),j.F|$0(.0 :49 	 ]4
HC
EcU"M	O# M&$99+M&,A+B%V\H]G^_ )/|1L,'3+13 =7< 	 Tu
-C
>se2FG#(="&=5;= GAF 	 VT7
3C
EcU"M	O#
 L ))A6)/;39; E?D 	 Lr   c                        \ rS rSrS rS rSrg)IgnoreKeyFni  c                 z    [        U[        5      (       a  U/n[        U[        5      (       a  Xl        g / U l        g rG   )rH   r   rG  r|  )r   r|  s     r   r   IgnoreKeyFn.__init__  s-    dC  6D&tT22D		r   c                     U R                    H6  n[        R                  " U5      nUc  M  UR                  U5      (       d  M6    g   g r   )r|  recompile	fullmatch)r   r  r  r{   r   _keypatterns          r   __call__IgnoreKeyFn.__call__  s;    IIDjj&G7#4#4S#9#9  r   )r|  N)r\   r]   r^   r_   r   r  r`   r[   r   r   r  r    s    ;
r   r  )Ni'  )FF)FN)NFrG   )NN))r   r0   r    rl   r   r  r%   ro   collectionsr   collections.abcr   pathlibr   typesr   typingr   r   r	   rP   rK  rI   r   torch.optimr
   
test_utilsr   r   r   rh   r4  r   rR  rj   r   rk   rs   r   r   r  r[   r   r   <module>r     s      	   	   # #   # #      0wC wCt	qK qhBII 		 <, #	4" 4"t  %)	-"")) -"d "&">RYY >.h ,0*.	/h +/?D r   