Ë
    ÿÍ:jTR  ã                   ó  — d Z ddlZddlmZmZ ddlmZmZmZm	Z	 ddl
Z
ddlmZmZ ddlmZ ddlmZ ddlmZ ddlZdd	lmZ dd
lmZ ddlmZ ddlmZ esdgZ ej>                  e «      Z!de"de#fd„Z$ G d„ de«      Z% G d„ de%«      Z&y)z_
Finetuning Callback
^^^^^^^^^^^^^^^^^^^^

Freeze and unfreeze models for finetuning purposes.
é    N)Ú	GeneratorÚIterable)ÚAnyÚCallableÚOptionalÚUnion)ÚModuleÚ
ModuleDict)Ú
_BatchNorm)Ú	Optimizer)Úoverride)ÚCallback)ÚMisconfigurationException)Ú_TORCHVISION_AVAILABLE)Úrank_zero_warnÚBackboneFinetuningÚepochÚreturnc                  ó   — y)Ng       @© )r   s    ú{/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/pytorch_lightning/callbacks/finetuning.pyÚmultiplicativer   ,   s   € Øó    c                   óž  — e Zd ZdZd)d„Zedeeef   fd„«       Z	edeeef   ddfd„«       Z
ed*d„«       Zedeeeeeef      f   dee   fd„«       Ze	 d+deeeeeef      f   dededefd„«       Zedeeeeeef      f   ddfd„«       Zededdfd„«       Zed,deeeeeef      f   deddfd„«       Zedededefd„«       Ze	 	 	 d-deeeeeef      f   dedee   dededdfd„«       Zedd	d
ddeddfd„«       Zedeeeef      dedeeeef      fd „«       Zd
dd!ed"ed#eeeef      ddf
d$„Z ed*d%„«       Z!d
dd&ededdfd'„Z"d.d(„Z#y)/ÚBaseFinetuningaß  This class implements the base logic for writing your own Finetuning Callback.

    .. warning::  This is an :ref:`experimental <versioning:Experimental API>` feature.

    Override ``freeze_before_training`` and ``finetune_function`` methods with your own logic.

    ``freeze_before_training``: This method is called before ``configure_optimizers``
        and should be used to freeze any modules parameters.

    ``finetune_function``: This method is called on every train epoch start and should be used to
        ``unfreeze`` any parameters. Those parameters need to be added in a new ``param_group``
        within the optimizer.

    .. note:: Make sure to filter the parameters based on ``requires_grad``.

    Example::

        >>> from torch.optim import Adam
        >>> class MyModel(pl.LightningModule):
        ...     def configure_optimizer(self):
        ...         # Make sure to filter the parameters based on `requires_grad`
        ...         return Adam(filter(lambda p: p.requires_grad, self.parameters()))
        ...
        >>> class FeatureExtractorFreezeUnfreeze(BaseFinetuning):
        ...     def __init__(self, unfreeze_at_epoch=10):
        ...         super().__init__()
        ...         self._unfreeze_at_epoch = unfreeze_at_epoch
        ...
        ...     def freeze_before_training(self, pl_module):
        ...         # freeze any module you want
        ...         # Here, we are freezing `feature_extractor`
        ...         self.freeze(pl_module.feature_extractor)
        ...
        ...     def finetune_function(self, pl_module, current_epoch, optimizer):
        ...         # When `current_epoch` is 10, feature_extractor will start training.
        ...         if current_epoch == self._unfreeze_at_epoch:
        ...             self.unfreeze_and_add_param_group(
        ...                 modules=pl_module.feature_extractor,
        ...                 optimizer=optimizer,
        ...                 train_bn=True,
        ...             )

    r   Nc                 ó    — i | _         d| _        y ©NF)Ú_internal_optimizer_metadataÚ_restarting©Úselfs    r   Ú__init__zBaseFinetuning.__init__]   s   € ØMOˆÔ)Ø ˆÕr   c                 ó   — d| j                   iS )NÚinternal_optimizer_metadata)r   r    s    r   Ú
