
    3j                        S SK J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
Jr  SSKJrJrJrJr  SS	KJr  SS
 jrSS jrSS jrSS jr " S S\\   5      rSS/rg)    )annotationsN)OrderedDict)override)KeyConditionget_seq_len   )ArchitectureImageModelDescriptorSizeRequirements	StateDict   )RRDBNetc                  ^ SU ;   a  U S   n SU ;  a  U $ S H  nUSU 3   USU SU 3'   USU 3	 M     [        5       mUR                  5        H`  u  pEU HU  nSU;   a>  U R                  5        H(  u  px[        R                  " XdU5      n	X:w  d  M#  UTU	'   M*     MG  X`;   d  MN  X   TU'   MW     Mb     Sn
U R	                  5        Hc  n[        R
                  " S	U5      nUc  M  UR                  5       u  pnX   TS
[        U5      S-   SU 3'   [        U
[        U5      S-  5      n
Me     U R	                  5        H[  nUS;   a  X   TS
U
S-    S3'   M  US;   a  X   TS
U
S-    S3'   M/  US;   a  X   TS
U
S-    S3'   ME  US;   d  MM  X   TS
U
S-    S3'   M]     SS jn[        TR	                  5       [        R                  " U5      S9n[        U4S jU 5       5      nU$ )zDConvert a new-arch model state dictionary to an old-arch dictionary.
params_emaconv_first.weight)weightbiaszmodel.1.sub./NB/.zmodel.1.sub..z\1r   z#(upconv|conv_up)(\d)\.(weight|bias)model.r   )zHRconv.weightzconv_hr.weight   .weight)zHRconv.biaszconv_hr.biasz.bias)conv_last.weight   )zconv_last.biasc                    U R                  S5      nUR                  S5      n[        US   5      n[        US   5      nXE-
  $ )Nr   r   )splitint)item1item2parts1parts2int1int2s         `/home/wildlama/miniconda3/lib/python3.13/site-packages/spandrel/architectures/ESRGAN/__init__.pycompare!_new_to_old_arch.<locals>.compareF   s@    S!S!6!9~6!9~{    )keyc              3  0   >#    U  H  oTU   4v   M     g 7f)N ).0k	old_states     r#   	<genexpr>#_new_to_old_arch.<locals>.<genexpr>P   s     Bky|,ks   )r   strr   r/   )r   itemsresubkeysmatchgroupsr   maxsorted	functools
cmp_to_key)state	state_map
num_blockskindold_keynew_keysnew_keyr+   vr2   
max_upconvr'   r4   _key_numkey_typer$   sorted_keysout_dictr,   s                      @r#   _new_to_old_archrH      s)   ul#%' #8Av&9
	LAdV45 )$01	 # I&__.G!KKMDA&&15Cx)*	# *
 #).Ig&   / Jzz|?E#(<<> A@E
Is7|a/0(<=ZW)9:J  zz|55:?*IzA~.g67338=
IzA~.e45)):?*IzA~.g67''8=
IzA~.e45  )y/C/CG/LMK BkBBHOr&   c                4    [        U S5      nUS-
  S-  nSU-  $ )Nmodel   r   r   )r   )r:   seq_len
log2_scales      r#   
_get_scalerN   U   s(     %)GA+!#Jj=r&   c           	         / nUS   S-   nU H]  nU  HK  n[         R                  " XE5      nU(       d  M"  UR                  [        UR	                  S5      5      5        MM     U(       d  M]    O   [        U6 S-   $ )N model.1.sub.\1.RDB\2.conv\3.0.\4)z=model\.\d+\.sub\.(\d+)\.RDB(\d+)\.conv(\d+)\.0\.(weight|bias)r   )r1   searchappendr   groupr6   )r:   r;   nbs
state_keys	state_keyr+   ms          r#   _get_num_blocksrX   c   sx    
C>? C J  	A		)'Aq

3qwwqz?+  3   9q=r&   c                V    SSSSSS.nSU ;   a  U S   n [        X5      n[        XU5      $ )N)r   )zconv_first.bias)trunk_conv.weightconv_body.weight)ztrunk_conv.biaszconv_body.bias)z4RRDB_trunk\.(\d+)\.RDB(\d)\.conv(\d+)\.(weight|bias)z.body\.(\d+)\.rdb(\d)\.conv(\d+)\.(weight|bias))model.0.weightzmodel.0.biaszmodel.1.sub./NB/.weightzmodel.1.sub./NB/.biasrP   r   )rX   rH   )r:   r;   r<   s      r#   _to_old_archr]   r   sG     1,#L!F.
I ul# 2JEj99r&   c                  @   ^  \ rS rSrSU 4S jjr\SS j5       rSrU =r$ )
ESRGANArch   c                   > [         TU ]  S[        R                  " [        R                  " SS5      [        R                  " SSSS5      [        R                  " SSS	S5      [        R                  " SS
5      5      S9  g )NESRGANr\   z!model.1.sub.0.RDB1.conv1.0.weightr   zbody.0.rdb1.conv1.weightr[   r   zRRDB_trunk.0.RDB1.conv1.weightrZ   z!model.1.sub.0.RDB1.conv1x1.weight)iddetect)super__init__r   has_anyhas_all)self	__class__s    r#   rf   ESRGANArch.__init__   s    ''$$$7 $$'.&&	 $$'4'& $$$7% 	 	
r&   c                   SnSnSnSnSnSnS n[        U5      n[        US5      n	US   R                  S   nUS	U	S-
   S
3   R                  S   n[        U5      n[        US5      S-
  nUS   R                  S   n[	        S UR                  5        5       5      (       a  SnX#S-  US-  4;   a0  UUS-  US-  4;   a"  [        [        R                  " X#-  5      5      nOS n[        UUUUUUUS9n
U S3U S3/nU(       a  UR                  SS5        U(       a  X(S-  -  nXh-  nUR                  S5        [        U
UU US:X  a  SOSUSSUUU[        SU(       a  SOSS9S9$ )Nr   @      r   FrJ   r\   r   r   r   r   zmodel.1.subc              3  ,   #    U  H
  nS U;   v   M     g7f)z	.conv1x1.Nr)   )r*   r+   s     r#   r-   "ESRGANArch.load.<locals>.<genexpr>   s     ;):A{a):s   T   )in_ncout_ncnum_filtersr<   scaleplusshuffle_factornfnbzESRGAN+r   	unshuffleRestorationSR)minimummultiple_of)	architecturepurposetagssupports_halfsupports_bfloat16ru   input_channelsoutput_channelssize_requirements)r]   r   shaperN   anyr3   r   mathsqrtrb   insertrR   r
   r   )ri   
state_dictrr   rs   rt   r<   ru   rv   rw   model_seq_lenrJ   r   s               r#   loadESRGANArch.load   s    
%)!*-
#J8+,2215f]1_$5W=>DDQG:& ];a?
 !1288;;):;;;D aZ"--&AIBJ=
 3
 !5>!:;N!N#!)
 m2l"
 KK9% a''E$EKK$#%*aZMT" ".!/AQ
 	
r&   r)   )returnNone)r   r   r   zImageModelDescriptor[ESRGAN])	__name__
__module____qualname____firstlineno__rf   r   r   __static_attributes____classcell__)rj   s   @r#   r_   r_      s    
: F
 F
r&   r_   rb   )r:   r   r;   dictr<   r   )r:   r   r   r   )r:   r   r;   r   r   r   )r:   r   r   r   )
__future__r   r8   r   r1   collectionsr   typing_extensionsr   spandrel.utilr   r   __helpers.model_descriptorr	   r
   r   r   __arch.RRDBr   rb   rH   rN   rX   r]   r_   __all__r)   r&   r#   <module>r      s^    "   	 # & 3  +=@:*e
f% e
P 
"r&   