§
     ’Þj˜  ã                   ó*   — d Z ddlZdZd„ Zd	ddœd„ZdS )
aX  Shared adapter format helpers for LoRA and linear LoKr checkpoints.

``convert_lora_keys`` changes names only by default. Linear model loaders can
opt into composing decomposed LoKr factors with ``compose_lokr=True``.
Underscore-separated module names are resolved against the actual architecture
instead of splitting names such as ``to_out``.
é    N)Ú	lokr_w1_aÚ	lokr_w1_bÚ	lokr_w2_aÚ	lokr_w2_bc                 óÎ  — t          d„ | D ¦   «         ¦  «        rt          d¦  «        ‚t          | ¦  «        } i }| D ][}|                     d¦  «        \  }}}|r>|t          v r5|                     |t          ¦   «         ¦  «                             |¦  «         Œ\|                     ¦   «         D �]7\  }}d}i }dD �]}	d|	› d�d|	› d�}}
|› d	|	› �}|
|v ||v k    rt          d
|	› d|› �¦  «        ‚|
|v rÎ|| v rt          d|	› d|› �¦  «        ‚|  	                    |› d|
› �¦  «        }|  	                    |› d|› �¦  «        }|j
        dk    s'|j
        dk    s|j        d         |j        d         k    rt          d|	› d|› �¦  «        ‚|�#||j        d         k    rt          d|› �¦  «        ‚||z  ||<   |j        d         }�Œ	|€�Œ|dk    rt          d|› �¦  «        ‚|› d�|v s|› d�| v st          d|› �¦  «        ‚|› d�|v s|› d�| v st          d|› �¦  «        ‚|› d�}|| v rˆ|  	                    |¦  «        }t          j        |¦  «        r!t          |                     ¦   «         ¦  «        nt          |¦  «        }||z  }|› d�}||v r||         |z  ||<   n|| v r| |         |z  | |<   |                     ¦   «         D ] \  }}|| v rt          d|› �¦  «        ‚|| |<   Œ!�Œ9| S )a  Fold AI Toolkit's linear LoKr matrix products into full w1/w2 factors.

    Call only for linear targets. The result is a new dictionary; source
    tensors are untouched. This deliberately does not handle convolutional CP
    factors, which need a different tensor transformation.
    c              3   ó@   K  — | ]}|                      d ¦  «        V — ŒdS ))z.lokr_t1z.lokr_t2N©Úendswith)Ú.0Úkeys     úAC:\Users\johnn\OneDrive\Documents\AI\shared\utils\lora_mapping.pyú	<genexpr>z.compose_linear_lokr_factors.<locals>.<genexpr>   s/   è è € Ð
