Ë
    ùÿæiq= ã                  ó´  — U d Z ddlmZ ddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlmZ ddlmZmZmZmZmZ ddlmZ ddl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!m"Z"m#Z#m$Z$ dd
l%m&Z&m'Z' ddl(m)Z)m*Z*m+Z+m,Z, erddlm-Z- g d¢Z. ed«      Z/ edd¬«      Z0ee1gdf   Z2ee3e/   gef   Z4ejj                  jl                  Z6de7d<   ejj                  jp                  Z8ejr                  jt                  Z: ejv                  e<«      Z= G d„ d«      Z> G d„ de+«      Z?d„ Z@d#d„ZAd„ ZB G d„ dee0   «      ZC G d„ d«      ZD G d„ d eD«      ZE G d!„ d"eD«      ZFy)$a  Definition of the DataLoader and associated iterators that subclass _BaseDataLoaderIter.

To support these two classes, in `./_utils` we define many utility methods and
functions to be run in multiprocessing. E.g., the data loading worker loop is
in `./_utils/worker.py`.
é    )ÚannotationsN)ÚCallable)ÚAnyÚGenericÚNoReturnÚTYPE_CHECKINGÚTypeVar)ÚSelf)ÚExceptionWrapper)Ú_utils)Ú!_IterDataPipeSerializationWrapperÚ _MapDataPipeSerializationWrapperÚIterDataPipeÚMapDataPipe)ÚDatasetÚIterableDataset)ÚBatchSamplerÚRandomSamplerÚSamplerÚSequentialSampler)ÚIterable)Ú
DataLoaderÚget_worker_infoÚdefault_collateÚdefault_convertÚ_TÚ_T_coT)Ú	covariantÚ_collate_fn_tr   c                  ó$   — e Zd ZdZdZed„ «       Zy)Ú_DatasetKindr   é   c                ó°   — | t         j                  k(  r"t        j                  j	                  ||||«      S t        j                  j                  ||||«      S ©N)r!   ÚMapr   ÚfetchÚ_MapDatasetFetcherÚ_IterableDatasetFetcher)ÚkindÚdatasetÚauto_collationÚ
collate_fnÚ	drop_lasts        úp/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.pyÚcreate_fetcherz_DatasetKind.create_fetcherR   sR   € à”<×#Ñ#Ò#Ü—<‘<×2Ñ2Ø˜¨°Yóð ô —<‘<×7Ñ7Ø˜¨°Yóð ó    N)Ú__name__Ú
__module__Ú__qualname__r%   r   Ústaticmethodr/   © r0   r.   r!   r!   N   s   „ Ø
€CØ€Hàñó ñr0   r!   c                  ó   — e Zd ZdZd„ Zy)Ú_InfiniteConstantSamplerzxAnalogous to ``itertools.repeat(None, None)``.

    Used as sampler for :class:`~torch.utils.data.IterableDataset`.
    c              #  ó   K  — 	 d –— Œ­wr$   r5   ©Úselfs    r.   Ú__iter__z!_InfiniteConstantSampler.__iter__d   s   è ø€ ØØŠJð ùs   ‚	N)r1   r2   r3   Ú__doc__r;   r5   r0   r.   r7   r7   ^   s   „ ñó
r0   r7   c                 ó¤   — t        j                  «       r<t        j                  «       r(t        j                  «       t        j                  «       fS y)N)r"   r   )ÚdistÚis_availableÚis_initializedÚget_world_sizeÚget_rankr5   r0   r.   Ú_get_distributed_settingsrC   i   s6   € Ü×ÑÔœt×2Ñ2Ô4Ü×"Ñ"Ó$¤d§m¡m£oÐ5Ð5àr0   c                ó~  — |}t         j                  j                  j                  «       }|€t	        d«      ‚|j
                  }|j                  }t        |t        t        f«      st	        d«      ‚||z  }||z  |z   }t         j                  j                  j                  j                  |||«       | �	 | |«       y y )Nz4Worker info is None in sharding worker init functionz;datapipe must be an instance of IterDataPipe or MapDataPipe)ÚtorchÚutilsÚdatar   ÚAssertionErrorÚnum_workersr*   Ú
