ó
    ÊÙ¢jà  ã                   óÎ   • S SK Jr  S SKJr  S SKJrJrJrJrJ	r	  S SK
r
S SK
Jr  S SKJrJr  S SKJ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  S SKJr   " S S\5      rg)é    )Ú	Generator)Úcontextmanager)ÚAnyÚCallableÚLiteralÚOptionalÚUnionN)ÚTensor)ÚLBFGSÚ	Optimizer)Úoverride)Ú_optimizer_handles_unscaling)Ú_TORCH_GREATER_EQUAL_2_4)ÚOptimizable)Ú	Precision)ÚGradClipAlgorithmType)ÚMisconfigurationExceptionc                   óŒ  ^ • \ rS rSrSr SS\S   S\S\S   S	S4S
 jjr\	S\
SSS	\
4U 4S jj5       r\	S\SSS\/ \4   S\S	\4
U 4S jj5       r\	S\R"                  4S\S\\\4   S\S	S4U 4S jjj5       rS	\R0                  4S jr\	\S	\S   4S j5       5       r\	S	\\\4   4S j5       r\	S\\\4   S	S4S j5       rSr U =r!$ ) ÚMixedPrecisioné   a2  Plugin for Automatic Mixed Precision (AMP) training with ``torch.autocast``.

Args:
    precision: Whether to use ``torch.float16`` (``'16-mixed'``) or ``torch.bfloat16`` (``'bf16-mixed'``).
    device: The device for ``torch.autocast``.
    scaler: An optional :class:`torch.cuda.amp.GradScaler` to use.

NÚ	precision©ú16-mixedú
bf16-mixedÚdeviceÚscalerztorch.amp.GradScalerÚreturnc                 óŠ  • US;  a&  [        S[        U 5      R                   SU< S35      eXl        Uc`  U R                  S:X  aP  [        (       a  [
        R                  R                  US9O'[
        R                  R                  R                  5       nUb  U R                  S:X  a  [        SU S	35      eX l
        X0l        g )
Nr   z	`Passed `z(precision=z1)`. Precision must be '16-mixed' or 'bf16-mixed'.r   )r   r   z6`precision='bf16-mixed'` does not use a scaler, found Ú.)Ú
ValueErrorÚtypeÚ__name__r   r   ÚtorchÚampÚ
GradScalerÚcudar   r   r   )Úselfr   r   r   s       ÚµC:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\pytorch_lightning/plugins/precision/amp.pyÚ__init__ÚMixedPrecision.__init__(   s½   € ð Ð6Ó6ÜØœD ›J×/Ñ/Ð0°¸I¹=ð IAð Bóð ð
 #ŒØ‰>˜dŸn™n°
Ó:ß<TÒ<T”U—Y‘Y×)Ñ)°Ð)Ñ8ÔZ_×ZdÑZd×ZhÑZh×ZsÑZsÓZuˆFØÑ $§.¡.°LÓ"@Ü+Ð.dÐekÐdlÐlmÐ,nÓoÐoØŒØ�ó    ÚtensorÚmodulezpl.LightningModulec                 ór   >• U R                   b  U R                   R                  U5      n[        TU ]  X5      $ ©N)r   ÚscaleÚsuperÚpre_backward)r'   r,   r-   Ú	__class__s      €r(   r2   ÚMixedPrecision.pre_backward<   s1   ø€ à�;‰;Ñ"Ø—[‘[×&Ñ& vÓ.ˆFÜ‰wÑ# FÓ3Ð3r+   Ú	optimizerÚmodelÚclosureÚkwargsc                 óÊ  >• U R                   c  [        TU ]  " U4X#S.UD6$ [        U[        5      (       a  [        S5      eU" 5       nUS L =(       a    UR                  n[        U5      (       d"  U(       d  U R                   R                  U5        U R                  X!5        U(       d9  U R                   R                  " U40 UD6nU R                   R                  5         U$ U$ )N)r6   r7   z/AMP and the LBFGS optimizer are not compatible.)r   r1   Úoptimizer_stepÚ
isinstancer   r   Úautomatic_optimizationr   Úunscale_Ú_after_closureÚstepÚupdate)	r'   r5   r6   r7   r8   Úclosure_resultÚskip_unscalingÚstep_outputr3   s	           €r(   r:   ÚMixedPrecision.optimizer_stepB   sÊ   ø€ ð �;‰;Ñä‘7Ò)¨)Ð\¸5Ñ\ÐU[Ñ\Ð\Ü�i¤×'Ñ'Ü+Ð,]Ó^Ð^Ù ›ˆð (¨4Ð/×P°E×4PÑ4Pˆä+¨I×6Ñ6¾~ð �K‰K× Ñ  Ô+à×Ñ˜EÔ-ö àŸ+™+×*Ò*¨9Ñ?¸Ñ?ˆKØ�K‰K×ÑÔ ØÐØÐr+   g        Úclip_valÚgradient_clip_algorithmc                 ó’   >• US:”  a2  [        U5      (       a"  [        S[        U5      R                   S35      e[        TU ]  XUS9  g )Nr   zThe current optimizer, z†, does not allow for gradient clipping because it performs unscaling of gradients internally. HINT: Are you using a 'fused' optimizer?)r5   rE   rF   )r   ÚRuntimeErrorr!   Ú__qualname__r1   Úclip_gradients)r'   r5   rE   rF   r3   s       €r(   rJ   ÚMixedPrecision.clip_gradientsd   sX   ø€ ð �a‹<Ô8¸×CÑCÜØ)¬$¨y«/×*FÑ*FÐ)Gð Hsð sóð ô 	‰Ñ¨Ð_vÐÒwr+   c                 ó¢   • U R                   S:X  a  [        R                  O[        R                  n[        R                  " U R
                  USS9$ )Nr   F)ÚdtypeÚcache_enabled)r   r#   Úbfloat16ÚhalfÚautocastr   )r'   rM   s     r(   Úautocast_context_managerÚ'MixedPrecision.autocast_context_managerr   s3   € Ø"&§.¡.°LÓ"@”—’ÄeÇjÁjˆÜ�~Š~˜dŸk™k°ÀeÑLÐLr+   )NNNc              #   óh   #   • U R                  5          Sv •  SSS5        g! , (       d  f       g= f7f)zEnable autocast context.N)rR   ©r'   s    r(   Úforward_contextÚMixedPrecision.forward_contextv   s!   é € ð ×*Ñ*Õ,Û÷ -×,Ö,üs   ‚2“!˜	2¡
