Ë
    (täiII  ã                   ó¼  — d dl Z d dlmc mZ d dl mZ ddlmZmZ ddlm	Z	  e	«       rd dl
mZmZ  ej                  e«      Zdej                   fd„Zdej                   fd	„Zdd
efd„Z G d„ de j                  j                   «      Z G d„ dej                   «      Z G d„ dej                   «      Z G d„ dej0                  «      Z G d„ dej4                  «      Zy)é    N)Únné   )Ú	deprecateÚlogging)Úis_transformers_available)ÚCLIPTextModelÚCLIPTextModelWithProjectionÚtext_encoderc                 ó&  — g }t        | t        t        f«      rXt        | j                  j
                  j                  «      D ]*  \  }}d|› d�}|j                  }|j                  ||f«       Œ, |S t        d| j                  j                  › �«      ‚)Nútext_model.encoder.layers.z
.self_attnz.do not know how to get attention modules for: )Ú
isinstancer   r	   Ú	enumerateÚ
text_modelÚencoderÚlayersÚ	self_attnÚappendÚ
ValueErrorÚ	__class__Ú__name__)r
   Úattn_modulesÚiÚlayerÚnameÚmods         úd/Volumes/fast/ai/experiments/MLX_z-image/.venv/lib/python3.12/site-packages/diffusers/models/lora.pyÚtext_encoder_attn_modulesr   '   s�   € Ø€Lä�,¤Ô0KÐ LÔMÜ! ,×"9Ñ"9×"AÑ"A×"HÑ"HÖI‰HˆAˆuØ/°¨s°*Ð=ˆDØ—/‘/ˆCØ×Ñ  s Õ,ð Jð Ðô ÐIÈ,×J`ÑJ`×JiÑJiÐIjÐkÓlÐló    c                 ó&  — g }t        | t        t        f«      rXt        | j                  j
                  j                  «      D ]*  \  }}|j                  }d|› d�}|j                  ||f«       Œ, |S t        d| j                  j                  › �«      ‚)Nr   z.mlpz(do not know how to get mlp modules for: )r   r   r	   r   r   r   r   Úmlpr   r   r   r   )r
   Úmlp_modulesr   r   Úmlp_modr   s         r   Útext_encoder_mlp_modulesr#   5   s�   € Ø€Kä�,¤Ô0KÐ LÔMÜ! ,×"9Ñ"9×"AÑ"A×"HÑ"HÖI‰HˆAˆuØ—i‘iˆGØ/°¨s°$Ð7ˆDØ×Ñ  g˜Õ/ð Jð Ðô ÐCÀL×DZÑDZ×DcÑDcÐCdÐeÓfÐfr   Ú
lora_scalec                 óˆ  — t        | «      D ]d  \  }}t        |j                  t        «      sŒ!||j                  _        ||j
                  _        ||j                  _        ||j                  _        Œf t        | «      D ]B  \  }}t        |j                  t        «      sŒ!||j                  _        ||j                  _        ŒD y ©N)r   r   Úq_projÚPatchedLoraProjectionr$   Úk_projÚv_projÚout_projr#   Úfc1Úfc2)r
   r$   Ú_Úattn_moduleÚ
mlp_modules        r   Úadjust_lora_scale_text_encoderr1   C   sœ   € Ü3°LÖA‰ˆˆ;Ü�k×(Ñ(Ô*?Õ@Ø,6ˆK×ÑÔ)Ø,6ˆK×ÑÔ)Ø,6ˆK×ÑÔ)Ø.8ˆK× Ñ Õ+ð Bô 2°,Ö?‰ˆˆ:Ü�j—n‘nÔ&;Õ<Ø(2ˆJ�N‰NÔ%Ø(2ˆJ�N‰NÕ%ñ @r   c                   óH   ‡ — e Zd Zd
ˆ fd„	Zddddœˆ fd„
Zdd„Zd„ Zd	„ Zˆ xZS )r(   Nc                 ób  •— d}t        dd|«       t        ‰	| �	  «        ddlm} || _        | j
                  j                  j                  }|€ | j
                  j                  j                  } || j
                  j                  | j
                  j                  ||||¬«      | _        || _        y )NzsUse of `PatchedLoraProjection` is deprecated. Please switch to PEFT backend by installing PEFT: `pip install peft`.r(   ú1.0.0r   )ÚLoRALinearLayer)Únetwork_alphaÚdeviceÚdtypeÚrank)r   ÚsuperÚ__init__Úmodels.lorar5   Úregular_linear_layerÚweightr7   r8   Úin_featuresÚout_featuresÚlora_linear_layerr$   )