state_dictzBaseFinetuning.state_dicta   s   € ð *¨4×+LÑ+Lð
ð 	
r   r%   c                 ó>   — d| _         d|v r|d   | _        y || _        y )NTr$   )r   r   )r!   r%   s     r   Úload_state_dictzBaseFinetuning.load_state_dictg   s*   € àˆÔØ(¨JÑ6Ø0:Ð;XÑ0YˆDÕ-ð 1;ˆDÕ-r   Útrainerú
pl.TrainerÚ	pl_moduleúpl.LightningModulec                 ó  — | j                   r| j                  rkt        |j                  «       «      }t	        |j
                  «      D ]:  \  }}|| j                  v sŒ| j                  | j                  |   |«      }||_        Œ< d| _         y y r   )r   r   ÚdictÚnamed_parametersÚ	enumerateÚ
optimizersÚ_apply_mapping_to_param_groupsÚparam_groups)r!   r(   r*   r.   Úopt_idxÚ	optimizerr2   s          r   Úon_fit_startzBaseFinetuning.on_fit_startp   s‘   € ð ×ÒØ×0Ò0Ü#'¨	×(BÑ(BÓ(DÓ#EÐ Ü*3°G×4FÑ4FÓ*Gò >Ñ&�G˜YØ $×"CÑ"CÒCØ'+×'JÑ'JØ ×=Ñ=¸gÑFÐHXó(˜ð 2>˜	Õ.ð>ð  %ˆDÕð r   Úmodulesc                 ój  — t        | t        «      r| j                  «       } t        | t        «      r9g }| D ]&  }|j	                  t
        j                  |«      «       Œ( t        |«      }n| j                  «       }|D �cg c]*  }t        |j                  «       «      r|j                  sŒ)|‘Œ, c}S c c}w )aH  This function is used to flatten a module or an iterable of modules into a list of its leaf modules (modules
        with no children) and parent modules that have parameters directly themselves.

        Args:
            modules: A given module or an iterable of modules

        Returns:
            List of modules

        )Ú