/«2c                 óT   • U R                   b  U R                   R                  5       $ 0 $ r/   )r   Ú
state_dictrU   s    r(   rY   ÚMixedPrecision.state_dict}   s$   € à�;‰;Ñ"Ø—;‘;×)Ñ)Ó+Ð+Øˆ	r+   rY   c                 óV   • U R                   b  U R                   R                  U5        g g r/   )r   Úload_state_dict)r'   rY   s     r(   r\   ÚMixedPrecision.load_state_dictƒ   s#   € à�;‰;Ñ"Ø�K‰K×'Ñ'¨
Õ3ð #r+   )r   r   r   r/   )"r"   Ú
__module__rI   Ú__firstlineno__Ú__doc__r   Ústrr   r)   r   r
   r2   r   r   r   r:   r   ÚNORMr   r	   ÚintÚfloatrJ   r#   rQ   rR   r   r   rV   ÚdictrY   r\   Ú__static_attributes__Ú__classcell__)r3   s   @r(   r   r      s›  ø† ñð 48ñ	àÐ3Ñ4ðð ðð Ð/Ñ0ð	ð
 
õð( ð4 6ð 4Ð3Gð 4ÈFö 4ó ð4ð
 ðàðð $ðð ˜"˜c˜'Ñ"ð	ð
 ðð 
öó ððB ð '*Ø9N×9SÑ9Sñ	xàðxð ˜˜U˜
Ñ#ðxð "7ð	xð
 
÷xó ðxðM¨%¯.©.ô Mð Øð Ð+;Ñ!<ó ó ó ðð
 ð˜D  c ™Nó ó ðð
 ð4¨$¨s°C¨x©.ð 4¸Tó 4ó ö4r+   r   ) Úcollections.abcr   Ú
contextlibr   Útypingr   r   r   r   r	   r#   r
   Útorch.optimr   r   Útyping_extensionsr   Úpytorch_lightningÚplÚ&lightning_fabric.plugins.precision.ampr   Ú"lightning_fabric.utilities.importsr   Ú lightning_fabric.utilities.typesr   Ú-pytorch_lightning.plugins.precision.precisionr   Úpytorch_lightning.utilitiesr   Ú&pytorch_lightning.utilities.exceptionsr   r   © r+   r(   Ú<module>rv      sB   ðõ &Ý %ß :Õ :ã Ý ß (Ý &ã Ý OÝ GÝ 8Ý CÝ =Ý Lôh4�Yõ h4r+   