Ë
    ÿÍ:j#n  ã                   óÂ  — U d dl mZ d dlmZmZmZmZmZmZ d dl	Z	d dl
mZ d dlmZmZ erd dlmZ d dlmZ eeeeef   f   Z G d„ d	«      Z G d
„ de«      Z	 džde	j4                  j6                  deg e	j8                  f   deee	j8                  ge	j8                  f      defd„Zi de	j<                  de	j>                  ddde	j@                  de	jB                  de	jD                  di“de	j<                  de	j>                  ddde	j@                  de	jB                  de	jD                  di“de	j<                  de	j>                  ddd e	j@                  d!e	jB                  d!e	jD                  d"i“d#e	j<                  d$e	j>                  d%dd&e	j@                  d e	jB                  d e	jD                  d'i“d(e	j<                  d)e	j>                  d*dd+e	j@                  d,e	jB                  d,e	jD                  d-i“d.e	j>                  d/dd/e	j@                  d/e	jB                  d/e	jD                  d0d1d2i“d3e	j>                  d4dd4e	j@                  d4e	jB                  d4e	jD                  d5d1d6i“d7e	j>                  d8dd8e	j@                  d8e	jB                  d8e	jD                  d9d1d:i“d;e	j>                  d<dde	j@                  d=e	jB                  d=e	jD                  d>d1d?i“d@e	j>                  dAddAe	j@                  dBe	jB                  dBe	jD                  dCd1dDi“dEe	j<                  dFe	j>                  dGddHe	j@                  dIe	jB                  dIe	jD                  dJi“dKe	j>                  dLddMe	j@                  dLe	jB                  dLe	jD                  dNd1dOi“dPe	j>                  dQddRe	j@                  dQe	jB                  dQe	jD                  dSd1dTi“dUe	j>                  dVddWe	j@                  dXe	jB                  dXe	jD                  dYd1dZi“d[e	j>                  d\dd\e	j@                  d\e	jB                  d\e	jD                  d]d1d^i“d_e	j>                  d`dd`e	j@                  d`e	jB                  d`e	jD                  dad1dbi“dce	j>                  ddddde	j@                  dde	jB                  dde	jD                  ded1dfi“e	j>                  dgddge	j@                  dge	jB                  dge	jD                  dhd1diie	j>                  djddje	j@                  dje	jB                  dje	jD                  dkd1dlie	j>                  dme	jB                  dne	jD                  dod1dpie	j>                  dqe	jB                  drie	j>                  dqe	jB                  dse	jD                  dtd1duie	j>                  dve	jB                  dwe	jD                  dxd1dyie	j>                  dze	jB                  d{e	jD                  d|d1d}ie	j>                  d~e	jB                  de	jD                  d€d1d�ie	j>                  d‚e	jB                  dƒe	jD                  d„d1d…ie	j<                  d†e	j>                  d‡e	jB                  dXie	j<                  dˆe	j>                  d‰e	jB                  dŠie	j<                  d‹e	j>                  dŒe	jB                  doid�œ¥Z#eeeeee	jH                  f   ef   f   e%dŽ<   d�d�d‘d’d“œZ&d”e	jN                  d•ee	jH                  ef   dee   fd–„Z(d—d˜de	jH                  fd™„Z) edše¬›«      Z* G dœ„ d�e+e*   «      Z,y)Ÿé    )Údeque)ÚTYPE_CHECKINGÚAnyÚCallableÚOptionalÚTypeVarÚUnionN)Úoverride)Úrank_zero_onlyÚrank_zero_warn)ÚFabric)Ú	Precisionc                   ó~   — e Zd ZdZ	 ddee   dedededdf
d„Zddd	œd
edededee   dee   ddfd„Z	de
fd„Zdd„Zy)Ú
Throughputaƒ  Computes throughput.

    +------------------------+-------------------------------------------------------------------------------------+
    | Key                    | Value                                                                               |
    +========================+=====================================================================================+
    | batches_per_sec        | Rolling average (over ``window_size`` most recent updates) of the number of batches |
    |                        | processed per second                                                                |
    +--------------------------+-----------------------------------------------------------------------------------+
    | samples_per_sec        | Rolling average (over ``window_size`` most recent updates) of the number of samples |
    |                        | processed per second                                                                |
    +--------------------------+-----------------------------------------------------------------------------------+
    | items_per_sec          | Rolling average (over ``window_size`` most recent updates) of the number of items   |
    |                        | processed per second                                                                |
    +--------------------------+-----------------------------------------------------------------------------------+
    | flpps_per_sec          | Rolling average (over ``window_size`` most recent updates) of the number of flops   |
    |                        | processed per second                                                                |
    +--------------------------+-----------------------------------------------------------------------------------+
    | device/batches_per_sec | batches_per_sec divided by world size                                               |
    +--------------------------+-----------------------------------------------------------------------------------+
    | device/samples_per_sec | samples_per_sec divided by world size                                               |
    +--------------------------+-----------------------------------------------------------------------------------+
    | device/items_per_sec   | items_per_sec divided by world size. This may include padding depending on the data |
    +--------------------------+-----------------------------------------------------------------------------------+
    | device/flops_per_sec   | flops_per_sec divided by world size.                                                |
    +--------------------------+-----------------------------------------------------------------------------------+
    | device/mfu             | device/flops_per_sec divided by world size.                                         |
    +--------------------------+-----------------------------------------------------------------------------------+
    | time                   | Total elapsed time                                                                  |
    +--------------------------+-----------------------------------------------------------------------------------+
    | batches                | Total batches seen                                                                  |
    +--------------------------+-----------------------------------------------------------------------------------+
    | samples                | Total samples seen                                                                  |
    +--------------------------+-----------------------------------------------------------------------------------+
    | lengths                | Total items seen                                                                    |
    +--------------------------+-----------------------------------------------------------------------------------+

    Example::

        throughput = Throughput()
        t0 = time()
        for i in range(1000):
            do_work()
            if torch.cuda.is_available(): torch.cuda.synchronize()  # required or else time() won't be correct
            throughput.update(time=time() - t0, samples=i)
            if i % 10 == 0:
                print(throughput.compute())

    Notes:
        - The implementation assumes that devices FLOPs are all the same as it normalizes by the world size and only
          takes a single ``available_flops`` value.
        - items_per_sec, flops_per_sec and MFU do not account for padding if present. We suggest using
          samples_per_sec or batches_per_sec to measure throughput under this circumstance.

    Args:
        available_flops: Number of theoretical flops available for a single device.
        world_size: Number of devices available across hosts. Global metrics are not included if the world size is 1.
        window_size: Number of batches to use for a rolling average.
        separator: Key separator to use when creating per-device and global metrics.

    NÚavailable_flopsÚ
