o
    zi$                     @   s   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mZmZm	Z	m
Z
mZ d dlmZ d dlmZ d dlZd dlmZ d dlmZmZmZ d dlmZ d dlmZ d d	lmZ d
ZG dd deZdededefddZG dd deZdS )    N)AnyCallableOptionalSizedTupleUnion)	HTTPError)warn)Tensor)
DataLoaderDatasetrandom_split)_IS_WINDOWS)LightningDataModule)_TORCHVISION_AVAILABLEz./datac                       s  e Zd ZdZdZdZdZdZ	d,ded	e	d
e
de	deddf fddZdedeeef fddZdefddZedefddZdede	fddZd-de	ddfddZdeddfddZed.d!ed"ed#edeeef fd$d%Zed/d'ed(eeef d)eeef defd*d+Z  ZS )0_MNISTa<  Carbon copy of ``tests_pytorch.helpers.datasets.MNIST``.

    We cannot import the tests as they are not distributed with the package.
    See https://github.com/Lightning-AI/lightning/pull/7614#discussion_r671183652 for more context.

    .. warning::  This is meant for testing/debugging and is experimental.

    )zChttps://pl-public-data.s3.amazonaws.com/MNIST/processed/training.ptz?https://pl-public-data.s3.amazonaws.com/MNIST/processed/test.ptztraining.ptztest.ptcompleteTg_)Ǻ?gGr?roottrain	normalizedownloadkwargsreturnNc                    sZ   t    || _|| _|| _| | | jr| jn| j}| t	j
| j|\| _| _d S N)super__init__r   r   r   prepare_dataTRAIN_FILE_NAMETEST_FILE_NAME	_try_loadospathjoincached_folder_pathdatatargets)selfr   r   r   r   r   	data_file	__class__ \/home/ubuntu/.local/lib/python3.10/site-packages/pytorch_lightning/demos/mnist_datamodule.pyr   5   s   

"z_MNIST.__init__idxc                 C   sV   | j |  d}t| j| }| jd ur't| jdkr'| j|g| jR  }||fS )Nr      )r%   float	unsqueezeintr&   r   lennormalize_tensor)r'   r-   imgtargetr+   r+   r,   __getitem__B   s
   z_MNIST.__getitem__c                 C   s
   t | jS r   )r2   r%   r'   r+   r+   r,   __len__K   s   
z_MNIST.__len__c                 C   s   t j| jd| jS )NMNIST)r!   r"   r#   r   cache_folder_namer7   r+   r+   r,   r$   N   s   z_MNIST.cached_folder_pathdata_folderc                 C   s4   d}| j | jfD ]}|otjtj||}q|S )NT)r   r   r!   r"   isfiler#   )r'   r;   existingfnamer+   r+   r,   _check_existsR   s   z_MNIST._check_existsc                 C   s4   |r|  | js| | j |  | jstdd S )NzDataset not found.)r?   r$   	_downloadRuntimeError)r'   r   r+   r+   r,   r   X   s
   z_MNIST.prepare_datac                 C   sR   t j|dd | jD ]}td|  t j|t j|}tj	
|| q
d S )NT)exist_okzDownloading )r!   makedirs	RESOURCESlogginginfor"   r#   basenameurllibrequesturlretrieve)r'   r;   urlfpathr+   r+   r,   r@   ^   s   
z_MNIST._download         ?	path_datatrialsdeltac                 C   s   d\}}|s
J dt j| sJ d|  t|D ]'}zt| }W n tyA } z|}t|t		   W Y d}~qd}~ww  |dusIJ |durO||S )zHResolving loading from the same time from multiple concurrent processes.)NNz!at least some trial has to be setzmissing file: N)
r!   r"   r<   rangetorchload	Exceptiontimesleeprandom)rO   rP   rQ   res	exception_exr+   r+   r,   r    e   s    z_MNIST._try_load        tensormeanstdc                 C   s8   t j|| j| jd}t j|| j| jd}| ||S )N)dtypedevice)rS   	as_tensorra   rb   subdiv)r^   r_   r`   r+   r+   r,   r3   z   s   z_MNIST.normalize_tensor)Tr   T)T)rM   rN   )r]   rN   )__name__
__module____qualname____doc__rD   r   r   r:   strbooltupler   r   r1   r   r
   r6   r8   propertyr$   r?   r   r@   staticmethodr/   r    r   r3   __classcell__r+   r+   r)   r,   r   "   s>    		&6r   argsr   r   c               
   O   s   t tdd }|r6zddlm} |tdd W n ty5 } ztd| d d}W Y d }~nd }~ww |s>td	 t}|| i |S )