isinstancer   r   Úgraph_settingsÚapply_sharding)Úworker_init_fnÚ
world_sizeÚrank_idÚ	worker_idÚglobal_worker_idÚinfoÚtotal_workersÚdatapipes           r.   Ú_sharding_worker_init_fnrU   p   s»   € Ø ÐÜ�;‰;×Ñ×+Ñ+Ó-€DØ€|ÜÐSÓTÐTØ×$Ñ$€MØ�|‰|€HÜ�h¤¬{Ð ;Ô<ÜØIó
ð 	
ð
 �ZÑ€MØ'¨*Ñ4°wÑ>Ðä	‡K�K×Ñ×#Ñ#×2Ñ2Ø�-Ð!1ôð Ð!Ù�yÕ!ð "r0   c                óð   — t        j                  dt         j                  ¬«      j                  | ¬«      }t	        |t
        j                  «      rt        j                  |d|¬«       |j                  «       S )Nr5   ©Údtype©Ú	generatorr   )ÚsrcÚgroup)	rE   ÚemptyÚint64Úrandom_rJ   r>   ÚProcessGroupÚ	broadcastÚitem)rZ   ÚpgÚ_shared_seeds      r.   Ú_share_dist_seedre   ‡   sS   € Ü—;‘;˜r¬¯©Ô5×=Ñ=È	Ð=ÓR€LÜ�"”d×'Ñ'Ô(Ü�‰�|¨°"Õ5Ø×ÑÓÐr0   c                  óp  ‡ — e Zd ZU dZded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ded<   ded<   ded<   dZ	 	 	 	 	 	 	 	 	 	 	 	 d#dddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d$d„Zd%d„Zed„ «       Z	e	j                  d&d„«       Z	d&ˆ fd„Zd%d„Zed„ «       Zed „ «       Zd'd!„Zd&d"„Zˆ xZS )(r   a  
    Data loader combines a dataset and a sampler, and provides an iterable over the given dataset.

    The :class:`~torch.utils.data.DataLoader` supports both map-style and
    iterable-style datasets with single- or multi-process loading, customizing
    loading order and optional automatic batching (collation) and memory pinning.

    See :py:mod:`torch.utils.data` documentation page for more details.

    Args:
        dataset (Dataset): dataset from which to load the data.
        batch_size (int, optional): how many samples per batch to load
            (default: ``1``).
        shuffle (bool, optional): set to ``True`` to have the data reshuffled
            at every epoch (default: ``False``).
        sampler (Sampler or Iterable, optional): defines the strategy to draw
            samples from the dataset. Can be any ``Iterable`` with ``__len__``
            implemented. If specified, :attr:`shuffle` must not be specified.
        batch_sampler (Sampler or Iterable, optional): like :attr:`sampler`, but
            returns a batch of indices at a time. Mutually exclusive with
            :attr:`batch_size`, :attr:`shuffle`, :attr:`sampler`,
            and :attr:`drop_last`.
        num_workers (int, optional): how many subprocesses to use for data
            loading. ``0`` means that the data will be loaded in the main process.
            (default: ``0``)
        collate_fn (Callable, optional): merges a list of samples to form a
            mini-batch of Tensor(s).  Used when using batched loading from a
            map-style dataset.
        pin_memory (bool, optional): If ``True``, the data loader will copy Tensors
            into device/CUDA pinned memory before returning them.  If your data elements
            are a custom type, or your :attr:`collate_fn` returns a batch that is a custom type,
            see the example below.
        drop_last (bool, optional): set to ``True`` to drop the last incomplete batch,
            if the dataset size is not divisible by the batch size. If ``False`` and
            the size of dataset is not divisible by the batch size, then the last batch
            will be smaller. (default: ``False``)
        timeout (numeric, optional): if positive, the timeout value for collecting a batch
            from workers. Should always be non-negative. (default: ``0``)
        worker_init_fn (Callable, optional): If not ``None``, this will be called on each
            worker subprocess with the worker id (an int in ``[0, num_workers - 1]``) as
            input, after seeding and before data loading. (default: ``None``)
        multiprocessing_context (str or multiprocessing.context.BaseContext, optional): If
            ``None``, the default
            `multiprocessing context <https://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods>`_ # noqa: D401
            of your operating system will
            be used. (default: ``None``)
        generator (torch.Generator, optional): If not ``None``, this RNG will be used
            by RandomSampler to generate random indexes and multiprocessing to generate
            ``base_seed`` for workers. (default: ``None``)
        prefetch_factor (int, optional, keyword-only arg): Number of batches loaded
            in advance by each worker. ``2`` means there will be a total of
            2 * num_workers batches prefetched across all workers. (default value depends
            on the set value for num_workers. If value of num_workers=0 default is ``None``.
            Otherwise, if value of ``num_workers > 0`` default is ``2``).
        persistent_workers (bool, optional): If ``True``, the data loader will not shut down
            the worker processes after a dataset has been consumed once. This allows to
            maintain the workers `Dataset` instances alive. (default: ``False``)
        pin_memory_device (str, optional): Deprecated, the current :ref:`accelerator<accelerators>`
            will be used as the device if ``pin_memory=True``.
        in_order (bool, optional): If ``False``, the data loader will not enforce that batches
            are returned in a first-in, first-out order. Only applies when ``num_workers > 0``. (default: ``True``)


    .. warning:: If the ``spawn`` start method is used, :attr:`worker_init_fn`
                 cannot be an unpicklable object, e.g., a lambda function. See
                 :ref:`multiprocessing-best-practices` on more details related
                 to multiprocessing in PyTorch.

    .. warning:: ``len(dataloader)`` heuristic is based on the length of the sampler used.
                 When :attr:`dataset` is an :class:`~torch.utils.data.IterableDataset`,
                 it instead returns an estimate based on ``len(dataset) / batch_size``, with proper
                 rounding depending on :attr:`drop_last`, regardless of multi-process loading
                 configurations. This represents the best guess PyTorch can make because PyTorch
                 trusts user :attr:`dataset` code in correctly handling multi-process
                 loading to avoid duplicate data.

                 However, if sharding results in multiple workers having incomplete last batches,
                 this estimate can still be inaccurate, because (1) an otherwise complete batch can
                 be broken into multiple ones and (2) more than one batch worth of samples can be
                 dropped when :attr:`drop_last` is set. Unfortunately, PyTorch can not detect such
                 cases in general.

                 See `Dataset Types`_ for more details on these two types of datasets and how
                 :class:`~torch.utils.data.IterableDataset` interacts with
                 `Multi-process data loading`_.

    .. warning:: See :ref:`reproducibility`, and :ref:`dataloader-workers-random-seed`, and
                 :ref:`data-loading-randomness` notes for random seed related questions.

    .. warning:: Setting `in_order` to `False` can harm reproducibility and may lead to a skewed data
                 distribution being fed to the trainer in cases with imbalanced data.
    úDataset[_T_co]r*   ú