isinstancer
   Úvaluesr   Úextendr   Úflatten_modulesÚiterr6   ÚlistÚchildrenÚ_parameters)r6   Ú_flatten_modulesÚmÚ_moduless       r   r;   zBaseFinetuning.flatten_modules~   s–   € ô �gœzÔ*Ø—n‘nÓ&ˆGä�gœxÔ(Ø!ÐØò K�Ø ×'Ñ'¬×(FÑ(FÀqÓ(IÕJðKô Ð,Ó-‰Hà—‘Ó(ˆHð $ÖO�a¬4°·
±
³Ô+=ÀÇÃ’ÒOÐOùÒOs   Á>*B0Â)B0Útrain_bnÚrequires_gradc              #   óÀ   K  — t         j                  | «      } | D ]@  }t        |t        «      r|sŒ|j	                  d¬«      D ]  }|j
                  |k(  sŒ|–— Œ ŒB y­w)am  Yields the `requires_grad` parameters of a given module or list of modules.

        Args:
            modules: A given module or an iterable of modules
            train_bn: Whether not to train the BatchNorm module
            requires_grad: Whether to create a generator for trainable or non-trainable parameters.
        Returns:
            Generator

        F©ÚrecurseN)r   r;   r8   r   Ú
parametersrD   )r6   rC   rD   ÚmodÚparams        r   Úfilter_paramszBaseFinetuning.filter_params™   sc   è ø€ ô !×0Ñ0°Ó9ˆØò 	 ˆCÜ˜#œzÔ*±8ØàŸ™°˜Ó6ò  �Ø×&Ñ&¨-Ó7Ø“Kñ ñ		 ùs   ‚AAÁ	Ac                 ó¦   — t         j                  | «      } | D ]7  }t        |t        «      rd|_        |j                  d¬«      D ]	  }d|_        Œ Œ9 y)zˆUnfreezes the parameters of the provided modules.

        Args:
            modules: A given module or an iterable of modules

        TFrF   N)r   r;   r8   r   Útrack_running_statsrH   rD   )r6   ÚmodulerJ   s      r   Úmake_trainablezBaseFinetuning.make_trainable°   sZ   € ô !×0Ñ0°Ó9ˆØò 	+ˆFÜ˜&¤*Ô-Ø-1�Ô*à×*Ñ*°5Ð*Ó9ò +�Ø&*�Õ#ñ+ñ		+r   rN   c                 ón   — t        | t        «      rd| _        | j                  d¬«      D ]	  }d|_        Œ y)zjFreezes the parameters of the provided module.

        Args:
            module: A given module

        FrF   N)r8   r   rM   rH   rD   )rN   rJ   s     r   Úfreeze_modulezBaseFinetuning.freeze_moduleÀ   s;   € ô �fœjÔ)Ø).ˆFÔ&à×&Ñ&¨uÐ&Ó5ò 	(ˆEØ"'ˆEÕñ	(r   c                 ó¶   — t         j                  | «      } | D ]?  }t        |t        «      r|rt         j	                  |«       Œ+t         j                  |«       ŒA y)zôFreezes the parameters of the provided modules.

        Args:
            modules: A given module or an iterable of modules
            train_bn: If True, leave the BatchNorm layers in training mode

        Returns:
            None

        N)r   r;   r8   r   rO   rQ   )r6   rC   rI   s      r   ÚfreezezBaseFinetuning.freezeÎ   sK   € ô !×0Ñ0°Ó9ˆØò 	2ˆCÜ˜#œzÔ*©xÜ×-Ñ-¨cÕ2ä×,Ñ,¨SÕ1ñ		2r   r4   Úparamsc                 óÔ   ‡— g }g }|D ]C  Št        ˆfd„| j                  D «       «      s|j                  ‰«       Œ3|j                  ‰«       ŒE |rt        dt	        | «      › d�«       |S )ac  This function is used to exclude any parameter which already exists in this optimizer.

        Args:
            optimizer: Optimizer used for parameter exclusion
            params: Iterable of parameters used to check against the provided optimizer

        Returns:
            List of parameters not contained in this optimizer param groups

        c              3   ó^   •K  — | ]$  }|d    D ]  }t        j                  |‰«      –— Œ Œ& y­w)rT   N)ÚtorchÚequal)Ú.0ÚgroupÚprJ   s      €r   ú	<genexpr>z5BaseFinetuning.filter_on_optimizer.<locals>.<genexpr>ð   s1   øè ø€ Òj°ÐZ_Ð`hÑZiÒjÐUV”u—{‘{ 1 e×,ÐjÐ,Ñjùs   ƒ*-z¾The provided params to be frozen already exist within another group of this optimizer. Those parameters will be skipped.
HINT: Did you init your optimizer in `configure_optimizer` as such:
 z<(filter(lambda p: p.requires_grad, self.parameters()), ...) )Úanyr2   Úappendr   Útype)r4   rT   Ú
out_paramsÚremoved_paramsrJ   s       @r   Úfilter_on_optimizerz"BaseFinetuning.filter_on_optimizerá   s}   ø€ ð ˆ
ØˆØò 	-ˆEÜÓj¸)×:PÑ:PÔjÔjØ×!Ñ! %Õ(à×%Ñ% eÕ,ð		-ñ Üðô ˜“OÐ$Ð$`ðbôð Ðr   ÚlrÚinitial_denom_lrc                 ó  — t         j                  | «       |€|j                  d   d   n
t        |«      }|€|nd}t         j	                  | |d¬«      }t         j                  ||«      }|r|j                  |||z  dœ«       yy)a…  Unfreezes a module and adds its parameters to an optimizer.

        Args:
            modules: A module or iterable of modules to unfreeze.
                Their parameters will be added to an optimizer as a new param group.
            optimizer: The provided optimizer will receive new parameters and will add them to
                `add_param_group`
            lr: Learning rate for the new param group.
            initial_denom_lr: If no lr is provided, the learning from the first param group will be used
                and divided by `initial_denom_lr`.
            train_bn: Whether to train the BatchNormalization layers.

        Nr   rc   g      ð?T)rC   rD   )rT   rc   )r   rO   r2   ÚfloatrK   rb   Úadd_param_group)r6   r4   rc   rd   rC   Ú	params_lrÚdenom_lrrT   s           r   Úunfreeze_and_add_param_groupz+BaseFinetuning.unfreeze_and_add_param_groupþ   s‡   € ô* 	×%Ñ% gÔ.Ø79°z�I×*Ñ*¨1Ñ-¨dÒ3ÄuÈRÃyˆ	Ø') zÑ#°sˆÜ×-Ñ-¨gÀÐX\Ð-Ó]ˆÜ×3Ñ3°I¸vÓFˆÙØ×%Ñ%°¸yÈ8Ñ?SÑ&TÕUð r   Ústagec                 ót   — | j                  |«       ddlm} t        |j                  |«      rt        d«      ‚y )Nr   )ÚDeepSpeedStrategyz‚The Finetuning callback does not support running with the DeepSpeed strategy. Choose a different strategy or disable the callback.)Úfreeze_before_trainingÚpytorch_lightning.strategiesrm   r8   ÚstrategyÚNotImplementedError)r!   r(   r*   rk   rm   s        r   ÚsetupzBaseFinetuning.setup  s<   € à×#Ñ# IÔ.åBä�g×&Ñ&Ð(9Ô:Ü%ðHóð ð ;r   r2   Úmappingc                 óÔ   — g }| D ]U  }|j                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ }}}|d   D �cg c]  }||   ‘Œ	 c}|d<   |j                  |«       ŒW |S c c}}w c c}w )NrT   )Úitemsr^   )r2   rs   ÚoutputÚgÚkÚvÚgroup_stater[   s           r   r1   z-BaseFinetuning._apply_mapping_to_param_groups'  sv   € àˆØò 	'ˆAà,-¯G©G«I×G¡D A q¸¸h»˜1˜a™4ÐGˆKÑGØ9:¸8¹Ö$E°A W¨Q£ZÒ$EˆK˜Ñ!Ø�M‰M˜+Õ&ð		'ð
 ˆùó HùÚ$Es   ›A©A¸A%r3   Únum_param_groupsÚcurrent_param_groupsc                 ó2  — |j                  «       D ��ci c]  \  }}||“Œ
 }}}|| j                  vr | j                  ||«      | j                  |<   y |t        |«      k7  r2| j                  |   j	                  | j                  ||d  |«      «       y y c c}}w ©N)r.   r   r1   Úlenr:   )r!   r*   r3   r{   r|   Únr[   rs   s           r   Ú_storezBaseFinetuning._store1  s¥   € ð %.×$>Ñ$>Ó$@×A™D˜A˜q�1�a‘4ÐAˆÑAØ˜$×;Ñ;Ñ;Ø9=×9\Ñ9\Ø$ gó:ˆD×-Ñ-¨gÒ6ð ¤Ð%9Ó!:Ò:à×-Ñ-¨gÑ6×=Ñ=Ø×3Ñ3Ð4HÐIYÐIZÐ4[Ð]dÓeõð ;ùó Bs   ”Bc                 óâ   — t        |j                  «      D ]W  \  }}t        |j                  «      }| j	                  ||j
                  |«       |j                  }| j                  ||||«       ŒY y)úCalled when the epoch begins.N)r/   r0   r   r2   Úfinetune_functionÚcurrent_epochr�   )r!   r(   r*   r3   r4   r{   r|   s          r   Úon_train_epoch_startz#BaseFinetuning.on_train_epoch_startC  sn   € ô #,¨G×,>Ñ,>Ó"?ò 	TÑˆG�YÜ" 9×#9Ñ#9Ó:ÐØ×"Ñ" 9¨g×.CÑ.CÀYÔOØ#,×#9Ñ#9Ð Ø�K‰K˜	 7Ð,<Ð>RÕSñ		Tr   r   c                 ó   — t         ‚)z$Override to add your unfreeze logic.©rq   )r!   r*   r   r4   s       r   r„   z BaseFinetuning.finetune_functionL  ó   € ä!Ð!r   c                 ó   — t         ‚)z"Override to add your freeze logic.rˆ   ©r!   r*   s     r   rn   z%BaseFinetuning.freeze_before_trainingP  r‰   r   )r   N©r(   r)   r*   r+   r   N)TT)T)Nç      $@T©r*   r+   r   N)$Ú__name__Ú
__module__Ú__qualname__Ú__doc__r"   r   r-   Ústrr   r%   r'   r5   Ústaticmethodr   r	   r   r=   r;   Úboolr   rK   rO   rQ   rS   r   rb   r   rf   rj   rr   r1   Úintr�   r†   r„   rn   r   r   r   r   r   0   sI  „ ñ*óX!ð ð
˜D  c ™Nò 
ó ð
ð
 ð;¨$¨s°C¨x©.ð ;¸Tò ;ó ð;ð ò%ó ð%ð ðP  v¨x¸¸fÀhÐ>NÑ8OÑ/PÐ'PÑ!Qð PÐVZÐ[aÑVbò Pó ðPð4 àptñ Ø�v˜x¨¨f°hÐ.>Ñ(?Ñ@Ð@ÑAð ØMQð Øimð à	ò ó ð ð, ð+  f¨h°u¸VÀXÐ=MÑ7NÑ.OÐ&OÑ Pð +ÐUYò +ó ð+ð ð(˜fð (¨ò (ó ð(ð ñ2˜˜f h¨u°V¸XÐ5EÑ/FÑ&GÐGÑHð 2ÐTXð 2Ðdhò 2ó ð2ð$ ð yð ¸(ð Àtò ó ðð8 ð #Ø"&ØñVØ�v˜x¨¨f°hÐ.>Ñ(?Ñ@Ð@ÑAðVàðVð �U‰OðVð  ð	Vð
 ðVð 
òVó ðVð8 ð	˜\ð 	Ð6Jð 	ÐSVð 	Ð[_ò 	ó ð	ð ð°T¸$¸sÀC¸x¹.Ñ5Ið ÐTXð Ð]aÐbfÐgjÐloÐgoÑbpÑ]qò ó ððà'ðð ðð ð	ð
 # 4¨¨S¨¡>Ñ2ðð 
óð$ òTó ðTð"Ð+?ð "Èð "ÐXað "Ðfjó "ô"r   r   c                   óø   ‡ — e Zd ZdZdedddddddf	d	ed
ededee   de	dede	de	deddfˆ fd„Z
edeeef   fd„«       Zedeeef   ddfˆ fd„«       Zedˆ fd„«       Zedd„«       Zedddededdfd„«       Zˆ xZS ) r   a^  Finetune a backbone model based on a learning rate user-defined scheduling.

    When the backbone learning rate reaches the current model learning rate
    and ``should_align`` is set to True, it will align with it for the rest of the training.

    Args:
        unfreeze_backbone_at_epoch: Epoch at which the backbone will be unfreezed.
        lambda_func: Scheduling function for increasing backbone learning rate.
        backbone_initial_ratio_lr:
            Used to scale down the backbone learning rate compared to rest of model
        backbone_initial_lr: Optional, Initial learning rate for the backbone.
            By default, we will use ``current_learning /  backbone_initial_ratio_lr``
        should_align: Whether to align with current learning rate when backbone learning
            reaches it.
        initial_denom_lr: When unfreezing the backbone, the initial learning rate will
            ``current_learning_rate /  initial_denom_lr``.
        train_bn: Whether to make Batch Normalization trainable.
        verbose: Display current learning rate for model and backbone
        rounding: Precision for displaying learning rate

    Example::

        >>> import torch
        >>> import torch.nn as nn
        >>> from pytorch_lightning import LightningModule, Trainer
        >>> from pytorch_lightning.callbacks import BackboneFinetuning
        >>> import torchvision.models as models
        >>>
        >>> class TransferLearningModel(LightningModule):
        ...     def __init__(self, num_classes=10):
        ...         super().__init__()
        ...         # REQUIRED: Your model must have a 'backbone' attribute
        ...         self.backbone = models.resnet50(weights=None)
        ...         # Remove the final classification layer from backbone
        ...         self.backbone = nn.Sequential(*list(self.backbone.children())[:-1])
        ...
        ...         # Add your task-specific head
        ...         self.head = nn.Sequential(
        ...             nn.Flatten(),
        ...             nn.Linear(2048, 512),
        ...             nn.ReLU(),
        ...             nn.Linear(512, num_classes)
        ...         )
        ...
        ...     def forward(self, x):
        ...         # Extract features with backbone
        ...         features = self.backbone(x)
        ...         # Classify with head
        ...         return self.head(features)
        ...
        ...     def configure_optimizers(self):
        ...         # Initially only optimize the head - backbone will be added by callback
        ...         return torch.optim.Adam(self.head.parameters(), lr=1e-3)
        ...
        >>> # Setup the callback
        >>> multiplicative = lambda epoch: 1.5
        >>> backbone_finetuning = BackboneFinetuning(
        ...     unfreeze_backbone_at_epoch=10,  # Start unfreezing at epoch 10
        ...     lambda_func=multiplicative,     # Gradually increase backbone LR
        ...     backbone_initial_ratio_lr=0.1,  # Start backbone at 10% of head LR
        ... )
        >>> model = TransferLearningModel()
        >>> trainer = Trainer(callbacks=[backbone_finetuning])

    é
   gš™™™™™¹?NTr�   Fé   Úunfreeze_backbone_at_epochÚlambda_funcÚbackbone_initial_ratio_lrÚbackbone_initial_lrÚshould_alignrd   rC   ÚverboseÚroundingr   c
                 ó®   •— t         ‰