HÐ
H°cˆ3�<Š<Ð0Ñ1Ô1Ð
HÐ
HÐ
HÐ
HÐ
HÐ
Hó    zIConvolutional CP LoKr factors are not supported by linear LoKr conversionú.N)Úw1Úw2Úlokr_Ú_aÚ_bz.lokr_zIncomplete AI Toolkit LoKr z factors for zBoth full and decomposed LoKr é   é   r   zInvalid AI Toolkit LoKr z matrix shapes for z'Inconsistent AI Toolkit LoKr ranks for z!Invalid AI Toolkit LoKr rank for ú.lokr_w1z&Missing AI Toolkit LoKr w1 factor for ú.lokr_w2z&Missing AI Toolkit LoKr w2 factor for ú.alphazLoKr keys collide at )ÚanyÚ
ValueErrorÚdictÚ
rpartitionÚ_DECOMPOSED_LOKRÚ
setdefaultÚsetÚaddÚitemsÚpopÚndimÚshapeÚtorchÚ	is_tensorÚfloatÚitem)Ú
state_dictÚgroupsr   ÚmoduleÚdotÚsuffixÚsuffixesÚrankÚfactorsÚpartÚa_nameÚb_nameÚ	full_nameÚaÚbÚ	alpha_keyÚalphaÚscaleÚw1_keyÚvalues                       r   Úcompose_linear_lokr_factorsr>      sò  € õ Ð
HÐ
H¸ZÐ
HÑ
HÔ
HÑHÔHð fÝÐdÑeÔeÐeÝ�jÑ!Ô!€JØ€FØð 9ð 9ˆØ!Ÿnšn¨SÑ1Ô1Ñˆ��VØð 	9�6Õ-Ð-Ð-Ø×Ò˜f¥c¡e¤eÑ,Ô,×0Ò0°Ñ8Ô8Ð8øà"ŸLšL™NœNð )$ñ )$Ñˆ�ØˆØˆØ ð 	"ñ 	"ˆDØ- TÐ-Ð-Ð-Ð/?°tÐ/?Ð/?Ð/?�FˆFØ!Ð/Ð/¨Ð/Ð/ˆIØ˜(Ð"¨°(Ð(:Ò;Ð;Ý Ð!Z¸tÐ!ZÐ!ZÐRXÐ!ZÐ!ZÑ[Ô[Ð[Ø˜Ð!Ð!Ø 
Ð*Ð*Ý$Ð%aÀdÐ%aÐ%aÐY_Ð%aÐ%aÑbÔbÐbØ—N’N fÐ#7Ð#7¨vÐ#7Ð#7Ñ8Ô8�Ø—N’N fÐ#7Ð#7¨vÐ#7Ð#7Ñ8Ô8�Ø”6˜Q’;�; !¤&¨A¢+ +°´¸´¸q¼wÀq¼zÒ1IÐ1IÝ$Ð%aÀÐ%aÐ%aÐY_Ð%aÐ%aÑbÔbÐbØÐ#¨°´¸´
Ò(:Ð(:Ý$Ð%WÈvÐ%WÐ%WÑXÔXÐXØ%&¨¡U�˜	Ñ"Ø”w˜q”z�ùàˆ<ÙØ�1Š9ˆ9ÝÐIÀÐIÐIÑJÔJÐJØÐ#Ð#Ð# wÐ.Ð.°VÐ2EÐ2EÐ2EÈÐ2SÐ2SÝÐNÀfÐNÐNÑOÔOÐOØÐ#Ð#Ð# wÐ.Ð.°VÐ2EÐ2EÐ2EÈÐ2SÐ2SÝÐNÀfÐNÐNÑOÔOÐOØÐ%Ð%Ð%ˆ	Ø˜
Ð"Ð"Ø—N’N 9Ñ-Ô-ˆEÝ+0¬?¸5Ñ+AÔ+AÐS•E˜%Ÿ*š*™,œ,Ñ'Ô'Ð'ÅuÈUÁ|Ä|ˆEØ˜D‘LˆEØÐ(Ð(Ð(ˆFØ˜Ð Ð Ø")¨&¤/°EÑ"9�˜‘�Ø˜:Ð%Ð%Ø%/°Ô%7¸%Ñ%?�
˜6Ñ"Ø!Ÿ-š-™/œ/ð 	$ð 	$‰JˆC�Ø�jÐ Ð Ý Ð!>¸Ð!>Ð!>Ñ?Ô?Ð?Ø#ˆJ�s‰OˆOñ	$ð Ðr   ÚwangpF)Úcompose_lokrc          
      óÎ  ‡‡— |dvrt          d|› �¦  «        ‚|rt          | ¦  «        } t          |¦  «        }t          |¦  «        D ]î}|pi                      ¦   «         D ]b\  }}||k    s|                     d|z   ¦  «        r?|dt          |¦  «         …         Š|                     ˆfd„|d         D ¦   «         ¦  «         Œc|pi                      ¦   «         D ]\\  }}|d         D ]N}	||	k    s|                     d|	z   ¦  «        r.|                     |dt          |	¦  «         …         |z   ¦  «         ŒOŒ]Œïi }
|D ]?}| 	                    dd¦  «        }||
v r|
|         |k    rt          d|› �¦  «        ‚||
|<   Œ@i }d	}|t          d
„ t          D ¦   «         ¦  «        z  }|                      ¦   «         D �]¯\  }}| 	                    dd¦  «         	                    dd¦  «        Š‰                     d¦  «        r‰dz  Št          ˆfd„|D ¦   «         d¦  «        }|€|||<   Œn‰dt          |¦  «         …         }|                     d¦  «        r6|t          d¦  «        d…         }||
vrt          d|› �¦  «        ‚|
|         }n<||vr8dD ]0Š|                     ‰¦  «        r|t          ‰¦  «        d…         } nŒ1n||v°8|dk    rG| 	                    dd¦  «         	                    dd¦  «        }d| 	                    dd¦  «        z   |z   }n:| 	                    dd¦  «         	                    dd¦  «        }|dk    rdnd|z   |z   }||v rt          d|› �¦  «        ‚|||<   �Œ±|S )zNNormalize adapter names, optionally composing linear LoKr factors for loading.)r?   Ú	diffusersÚkohyazUnknown LoRA naming format: r   Nc              3   ó"   •K  — | ]	}‰|z   V — Œ
d S ©N© )r   ÚaliasÚprefixs     €r   r   z$convert_lora_keys.<locals>.<genexpr>X   s'   øè è € Ð#WÐ#W°u F¨U¡NÐ#WÐ#WÐ#WÐ#WÐ#WÐ#Wr   Úmapped_modulesÚ_z"Ambiguous underscore module name: )z.lora_A.weightz.lora_B.weightz.lora_down.weightz.lora_up.weightr   z.dora_scaler   r   c              3   ó    K  — | ]	}d |z   V — Œ
dS )r   NrF   )r   r/   s     r   r   z$convert_lora_keys.<locals>.<genexpr>g   s&   è è € ÐBÐB v�c˜F‘lÐBÐBÐBÐBÐBÐBr   z.lora.z.lora_z.default.weightz.weight)z.lora_Az.lora_Bc              3   óF   •K  — | ]}‰                      |¦  «        ¯|V — Œd S rE   r	   )r   r/   Ú
normalizeds     €r   r   z$convert_lora_keys.<locals>.<genexpr>l   s6   øè è € ÐTÐT &¸
×8KÒ8KÈFÑ8SÔ8SÐT�vÐTÐTÐTÐTÐTÐTr   Ú
lora_unet_zUnknown Kohya LoRA module: )zbase_model.model.zmodel.diffusion_model.údiffusion_model.útransformer.rC   z.lora_A.z.lora_down.z.lora_B.z	.lora_up.r?   rO   rP   zLoRA keys collide at )r   r>   r!   Útupler#   r
   ÚlenÚupdater"   Úreplacer   ÚnextÚ