int | NoneÚ
batch_sizeÚintrI   ÚboolÚ
pin_memoryr-   ÚfloatÚtimeoutzSampler | IterableÚsamplerÚstrÚpin_memory_deviceÚprefetch_factorz_BaseDataLoaderIter | NoneÚ	_iteratorFNÚ T)rr   Úpersistent_workersrq   Úin_orderc               óR  — t         j                  j                  d«       |dk  rt        d«      ‚|
dk  rt        d«      ‚|dk(  r|�t        d«      ‚|dkD  r|€d}n|�|dk  rt        d«      ‚|r|dk(  rt        d«      ‚|| _        || _        || _        || _        || _        |
| _	        || _
        || _        || _        t        | j                  t        «      rt        | j                  «      | _        n4t        | j                  t         «      rt#        | j                  «      | _        t        |t$        «      r�t&        j(                  | _        t        |t        «      r8|�Ht         j,                  j.                  j0                  j3                  ||¬	«      }n|d
vrt        d|› �«      ‚|�t        d|› �«      ‚|�.t        d|› �«      ‚t5        |«      }t&        j6                  | _        |�|rt        d«      ‚|�|dk7  s|s|€|	rt        d«      ‚d }d}	n|€|	rt        d«      ‚|€C| j*                  t&        j(                  k(  rt9        «       }n|rt;        ||¬«      }nt=        |«      }|�|€t?        |||	«      }|| _         |	| _!        || _"        || _#        || _$        |€A| jJ                  rtL        jN                  jP                  }ntL        jN                  jR                  }|| _*        || _+        d| _,        d | _-        d | _.        | j_                  «        t        j`                  ddd«       y )Nzpython.data_loaderr   zXnum_workers option should be non-negative; use num_workers=0 to disable multiprocessing.z%timeout option should be non-negativez—prefetch_factor option could only be specified in multiprocessing.let num_workers > 0 to enable multiprocessing, otherwise set prefetch_factor to None.é   z-prefetch_factor option should be non-negativez/persistent_workers option needs num_workers > 0)Úshuffle>   FNzVDataLoader with IterableDataset: expected unspecified shuffle option, but got shuffle=zVDataLoader with IterableDataset: expected unspecified sampler option, but got sampler=zbDataLoader with IterableDataset: expected unspecified batch_sampler option, but got batch_sampler=z1sampler option is mutually exclusive with shuffler"   z[batch_sampler option is mutually exclusive with batch_size, shuffle, sampler, and drop_lastFzVbatch_size=None option disables auto-batching and is mutually exclusive with drop_lastrY   TÚ
DataloaderÚenabledÚTrue)1rE   Ú_CÚ_log_api_usage_onceÚ
ValueErrorr*   rI   rr   rl   rq   rn   rM   Úmultiprocessing_contextrv   rJ   r   r   r   r   r   r!   r   Ú_dataset_kindrF   rG   rK   Úapply_shuffle_settingsrk   r%   r7   r   r   r   ri   r-   ro   Úbatch_samplerrZ   Ú_auto_collationr   Úcollater   r   r,   ru   Ú_DataLoader__initializedÚ_IterableDataset_len_calledrs   Úcheck_worker_number_rationalityÚ	set_vital)r:   r*   ri   ry   ro   rƒ   rI   r,   rl   r-   rn   rM   r€   rZ   rr   ru   rq   rv   s                     r.   Ú__init__zDataLoader.__init__ø   sT  € ô* 	�‰×$Ñ$Ð%9Ô:à˜Š?Üð@óð ð
 �QŠ;ÜÐDÓEÐEà˜!Ò Ð ;Üðhóð ð ˜1Š_ Ð!8Ø‰OØÐ(¨_¸qÒ-@ÜÐLÓMÐMá +°Ò"2ÜÐNÓOÐOàˆŒØ&ˆÔØ.ˆÔØ$ˆŒØ!2ˆÔØˆŒØ,ˆÔØ'>ˆÔ$Ø ˆŒô �d—l‘l¤LÔ1Ü<¸T¿\¹\ÓJˆD�LÜ˜Ÿ™¤kÔ2Ü;¸D¿L¹LÓIˆDŒLô �gœÔ/Ü!-×!6Ñ!6ˆDÔô4 ˜'¤<Ô0ØÐ&Ü#Ÿk™k×.Ñ.×=Ñ=×TÑTØ¨ð Uó ‘Gð  Ñ-Ü ØlÐmtÐluÐvóð ð Ð"ä ØlÐmtÐluÐvóð ð Ð*ä ðCØCPÀ/ðSóð ô
 ˜7“mˆGÜ!-×!1Ñ!1ˆDÔàÐ¡7ÜÐPÓQÐQàÐ$à˜QŠ¡'¨WÐ-@ÁIÜ ð óð ð
 ˆJØ‰IØÐáÜ ð?óð ð
 ˆ?Ø×!Ñ!¤\×%:Ñ%:Ò:ä2Ó4‘áÜ+¨G¸yÔI‘Gä/°Ó8�GàÐ! mÐ&;ä(¨°*¸iÓHˆMà$ˆŒØ"ˆŒØˆŒØ*ˆÔØ"ˆŒàÐØ×#Ò#Ü#Ÿ^™^×;Ñ;‘
ä#Ÿ^™^×;Ñ;�
à$ˆŒØ"4ˆÔà!ˆÔàð 	Ô(ð ˆŒà×,Ñ,Ô.ä�‰˜ i°Õ8r0   c                ól   — | j                   dk(  rt        | «      S | j                  «        t        | «      S ©Nr   )rI   Ú_SingleProcessDataLoaderIterrˆ   Ú_MultiProcessingDataLoaderIterr9   s    r.   Ú_get_iteratorzDataLoader._get_iterator¬  s2   € Ø×Ñ˜qÒ Ü/°Ó5Ð5à×0Ñ0Ô2Ü1°$Ó7Ð7r0   c                ó   — | j                   S r$   )Ú$_DataLoader__multiprocessing_contextr9   s    r.   r€   z"DataLoader.multiprocessing_context³  s   € à×-Ñ-Ð-r0   c                óŒ  — |�»| j                   dkD  r”t        |t        «      rRt        j                  j                  «       }||vrt        d|›d|›�«      ‚t        j                  j                  |«      }t        |t        j                  j                  «      s&t        d|› �«      ‚t        d| j                   › �«      ‚|| _        y )Nr   zFmultiprocessing_context option should specify a valid start method in z", but got multiprocessing_context=z‰multiprocessing_context option should be a valid context object or a string specifying the start method, but got multiprocessing_context=zkmultiprocessing_context can only be used with multi-process loading (num_workers > 0), but got num_workers=)rI   rJ   rp   rE   ÚmultiprocessingÚget_all_start_methodsr   Úget_contextÚpython_multiprocessingÚcontextÚBaseContextÚ	TypeErrorr‘   )r:   r€   Úvalid_start_methodss      r.   r€   z"DataLoader.multiprocessing_context·  sò   € à"Ð.Ø×Ñ !Ò#ÜÐ5´sÔ;Ü*/×*?Ñ*?×*UÑ*UÓ*WÐ'Ø.Ð6IÑIÜ(ðFØFYÐE\ð ]7Ø7NÐ6QðSóð ô
 /4×.CÑ.C×.OÑ.OØ/ó/Ð+ô "Ø+Ô-C×-KÑ-K×-WÑ-Wôô $ð3à3JÐ2KðMóð ô !ð#à#'×#3Ñ#3Ð"4ð6óð ð *AˆÕ&r0   c                ó�   •— | j                   r)|dv r%t        |› d| j                  j                  › d�«      ‚t        ‰| �  ||«       y )N)ri   rƒ   ro   r-   r*   ru   z# attribute should not be set after z is initialized)r†   r   Ú	__class__r1   ÚsuperÚ__setattr__)r:   ÚattrÚvalrœ   s      €r.   rž   zDataLoader.__setattr__Ø  sU   ø€ Ø×Ò $ð +
ñ #
ô Ø�&Ð;¸D¿N¹N×<SÑ<SÐ;TÐTcÐdóð ô 	‰Ñ˜D #Õ&r0   c                ó   — | j                   rc| j                  dkD  rT| j                  €!| j                  «       | _        | j                  S | j                  j	                  | «       | j                  S | j                  «       S rŒ   )ru   rI   rs   r�   Ú_resetr9   s    r.   r;   zDataLoader.__iter__ç  sm   € ð ×"Ò" t×'7Ñ'7¸!Ò';Ø�~‰~Ð%Ø!%×!3Ñ!3Ó!5�”ð —>‘>Ð!ð —‘×%Ñ% dÔ+Ø—>‘>Ð!à×%Ñ%Ó'Ð'r0   c                ó   — | j                   d uS r$   )rƒ   r9   s    r.   r„   zDataLoader._auto_collationö  s   € à×!Ñ!¨Ð-Ð-r0   c                óJ   — | j                   r| j                  S | j                  S r$   )r„   rƒ   ro   r9   s    r.   Ú_index_samplerzDataLoader._index_samplerú  s#   € ð ×ÒØ×%Ñ%Ð%à—<‘<Ðr0   c                ó*  — | j                   t        j                  k(  rbt        | j                  «      x}| _        | j                  �8ddlm} | j                  r|| j                  z  }|S  ||| j                  z  «      }|S t        | j                  «      S )Nr   )Úceil)r�   r!   r   Úlenr*   r‡   ri   Úmathr§   r-   r¥   )r:   Úlengthr§   s      r.   Ú__len__zDataLoader.__len__  s‚   € Ø×Ñ¤×!6Ñ!6Ò6ô" 9<¸D¿L¹LÓ8IÐIˆF�TÔ5à—‘Ð+å%à—>’>Ø# t§¡Ñ6�Fð ˆMñ " &¨4¯?©?Ñ":Ó;�FØˆMä�t×*Ñ*Ó+Ð+r0   c                óÈ  — d„ }| j                   r| j                   dk(  ry d }d}t        t        d«      r!	 t        t        j                  d«      «      }d}|€t        j                  «       }|�|}|€*t        j                   ||| j                   |«      d¬«       y | j                   |kD  r*t        j                   ||| j                   |«      d¬«       y y # t
        $ r Y Œ‹w xY w)Nc                óL   — | �dj                  | |rdnd«      nd}d|› d|› d�}|S )Nz|Our suggested max number of worker in current system is {}{}, which is smaller than what this DataLoader is going to create.rt   z% (`cpuset` is not taken into account)zUDataLoader is not able to compute a suggested max number of worker in current system.zThis DataLoader will create z worker processes in total. zª Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary.)Úformat)Únum_worker_suggestÚnum_worker_createdÚcpuset_checkedÚsuggested_max_worker_msgÚwarn_msgs        r.   Ú_create_warning_msgzGDataLoader.check_worker_number_rationality.<locals>._create_warning_msgA  sb   € ð &Ð1ðHç‘fØ*ñ  .ñ à!Hôð lð! %ð* /Ð/AÐ.BÐB^Ð_wÐ^xð y[ð [ð ð
 ˆOr0   r   FÚsched_getaffinityTrx   ©Ú
stacklevel)	rI   ÚhasattrÚosr¨   rµ   Ú	ExceptionÚ	cpu_countÚwarningsÚwarn)r:   r´   Úmax_num_worker_suggestr±   r»   s        r.   rˆ   z*DataLoader.check_worker_number_rationality&  sú   € ò6	ð8 ×Ò 4×#3Ñ#3°qÒ#8Øð "&ÐØˆÜ”2Ð*Ô+ðÜ),¬R×-AÑ-AÀ!Ó-DÓ)EÐ&Ø!%�ð "Ð)ô Ÿ™›ˆIØÐ$Ø)2Ð&à!Ð)Ü�M‰MÙ#Ø*¨D×,<Ñ,<¸nóð õ	ð à×ÑÐ4Ò4Ü�M‰MÙ#Ø*¨D×,<Ñ,<¸nóð ö	ð 5øô% ò Ùðús   µ C Ã	C!Ã C!)r"   NNNr   NFFr   NNN) r*   rg   ri   rh   ry   zbool | Nonero   zSampler | Iterable | Nonerƒ   z%Sampler[list] | Iterable[list] | NonerI   rj   r,   z_collate_fn_t | Nonerl   rk   r-   rk   rn   rm   rM   z_worker_init_fn_t | Nonerr   rh   ru   rk   rq   rp   rv   rk   ÚreturnÚNone)r¿   Ú_BaseDataLoaderIter©r¿   rÀ   ©r¿   rj   )r1   r2   r3   r<   Ú__annotations__r†   rŠ   r�   Úpropertyr€   Úsetterrž   r;   r„   r¥   r«   rˆ   Ú__classcell__©rœ   s   @r.   r   r   Ž   s®  ø… ñ[ðz ÓØÓØÓØÓØƒOØƒNØÓØÓØÓØ)Ó)Ø€Mð
 "#Ø#Ø-1Ø?CØØ+/Ø ØØØ37Ø $Øðr9ð  '+Ø#(Ø!#Øñ'r9àðr9ð ðr9ð ð	r9ð
 +ðr9ð =ðr9ð ðr9ð )ðr9ð ðr9ð ðr9ð ðr9ð 1ðr9ð  $ð!r9ð" !ð#r9ð$ ð%r9ð& ð'r9ð( 