NPL_USE_MOCKED_MNISTFr   )r9   T)r   zError z) downloading `torchvision.datasets.MNIST`zD`torchvision.datasets.MNIST` not available. Using our hosted version)	rk   r!   getenvtorchvision.datasetsr9   _DATASETS_PATHr   printr   )rp   r   torchvision_mnist_availabler9   r\   r+   r+   r,   r9      s   r9   c                       s   e Zd ZdZdZedddddfded	ed
ededededdf fddZ	e
defddZd!ddZdeddfddZdefddZdefddZdefddZe
dee fdd Z  ZS )"MNISTDataModulezStandard MNIST, train, val, test splits and transforms.

    >>> MNISTDataModule()  # doctest: +ELLIPSIS
    <...mnist_datamodule.MNISTDataModule object at ...>

    mnisti     F*       data_dir	val_splitnum_workersr   seed
batch_sizer   Nc                    sN   t    |rtrtd| d d}|| _|| _|| _|| _|| _|| _	dS )an  
        Args:
            data_dir: where to save/load the data
            val_split: how many of the training images to use for the validation split
            num_workers: how many workers to use for loading data
            normalize: If true applies image normalize
            seed: starting seed for RNG.
            batch_size: desired batch size.
        zYou have requested num_workers=zA on Windows, but currently recommended is 0, so we set it for your   N)
r   r   r   r	   r|   r}   r~   r   r   r   )r'   r|   r}   r~   r   r   r   r)   r+   r,   r      s   


zMNISTDataModule.__init__c                 C   s   dS )N
   r+   r7   r+   r+   r,   num_classes   s   zMNISTDataModule.num_classesc                 C   s$   t | jddd t | jddd dS )zSaves MNIST files to `data_dir`Tr   r   FN)r9   r|   r7   r+   r+   r,   r      s   zMNISTDataModule.prepare_datastagec                 C   sr   | j rd| j ini }t| jfddd|}t|tsJ t|}t||| j | jgt	 
dd\| _| _dS )z"Split the train and valid dataset.	transformTFr   rz   )	generatorN)default_transformsr9   r|   
isinstancer   r2   r   r}   rS   	Generatormanual_seeddataset_traindataset_val)r'   r   extradatasettrain_lengthr+   r+   r,   setup   s   zMNISTDataModule.setupc                 C   s   t | j| jd| jdddS )z7MNIST train set removes a subset to use for validation.Tr   shuffler~   	drop_last
pin_memory)r   r   r   r~   r7   r+   r+   r,   train_dataloader      z MNISTDataModule.train_dataloaderc                 C   s   t | j| jd| jdddS )z?MNIST val set uses a subset of the training set for validation.FTr   )r   r   r   r~   r7   r+   r+   r,   val_dataloader   r   zMNISTDataModule.val_dataloaderc                 C   sD   | j rd| j ini }t| jfddd|}t|| jd| jdddS )z#MNIST test set uses the test split.r   Fr   Tr   )r   r9   r|   r   r   r~   )r'   r   r   r+   r+   r,   test_dataloader   s   zMNISTDataModule.test_dataloaderc                 C   sF   t sd S ddlm} | jr|| |jdddg}|S | }|S )Nr   )
transforms)g      ?)r_   r`   )r   torchvisionr   r   ComposeToTensor	Normalize)r'   r   mnist_transformsr+   r+   r,   r      s   z"MNISTDataModule.default_transforms)r   N)rf   rg   rh   ri   namert   rj   r1   rk   r   rm   r   r   r   r   r   r   r   r   r   r   ro   r+   r+   r)   r,   rw      sB    "

rw   ) rE   r!   rX   rV   rH   typingr   r   r   r   r   r   urllib.errorr   warningsr	   rS   r
   torch.utils.datar   r   r   "lightning_fabric.utilities.importsr   pytorch_lightningr   #pytorch_lightning.utilities.importsr   rt   r   r9   rw   r+   r+   r+   r,   <module>   s$    _