world_sizeÚwindow_sizeÚ	separatorÚreturnc                 óô   — || _         || _        |dkD  sJ ‚|| _        |dkD  sJ ‚t        |¬«      | _        t        |¬«      | _        t        |¬«      | _        t        |¬«      | _        t        |¬«      | _	        y )Nr   é   )Úmaxlen)
r   r   r   Ú_MonotonicWindowÚ_timeÚ_batchesÚ_samplesÚ_lengthsr   Ú_flops)Úselfr   r   r   r   s        úz/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/lightning_fabric/utilities/throughput.pyÚ__init__zThroughput.__init__^   sr   € ð  /ˆÔØ"ˆŒØ˜AŠ~Ðˆ~Ø$ˆŒð ˜QŠÐˆô /?ÀkÔ.RˆŒ
Ü/?À{Ô/SˆŒÜ/?À{Ô/SˆŒÜ/?À{Ô/SˆŒÜ"'¨{Ô";ˆ�ó    )ÚlengthsÚflopsÚtimeÚbatchesÚsamplesr#   r$   c                óX  — | j                   j                  |«       ||k  rt        d|› d|› d�«      ‚| j                  j                  |«       | j                  j                  |«       |�•||k  rt        d|› d|› d�«      ‚| j
                  j                  |«       t        | j                  «      t        | j
                  «      k7  r8t        dt        | j
                  «      › dt        | j                  «      › d�«      ‚|�)| j                  j                  || j                  z  «       yy)	ad  Update throughput metrics.

        Args:
            time: Total elapsed time in seconds. It should monotonically increase by the iteration time with each
                call.
            batches: Total batches seen per device. It should monotonically increase with each call.
            samples: Total samples seen per device. It should monotonically increase by the batch size with each call.
            lengths: Total length of the samples seen. It should monotonically increase by the lengths of a batch with
                each call.
            flops: Flops elapased per device since last ``update()`` call. You can easily compute this by using
                :func:`measure_flops` and multiplying it by the number of batches that have been processed.
                The value might be different in each device if the batch size is not the same.

        zExpected samples (z') to be greater or equal than batches (ú)NzExpected lengths (z') to be greater or equal than samples (zIf lengths are passed (z1), there needs to be the same number of samples ()
r   ÚappendÚ
ValueErrorr   r   r   ÚlenÚRuntimeErrorr   r   )r   r%   r&   r'   r#   r$   s         r    ÚupdatezThroughput.updateq   s  € ð. 	�
‰
×Ñ˜$ÔØ�WÒÜÐ1°'°Ð:aÐbiÐajÐjkÐlÓmÐmØ�‰×Ñ˜WÔ%Ø�‰×Ñ˜WÔ%ØÐØ˜Ò Ü Ð#5°g°YÐ>eÐfmÐenÐnoÐ!pÓqÐqØ�M‰M× Ñ  Ô)Ü�4—=‘=Ó!¤S¨¯©Ó%7Ò7Ü"Ø-¬c°$·-±-Ó.@Ð-Að BÜ˜TŸ]™]Ó+Ð,¨Að/óð ð Ðà�K‰K×Ñ˜u t§¡Ñ6Õ7ð r"   c                 ó4  — | j                   d   | j                  d   | j                  d   dœ}| j                  r| j                  d   |d<   | j                  dkD  }t        | j                   «      | j                   j                  k(  �rF| j                   d   | j                   d   z
  }| j                  d   | j                  d   z
  }| j                  d   | j                  d   z
  }||z  }||z  }|j                  d| j                  › d�||z  d| j                  › d�|i«       |r0|| j                  z  }|j                  ||| j                  z  d	œ«       t        | j                  «      | j                  j                  k(  rM| j                  d   | j                  d   z
  }	|	|z  }