ó)r9óh8ð ñ.ó ð.ð ×#Ñ#òAó $ðAõ@'ó(ð ñ.ó ð.ð ñ	 ó ð	 ó,÷@Yr0   r   c                  óJ   — e Zd Zd
d„Zdd„Zddd„Zd„ Zdd„Zdd„Zdd„Z	d„ Z
y	)rÁ   c                óô  — |j                   | _        d | _        d | _        t	        | j                  t
        «      rÚt        j                  «       r/t        j                  «       rt        j                  d¬«      | _        t        |j                  | j                  «      | _        t        j                  «       }|j                  | j                  «       t        j                  j                   j"                  j%                  | j                  |«      | _        |j&                  | _        |j(                  | _        |j*                  | _        |j,                  | _        |j0                  | _        |j2                  | _        t7        «       \  }}|| _        || _        |j<                  r1|j>                  r%tA        jB                  d|j>                  › d�d¬«       |j<                  r7t        jD                  j                  «       sd}tA        jB                  |d¬«       |j<                  xr t        jD                  j                  «       | _#        | jF                  r,t        jD                  jI                  «       x}�|jJ                  nd | _&        | jL                  dk(  r d	| _#        d
}tA        jB                  |d¬«       |jN                  | _(        |jR                  | _*        tW        | j0                  «      | _,        t        jZ                  dt        j\                  ¬«      j_                  |j                  ¬«      ja                  «       | _1        |jd                  | _3        d| _4        d| jj                  jl                  › d�| _7        y )NÚgloo)Úbackendznpin_memory_device is deprecated, the current accelerator will be used as the device,ignore pin_memory_device='z'.rx   r¶   zj'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.ÚmpsFzf'pin_memory' argument is set as true but not supported on MPS now, device pinned memory won't be used.r5   rW   rY   r   zenumerate(DataLoader)#z	.__next__)8r*   Ú_datasetrd   Ú_pgrJ   r   r>   r?   r@   Ú	new_groupre   rZ   rE   Ú	GeneratorÚmanual_seedrF   rG   rK   Úapply_random_seedr�   r‡   r„   r-   Ú
_drop_lastr¥   rI   Ú_num_workersrC   Ú_world_sizeÚ_rankrl   rq   r¼   r½   ÚacceleratorÚ_pin_memoryÚcurrent_acceleratorÚtypeÚ_pin_memory_devicern   Ú_timeoutr,   Ú_collate_fnÚiterÚ_sampler_iterr]   r^   r_   rb   Ú
_base_seedru   Ú_persistent_workersÚ_num_yieldedrœ   r1   Ú_profile_name)r:   ÚloaderÚ
shared_rngÚwsÚrankr³   Úaccs          r.   rŠ   z_BaseDataLoaderIter.__init__ƒ  s·  € ØŸ™ˆŒØ ˆÔØˆŒÜ�d—m‘m¤\Ô2Ü× Ñ Ô"¤t×':Ñ':Ô'<ÜŸ>™>°&Ô9�”Ü 0°×1AÑ1AÀ4Ç8Á8Ó LˆDÔÜŸ™Ó*ˆJØ×"Ñ" 4×#4Ñ#4Ô5Ü!ŸK™K×,Ñ,×;Ñ;×MÑMØ—‘˜zóˆDŒMð $×1Ñ1ˆÔØ+1×+MÑ+MˆÔ(Ø%×5Ñ5ˆÔØ ×*Ñ*ˆŒØ$×3Ñ3ˆÔØ"×.Ñ.ˆÔÜ,Ó.‰ˆˆDØˆÔØˆŒ
à×Ò ×!9Ò!9Ü�M‰Mð-Ø-3×-EÑ-EÐ,FÀbðJàõð
 ×Ò¤U×%6Ñ%6×%CÑ%CÔ%Eð;ð ô �M‰M˜(¨qÕ1ð "×,Ñ,ÒQ´×1BÑ1B×1OÑ1OÓ1QˆÔð
 ×ÒÜ×)Ñ)×=Ñ=Ó?Ð?�ÐLð �HŠHð ð	 	Ôð ×"Ñ" eÒ+Ø$ˆDÔð6ð ô �M‰M˜(¨qÕ1àŸ™ˆŒØ!×,Ñ,ˆÔÜ! $×"5Ñ"5Ó6ˆÔä�K‰K˜¤%§+¡+Ô.ß‰W˜v×/Ñ/ˆWÓ0ß‰T‹Vð 	Œð
 $*×#<Ñ#<ˆÔ ØˆÔØ5°d·n±n×6MÑ6MÐ5NÈiÐXˆÕr0   c                ó   — | S r$   r5   r9   s    r.   r;   z_BaseDataLoaderIter.__iter__Ë  s   € Øˆr0   c                óÌ  — t        | j                  «      | _        d| _        |j                  | _        t        | j                  t        «      r˜t        |j                  | j                  «      | _        t        j                  «       }|j                  | j                  «       t        j                  j                   j"                  j%                  | j                  |«      | _        y y rŒ   )rß   r¥   rà   rã   r‡   rJ   rÎ   r   re   rZ   rÏ   rd   rE   rÑ   rÒ   rF   rG   rK   rÓ   )r:   rå   Ú
first_iterræ   s       r.   r¢   z_BaseDataLoaderIter._resetÎ  s¢   € Ü! $×"5Ñ"5Ó6ˆÔØˆÔØ+1×+MÑ+MˆÔ(Ü�d—m‘m¤\Ô2Ü 0°×1AÑ1AÀ4Ç8Á8Ó LˆDÔÜŸ™Ó*ˆJØ×"Ñ" 4×#4Ñ#4Ô5Ü!ŸK™K×,Ñ,×;Ñ;×MÑMØ—‘˜zóˆD�Mð	 3r0   c                ó,   — t        | j                  «      S r$   )Únextrà   r9   s    r.   Ú_next_indexz_BaseDataLoaderIter._next_indexÚ  s   € Ü�D×&Ñ&Ó'Ð'r0   c                ó   — t         ‚r$   )ÚNotImplementedErrorr9   s    r.   Ú
_next_dataz_BaseDataLoaderIter._next_dataÝ  s   € Ü!Ð!r0   c                óH  — t         j                  j                  j                  | j                  «      5  | j
                  €| j                  «        | j                  «       }| xj                  dz  c_        | j                  t        j                  k(  rz| j                  �n| j                  | j                  kD  rUd| j                  › d| j                  › d| j                  › d�}| j                  dkD  r|dz  }t        j                   |d¬	«       |cd d d «       S # 1 sw Y   y xY w)