Úselfr=   r$   r6   r9   r8   Údeprecation_messager5   r7   r   s
            €r   r;   zPatchedLoraProjection.__init__R   s£   ø€ ð TÐÜÐ)¨7Ð4GÔHä‰ÑÔÝ1à$8ˆÔ!à×*Ñ*×1Ñ1×8Ñ8ˆàˆ=Ø×-Ñ-×4Ñ4×:Ñ:ˆEá!0Ø×%Ñ%×1Ñ1Ø×%Ñ%×2Ñ2Ø'ØØØô"
ˆÔð %ˆ�r   Ú F©ÚdestinationÚprefixÚ	keep_varsc                óz   •— | j                   € | j                  j                  ||||dœŽS t        ‰| �  ||||dœŽS )NrE   )rA   r=   Ú
state_dictr:   )rB   rF   rG   rH   Úargsr   s        €r   rJ   z PatchedLoraProjection.state_dictm   sL   ø€ Ø×!Ñ!Ð)Ø7�4×,Ñ,×7Ñ7Ø ;°vÈòð ô ‰wÑ! 4°[ÈÐ[dÒeÐer   c           	      ó4  — | j                   €y | j                  j                  j                  j                  | j                  j                  j                  j
                  }}| j                  j                  j                  j                  «       }| j                   j                  j                  j                  j                  «       }| j                   j                  j                  j                  j                  «       }| j                   j                  �0|| j                   j                  z  | j                   j                  z  }||t        j                  |d d d …f   |d d d …f   «      d   z  z   }|r@t        j                  |«      j                  «       j                  «       rt!        d| › d�«      ‚|j#                  ||¬«      | j                  j                  _        d | _         |j%                  «       | _        |j%                  «       | _        || _        y ©Nr   úaThis LoRA weight seems to be broken. Encountered NaN values when trying to fuse LoRA weights for ú .LoRA weights will not be fused.©r7   r8   )rA   r=   r>   Údatar8   r7   ÚfloatÚupÚdownr6   r9   ÚtorchÚbmmÚisnanÚanyÚitemr   ÚtoÚcpuÚw_upÚw_downr$   ©	rB   r$   Úsafe_fusingr8   r7   Úw_origr\   r]   Úfused_weights	            r   Ú
