ó
    óó�jÙ<  ã                   ó*  • S r SSKrSSKrSSKrSSKJrJrJr  SSKJ	r	  SSK
JrJr  SSKJr  SSKJrJr  SSKJrJrJr  SS	KJr   SSKrSS
KJr  Sr\" S5      SS S:X  a  \R:                  R<                  rO\R@                  r \" \"5      r#S r$SS jr%S r&SS jr'\RP                  " \&\	RR                  5        \	RR                  \	l*        \&\	l)        \+" \	S5      (       a  \'\	l,        \ " S S\5      5       r-\ " S S5      5       r.g! \! a    Sr NŒf = f)a3  PyTorch compatible DataLoaders

Essentially we extend PyTorch DataLoader by adding the ability to save the
data loading state, so that a checkpoint may be saved in the middle of an
epoch.

Example
-------
>>> import torch
>>> from speechbrain.utils.checkpoints import Checkpointer
>>> # An example "dataset" and its loader
>>> dataset = torch.randn(10, 1)
>>> dataloader = SaveableDataLoader(dataset, num_workers=3)
>>> # Setup the checkpointer:
>>> tmpdir = getfixture("tmpdir")
>>> checkpointer = Checkpointer(tmpdir, {"dataloader": dataloader})
>>> # Iterate:
>>> for i, data_point in enumerate(dataloader):
...     # Here you would process the data:
...     rainfall_amount_prediction = data_point * 4.0
...     # Now, imagine the experiment gets killed on the fifth batch:
...     if i == 4:
...         break
...     # Luckily, you had just saved a checkpoint:
...     if i == 3:
...         _ = checkpointer.save_checkpoint(end_of_epoch=False)
>>> # So when you restart the experiment:
>>> new_dataloader = SaveableDataLoader(dataset, num_workers=3)
>>> new_checkpointer = Checkpointer(tmpdir, {"dataloader": new_dataloader})
>>> _ = new_checkpointer.recover_if_possible()
>>> # The dataloader fast-forwards to the position where we left off:
>>> assert next(iter(new_dataloader)) == dataset[4]

Authors:
  * Aku Rouhe 2020