Nr"   zLength of IterableDataset z was reported to be z&(when accessing len(dataloader)), but z samples have been fetched. r   zâFor multiprocessing data-loading, this could be caused by not properly configuring the IterableDataset replica at each worker. Please see https://pytorch.org/docs/stable/data.html#torch.utils.data.IterableDataset for examples.rx   r¶   )rE   ÚautogradÚprofilerÚrecord_functionrä   rà   r¢   rò   rã   r�   r!   r   r‡   rÎ   rÕ   r¼   r½   )r:   rG   r³   s      r.   Ú__next__z_BaseDataLoaderIter.__next__à  sþ   € Ü�^‰^×$Ñ$×4Ñ4°T×5GÑ5GÕHØ×!Ñ!Ð)à—‘”Ø—?‘?Ó$ˆDØ×Ò Ñ"Õà×"Ñ"¤l×&;Ñ&;Ò;Ø×4Ñ4Ð@Ø×%Ñ%¨×(HÑ(HÒHð 1°·±°Ð?SÐTX×TtÑTtÐSuØ<¸T×=NÑ=NÐ<OÐOkðmð ð ×$Ñ$ qÒ(Øðsñ�Hô
 —‘˜h°1Õ5Ø÷- I×HÒHús   ´CDÄD!c                ó,   — t        | j                  «      S r$   )r¨   r¥   r9   s    r.   r«   z_BaseDataLoaderIter.__len__ù  s   € Ü�4×&Ñ&Ó'Ð'r0   c                óB   — t        d| j                  j                  «      ‚)Nz{} cannot be pickled)rñ   rœ   r1   r9   s    r.   Ú__getstate__z _BaseDataLoaderIter.__getstate__ü  s   € ô "Ð"8¸$¿.¹.×:QÑ:QÓRÐRr0   N)rå   r   r¿   rÀ   )r¿   r
   ©FrÂ   )r¿   r   )r¿   r   rÃ   )r1   r2   r3   rŠ   r;   r¢   rï   rò   r÷   r«   rú   r5   r0   r.   rÁ   rÁ   ‚  s.   „ óFYóPô
ò(ó"óó2(óSr0   rÁ   c                  ó&   ‡ — e Zd Zdˆ fd„Zd„ Zˆ xZS )r�   c                ó  •— t         ‰| �  |«       | j                  dk7  rt        d«      ‚| j                  dk7  rt        d«      ‚t        | j                  t        t        f«      rSt        j                  j                  j                  j                  | j                  | j                  | j                  «       t         j#                  | j$                  | j                  | j&                  | j(                  | j*                  «      | _        y )Nr   z2_SingleProcessDataLoaderIter requires timeout == 0z6_SingleProcessDataLoaderIter requires num_workers == 0)r�   rŠ   rÝ   rH   rÕ   rJ   rÎ   r   r   rE   rF   rG   rK   rL   rÖ   r×   r!   r/   r�   r„   rÞ   rÔ   Ú_dataset_fetcher)r:   rå   rœ   s     €r.   rŠ   z%_SingleProcessDataLoaderIter.__init__  sÌ   ø€ Ü‰Ñ˜Ô Ø�=‰=˜AÒÜ Ð!UÓVÐVØ×Ñ Ò!Ü ØHóð ô �d—m‘m¤l´KÐ%@ÔAä�K‰K×Ñ×+Ñ+×:Ñ:Ø—‘˜t×/Ñ/°·±ôô !-× ;Ñ ;Ø×ÑØ�M‰MØ× Ñ Ø×ÑØ�O‰Oó!
ˆÕr0   c                óÈ   — | j                  «       }| j                  j                  |«      }| j                  r*t        j
                  j                  || j                  «      }|S r$   )rï   rþ   r&   rÙ   r   rl   rÜ   )r:   ÚindexrG   s      r.   rò   z'_SingleProcessDataLoaderIter._next_data  sR   € Ø× Ñ Ó"ˆØ×$Ñ$×*Ñ*¨5Ó1ˆØ×ÒÜ×$Ñ$×/Ñ/°°d×6MÑ6MÓNˆDØˆr0   rÂ   )r1   r2   r3   rŠ   rò   rÇ   rÈ   s   @r.   r�   r�     s   ø„ õ