_fuse_loraz PatchedLoraProjection._fuse_lorau   s´  € Ø×!Ñ!Ð)Øà×1Ñ1×8Ñ8×=Ñ=×CÑCÀT×E^ÑE^×EeÑEe×EjÑEj×EqÑEqˆvˆà×*Ñ*×1Ñ1×6Ñ6×<Ñ<Ó>ˆØ×%Ñ%×(Ñ(×/Ñ/×4Ñ4×:Ñ:Ó<ˆØ×'Ñ'×,Ñ,×3Ñ3×8Ñ8×>Ñ>Ó@ˆà×!Ñ!×/Ñ/Ð;Ø˜$×0Ñ0×>Ñ>Ñ>À×AWÑAW×A\ÑA\Ñ\ˆDà ¬e¯i©i¸¸TÂ1¸W¹ÀvÈdÒTUÈgÁÓ.WÐXYÑ.ZÑ!ZÑ[ˆáœ5Ÿ;™; |Ó4×8Ñ8Ó:×?Ñ?ÔAÜðOØOSÈfð U2ð2óð ð 1=·±ÀvÐUZ°Ó0[ˆ×!Ñ!×(Ñ(Ô-ð "&ˆÔð —H‘H“JˆŒ	Ø—j‘j“lˆŒØ$ˆ�r   c           	      óN  — t        | dd «      �t        | dd «      €y | j                  j                  j                  }|j                  |j
                  }}| j                  j                  |¬«      j                  «       }| j                  j                  |«      j                  «       }|j                  «       | j                  t        j                  |d d d …f   |d d d …f   «      d   z  z
  }|j                  ||¬«      | j                  j                  _        d | _        d | _	        y ©Nr\   r]   ©r7   r   rP   )Úgetattrr=   r>   rQ   r8   r7   r\   rZ   rR   r]   r$   rU   rV   ©rB   ra   r8   r7   r\   r]   Úunfused_weights          r   Ú_unfuse_loraz"PatchedLoraProjection._unfuse_lora•   sÿ   € Ü˜˜f dÓ+Ð7¼GÀDÈ(ÐTXÓ<YÐ<eØà×0Ñ0×7Ñ7×<Ñ<ˆØ$×*Ñ*¨L×,?Ñ,?ˆvˆà�y‰y�|‰| 6ˆ|Ó*×0Ñ0Ó2ˆØ—‘—‘ Ó'×-Ñ-Ó/ˆà%×+Ñ+Ó-°·±Ä5Ç9Á9ÈTÐRVÒXYÐRYÉ]Ð\bÐcgÒijÐcjÑ\kÓClÐmnÑCoÑ1oÑpˆØ0>×0AÑ0AÈÐW\Ð0AÓ0]ˆ×!Ñ!×(Ñ(Ô-àˆŒ	Øˆ�r   c                 óÂ   — | j                   €d| _         | j                  €| j                  |«      S | j                  |«      | j                   | j                  |«      z  z   S )Nç      ð?)r$   rA   r=   )rB   Úinputs     r   ÚforwardzPatchedLoraProjection.forward¥   s[   € Ø�?‰?Ð"Ø!ˆDŒOØ×!Ñ!Ð)Ø×,Ñ,¨UÓ3Ð3Ø×(Ñ(¨Ó/°4·?±?ÀT×E[ÑE[Ð\aÓEbÑ3bÑcÐcr   )é   Né   N©rk   F)	r   Ú
__module__Ú__qualname__r;   rJ   rb   ri   rm   Ú__classcell__©r   s   @r   r(   r(   Q   s(   ø„ õ%ð6 -1¸Àuö fó%ò@ö dr   r(   c                   ó¾   ‡ — e Zd ZdZ	 	 	 	 ddededededz  dej                  ez  dz  dej                  dz  fˆ fd	„Z
d
ej                  dej                  fd„Zˆ xZS )r5   a‘  
    A linear layer that is used with LoRA.

    Parameters:
        in_features (`int`):
            Number of input features.
        out_features (`int`):
            Number of output features.
        rank (`int`, `optional`, defaults to 4):
            The rank of the LoRA layer.
        network_alpha (`float`, `optional`, defaults to `None`):
            The value of the network alpha used for stable learning and preventing underflow. This value has the same
            meaning as the `--network_alpha` option in the kohya-ss trainer script. See
            https://github.com/darkstorm2150/sd-scripts/blob/main/docs/train_network_README-en.md#execute-learning
        device (`torch.device`, `optional`, defaults to `None`):
            The device to use for the layer's weights.
        dtype (`torch.dtype`, `optional`, defaults to `None`):
            The dtype to use for the layer's weights.
    Nr?   r@   r9   r6   r7   r8   c                 óÊ  •— t         ‰| �  «        d}t        dd|«       t        j                  ||d||¬«      | _        t        j                  ||d||¬«      | _        || _        || _        || _	        || _
        t        j                  j                  | j
                  j                  d|z  ¬«       t        j                  j                  | j                  j                  «       y )NzmUse of `LoRALinearLayer` is deprecated. Please switch to PEFT backend by installing PEFT: `pip install peft`.r5   r4   F)Úbiasr7   r8   rn   ©Ústd)r:   r;   r   r   ÚLinearrT   rS   r6   r9   r@   r?   ÚinitÚnormal_r>   Úzeros_)	rB   r?   r@   r9   r6   r7   r8   rC   r   s	           €r   r;   zLoRALinearLayer.__init__Â   s´   ø€ ô 	‰ÑÔð NÐÜÐ# WÐ.AÔBä—I‘I˜k¨4°eÀFÐRWÔXˆŒ	Ü—)‘)˜D ,°UÀ6ÐQVÔWˆŒð +ˆÔØˆŒ	Ø(ˆÔØ&ˆÔä
�‰�‰˜Ÿ	™	×(Ñ(¨a°$©hˆÔ7Ü
�‰�‰�t—w‘w—~‘~Õ&r   Úhidden_statesÚreturnc                 ó.  — |j                   }| j                  j                  j                   }| j                  |j                  |«      «      }| j	                  |«      }| j
                  �|| j
                  | j                  z  z  }|j                  |«      S r&   ©r8   rT   r>   rZ   rS   r6   r9   ©rB   r~   Ú
