o
    #ik                     @  sn   d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZmZmZ dgZG dd deZdS )	    )annotationsN)
DataLoader)Dataset)get_track_meta)list_data_collateset_rndworker_init_fnr   c                      s$   e Zd ZdZdd fd	d
Z  ZS )r   a  
    Provides an iterable over the given `dataset`.  It inherits the PyTorch
    DataLoader and adds enhanced `collate_fn` and `worker_fn` by default.

    Although this class could be configured to be the same as
    `torch.utils.data.DataLoader`, its default configuration is
    recommended, mainly for the following extra features:

        - It handles MONAI randomizable objects with appropriate random state
          managements for deterministic behaviour.
        - It is aware of the patch-based transform (such as
          :py:class:`monai.transforms.RandSpatialCropSamplesDict`) samples for
          preprocessing with enhanced data collating behaviour.
          See: :py:class:`monai.transforms.Compose`.

    For more details about :py:class:`torch.utils.data.DataLoader`, please see:
    https://pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader.

    For example, to construct a randomized dataset and iterate with the data loader:

    .. code-block:: python

        import torch

        from monai.data import DataLoader
        from monai.transforms import Randomizable


        class RandomDataset(torch.utils.data.Dataset, Randomizable):
            def __getitem__(self, index):
                return self.R.randint(0, 1000, (1,))

            def __len__(self):
                return 16


        dataset = RandomDataset()
        dataloader = DataLoader(dataset, batch_size=2, num_workers=4)
        for epoch in range(2):
            for i, batch in enumerate(dataloader):
                print(epoch, i, batch.data.numpy().flatten().tolist())

    Args:
        dataset: dataset from which to load the data.
        num_workers: how many subprocesses to use for data
            loading. ``0`` means that the data will be loaded in the main process.
            (default: ``0``)
        collate_fn: default to :py:func:`monai.data.utils.list_data_collate`.
        worker_init_fn: default to :py:func:`monai.data.utils.worker_init_fn`.
        kwargs: other parameters for PyTorch DataLoader.
    r   datasetr   num_workersintreturnNonec                   s   |dkr1| dd u rtjjn|d }| }tjdtjdj|d }t	|t
| || d|vr9t|d< d|vrAt|d< d|v rS|d d	krSt sStd
 t jd||d| d S )Nr   	generator )dtype)r   
collate_fnr   multiprocessing_contextspawna  Please be aware: Return type of the dataloader will not be a Tensor as expected but a MetaTensor instead! This is because 'spawn' creates a new process where _TRACK_META is initialized to True again. Context:_TRACK_META is set to False and multiprocessing_context to spawn)r	   r
   )gettorchrandomdefault_generatorinitial_seedemptyint64random_itemr   r   manual_seedr   r   r   warningswarnsuper__init__)selfr	   r
   kwargs_gZ	init_seed_seed	__class__r   W/home/dell461/cl/sdc2/last_ska_mid/HISourceFinder-master-l/src/monai/data/dataloader.pyr!   O   s$   
zDataLoader.__init__)r   )r	   r   r
   r   r   r   )__name__
__module____qualname____doc__r!   __classcell__r   r   r&   r(   r      s    4)
__future__r   r   r   torch.utils.datar   Z_TorchDataLoaderr   Zmonai.data.meta_objr   Zmonai.data.utilsr   r   r   __all__r   r   r   r(   <module>   s   