ö2r0   r�   c                  ó–   ‡ — e Zd ZdZdˆ fd„Zddˆ fd„Zej                  fd„Zd„ Z	d„ Z
dd„Zd„ Zddd	„Zdd
„Zedd„«       Zdd„Zˆ xZS )rŽ   zIIterates once over the DataLoader's dataset, as specified by the sampler.c                óÈ  •— t         ‰
| �  |«       |j                  | _        |j                  | _        | j                  dk  rt        d«      ‚| j                  dk  rt        d«      ‚|j                  €t        j                  }n|j                  }|j                  | _        t        | j                  t        t         f«      r?t#        j$                  t&        | j                  | j(                  | j*                  «      | _        |j-                  «       | _        d| _        d| _        |j5                  «       | _        g | _        g | _        t=        | j                  «      D �](  }|j-                  «       }|j?                  «        |jA                  tB        jD                  jF                  | jH                  | j                  || j.                  | j6                  | jJ                  | jL                  | jN                  | jP                  | j                  || j                  | jR                  | jT                  f¬«      }d|_+        ddl,m-} 	 |j]                  «        | j8                  jg                  |«       | j:                  jg                  |«       �Œ+ | jh                  rËtk        j4                  «       | _6        to        j,                  «       | _8        t        jr                  ju                  «       }tk        jv                  tB        jx                  jz                  | j.                  | jp                  || jl                  | j|                  f¬«      }d|_+        |j]                  «        || _?        n| j.                  | _8        | jR                  rA| jh                  r5dd l@}	| j:                  D ]"  }|	jƒ                  t„        j†                  |«       Œ$ tB        jˆ                  j‹                  t�        | «      t�        d„ | j:                  D «       «      «       tB        jˆ                  j‘                  «        d| _        | j“                  |d¬«       y # t^        t`        |f$ r tc        jd                  dd	¬
«       ‚ w xY w)Nr   zDnum_workers must be greater than 0 for MultiProcessingDataLoaderIterzHprefetch_factor must be greater than 0 for MultiProcessingDataLoaderIterF)ÚtargetÚargsT)ÚPicklingErrora[  Got pickle error when attempting to start a worker Process. This might be because the worker Process arguments are not picklable. Python 3.14+ changed the multiprocessing start method in non-Mac POSIX platforms to 'forkserver', which requires the worker Process arguments to be picklable. You can also try multiprocessing.set_start_method('fork').rx   r¶   c              3  ó4   K  — | ]  }|j                   –— Œ y ­wr$   )Úpid©Ú.0Úws     r.   Ú	<genexpr>z:_MultiProcessingDataLoaderIter.__init__.<locals>.<genexpr>Þ  s   è ø€ Ð/¡˜A�!—%•%¡ùs   ‚)rì   )Jr�   rŠ   rr   Ú_prefetch_factorrv   Ú	_in_orderrÕ   rH   r€   rE   r“   rM   Ú_worker_init_fnrJ   rÎ   r   r   Ú	functoolsÚpartialrU   rÖ   r×   ÚQueueÚ_worker_result_queueÚ_worker_pids_setÚ	_shutdownÚEventÚ_workers_done_eventÚ_index_queuesÚ_workersÚrangeÚcancel_join_threadÚProcessr   ÚworkerÚ_worker_loopr�   r„   rÞ   rÔ   rá   râ   rd   ÚdaemonÚpickler  Ústartr™   ÚAttributeErrorr¼   r½   ÚappendrÙ   Ú	threadingÚ_pin_memory_thread_done_eventÚqueueÚ_data_queuerØ   Úcurrent_device_indexÚThreadrl   Ú_pin_memory_looprÜ   Ú_pin_memory_threadÚatexitÚregisterrŽ   Ú_clean_up_workerÚsignal_handlingÚ_set_worker_pidsÚidÚtupleÚ_set_SIGCHLD_handlerr¢   )r:   rå   r€   ÚiÚindex_queuer
  r  Úcurrent_device_idÚpin_memory_threadr+  rœ   s             €r.   rŠ   z'_MultiProcessingDataLoaderIter.__init__]  s¯  ø€ Ü‰Ñ˜Ô à &× 6Ñ 6ˆÔØŸ™ˆŒà×Ñ Ò!Ü ØVóð ð × Ñ  AÒ%Ü ØZóð ð ×)Ñ)Ð1Ü&+×&;Ñ&;Ñ#à&,×&DÑ&DÐ#à%×4Ñ4ˆÔô �d—m‘m¤l´KÐ%@ÔAÜ#,×#4Ñ#4Ü(Ø×$Ñ$Ø× Ñ Ø—
‘
ó	$ˆDÔ ð %<×$AÑ$AÓ$CˆÔ!Ø %ˆÔØˆŒØ#:×#@Ñ#@Ó#BˆÔ àˆÔØˆŒÜ�t×(Ñ(×)ˆAà1×7Ñ7Ó9ˆKð ×*Ñ*Ô,Ø'×/Ñ/Ü—}‘}×1Ñ1à×&Ñ&Ø—M‘MØØ×-Ñ-Ø×,Ñ,Ø×(Ñ(Ø×$Ñ$Ø—O‘OØ—O‘OØ×(Ñ(ØØ×%Ñ%Ø×,Ñ,Ø×%Ñ%ðð 0ó ˆAð& ˆAŒHõ -ðØ—‘”	ð ×Ñ×%Ñ% kÔ2Ø�M‰M× Ñ  Ö#ð_ *ðb ×ÒÜ1:·±Ó1BˆDÔ.ô  %Ÿ{™{›}ˆDÔÜ %× 1Ñ 1× FÑ FÓ HÐÜ )× 0Ñ 0Ü×(Ñ(×9Ñ9à×-Ñ-Ø×$Ñ$Ø%Ø×6Ñ6Ø×+Ñ+ðô	!Ðð (,ÐÔ$Ø×#Ñ#Ô%ð '8ˆDÕ#à#×8Ñ8ˆDÔð ×#Ò#¨×(8Ò(8Ûà—]”]�Ø—‘Ô >× OÑ OÐQRÕSð #ô 	×Ñ×/Ñ/Üˆt‹HÜÑ/ §¢Ó/Ó/ô	
ô 	×Ñ×3Ñ3Ô5Ø $ˆÔØ�‰�F tˆÕ,øôs œ~¨}Ð=ò 	Ü—‘ðQð
  !õð ð	ús   È>P8Ð8)Q!c                ó\  •— t         ‰	| �  ||«       d| _        d| _        i | _        d| _        t        | j                  «      D �cg c]  }d‘Œ c}| _        t        | j                  «      D �cg c]  }d‘Œ c}| _	        t        j                  t        | j                  «      «      | _        |s¿t        | j                  «      D ]G  }| j                  |   j                  t        j                   j#                  | j$                  «      «       ŒI | j                  }|dkD  rO| j'                  «       \  }}t)        |t        j                   j"                  «      r|�t+        d«      ‚|dz  }|dkD  rŒOt        | j,                  | j                  z  «      D ]  }| j/                  «        Œ y c c}w c c}w )Nr   Tz7Expected return_data to be None when resuming iterationr"   )r�   r¢   Ú	_send_idxÚ	_rcvd_idxÚ
_task_infoÚ_tasks_outstandingr  rÕ   Ú_workers_statusÚ_workers_num_tasksÚ	itertoolsÚcycleÚ_worker_queue_idx_cycler  Úputr   r  Ú_ResumeIterationrd   Ú	_get_datarJ   rH   r  Ú_try_put_index)
r:   rå   rì   r3  ÚidxÚresume_iteration_cntÚ
return_idxÚreturn_dataÚ_rœ   s
            €r.   r¢   z%_MultiProcessingDataLoaderIter._resetä  s‡  ø€ Ü‰‰�v˜zÔ*ØˆŒØˆŒð ˆŒàð 	Ôô /4°D×4EÑ4EÔ.FÓGÑ.F¨¢Ð.FÑGˆÔô
 /4°D×4EÑ4EÔ.FÓ"GÑ.F¨¢1Ð.FÑ"GˆÔä'0§¡´u¸T×=NÑ=NÓ7OÓ'PˆÔ$áÜ˜T×.Ñ.Ö/�Ø×"Ñ" 3Ñ'×+Ñ+Ü—M‘M×2Ñ2°4×3DÑ3DÓEõð 0ð $(×#4Ñ#4Ð Ø&¨Ò*Ø*.¯.©.Ó*:Ñ'�
˜KÜ˜j¬&¯-©-×*HÑ*HÔIØ"Ð.Ü,ØUóð ð )¨AÑ-Ð(ð '¨Ó*ô �t×,Ñ,¨t×/@Ñ/@Ñ@ÖAˆAØ×ÑÕ!ñ Bùò1  Hùò
 #Hs   Á	F$Á-	F)c                ó  — 	 | j                   j                  |¬«      }d|fS # t        $ �r\}g }t        | j                  «      D ]H  \  }}| j
                  |   sŒ|j                  «       rŒ'|j                  |«       | j                  |«       ŒJ t        |«      dkD  r(dj                  d„ |D «       «      }t        d|› d�«      |‚t        |t        j                  «      rY d }~ydd l}dd l}		 d	}