orig_dtyper8   Údown_hidden_statesÚup_hidden_statess         r   rm   zLoRALinearLayer.forwardÜ   óƒ   € Ø"×(Ñ(ˆ
Ø—	‘	× Ñ ×&Ñ&ˆà!ŸY™Y }×'7Ñ'7¸Ó'>Ó?ÐØŸ7™7Ð#5Ó6Ðà×ÑÐ)Ø × 2Ñ 2°T·Y±YÑ >Ñ>Ðà×"Ñ" :Ó.Ð.r   )ro   NNN)r   rq   rr   Ú__doc__ÚintrR   rU   r7   Ústrr8   r;   ÚTensorrm   rs   rt   s   @r   r5   r5   ­   s‹   ø„ ñð0 Ø&*Ø,0Ø$(ñ'àð'ð ð'ð ð	'ð
 ˜t‘|ð'ð —‘˜sÑ" TÑ)ð'ð �{‰{˜TÑ!õ'ð4
/ U§\¡\ð 
/°e·l±l÷ 
/r   r5   c                   óÀ   ‡ — e Zd ZdZ	 	 	 	 	 ddedededeeeef   z  deeeef   z  deeeef   z  ez  d	edz  fˆ fd
„Zde	j                  de	j                  fd„Zˆ xZS )ÚLoRAConv2dLayera"  
    A convolutional layer that is used with LoRA.

    Parameters:
        in_features (`int`):
            Number of input features.
        out_features (`int`):
            Number of output features.
        rank (`int`, `optional`, defaults to 4):
            The rank of the LoRA layer.
        kernel_size (`int` or `tuple` of two `int`, `optional`, defaults to 1):
            The kernel size of the convolution.
        stride (`int` or `tuple` of two `int`, `optional`, defaults to 1):
            The stride of the convolution.
        padding (`int` or `tuple` of two `int` or `str`, `optional`, defaults to 0):
            The padding of the convolution.
        network_alpha (`float`, `optional`, defaults to `None`):
            The value of the network alpha used for stable learning and preventing underflow. This value has the same
            meaning as the `--network_alpha` option in the kohya-ss trainer script. See
            https://github.com/darkstorm2150/sd-scripts/blob/main/docs/train_network_README-en.md#execute-learning
    Nr?   r@   r9   Úkernel_sizeÚstrideÚpaddingr6   c                 ó°  •— t         ‰	| �  «        d}t        dd|«       t        j                  |||||d¬«      | _        t        j                  ||ddd¬«      | _        || _        || _        t        j                  j                  | j
                  j                  d|z  ¬	«       t        j                  j                  | j                  j                  «       y )
NzmUse of `LoRAConv2dLayer` is deprecated. Please switch to PEFT backend by installing PEFT: `pip install peft`.rŒ   r4   F)r�   rŽ   r�   rw   ©rn   rn   )r�   rŽ   rw   rn   rx   )r:   r;   r   r   ÚConv2drT   rS   r6   r9   r{   r|   r>   r}   )
rB   r?   r@   r9   r�   rŽ   r�   r6   rC   r   s
            €r   r;   zLoRAConv2dLayer.__init__   sª   ø€ ô 	‰ÑÔð NÐÜÐ# WÐ.AÔBä—I‘I˜k¨4¸[ÐQWÐahÐotÔuˆŒ	ô —)‘)˜D ,¸FÈ6ÐX]Ô^ˆŒð +ˆÔØˆŒ	ä
�‰�‰˜Ÿ	™	×(Ñ(¨a°$©hˆÔ7Ü
�‰�‰�t—w‘w—~‘~Õ&r   r~   r   c                 ó.  — |j                   }| j                  j                  j                   }| j                  |j                  |«      «      }| j	                  |«      }| j
                  �|| j
                  | j                  z  z  }|j                  |«      S r&   r�   r‚   s         r   rm   zLoRAConv2dLayer.forward  r†   r   )ro   r‘   r‘   r   N)r   rq   rr   r‡   rˆ   Útupler‰   rR   r;   rU   rŠ   rm   rs   rt   s   @r   rŒ   rŒ   é   s­   ø„ ñð4 Ø-3Ø(.Ø/0Ø&*ñ'àð'ð ð'ð ð	'ð
 ˜5  c ™?Ñ*ð'ð �e˜C ˜H‘oÑ%ð'ð �u˜S #˜X‘Ñ&¨Ñ,ð'ð ˜t‘|õ'ð8
/ U§\¡\ð 
/°e·l±l÷ 
/r   rŒ   c                   óœ   ‡ — e Zd ZdZddœdedz  fˆ fd„Zdedz  fd„Zddedefd	„Z	d
„ Z
ddej                  dedej                  fd„Zˆ xZS )ÚLoRACompatibleConvz;
    A convolutional layer that can be used with LoRA.
    N©Ú