| �  «        || _        || _        || _        || _        || _        || _        || _        || _	        |	| _
        d | _        y r~   )Úsuperr"   rš   r›   rœ   r�   rž   rd   rC   rŸ   r    Úprevious_backbone_lr)r!   rš   r›   rœ   r�   rž   rd   rC   rŸ   r    Ú	__class__s             €r   r"   zBackboneFinetuning.__init__˜  s]   ø€ ô 	‰ÑÔà/IˆÔ'Ø%0ˆÔØ0IˆÔ&Ø4GˆÔ Ø".ˆÔØ'7ˆÔØ&ˆŒØ$ˆŒØ%ˆŒØ59ˆÕ!r   c                 ó4   — | j                   | j                  dœS )N)r$   r£   )r   r£   r    s    r   r%   zBackboneFinetuning.state_dict±  s    € ð ,0×+LÑ+LØ$(×$=Ñ$=ñ
ð 	
r   r%   c                 ó8   •— |d   | _         t        ‰| �	  |«       y )Nr£   )r£   r¢   r'   )r!   r%   r¤   s     €r   r'   z"BackboneFinetuning.load_state_dict¸  s   ø€ à$.Ð/EÑ$FˆÔ!Ü‰Ñ 
Õ+r   r*   r+   c                 ó†   •— t        |d«      r*t        |j                  t        «      rt        ‰| �  ||«      S t        d«      ‚)zŠ
        Raises:
            MisconfigurationException:
                If LightningModule has no nn.Module `backbone` attribute.
        Úbackbonez@The LightningModule should have a nn.Module `backbone` attribute)Úhasattrr8   r¨   r	   r¢   r5   r   )r!   r(   r*   r¤   s      €r   r5   zBackboneFinetuning.on_fit_start½  s<   ø€ ô �9˜jÔ)¬j¸×9KÑ9KÌVÔ.TÜ‘7Ñ'¨°Ó;Ð;Ü'Ð(jÓkÐkr   c                 ó:   — | j                  |j                  «       y r~   )rS   r¨   r‹   s     r   rn   z)BackboneFinetuning.freeze_before_trainingÈ  s   € à�‰�I×&Ñ&Õ'r   r   r4   c           	      ó.  — || j                   k(  rÅ|j                  d   d   }| j                  �| j                  n|| j                  z  }|| _        | j                  |j                  ||| j                  | j                  ¬«       | j                  rDt        j                  dt        || j                  «      › dt        || j                  «      › �«       yy|| j                   kD  r²|j                  d   d   }| j                  |dz   «      | j                  z  }| j                  r||kD  r|n|}||j                  d   d<   || _        | j                  rDt        j                  dt        || j                  «      › dt        || j                  «      › �«       yyy)	rƒ   r   rc   N)rC   rd   zCurrent lr: z, Backbone lr: é   éÿÿÿÿ)rš   r2   r�   rœ   r£   rj   r¨   rC   rd   rŸ   ÚlogÚinfoÚroundr    r›   rž   )r!   r*   r   r4   Ú