t#        j$                  «       5 }t'        |
«      D ]!  }|j)                  |	j+                  «       «       Œ# 	 d d d «       ‚ # 1 sw Y   ‚ xY w# t,        $ r/}|j                  |j.                  k(  rt        d
«      d ‚Y d }~‚ d }~ww xY wd }~ww xY w)N©rn   Tr   z, c              3  óF   K  — | ]  }t        |j                  «      –— Œ y ­wr$   )rp   r  r  s     r.   r  z?_MultiProcessingDataLoaderIter._try_get_data.<locals>.<genexpr>*  s   è ø€ Ð$H¹°A¤S¨¯©§Z¹ùs   ‚!zDataLoader worker (pid(s) z) exited unexpectedly)FNé
   a  Too many open files. Communication with the workers is no longer possible. Please increase the limit using `ulimit -n` in the shell or change the sharing strategy by calling `torch.multiprocessing.set_sharing_strategy('file_system')` at the beginning of your code)r&  Úgetrº   Ú	enumerater  r<  Úis_aliver"  Ú_mark_worker_as_unavailabler¨   ÚjoinÚRuntimeErrorrJ   r%  ÚEmptyÚerrnoÚtempfileÚ
contextlibÚ	ExitStackr  Úenter_contextÚNamedTemporaryFileÚOSErrorÚEMFILE)r:   rn   rG   ÚeÚfailed_workersrP   r
  Úpids_strrU  rV  Úfds_limit_marginÚstackrI  s                r.   Ú_try_get_dataz,_MultiProcessingDataLoaderIter._try_get_data  s~  € ð,	Ø×#Ñ#×'Ñ'°Ð'Ó8ˆDØ˜$�<ÐøÜó )	ð  ˆNÜ )¨$¯-©-Ö 8‘�	˜1Ø×'Ñ'¨	Ó2¸1¿:¹:½<Ø"×)Ñ)¨!Ô,Ø×4Ñ4°YÕ?ð !9ô �>Ó" QÒ&ØŸ9™9Ñ$H¹Ó$HÓH�Ü"Ø0°°
Ð:OÐPóàðô ˜!œUŸ[™[Ô)Ü$ãÛð ð
 $&Ð Ü×)Ñ)Ô+¨uÜ"Ð#3Ö4˜Ø×+Ñ+Ø$×7Ñ7Ó9õñ 5÷ ,ð ÷ ,ð ûô ò 	 Ø—7‘7˜eŸl™lÒ*Ü&ð9óð  ð ó +ð ûð	 þð?)	úsu   ‚" ¢
F¬,FÁFÁ*A4FÃ#FÃ,EÄ0D<Ä3EÄ;FÄ<E	ÅEÅFÅEÅ	F Å%E;Å6FÅ;F Æ FÆFc                óŽ  — | j                   dkD  r;| j                  | j                   «      \  }}|r|S t        d| j                   › d�«      ‚| j                  rW| j                  j                  «       r2| j                  «       \  }}|r|S | j                  j                  «       rŒ2t        d«      ‚	 | j                  «       \  }}|r|S Œ)Nr   zDataLoader timed out after z secondsz%Pin memory thread exited unexpectedly)rÝ   rb  rS  rÙ   r*  rP  )r:   ÚsuccessrG   s      r.   rC  z(_MultiProcessingDataLoaderIter._get_data¬  sÊ   € ð �=‰=˜1ÒØ ×.Ñ.¨t¯}©}Ó=‰MˆG�TÙØ�ä"Ø1°$·-±-°ÀÐIóð ð ×ÒØ×)Ñ)×2Ñ2Ô4Ø $× 2Ñ 2Ó 4‘�˜ÙØ�Kð ×)Ñ)×2Ñ2Õ4ô #Ð#JÓKÐKð Ø $× 2Ñ 2Ó 4‘�˜ÙØ�Kð r0   c                óž  — 	 | j                   | j                  k  r‘| j                  j                  | j                   d «      }|r:|d   }t	        |«      dk(  s| j
                  |   rnh| j                  | j                   = | xj                   dz  c_         | j                   | j                  k  rŒ‘| j                  s| j                  «        t        ‚t	        | j                  | j                      «      dk(  rO| j                  j                  | j                   «      \  }}| xj                   dz  c_         | j                  ||«      S | j                  s| j                  dk  rt        d«      ‚| j                  «       \  }}| xj                  dz  c_        | j                  t         j"                  k(  rwt%        |t&        j(                  j*                  «      rS| j                  rd| j
                  |j,                  <   n| j/                  |j,                  «       | j1                  «        �Œ#|| j                   k7  rU| j2                  s0| j                  j                  |«      d   }| j                  ||«      S | j                  |xx   |fz  cc<   nE| j                  j                  |«      d   }| xj                   dz  c_         | j                  ||«      S �ŒÍ)Nr   rx   r"   zPInvalid iterator state: shutdown or no outstanding tasks when fetching next dataF)r9  r8  r:  rN  r¨   r<  râ   Ú_shutdown_workersÚStopIterationÚpopÚ_process_datar  r;  rH   rC  r�   r!   r   rJ   r   r  Ú_IterableDatasetStopIterationrP   rQ  rD  r  )r:   rR   rP   rG   rE  s        r.   rò   z)_MultiProcessingDataLoaderIter._next_dataÏ  sB  € Øð —.‘. 4§>¡>Ò1Ø—‘×*Ñ*¨4¯>©>¸4Ó@�ÙØ $ Q¡�Iä˜D›	 Qš¨$×*>Ñ*>¸yÒ*IàØŸ™¨¯©Ð7Ø—’ !Ñ#•ð —.‘. 4§>¡>Ó1ð ×/Ò/Ø×*Ñ*Ô,Ü#Ð#ô
 �4—?‘? 4§>¡>Ñ2Ó3°qÒ8Ø"&§/¡/×"5Ñ"5°d·n±nÓ"E‘�	˜4Ø—’ !Ñ#•Ø×)Ñ)¨$°	Ó:Ð:à�~Š~ ×!8Ñ!8¸AÒ!=Ü$Øfóð ð Ÿ™Ó(‰IˆC�Ø×#Ò# qÑ(Õ#Ø×!Ñ!¤\×%:Ñ%:Ò:ä˜d¤F§M¡M×$OÑ$OÔPØ×/Ò/Ø?D˜×,Ñ,¨T¯^©^Ò<à×8Ñ8¸¿¹ÔHØ×'Ñ'Ô)Ùà�d—n‘nÒ$Ø—~’~ð !%§¡× 3Ñ 3°CÓ 8¸Ñ ;�IØ×-Ñ-¨d°IÓ>Ð>à—‘ Ó$¨¨Ñ/Ô$à ŸO™O×/Ñ/°Ó4°QÑ7�	Ø—’ !Ñ#•Ø×)Ñ)¨$°	Ó:Ð:ñy r0   c                ó¤  — | j                   | j                  z  }| j                  |k\  rt        d«      ‚	 | j	                  «       }t        | j                  «      D ]_  }t        | j                  «      }| j                  |   sŒ(| j                  r n-| j                  |   |t        | j                  «      z  k  sŒ_ n y | j                  |   j                  | j                  |f«       |f| j                   | j                  <   | j                  |xx   dz  cc<   | xj                  dz  c_        | xj                  dz  c_        y # t
        $ r Y y w xY w)Nz:Number of outstanding tasks exceeded maximum allowed tasksr"   )r  rÕ   r;  rH   rï   rg  r  rî   r@  r<  r  r=  Úsumr  rA  r8  r:  )r:   Ú	max_tasksr   rI  Úworker_queue_idxs        r.   rD  z-_MultiProcessingDataLoaderIter._try_put_index  sC  € Ø×)Ñ)¨D×,=Ñ,=Ñ=ˆ	Ø×"Ñ" iÒ/Ü ØLóð ð	Ø×$Ñ$Ó&ˆEô �t×(Ñ(Ö)ˆAÜ# D×$@Ñ$@ÓAÐØ×#Ñ#Ð$4Ó5Ø—>’>ÙØ×,Ñ,Ð-=Ñ>ÀÌcØ×(Ñ(óOñ Bó ñ
 ð *ð à×ÑÐ+Ñ,×0Ñ0°$·.±.À%Ð1HÔIØ+;Ð*=ˆ�‰˜Ÿ™Ñ'Ø×ÑÐ 0Ó1°QÑ6Ó1Ø×Ò 1Ñ$ÕØ�Š˜!ÑŽøô+ ò 	Ùð	ús   µE Å	EÅEc                ó”   — | j                   |xx   dz  cc<   | j                  «        t        |t        «      r|j	                  «        |S )Nr"   )r=  rD  rJ   r   Úreraise)r:   rG   Ú