lora_layerr˜   c                óP   •— d}t        dd|«       t        ‰| �  |i |¤Ž || _        y )NzpUse of `LoRACompatibleConv` is deprecated. Please switch to PEFT backend by installing PEFT: `pip install peft`.r–   r4   ©r   r:   r;   r˜   ©rB   r˜   rK   ÚkwargsrC   r   s        €r   r;   zLoRACompatibleConv.__init__.  s3   ø€ ð QÐÜÐ&¨Ð1DÔEä‰Ñ˜$Ð) &Ò)Ø$ˆ�r   c                 ó0   — d}t        dd|«       || _        y ©NznUse of `set_lora_layer()` is deprecated. Please switch to PEFT backend by installing PEFT: `pip install peft`.Úset_lora_layerr4   ©r   r˜   ©rB   r˜   rC   s      r   rŸ   z!LoRACompatibleConv.set_lora_layer5  s    € ð OÐÜÐ" GÐ-@ÔAà$ˆ�r   r$   r_   c                 ó<  — | j                   €y | j                  j                  j                  | j                  j                  j                  }}| j                  j                  j                  «       }| j                   j                  j                  j                  j                  «       }| j                   j                  j                  j                  j                  «       }| j                   j                  �0|| j                   j                  z  | j                   j                  z  }t        j                  |j                  d¬«      |j                  d¬«      «      }|j                  |j                  «      }|||z  z   }	|r@t        j                  |	«      j!                  «       j#                  «       rt%        d| › d�«      ‚|	j'                  ||¬«      | j                  _        d | _         |j)                  «       | _        |j)                  «       | _        || _        y )Nrn   ©Ú	start_dimrN   rO   rP   )r˜   r>   rQ   r8   r7   rR   rS   rT   r6   r9   rU   ÚmmÚflattenÚreshapeÚshaperW   rX   rY   r   rZ   r[   r\   r]   Ú_lora_scale)
rB   r$   r_   r8   r7   r`   r\   r]   Úfusionra   s
             r   rb   zLoRACompatibleConv._fuse_lora;  s�  € Ø�?‰?Ð"ØàŸ™×(Ñ(×.Ñ.°·±×0@Ñ0@×0GÑ0Gˆvˆà—‘×!Ñ!×'Ñ'Ó)ˆØ�‰×!Ñ!×(Ñ(×-Ñ-×3Ñ3Ó5ˆØ—‘×%Ñ%×,Ñ,×1Ñ1×7Ñ7Ó9ˆà�?‰?×(Ñ(Ð4Ø˜$Ÿ/™/×7Ñ7Ñ7¸$¿/¹/×:NÑ:NÑNˆDä—‘˜$Ÿ,™,°˜,Ó3°V·^±^Èa°^Ó5PÓQˆØ—‘ §¡Ó/ˆØ ¨fÑ!4Ñ5ˆáœ5Ÿ;™; |Ó4×8Ñ8Ó:×?Ñ?ÔAÜðOØOSÈfð U2ð2óð ð (Ÿ?™?°&À˜?ÓFˆ�‰Ôð ˆŒð —H‘H“JˆŒ	Ø—j‘j“lˆŒØ%ˆÕr   c                 óâ  — t        | dd «      �t        | dd «      €y | j                  j                  }|j                  j                  |j                  j                  }}| j
                  j                  |¬«      j                  «       | _        | j                  j                  |«      j                  «       | _        t        j                  | j
                  j                  d¬«      | j                  j                  d¬«      «      }|j                  |j                  «      }|j                  «       | j                  |z  z
  }|j                  ||¬«      | j                  _        d | _        d | _        y )Nr\   r]   re   rn   r£   rP   )rf   r>   rQ   r8   r7   r\   rZ   rR   r]   rU   r¥   r¦   r§   r¨   r©   )rB   ra   r8   r7   rª   rh   s         r   ri   zLoRACompatibleConv._unfuse_lora]  s   € Ü˜˜f dÓ+Ð7¼GÀDÈ(ÐTXÓ<YÐ<eØà—{‘{×'Ñ'ˆØ$×)Ñ)×/Ñ/°×1BÑ1B×1IÑ1Iˆvˆà—I‘I—L‘L¨�LÓ/×5Ñ5Ó7ˆŒ	Ø—k‘k—n‘n VÓ,×2Ñ2Ó4ˆŒä—‘˜$Ÿ)™)×+Ñ+°aÐ+Ó8¸$¿+¹+×:MÑ:MÐXYÐ:MÓ:ZÓ[ˆØ—‘ ×!3Ñ!3Ó5ˆØ%×+Ñ+Ó-°×1AÑ1AÀFÑ1JÑKˆØ)×,Ñ,°FÀ%Ð,ÓHˆ�‰ÔàˆŒ	Øˆ�r   r~   Úscaler   c           	      óz  — | j                   dk7  r/t        j                  || j                  | j                   ¬«      }d}n| j                  }t        j
                  || j                  | j                  | j                  || j                  | j                  «      }| j                  €|S ||| j                  |«      z  z   S )NÚzeros)Úmode)r   r   )Úpadding_modeÚFÚpadÚ _reversed_padding_repeated_twicer�   Úconv2dr>   rw   rŽ   ÚdilationÚgroupsr˜   )rB   r~   r¬   r�   Úoriginal_outputss        r   rm   zLoRACompatibleConv.forwardo  s�   € Ø×Ñ Ò'ÜŸE™E -°×1VÑ1VÐ]a×]nÑ]nÔoˆMØ‰Gà—l‘lˆGäŸ8™8Ø˜4Ÿ;™;¨¯	©	°4·;±;ÀÈÏÉÐX\×XcÑXcó
Ðð �?‰?Ð"Ø#Ð#à# u¨t¯©¸}Ó/MÑ'MÑNÐNr   rp   ©rk   )r   rq   rr   r‡   rŒ   r;   rŸ   rR   Úboolrb   ri   rU   rŠ   rm   rs   rt   s   @r   r–   r–   )  sp   ø„ ñð DHò %¨/¸DÑ*@õ %ð%¨¸4Ñ)?ó %ñ & Uð  &¸tó  &òDñ$O U§\¡\ð O¸%ð OÈ%Ï,É,÷ Or   r–   c                   ó    ‡ — e Zd ZdZddœdedz  fˆ fd„Zdedz  fd„Zddedefd	„Z	d
„ Z
ddej                  dedej                  fˆ fd„Zˆ xZS )ÚLoRACompatibleLinearz4
    A Linear layer that can be used with LoRA.
    Nr—   r˜   c                óP   •— d}t        dd|«       t        ‰| �  |i |¤Ž || _        y )NzrUse of `LoRACompatibleLinear` is deprecated. Please switch to PEFT backend by installing PEFT: `pip install peft`.r»   r4   rš   r›   s        €r   r;   zLoRACompatibleLinear.__init__…  s3   ø€ ð SÐÜÐ(¨'Ð3FÔGä‰Ñ˜$Ð) &Ò)Ø$ˆ�r   c                 ó0   — d}t        dd|«       || _        y rž   r    r¡   s      r   rŸ   z#LoRACompatibleLinear.set_lora_layerŒ  s    € ð OÐÜÐ" GÐ-@ÔAØ$ˆ�r   r$   r_   c           	      óä  — | j                   €y | j                  j                  j                  | j                  j                  j                  }}| j                  j                  j                  «       }| j                   j                  j                  j                  j                  «       }| j                   j                  j                  j                  j                  «       }| j                   j                  �0|| j                   j                  z  | j                   j                  z  }||t        j                  |d d d …f   |d d d …f   «      d   z  z   }|r@t        j                  |«      j                  «       j                  «       rt        d| › d�«      ‚|j!                  ||¬«      | j                  _        d | _         |j#                  «       | _        |j#                  «       | _        || _        y rM   )r˜   r>   rQ   r8   r7   rR   rS   rT   r6   r9   rU   rV   rW   rX   rY   r   rZ   r[   r\   r]   r©   r^   s	            r   rb   zLoRACompatibleLinear._fuse_lora‘  s‡  € Ø�?‰?Ð"ØàŸ™×(Ñ(×.Ñ.°·±×0@Ñ0@×0GÑ0Gˆvˆà—‘×!Ñ!×'Ñ'Ó)ˆØ�‰×!Ñ!×(Ñ(×-Ñ-×3Ñ3Ó5ˆØ—‘×%Ñ%×,Ñ,×1Ñ1×7Ñ7Ó9ˆà�?‰?×(Ñ(Ð4Ø˜$Ÿ/™/×7Ñ7Ñ7¸$¿/¹/×:NÑ:NÑNˆDà ¬e¯i©i¸¸TÂ1¸W¹ÀvÈdÒTUÈgÁÓ.WÐXYÑ.ZÑ!ZÑ[ˆáœ5Ÿ;™; |Ó4×8Ñ8Ó:×?Ñ?ÔAÜðOØOSÈfð U2ð2óð ð (Ÿ?™?°&À˜?ÓFˆ�‰Ôð ˆŒð —H‘H“JˆŒ	Ø—j‘j“lˆŒØ%ˆÕr   c           	      ó&  — t        | dd «      �t        | dd «      €y | j                  j                  }|j                  |j                  }}| j
                  j                  |¬«      j                  «       }| j                  j                  |«      j                  «       }|j                  «       | j                  t        j                  |d d d …f   |d d d …f   «      d   z  z
  }|j                  ||¬«      | j                  _        d | _        d | _        y rd   )rf   r>   rQ   r8   r7   r\   rZ   rR   r]   r©   rU   rV   rg   s          r   ri   z!LoRACompatibleLinear._unfuse_lora±  sð   € Ü˜˜f dÓ+Ð7¼GÀDÈ(ÐTXÓ<YÐ<eØà—{‘{×'Ñ'ˆØ$×*Ñ*¨L×,?Ñ,?ˆvˆà�y‰y�|‰| 6ˆ|Ó*×0Ñ0Ó2ˆØ—‘—‘ Ó'×-Ñ-Ó/ˆà%×+Ñ+Ó-°×1AÑ1AÄEÇIÁIÈdÐSWÒYZÐSZÉmÐ]cÐdhÒjkÐdkÑ]lÓDmÐnoÑDpÑ1pÑqˆØ)×,Ñ,°FÀ%Ð,ÓHˆ�‰ÔàˆŒ	Øˆ�r   r~   r¬   r   c                 óŠ   •— | j                   €t        ‰| �	  |«      }|S t        ‰| �	  |«      || j                  |«      z  z   }|S r&   )r˜   r:   rm   )rB   r~   r¬   Úoutr   s       €r   rm   zLoRACompatibleLinear.forwardÁ  sF   ø€ Ø�?‰?Ð"Ü‘'‘/ -Ó0ˆCØˆJä‘'‘/ -Ó0°E¸D¿O¹OÈMÓ<ZÑ4ZÑ[ˆCØˆJr   rp   r¸   )r   rq   rr   r‡   r5   r;   rŸ   rR   r¹   rb   ri   rU   rŠ   rm   rs   rt   s   @r   r»   r»   €  sq   ø„ ñð DHò %¨/¸DÑ*@õ %ð%¨¸4Ñ)?ó %ñ
& Uð &¸tó &ò@ñ  U§\¡\ð ¸%ð È%Ï,É,÷ ñ r   r»   r¸   )rU   Útorch.nn.functionalr   Ú
functionalr±   Úutilsr   r   Úutils.import_utilsr   Útransformersr   r	   Ú
get_loggerr   ÚloggerÚModuler   r#   rR   r1   r(   r5   rŒ   r’   r–   rz   r»   © r   r   Ú<module>rË      sÆ   ðó0 ß Ð Ý ç &Ý :ñ ÔßGð 
ˆ×	Ñ	˜HÓ	%€ð¨B¯I©Ió ð¨2¯9©9ó ñ3¸Uó 3ôYd˜EŸH™HŸO™Oô Ydôx9/�b—i‘iô 9/ôx=/�b—i‘iô =/ô@TO˜Ÿ™ô TOônG˜2Ÿ9™9õ Gr   