o
    8wi7$                     @   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 d dl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)Sized)AnyCallableOptional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_MNISTaD  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/pytorch-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__ e/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/pytorch_lightning/demos/mnist_datamodule.pyr   6   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__C   s
   z_MNIST.__getitem__c                 C   s
   t | jS r   )r1   r$   r&   r*   r*   r+   __len__L   s   
z_MNIST.__len__c                 C   s   t j| jd| jS )NMNIST)r    r!   r"   r   cache_folder_namer6   r*   r*   r+   r#   O   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_existsS   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   Y   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)rN   rO   rP   res	exception_exr*   r*   r+   r   f   s    z_MNIST._try_load        tensormeanstdc                 C   s8   t j|| j| jd}t j|| j| jd}| ||S )N)dtypedevice)rR   	as_tensorr`   ra   subdiv)r]   r^   r_   r*   r*   r+   r2   {   s   z_MNIST.normalize_tensor)Tr   T)T)rL   rM   )r\   rM   )__name__
__module____qualname____doc__rC   r   r   r9   strbooltupler   r   r0   r	   r5   r7   propertyr#   r>   r   r?   staticmethodr.   r   r   r2   __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   )r8   T)r   zError z) downloading `torchvision.datasets.MNIST`zD`torchvision.datasets.MNIST` not available. Using our hosted version)	rj   r    getenvtorchvision.datasetsr8   _DATASETS_PATHr   printr   )ro   r   torchvision_mnist_availabler8   r[   r*   r*   r+   r8      s   r8   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*   r6   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)r8   r{   r6   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   ry   )	generatorN)default_transformsr8   r{   
isinstancer   r1   r   r|   rR   	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}   r6   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}   r6   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   r8   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)re   rf   rg   rh   namers   ri   r0   rj   r   rl   r   r   r   r
   r   r   r   r   r   r   rn   r*   r*   r(   r+   rv      sB    "

rv   ) rD   r    rW   rU   rG   collections.abcr   typingr   r   r   r   urllib.errorr   warningsr   rR   r	   torch.utils.datar
   r   r   "lightning_fabric.utilities.importsr   pytorch_lightningr   #pytorch_lightning.utilities.importsr   rs   r   r8   rv   r*   r*   r*   r+   <module>   s&   _