worker_idxs      r.   ri  z,_MultiProcessingDataLoaderIter._process_data.  s=   € Ø×Ñ 
Ó+¨qÑ0Ó+Ø×ÑÔÜ�dÔ,Ô-Ø�L‰LŒNØˆr0   c                ó  — | j                   |   s| j                  s|st        d«      ‚| j                  |   }|j	                  d «       d| j                   |<   | j
                  j                  «       |k7  rt        d«      ‚y )Nz=Worker status inconsistent when marking worker as unavailableFz6_workers_done_event state does not match shutdown flag)r<  râ   rH   r  rA  r  Úis_set)r:   rP   ÚshutdownÚqs       r.   rQ  z:_MultiProcessingDataLoaderIter._mark_worker_as_unavailable5  s‹   € ð ×$Ñ$ YÒ/Ø×,Ò,Ùä ØOóð ð
 ×Ñ˜yÑ)ˆð 	
�‰ˆdŒð +0ˆ×Ñ˜YÑ'à×#Ñ#×*Ñ*Ó,°Ò8Ü ØHóð ð 9r0   c                óü  — t         �"t         j                  du st         j                  €y | j                  �sÔd| _        	 t        | d«      rƒ| j                  j                  «        | j                  j                  d«       | j                  j                  «        | j                  j                  «        | j                  j                  «        | j                  j                  «        t        t        | j                  «      «      D ]1  }| j                   s| j"                  |   sŒ| j%                  |d¬«       Œ3 | j                  D ]"  }|j                  t         j&                  ¬«       Œ$ | j(                  D ]"  }|j                  «        |j                  «        Œ$ 	 | j*                  r/t         j,                  j/                  t1        | «      «       d| _        | j                  D ]#  }|j3                  «       sŒ|j5                  «        Œ% y y # | j*                  r/t         j,                  j/                  t1        | «      «       d| _        | j                  D ]#  }|j3                  «       sŒ|j5                  «        Œ% w xY w)NTr*  )NN)rt  rK  F)r   Úpython_exit_statusr  r¸   r$  Úsetr  rA  r*  rR  r  Úcloser  r  r¨   r  râ   r<  rQ  ÚMP_STATUS_CHECK_INTERVALr  r  r.  Ú_remove_worker_pidsr0  rP  Ú	terminate)r:   rP   r
  ru  s       r.   rf  z0_MultiProcessingDataLoaderIter._shutdown_workersY  sï  € ô
 ˆNä×(Ñ(¨DÑ0ä×(Ñ(Ð0ð ð �~‹~Ø!ˆDŒNð7&ô ˜4Ð!5Ô6à×6Ñ6×:Ñ:Ô<ð ×-Ñ-×1Ñ1°,Ô?Ø×+Ñ+×0Ñ0Ô2Ø×-Ñ-×@Ñ@ÔBØ×-Ñ-×3Ñ3Ô5ð ×(Ñ(×,Ñ,Ô.Ü!&¤s¨4¯=©=Ó'9Ö!:�Ið ×/Ò/°4×3GÑ3GÈ	Ó3RØ×8Ñ8¸ÈTÐ8ÕRð ";ð Ÿœ�Að —F‘F¤6×#BÑ#B�FÕCð	 'ð
 ×+Ô+�AØ×(Ñ(Ô*Ø—G‘G•Iñ ,ð ×(Ò(Ü×*Ñ*×>Ñ>¼rÀ$»xÔHØ,1�DÔ)ØŸœ�AØ—z‘z•|ð
 Ÿ™�ñ 'ðg øð` ×(Ò(Ü×*Ñ*×>Ñ>¼rÀ$»xÔHØ,1�DÔ)ØŸœ�AØ—z‘z•|ð
 Ÿ™�ñ 'ús   ¿C%H Ä%A7H ÈAI;É(I;c                óÔ   — 	 | j                  t        j                  ¬«       | j                  «       r| j	                  «        y y # | j                  «       r| j	                  «        w w xY w)NrK  )rR  r   rz  rP  r|  )r
  s    r.   r-  z/_MultiProcessingDataLoaderIter._clean_up_worker¤  sJ   € ð	Ø�F‰Fœ6×:Ñ:ˆFÔ;à�z‰zŒ|Ø—‘•ð øˆq�z‰zŒ|Ø—‘•ð ús   ‚ A Á#A'c                ó$   — | j                  «        y r$   )rf  r9   s    r.   Ú__del__z&_MultiProcessingDataLoaderIter.__del__¬  s   € Ø×ÑÕ r0   rÂ   rû   )r1   r2   r3   r<   rŠ   r¢   r   rz  rb  rC  rò   rD  ri  rQ  rf  r4   r-  r  rÇ   rÈ   s   @r.   rŽ   rŽ   '  sb   ø„ ÙTõj	E-öN+"ðZ %+×$CÑ$Có 8òv! òF=;ó~ò@ô"óHH&ðV òó ð÷!r0   rŽ   rÂ   )Gr<   Ú
__future__r   rW  r  r>  Úloggingr“   r–   r¹   r%  r#  r¼   Úcollections.abcr   Útypingr   r   r   r   r	   Útyping_extensionsr
   rE   Útorch.distributedÚdistributedr>   Útorch.utils.data.graph_settingsÚtorch._utilsr   Útorch.utils.datar   Ú#torch.utils.data.datapipes.datapiper   r   r   r   Útorch.utils.data.datasetr   r   Útorch.utils.data.samplerr   r   r   r   r   Ú__all__r   r   rj   Ú_worker_init_fn_tÚlistr   r…   r   rÄ   r   r  r   Ú	getLoggerr1   Úloggerr!   r7   rC   rU   re   r   rÁ   r�   rŽ   r5   r0   r.   Ú<module>r’     sU  ðòõ #ã Û Û Û Û 0Û 	Û Û Û Ý $ß AÕ AÝ "ã Ý  Û &Ý )Ý #÷ó ÷ >÷ó ñ Ý(ò€ñ ˆTƒ]€Ù� 4Ô(€Ø˜c˜U D˜[Ñ)Ð ð
 ˜$˜r™(˜ S˜Ñ)€ð "(§¡×!?Ñ!?€�Ó ?Ø—.‘.×0Ñ0€à—-‘-×/Ñ/€à	ˆ×	Ñ	˜8Ó	$€÷ñ ô ˜wô òó"ò.ôq�˜‘ô q÷h@Sñ @SôFÐ#6ô ôDF!Ð%8õ F!r0   