current_lrÚinitial_backbone_lrÚnext_current_backbone_lrs          r   r„   z$BackboneFinetuning.finetune_functionÌ  s­  € ð �D×3Ñ3Ò3Ø"×/Ñ/°Ñ2°4Ñ8ˆJð ×+Ñ+Ð7ð ×(Ò(à $×"@Ñ"@Ñ@ð  ð
 )<ˆDÔ%Ø×-Ñ-Ø×"Ñ"ØØ#ØŸ™Ø!%×!6Ñ!6ð .ô ð �|Š|Ü—‘Ø"¤5¨°T·]±]Ó#CÐ"Dð E$Ü$)Ð*=¸t¿}¹}Ó$MÐ#NðPõð ð �T×4Ñ4Ò4Ø"×/Ñ/°Ñ2°4Ñ8ˆJØ'+×'7Ñ'7¸À¹	Ó'BÀT×E^ÑE^Ñ'^Ð$ð ×%Ò%Ð*BÀZÒ*Oñ à-ð %ð
 0HˆI×"Ñ" 2Ñ& tÑ,Ø(@ˆDÔ%Ø�|Š|Ü—‘Ø"¤5¨°T·]±]Ó#CÐ"Dð E$Ü$)Ð*BÀDÇMÁMÓ$RÐ#SðUõð ð 5r   rŒ   rŽ   )r�   r�   r‘   r’   r   r–   r   rf   r   r•   r"   r   r-   r“   r   r%   r'   r5   rn   r   r„   Ú__classcell__)r¤   s   @r   r   r   U  s<  ø„ ñ@ðH +-Ø .Ø+0Ø/3Ø!Ø"&ØØØñ:à$'ð:ð ð:ð $)ð	:ð
 & e™_ð:ð ð:ð  ð:ð ð:ð ð:ð ð:ð 
õ:ð2 ð
˜D  c ™Nò 
ó ð
ð ð,¨$¨s°C¨x©.ð ,¸Tô ,ó ð,ð ôló ðlð ò(ó ð(ð ð%Ð+?ð %Èð %ÐXað %Ðfjò %ó ô%r   )'r’   ÚloggingÚcollections.abcr   r   Útypingr   r   r   r   rW   Útorch.nnr	   r
   Útorch.nn.modules.batchnormr   Útorch.optim.optimizerr   Útyping_extensionsr   Úpytorch_lightningÚplÚ$pytorch_lightning.callbacks.callbackr   Ú&pytorch_lightning.utilities.exceptionsr   Ú#pytorch_lightning.utilities.importsr   Ú%pytorch_lightning.utilities.rank_zeror   Ú__doctest_skip__Ú	getLoggerr�   r®   r–   rf   r   r   r   r   r   r   ú<module>rÄ      s†   ðñó ß /ß 1Ó 1ã ß 'Ý 1Ý +Ý &ã Ý 9Ý LÝ FÝ @áØ,Ð-Ðð €g×Ñ˜Ó!€ð˜#ð  %ó ôb"�Xô b"ôJ	]˜õ ]r   