|
|d| j                  › d
�<   |r|
| j                  z  }||d
<   t        | j                  «      | j                  j                  k(  ržt        | j                  «      | j                  d   z
  }| j                   d   | j                   d   z
  }||z  }|| j                  z  }|r||d<   ||d| j                  › d�<   | j                  r || j                  z  |d| j                  › d�<   |S )zCompute throughput metrics.éÿÿÿÿ)r%   r&   r'   r#   r   r   ÚdeviceÚbatches_per_secÚsamples_per_sec)r2   r3   Úitems_per_secÚflops_per_secÚmfu)r   r   r   r   r   r,   r   r.   r   r   Úsumr   )r   ÚmetricsÚadd_global_metricsÚelapsed_timeÚelapsed_batchesÚelapsed_samplesÚdev_samples_per_secÚdev_batches_per_secr3   Úelapsed_lengthsÚdev_items_per_secr4   Úelapsed_flopsr5   Údev_flops_per_secs                  r    ÚcomputezThroughput.computeš   sƒ  € ð —J‘J˜r‘NØ—}‘} RÑ(Ø—}‘} RÑ(ñ
ˆð
 �=Š=Ø!%§¡¨rÑ!2ˆG�IÑà!Ÿ_™_¨qÑ0Ðô ˆt�z‰z‹?˜dŸj™j×/Ñ/Ó/ØŸ:™: b™>¨D¯J©J°q©MÑ9ˆLØ"Ÿm™m¨BÑ/°$·-±-ÀÑ2BÑBˆOØ"Ÿm™m¨BÑ/°$·-±-ÀÑ2BÑBˆOà"1°LÑ"@ÐØ"1°LÑ"@ÐØ�N‰NØ˜Ÿ™Ð(¨Ð8¸/ÈLÑ:XØ˜Ÿ™Ð(¨Ð8Ð:Mðô ñ "Ø"5¸¿¹Ñ"G�Ø—‘Ø'6Ø':¸T¿_¹_Ñ'Lñ ô ô
 �4—=‘=Ó! T§]¡]×%9Ñ%9Ò9Ø"&§-¡-°Ñ"3°d·m±mÀAÑ6FÑ"F�Ø$3°lÑ$BÐ!ØBS�˜& §¡Ð 0°Ð>Ñ?Ù%Ø$5¸¿¹Ñ$G�MØ/<�G˜OÑ,äˆt�{‰{Ó˜tŸ{™{×1Ñ1Ò1Ü §¡Ó,¨t¯{©{¸1©~Ñ=ˆMØŸ:™: b™>¨D¯J©J°q©MÑ9ˆLØ)¨LÑ8ˆMØ -°·±Ñ ?ÐÙ!Ø+8�˜Ñ(Ø>OˆG�f˜TŸ^™^Ð,¨MÐ:Ñ;Ø×#Ò#Ø8IÈD×L`ÑL`Ñ8`�˜& §¡Ð 0°Ð4Ñ5àˆr"   c                 ó  — | j                   j                  «        | j                  j                  «        | j                  j                  «        | j                  j                  «        | j
                  j                  «        y ©N)r   Úclearr   r   r   r   ©r   s    r    ÚresetzThroughput.resetÎ   sR   € Ø�
‰
×ÑÔØ�‰×ÑÔØ�‰×ÑÔØ�‰×ÑÔØ�‰×ÑÕr"   )Nr   éd   ú/)r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚfloatÚintÚstrr!   r.   Ú_THROUGHPUT_METRICSrC   rH   © r"   r    r   r       s¥   „ ñ;ð| vyñ<Ø'¨™ð<ØCFð<ØY\ð<Øorð<à	ó<ð2 "&Ø#ò'8ð ð'8ð ð	'8ð
 ð'8ð ˜#‘ð'8ð ˜‰}ð'8ð 
ó'8ðR2Ð,ó 2ôhr"   r   c                   óL   ‡ — e Zd ZdZdddeddfˆ fd„Zd
dee   dedefd	„Z	ˆ xZ
S )ÚThroughputMonitora  Computes throughput.

    This class will automatically keep a count of the number of log calls (``step``). But that can be modified as
    desired. For manual logging, using :class:`Throughput` directly might be desired.

    Example::

        logger = ...
        fabric = Fabric(logger=logger)
        throughput = ThroughputMonitor(fabric)
        t0 = time()
        for i in range(1, 100):
            do_work()
            if torch.cuda.is_available(): torch.cuda.synchronize()  # required or else time() won't be correct
            throughput.update(time=time() - t0, batches=i, samples=i)
            if i % 10 == 0:
                throughput.compute_and_log(step=i)

    Args:
        fabric: The Fabric object.
        \**kwargs: See available parameters in :class:`Throughput`

    Úfabricr   Úkwargsr   Nc                 ó¼  •— |j                  «        t        |j                  j                  «      }t	        |j
                  |«      }t        ‰| �  d||j                  dœ|¤Ž || _	        d| _
        t        | j                  «      | _        t        | j                  i ¬«      | _        t        | j                  i ¬«      | _        t        | j                  «      | _        y )N)r   r   r0   )ÚdefaultrS   )Ú_validate_launchedÚ_plugin_to_compute_dtypeÚstrategyÚ	precisionÚget_available_flopsr1   Úsuperr!   r   Ú_fabricÚstepr   r.   rC   Úcompute_and_logrH   )r   rV   rW   Údtyper   Ú	__class__s        €r    r!   zThroughputMonitor.__init__ï   s¦   ø€ Ø×!Ñ!Ô#Ü(¨¯©×)BÑ)BÓCˆÜ-¨f¯m©m¸UÓCˆÜ‰ÑÐa¨ÀV×EVÑEVÑaÐZ`ÒaØˆŒØˆŒ	ä$ T§[¡[Ó1ˆŒÜ% d§l¡l¸BÔ?ˆŒÜ-¨d×.BÑ.BÈBÔOˆÔÜ# D§J¡JÓ/ˆ�
r"   ra   c                 ó¨   — |€| j                   dz   n|| _          | j                  di |¤Ž}| j                  j                  || j                   ¬«       |S )zÁSee :meth:`Throughput.compute`

        Args:
            step: Can be used to override the logging step.
            \**kwargs: See available parameters in :meth:`Throughput.compute`

        r   )r8   ra   rS   )ra   rC   r`   Úlog_dict)r   ra   rW   r8   s       r    rb   z!ThroughputMonitor.compute_and_logü   sL   € ð (, |�T—Y‘Y ’]¸ˆŒ	Ø�$—,‘,Ñ( Ñ(ˆØ�‰×Ñ g°D·I±IÐÔ>Øˆr"   rE   )rK   rL   rM   rN   r   r!   r   rP   rR   rb   Ú__classcell__©rd   s   @r    rU   rU   Ö   sA   ø„ ñð00˜xð 0°3ð 0¸4õ 0ñ H¨S¡Mð ÀCð ÐL_÷ r"   rU   ÚmodelÚ
forward_fnÚloss_fnr   c                 óÖ   — ddl m}  |d¬«      }|5  |€ |«        n | |«       «      j                  «        ddd«       |j                  «       S # 1 sw Y   |j                  «       S xY w)a-  Utility to compute the total number of FLOPs used by a module during training or during inference.

    It's recommended to create a meta-device model for this:

    Example::

        with torch.device("meta"):
            model = MyModel()
            x = torch.randn(2, 32)

        model_fwd = lambda: model(x)
        fwd_flops = measure_flops(model, model_fwd)

        model_loss = lambda y: y.sum()
        fwd_and_bwd_flops = measure_flops(model, model_fwd, model_loss)

    Args:
        model: The model whose FLOPs should be measured.
        forward_fn: A function that runs ``forward`` on the model and returns the result.
        loss_fn: A function that computes the loss given the ``forward_fn`` output. If provided, the loss and `backward`
            FLOPs will be included in the result.

    r   )ÚFlopCounterModeF)ÚdisplayN)Útorch.utils.flop_counterrm   ÚbackwardÚget_total_flops)ri   rj   rk   rm   Úflop_counters        r    Úmeasure_flopsrs   
  sc   € õ8 9á"¨5Ô1€LØ	ñ -Øˆ?Ù�Lá‘J“LÓ!×*Ñ*Ô,÷	-ð
 ×'Ñ'Ó)Ð)÷-ð
 ×'Ñ'Ó)Ð)ús   ’&AÁA(ú	h200 sxm1g   ì=ì¾Bg  ˜™ÓwÎBÚtfloat32g  Ÿ²2#Cg  4&õkCg  4&õk,Cú	h200 nvl1g  àWëH»Bg  àWëHËBg  äìÍßCg  y`�(Cg €„?ªr'Cúh100 nvlg  $^/lÞBg €SÕCg €SÕCg  />2,Cúh100 sxmg  ˜™Ów¾Bg  $^/lÎBg €SÕüBg  />2Cú	h100 pcieg   èvH·Bg   èvHÇBg  š»Ÿ|õBg  š»Ÿ|Cg @.C€Czrtx 4090g  $êóÇÒBg €µbÆCÚint4g €µbÆCzrtx 4080g  ¬m%ÆBg €÷¯Ê)öBg €÷¯Ê)Czrtx 4080 superg  ˆ:á¼ÇBg  ˆ:á¼÷Bg  ˆ:á¼CÚl4g  ˜¼ÄŽ»Bg  $� ƒÛBg  $� ƒëBg  $� ƒûBÚl40g  ŠË“ÔBg  ŠË“äBg  ŠË“ôBg  ŠË“CÚa100g  Ðê¤¡Bg  ¸’2¼±Bg  ¸’2¼áBg  ¸’2¼ñBg  ¸’2¼CÚa6000g  \àE™ÁBg  \àE™ÑBg €ÊgºšñBg @$ šCÚa40g  xÛîÁBg  xÛîÑBg €æbcñBg À�¦CÚa10gg  ÀêP`¼Bg  4&õkÌBg  4&õkÜBg  4&õkìBg  4&õküBzrtx 3090 tig  @åœ0ÂBg  @åœ0òBg  @åœ0Czrtx 3090g  P­b0ÀBg  Üq¾$ðBg  Üq¾$ Czrtx 3080 tig  c†¿Bg  c†ïBg  Y­ÿBg  jZ»Bg  œ.¶ëBg  œ.¶ûBg  øIvv²Bg  ²gH|âBg  ²gH|òBg   }¶w�Bg  ˆôþŽÍBg  ˆôþŽÝBg  ˆôþŽíBg   h_¤Bg  ”HÔBg  ”H´Bg  ”HäBg  ”HôBg  `écÔ©Bg  H`¬ë¹Bg  ±3ñâéBg  ±3ñâùBg   xH£Bg   xH³Bg   xHãBg €±ð�FóBg  ðˆ„� Bg  <v°Bg  Â/|àBg  Â/|ðBg  pkG¦­Bg  pkG¦½Bg  *‰¬íBg  *‰¬ýBg  ÀêP`œBg  �ØáŽ¬Bg  ÀBw™Bg  ÀBw©Bg  ÀBwÙBg  @YØÔ�Bg  @YØÔ­B)zrtx 3080zrtx 3070Út4úquadro rtx 5000zrtx 2080 superzrtx 2080 tizrtx 2080zrtx 2070 superú	titan rtxúv100 sxmú	v100 pcieú
v100s pcieÚ_CUDA_FLOPSg  è�°vÄBg  ¬ÓŠ÷ÛBg  ª�CïBg  ª`teæB)Úv2Úv3Úv4Ú	v5litepodr1   rc   c                 óV  — | j                   dk(  �rmt        j                  j                  | «      }|j	                  «       }d|v rd|v rd}nµd|v r±d}n®d|v rd|v rd	}n£d
|v rd}nœd|v sd|v r”d}n‘d|v r	d|v rdnd}n„d|v r+|j                  d«      d   }d}d|v rd}nd|v rd}d|› |› �}nUd|v rd}nNd|v rd}nGd|v rd}n@d|v rd}n9d|v rd}n2d |v rd }n+d!|v rd!}n$d"|v rd#}nd$|v rd%}nd&|v rd'}nt        d(|›�«       y)|t        vrt        d(|›d*|›�«       y)t        |   }|t        j                  u r&d+d,l	m
}  |«       rt        j                  «       d-k7  rd.}||vrt        |›d/|› �«       y)t        ||   «      S | j                   d0k(  r�d+d1lm} |rd+d2lm}	 nd+d2lm}	 |	j%                  «       }
|
j'                  d3«      xs |
d4   j                  d5«      d+   }|j	                  «       }t)        |t*        «      sJ ‚|t,        vrt        d6|›d7|› �«       y)t        t,        |   «      S y))8z²Returns the available theoretical FLOPs.

    This is an optimistic upper limit that could only be achievable if only thick matmuls were run in a benchmark
    environment.

    ÚcudaÚh200Úsxm1rt   Únvl1rv   Úh100Úhbm3rx   Únvlrw   ÚpcieÚhbm2ery   r{   Úteslar|   zgeforce rtxú é   Ú r_   z superÚtiz tizrtx r~   r}   r   r€   r�   r‚   rƒ   zv100-sxmr„   z	v100-pcier…   z
v100s-pcier†   zFLOPs not found for Nz
, chip is r   )Ú_is_ampere_or_laterÚhighestru   z does not support Úxla)Ú_XLA_GREATER_EQUAL_2_1)ÚtpuÚTYPEÚACCELERATOR_TYPEú-zFLOPs not found for TPU z with )ÚtypeÚtorchr�   Úget_device_nameÚlowerÚsplitr   r‡   Úfloat32Ú"lightning_fabric.accelerators.cudar›   Úget_float32_matmul_precisionrP   Ú!lightning_fabric.accelerators.xlarž   Útorch_xla._internalrŸ   Útorch_xla.experimentalÚget_tpu_envÚgetÚ
isinstancerQ   Ú
_TPU_FLOPS)r1   rc   Údevice_nameÚchipÚnumberÚextraÚdtype_to_flopsr›   rž   rŸ   Útpu_envs              r    r^   r^   "  s–  € ð ‡{�{�fÓÜ—j‘j×0Ñ0°Ó8ˆØ× Ñ Ó"ˆØ�T‰>Ø˜‰~Ø"‘Ø˜4‘Ø"‘Ø�t‰^Ø˜‰~Ø!‘Ø˜$‘Ø!‘Ø˜4‘ 7¨d¡?Ø"‘Ø�T‰\Ø# t™O‘5°‰DØ˜dÑ"Ø—Z‘Z “_ QÑ'ˆFØˆEØ˜$‰Ø ‘Ø˜‘Ø�Ø˜&˜ % Ð)‰DØ˜‰_Ø‰DØ�t‰^Ø‰DØ�d‰]Ø‰DØ�t‰^Ø‰DØ�T‰\Ø‰DØ $Ñ&Ø$‰DØ˜DÑ Ø‰DØ˜4ÑØ‰DØ˜DÑ Ø‰DØ˜TÑ!Ø‰Dô Ð1°+°ÐAÔBØØ”{Ñ"äÐ1°+°À
È4È(ÐSÔTØÜ$ TÑ*ˆØ”E—M‘MÑ!ÝNá"Ô$¬×)KÑ)KÓ)MÐQZÒ)ZØ"�Ø˜Ñ&ä˜k˜_Ð,>¸u¸gÐFÔGØÜ�> %Ñ(Ó)Ð)à‡{�{�eÒÝLá!Þ/å2à—/‘/Ó#ˆà—k‘k &Ó)ÒV¨WÐ5GÑ-H×-NÑ-NÈsÓ-SÐTUÑ-VˆØ× Ñ Ó"ˆÜ˜+¤sÔ+Ð+Ð+Ø”zÑ!ÜÐ5°k°_ÀFÈ5È'ÐRÔSØÜ”:˜dÑ#Ó$Ð$ð! r"   Úpluginr   c                 ó   — ddl m}m}m}m}m}m}m}m}m	}	 t        | |«      st        d| › �«      ‚t        | |«      r| j                  S t        | ||f«      r| j                  S t        | |«      rt        j                  S t        | |	|f«      r| j                   S t        | |«      rt        j"                  S t        | |«      r(| j$                  j&                  xs t        j(                  S t        | |«      rt        j(                  S t+        | «      ‚)Nr   )	ÚBitsandbytesPrecisionÚDeepSpeedPrecisionÚDoublePrecisionÚFSDPPrecisionÚHalfPrecisionÚMixedPrecisionr   ÚTransformerEnginePrecisionÚXLAPrecisionz!Expected a precision plugin, got )Úlightning_fabric.pluginsrº   r»   r¼   r½   r¾   r¿   r   rÀ   rÁ   r°   r-   rc   Ú_desired_input_dtyper¤   ÚdoubleÚ_desired_dtypeÚint8Úmixed_precision_configÚreduce_dtyper¨   ÚNotImplementedError)
r¸   rº   r»   r¼   r½   r¾   r¿   r   rÀ   rÁ   s
             r    r[   r[   }  sé   € ÷
÷ 
õ 
ô �f˜iÔ(ÜÐ>¸v¸hÐGÓHÐHÜ�&Ð/Ô0Ø�|‰|ÐÜ�&˜=¨.Ð9Ô:Ø×*Ñ*Ð*Ü�&˜/Ô*Ü�|‰|ÐÜ�&˜<Ð);Ð<Ô=Ø×$Ñ$Ð$Ü�&Ð4Ô5Ü�z‰zÐÜ�&˜-Ô(Ø×,Ñ,×9Ñ9ÒJ¼U¿]¹]ÐJÜ�&˜)Ô$Ü�}‰}ÐÜ
˜fÓ
%Ð%r"   ÚT)Úboundc                   ó€   ‡ — e Zd ZdZdeddfˆ fd„Zedee   fd„«       Z	e
deddfd„«       Ze
d	ed
eddfd„«       Zˆ xZS )r   zjCustom fixed size list that only supports right-append and ensures that all values increase monotonically.r   r   Nc                 ó0   •— t         ‰| �  «        || _        y rE   )r_   r!   r   )r   r   rd   s     €r    r!   z_MonotonicWindow.__init__¤  s   ø€ Ü‰ÑÔØˆ�r"   c                 ó*   — t        | «      dkD  r| d   S y )Nr   r0   )r,   rG   s    r    Úlastz_MonotonicWindow.last¨  s   € äˆt‹9�qŠ=Ø˜‘8ˆOØr"   Úxc                 ó°   — | j                   }|�||k\  rt        d|› d|› �«      ‚t        j                  | |«       t	        | «      | j
                  kD  r| d= y y )Nz&Expected the value to increase, last: z, current: r   )rÏ   r+   Úlistr*   r,   r   )r   rÐ   rÏ   s      r    r*   z_MonotonicWindow.append®  s\   € à�y‰yˆØÐ ¨¢	ÜÐEÀdÀVÈ;ÐWXÐVYÐZÓ[Ð[Ü�‰�D˜!Ôäˆt‹9�t—{‘{Ò"Ø�Q‘ð #r"   ÚkeyÚvaluec                 ó   — t        d«      ‚)Nz__setitem__ is not supported)rÉ   )r   rÓ   rÔ   s      r    Ú__setitem__z_MonotonicWindow.__setitem__¸  s   € ô "Ð"@ÓAÐAr"   )rK   rL   rM   rN   rP   r!   Úpropertyr   rÊ   rÏ   r
   r*   r   rÖ   rg   rh   s   @r    r   r   ¡  sˆ   ø„ Ùtð˜sð  tõ ð ð�h˜q‘kò ó ðð
 ð˜ð ˜dò ó ðð ðB˜sð B¨3ð B°4ò Bó ôBr"   r   rE   )-Úcollectionsr   Útypingr   r   r   r   r   r	   r¤   Útyping_extensionsr
   Ú$lightning_fabric.utilities.rank_zeror   r   Úlightning_fabricr   rÂ   r   ÚdictrQ   rP   rO   rR   r   rU   ÚnnÚModuleÚTensorrs   Úfloat64r¨   Úbfloat16Úfloat16rÆ   r‡   rc   Ú__annotations__r±   r1   r^   r[   rÊ   rÒ   r   rS   r"   r    ú<module>rå      s«  ðö ß I× Iã Ý &ç OáÝ'Ý2à˜3  c¨5 jÑ 1Ð1Ñ2Ð ÷
sñ sôl1˜
ô 1ðn AEñ$*Ø�8‰8�?‰?ð$*à˜˜UŸ\™\Ð)Ñ*ð$*ð �h §¡˜~¨u¯|©|Ð;Ñ<Ñ=ð$*ð 	ó	$*ðN`@ð Ø�‰�vØ�‰�vØ�FØ�‰˜Ø�‰�vØ�
‰
�Fðð`@ð Ø�‰�vØ�‰�vØ�FØ�‰˜Ø�‰�vØ�
‰
�Fðð`@ð( Ø�‰�uØ�‰�xØ�HØ�‰˜	Ø�‰�yØ�
‰
�Iðð)`@ð8 Ø�‰�wØ�‰�wØ�HØ�‰˜Ø�‰�xØ�
‰
�Iðð9`@ðH Ø�‰�wØ�‰�wØ�FØ�‰˜Ø�‰�vØ�
‰
�GððI`@ð\ Ø�‰�wØ�GØ�‰˜Ø�‰�wØ�
‰
�HØ�	ðð]`@ðl Ø�‰�wØ�GØ�‰˜Ø�‰�wØ�
‰
�HØ�ððm`@ð| Ø�‰�wØ�GØ�‰˜Ø�‰�wØ�
‰
�HØ�ðð}`@ðL 	Ø�‰�wØ�EØ�‰˜Ø�‰�vØ�
‰
�FØ�ððM`@ð\ 
Ø�‰�wØ�GØ�‰˜Ø�‰�vØ�
‰
�FØ�ðð]`@ðr Ø�‰�vØ�‰�wØ�FØ�‰˜Ø�‰�vØ�
‰
�Fððs`@ðB Ø�‰�wØ�GØ�‰˜Ø�‰�wØ�
‰
�HØ�ððC`@ðR 
Ø�‰�wØ�GØ�‰˜Ø�‰�wØ�
‰
�HØ�ððS`@ðd Ø�‰�wØ�GØ�‰˜Ø�‰�vØ�
‰
�FØ�ððe`@ðt Ø�‰�uØ�EØ�‰˜Ø�‰�uØ�
‰
�FØ�ððu`@ðD Ø�‰�wØ�GØ�‰˜Ø�‰�wØ�
‰
�FØ�ððE`@ðT Ø�‰�wØ�GØ�‰˜Ø�‰�wØ�
‰
�HØ�ððU`@ðf 	�‰�wØ�GØ�‰˜Ø�‰�wØ�
‰
�FØ�ðð 	�‰�wØ�GØ�‰˜Ø�‰�wØ�
‰
�HØ�ðð 	�‰�vØ�‰�uØ�
‰
�FØ�ð	ð 	�‰�wØ�‰�wðð
 	�‰�wØ�‰�wØ�
‰
�HØ�ð	ð 	�‰�wØ�‰�wØ�
‰
�HØ�ð	ð 	�‰�wØ�‰�wØ�
‰
�HØ�ð	ð 	�‰�vØ�‰�wØ�
‰
�FØ�ð	ð 	�‰�wØ�‰�wØ�
‰
�FØ�ð	ð 	�‰�vØ�‰�wØ�‰�vðð 	�‰�tØ�‰�uØ�‰�vðð 	�‰�vØ�‰�wØ�‰�vðòw`@€ˆT�#�t˜E # u§{¡{Ð"2Ñ3°UÐ:Ñ;Ð;Ñ<ó `ðN à
à
àñ€
ðX% §¡ð X%°U¸5¿;¹;ÈÐ;KÑ5Lð X%ÐQYÐZ]ÑQ^ó X%ðv& [ð &°U·[±[ó &ñB ˆC�uÔ€ôB�t˜A‘wõ Br"   