é    N)Ú
DataLoaderÚDistributedSamplerÚIterableDataset)Ú_BaseDataLoaderIter)ÚBatchsizeGuesserÚPaddedBatch)ÚDynamicItemDataset)ÚDistributedSamplerWrapperÚReproducibleRandomSampler)Úmark_as_loaderÚmark_as_saverÚregister_checkpoint_hooks)Ú
get_logger)ÚversionTÚ
webdataseté   z0.1.Fc                 óÒ  • UR                  SS5      nUR                  SS5      nU (       aŠ  [        U[        5      (       du  UR                  SS5      nUb  [        UUUUS9nSUS'   XCS'   U$ UR                  S5      c  [	        UUUS9nSUS'   XCS'   U$ [        UR                  SS5      US	9nXCS'    U$ U (       a*  [        U[        5      (       a  [
        R                  S
5        U$ )ak  Prepare loader_kwargs for DDP when necessary.

Arguments
---------
distributed_launch : bool
    DDP flag
rank : int
    node rank in DDP
dataset : Dataset
    The dataset to make a DataLoader for.
loader_kwargs : dict
    Keyword args to DataLoader, see PyTorch DataLoader for
    options.

Returns
-------
loader_kwargs
    augmented keyword args to DataLoader
ÚsamplerNÚshuffleFÚ	drop_last)Úrankr   r   Úbatch_sampler)r   r   )r   zDCannot automatically solve distributed sampling for IterableDataset.)ÚgetÚ
isinstancer   r
   r   ÚloggerÚwarning)Údistributed_launchr   ÚdatasetÚloader_kwargsr   r   r   s          Ú«C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\speechbrain/dataio/dataloader.pyÚdistributed_loader_specificsr!   L   s   € ð, ×Ñ 	¨4Ó0€GØ×Ñ 	¨5Ó1€Gæ¤*¨W´o×"FÑ"FØ!×%Ñ% k°5Ó9ˆ	ð ÑÜ/ØØØ#Øñ	ˆGð (-ˆM˜)Ñ$Ø'.˜)Ñ$ð. Ðð- ×Ñ˜Ó/Ñ7ä(ØØØ#ñˆGð (-ˆM˜)Ñ$Ø'.˜)Ñ$ð Ðô 0Ø×!Ñ! /°4Ó8ØñˆGð .5˜/Ò*ð Ðö 
¤
¨7´O× DÑ DÜ�‰ð#ô	
ð Ðó    c                 óö  • SU;  a  [        U [        5      (       a	  [        US'   UR                  SS5      (       aV  UR                  S5      b  [	        S5      e[        [        R                  R                  SS5      5      n[        XS	9nXBS'   US	 [        (       a   [        U [        5      (       a  S
U;  a  SUS
'   [        U [        5      (       a  [        U 40 UD6nO[        U 40 UD6nUb  [        XQ5      nU$ )a»  Makes a basic DataLoader with SpeechBrain defaults.

For DynamicItemDatasets (which return dicts), use
PaddedBatch as the default collate_fn.

Shuffling gets implemented by ReproducibleRandomSampler.

If the Dataset is not an IterableDataset, the DataLoader
is a SaveableDataLoader.

If the Dataset is a webdataset.dataset.Composable, set default
batch_size = None.

Can also loop over the underlying dataloader continuously,
and stop iterations at nominal epoch lengths.

Arguments
---------
dataset : Dataset
    The dataset to make a DataLoader for.
looped_nominal_epoch : None, int
    If an integer is given, loop the underlying DataLoader infinitely and
    set a nominal epoch length in batches (or whatever the DataLoader
    yields).
**loader_kwargs : dict
    Keyword args to DataLoader, see PyTorch DataLoader for
    options.

Returns
-------
DataLoader
    If looped_nominal_epoch is None
LoopedLoader
    If looped_nominal_epoch is not None
Ú
collate_fnr   Fr   Nz?Cannot specify both shuffle=True and a sampler in loader_kwargsÚSB_GLOBAL_SEEDi&l”!)ÚseedÚ
batch_size)r   r	   r   r   Ú
ValueErrorÚintÚosÚenvironr   ÚWDS_AVAILABLEÚ	WDS_CLASSr   r   ÚSaveableDataLoaderÚLoopedLoader)r   Úlooped_nominal_epochr   r&   r   Ú
dataloaders         r    Úmake_dataloaderr2   Ž   s   € ðJ ˜=Ó(¬ZØÔ#÷.ñ .ô '2ˆ�lÑ#à×Ñ˜ E×*Ñ*Ø×Ñ˜YÓ'Ñ3Üð+óð ô ”2—:‘:—>‘>Ð"2°IÓ>Ó?ˆÜ+¨GÑ?ˆØ#*�iÑ ð ˜)Ð$÷ 	ŠÜ�w¤	×*Ñ*Ø Ó-à&*ˆ�lÑ#ä�'œ?×+Ñ+Ü Ñ9¨=Ñ9‰
ä'¨ÑA°=ÑAˆ
ØÑ'Ü! *ÓCˆ
ØÐr"   c                 óv  • U R                   " U/UQ70 UD6  [        US5      (       aR  UR                  bD  [        UR                  5       H#  n [	        U R
                  5        US-   U l	        M%     S Ul        g g g ! [         a3    SnSUR                   S3   U S3  [        R                  " U5           MF  f = f)NÚ_speechbrain_recovery_skip_toz/Tried to fast-forward Sampler after checkpoint zrecovery by Ú z! indices. Ignoring this mismatch.é   )
Ú__old_init__Úhasattrr4   ÚrangeÚnextÚ_sampler_iterÚStopIterationÚwarningsÚwarnÚ_num_yielded)ÚselfÚloaderÚargsÚkwargsÚiÚMSGs         r    Ú
__new_initrF   à   sÆ   € Ø×Ò�fÐ.˜tÒ. vÒ.ä�Ð7×8Ñ8Ø×0Ñ0Ñ<ô �v×;Ñ;Ö<ˆAðÜ�T×'Ñ'Ô(ð !" A¡ˆDÖñ =ð 04ˆÕ,ð =ð 	9øô !ó ØG�Ø˜v×CÑCÐDÀAÑFØFØ�#Ð6Ñ7Ü—’˜cÔ"Ûðús   ÁA;Á;8B8Â7B8c                 óx   • U(       d3  [        U R                  5      U l        SU l        UR                  U l        g g ©Nr   )ÚiterÚ_index_samplerr;   r?   Ú_IterableDataset_len_called)r@   rA   Ú
first_iterrB   rC   s        r    Ú__new_resetrM   ö   s5   € ö Ü! $×"5Ñ"5Ó6ˆÔØˆÔØ+1×+MÑ+MˆÕ(ð r"   Ú_resetc                   óX   ^ • \ rS rSrSrU 4S jrU 4S jr\S 5       r\	S 5       r
SrU =r$ )r.   i  a¼  A saveable version of the PyTorch DataLoader.

See `torch.utils.data.DataLoader` for usage. This class should work exactly
like the PyTorch basic DataLoader, but this can be checkpointed with
SpeechBrain's Checkpointer.

Note
----
1. The saveability is implemented via some unfortunately slightly magical
means.
2. The data loader cannot recover after entering __iter__. Normally this is
not a problem, as recovery should happen before training begins.  However,
just before evaluation, it is also typical to recover the checkpoint at
which performance was the best. Thus, if a checkpoint is loaded after
entering __iter__, we just assume it is for this reason. A warning is
logged, but that is all.
c                 óª   >• [         TU ]  " U0 UD6  [        U R                  [        5      (       a  [
        R                  S5        S U l        S U l        g )NzkSaveableDataLoader cannot save the position in an IterableDataset. Save the position on the dataset itself.)	ÚsuperÚ__init__r   r   r   r   r   r4   Ú_speechbrain_iterator)r@   rB   rC   Ú	__class__s      €r    rR   ÚSaveableDataLoader.__init__  sJ   ø€ Ü‰Ò˜$Ð) &Ò)Ü�d—l‘l¤O×4Ñ4Ü�N‰NðLôð .2ˆÔ*Ø%)ˆÕ"r"   c                 ó0   >• [         TU ]  5       nXl        U$ ©N)rQ   Ú__iter__rS   )r@   ÚiteratorrT   s     €r    rX   ÚSaveableDataLoader.__iter__&  s   ø€ Ü‘7Ñ#Ó%ˆð &.Ô"Øˆr"   c                 ó6  • [        U R                  [        5      (       a  [        R	                  S5        U R
                  c  S nOU R
                  R                  n[        USSS9 nUR                  [        U5      5        S S S 5        g ! , (       d  f       g = f)Nz×Warning again: a checkpoint was requested on SaveableDataLoader, but the dataset is an IterableDataset. Cannot save the position in an IterableDataset. Not raising an error; assuming that you know what you're doing.Úwúutf-8©Úencoding)
r   r   r   r   r   rS   r?   ÚopenÚwriteÚstr)r@   ÚpathÚto_saveÚfos       r    Ú_speechbrain_saveÚ$SaveableDataLoader._speechbrain_save1  ss   € ä�d—l‘l¤O×4Ñ4Ü�N‰NðFôð ×%Ñ%Ñ-Ø‰Gà×0Ñ0×=Ñ=ˆGÜ�$˜ gÒ.°"Ø�H‰H”S˜“\Ô"÷ /×.Ö.ús   Á&B
Â

Bc                 ó  • U R                   b  [        R                  S5        g U(       a  g [        USS9 nUR	                  5       nU[        S 5      :X  a
   S S S 5        g [        U5      U l         S S S 5        g ! , (       d  f       g = f)NzäSaveableDataLoader was requested to load a checkpoint, but the DataLoader has already been iterated. The DataLoader file will be ignored. This is normal in evaluation, when a checkpoint is loaded just to retrieve the best model.r]   r^   )rS   r   Údebugr`   Úreadrb   r)   r4   )r@   rc   Úend_of_epochÚfiÚsaveds        r    Ú_speechbrain_loadÚ$SaveableDataLoader._speechbrain_loadA  st   € à×%Ñ%Ñ1Ü�L‰Lð:ôð Þð Ü�$ Ò)¨RØ—G‘G“IˆEØœ˜D›	Ó!à÷	 *Ð)ô 69¸³Z�Õ2÷ *×)Ö)ús   ¶!A:Á A:Á:
B)rS   r4   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rR   rX   r   rf   r   rn   Ú__static_attributes__Ú__classcell__)rT   s   @r    r.   r.     s<   ø† ñõ$*õ	ð ñ#ó ð#ð ñ@ó ö@r"   r.   c                   óX   • \ rS rSrSrSS jrS rS rS r\	S 5       r
\SS	 j5       rS
rg)r/   iY  a\  Loops an underlying iterable indefinitely, with nominal epoch lengths

This is useful for working with IterableDatasets, and particularly
webdataset-style loading. We recommend using ``.repeat()`` on the
webdataset IterableDataset instance, so that the underlying dataloader
naturally continues for ever.

Arguments
---------
loader : iterable
    A DataLoader or other iterable that is looped repeatedly.
epoch_length : int
    The length of the nominal epoch. After this many steps, raises
    StopIteration
batchsize_fn : callable
    Function for determining batch size, default ``BatchsizeGuesser``
Nc                 óz   • Xl         S U l        X l        SU l        SU l        SU l        Uc  [        5       U l        g g rH   )rA   rY   Úepoch_lengthÚstepÚtotal_stepsÚtotal_samplesr   Úbatchsize_fn)r@   rA   ry   r}   s       r    rR   ÚLoopedLoader.__init__m  sA   € ØŒØˆŒØ(ÔØˆŒ	ØˆÔØˆÔØÑÜ 0Ó 2ˆDÕð  r"   c                 óT   • U R                   c  [        U R                  5      U l         U $ rW   )rY   rI   rA   ©r@   s    r    rX   ÚLoopedLoader.__iter__w  s!   € Ø�=‰=Ñ Ü  §¡Ó-ˆDŒMØˆr"   c                 óš  • U R                   U R                  :  af  U =R                   S-  sl         U =R                  S-  sl         [        U R                  5      nU =R                  U R                  U5      -  sl        U$ SU l         [
        e! [
         a2    [        U R                  5      U l        [        U R                  5      n Nnf = f)Nr6   r   )
rz   ry   r{   r:   rY   r<   rI   rA   r|   r}   )r@   Úbatchs     r    Ú__next__ÚLoopedLoader.__next__|  s¤   € Ø�9‰9�t×(Ñ(Ó(Ø�IŠI˜‰N�IØ×Ò Ñ!Õð,Ü˜TŸ]™]Ó+�ð ×Ò $×"3Ñ"3°EÓ":Ñ:ÕØˆLàˆDŒIÜÐøô !ó ,Ü $ T§[¡[Ó 1�”Ü˜TŸ]™]Ó+’ð,ús   ÁB Â9C
Ã	C
c                 ó   • U R                   $ rW   )ry   r€   s    r    Ú__len__ÚLoopedLoader.__len__‹  s   € Ø× Ñ Ð r"   c                 óÆ   • [        USSS9 n[        U R                  US9  [        U R                  US9  [        U R                  US9  SSS5        g! , (       d  f       g= f)zSaves the needed information.r\   r]   r^   )ÚfileN)r`   Úprintrz   r{   r|   )r@   rc   re   s      r    ÚsaveÚLoopedLoader.saveŽ  sL   € ô �$˜ gÒ.°"Ü�$—)‘) "Ò%Ü�$×"Ñ"¨Ò,Ü�$×$Ñ$¨2Ò.÷ /×.Ö.ús   Œ=AÁ
A c                 óÄ  • [        USS9 n[        UR                  5       R                  5       5      U l        [        UR                  5       R                  5       5      U l        [        UR                  5       R                  5       5      U l        U(       d1  U R                  S:X  a!  U R
                  S:”  a  U R                  U l        SSS5        g! , (       d  f       g= f)zLoads the needed information.r]   r^   r   N)r`   r)   ÚreadlineÚstriprz   r{   r|   ry   )r@   rc   rk   rl   s       r    ÚloadÚLoopedLoader.load–  s˜   € ô �$ Ò)¨RÜ˜BŸK™K›M×/Ñ/Ó1Ó2ˆDŒIÜ" 2§;¡;£=×#6Ñ#6Ó#8Ó9ˆDÔÜ!$ R§[¡[£]×%8Ñ%8Ó%:Ó!;ˆDÔÞ D§I¡I°£N°t×7GÑ7GÈ!Ó7Kð !×-Ñ-�”	÷ *×)Ö)ús   ‹B=CÃ
C)r}   ry   rY   rA   rz   r|   r{   rW   )T)rp   rq   rr   rs   rt   rR   rX   r„   r‡   r   rŒ   r   r‘   ru   © r"   r    r/   r/   Y  sC   † ñô$3òò
 ò!ð ñ/ó ð/ð ó.ó ó.r"   r/   rW   )F)/rt   Ú	functoolsr*   r=   Útorch.utils.datar   r   r   Útorch.utils.data.dataloaderr   Úspeechbrain.dataio.batchr   r   Úspeechbrain.dataio.datasetr	   Úspeechbrain.dataio.samplerr
   r   Úspeechbrain.utils.checkpointsr   r   r   Úspeechbrain.utils.loggerr   r   ÚwdsÚimportlib_metadatar   r,   r   Ú
Composabler-   ÚDataPipelineÚImportErrorrp   r   r!   r2   rF   rM   Úupdate_wrapperrR   r7   r8   rN   r.   r/   r“   r"   r    Ú<module>r¢      s:  ðñ#óJ Û 	Û ç LÑ LÝ ;ç BÝ 9÷÷ñ õ
 0ðÛÝ*à€Mñ ˆ|Ó˜Q˜qÐ! VÓ+Ø—K‘K×*Ñ*‰	à×$Ñ$‰	ñ 
�HÓ	€ò?ôDHòd4ô,Nð 
× Ò ˜Ð%8×%AÑ%AÔ BØ#6×#?Ñ#?Ð Ô  Ø)Ð Ô Ù
Ð ×)Ñ)Ø!,ÐÔð ôM@˜ó M@ó ðM@ð` ÷J.ð J.ó ñJ.øði ó Ø‚Mðús   Á1D Á8D ÄDÄD