startswith)r+   Úmodule_namesÚtargetÚfused_split_mapÚsplit_linear_modules_mapr@   ÚnameÚfusedÚspecÚsplitÚencodedr   Úresultr0   r=   r/   r-   Úencoded_nameÚdestinationrM   rH   s                      @@r   Úconvert_lora_keysrc   M   sG  øø€ àÐ4Ð4Ð4ÝÐ@¸Ð@Ð@ÑAÔAÐAØð =Ý0°Ñ<Ô<ˆ
Ý�|Ñ$Ô$€LÝ�lÑ#Ô#ð 
Að 
AˆØ+Ð1¨r×8Ò8Ñ:Ô:ð 	Xð 	X‰KˆE�4Ø�uŠ}ˆ} §¢¨c°E©kÑ :Ô :ˆ}Ø˜l¥ E¡
¤
˜{˜lÔ+�Ø×#Ò#Ð#WÐ#WÐ#WÐ#WÀÐEUÔ@VÐ#WÑ#WÔ#WÑWÔWÐWøð 5Ð:¸×AÒAÑCÔCð 	Að 	A‰KˆE�4ØÐ.Ô/ð Að A�Ø˜5’=�= D§M¢M°#¸±+Ñ$>Ô$>�=Ø ×$Ò$ T¨,­C°©J¬J¨;¨,Ô%7¸%Ñ%?Ñ@Ô@Ð@øðAð	Að €GØð ð ˆØ�lŠl˜3 Ñ$Ô$ˆØ�'ˆ>ˆ>˜g cœl¨dÒ2Ð2ÝÐGÀ#ÐGÐGÑHÔHÐHØˆ�‰ˆØ€Fð M€HØ•ÐBÐBÕ1AÐBÑBÔBÑBÔBÑB€HØ ×&Ò&Ñ(Ô(ð  $ñ  $‰
ˆˆUØ—[’[ ¨8Ñ4Ô4×<Ò<Ð=NÐPYÑZÔZˆ
Ø×ÒÐ5Ñ6Ô6ð 	$Ø˜)Ñ#ˆJÝÐTÐTÐTÐT¨HÐTÑTÔTÐVZÑ[Ô[ˆØˆ>ØˆF�3‰KØØ˜M�c &™kœk˜\˜MÔ*ˆØ×Ò˜\Ñ*Ô*ð 	Ø!¥# lÑ"3Ô"3Ð"4Ð"4Ô5ˆLØ 7Ð*Ð*Ý Ð!M¸|Ð!MÐ!MÑNÔNÐNØ˜\Ô*ˆFˆFð  Ð,Ð,Øqð ð �FØ×(Ò(¨Ñ0Ô0ð Ø!'­¨F©¬¨¨Ô!5˜Ø˜ðð ð  Ð,Ð,ð �WÒÐØ—^’^ J°Ñ>Ô>×FÒFÀzÐS^Ñ_Ô_ˆFØ&¨¯ª¸¸SÑ)AÔ)AÑAÀFÑJˆKˆKà—^’^ M°:Ñ>Ô>×FÒFÀ{ÐT^Ñ_Ô_ˆFØ17¸7Ò1BÐ1BÐ-Ð-ÈÐZ`Ñ`ÐciÑiˆKØ˜&Ð Ð ÝÐB°[ÐBÐBÑCÔCÐCØ#ˆˆ{ÑÑØ€Mr   )r?   NN)Ú__doc__r'   r   r>   rc   rF   r   r   ú<module>re      sb   ððð ð €€€ð HÐ ð:ð :ð :ðz<ð  FKð <ð <ð <ð <ð <ð <ð <r   