U
    <jg                     @   sd   d dl Z d dlZd dlmZmZmZmZmZ d dlZ	ddl
mZmZ ddlmZ G dd deZdS )    N)AnyCallableOptionalTupleUnion   )download_and_extract_archiveverify_str_arg)VisionDatasetc                	       s   e Zd ZdZdZdZdeeej	f ee
ee ee edd fd	d
Ze
dddZe
eeef dddZedddZedddZddddZ  ZS )DTDaN  `Describable Textures Dataset (DTD) <https://www.robots.ox.ac.uk/~vgg/data/dtd/>`_.

    Args:
        root (str or ``pathlib.Path``): Root directory of the dataset.
        split (string, optional): The dataset split, supports ``"train"`` (default), ``"val"``, or ``"test"``.
        partition (int, optional): The dataset partition. Should be ``1 <= partition <= 10``. Defaults to ``1``.

            .. note::

                The partition only changes which split each image belongs to. Thus, regardless of the selected
                partition, combining all splits will result in all images.

        transform (callable, optional): A function/transform that takes in a PIL image and returns a transformed
            version. E.g, ``transforms.RandomCrop``.
        target_transform (callable, optional): A function/transform that takes in the target and transforms it.
        download (bool, optional): If True, downloads the dataset from the internet and
            puts it in root directory. If dataset is already downloaded, it is not
            downloaded again. Default is False.
    zDhttps://www.robots.ox.ac.uk/~vgg/data/dtd/download/dtd-r1.0.1.tar.gzZ fff73e5086ae6bdbea199a49dfb8a4c1trainr   NF)rootsplit	partition	transformtarget_transformdownloadreturnc              	      sb  t |dd _t|ts>d|  kr,dks>n td| d| _t j|||d t	 j
t j   _ jd  _ jd	  _ jd
  _|r     stdg  _g }t j j  j d B}|D ]6}	|	 d\}
} j j|
| ||
 qW 5 Q R X tt| _tt jt t! j _" fdd|D  _#d S )Nr   )r   valtestr   
   zPParameter 'partition' should be an integer with `1 <= partition <= 10`, but got z instead)r   r   ZdtdlabelsZimagesz;Dataset not found. You can use download=True to download itz.txt/c                    s   g | ]} j | qS  )class_to_idx).0clsselfr   </tmp/pip-unpacked-wheel-xh8d94dr/torchvision/datasets/dtd.py
<listcomp>J   s     z DTD.__init__.<locals>.<listcomp>)$r	   _split
isinstanceint
ValueError
_partitionsuper__init__pathlibPathr   type__name__lower_base_folder_data_folderZ_meta_folderZ_images_folder	_download_check_existsRuntimeError_image_filesopenstripr   appendjoinpathsortedsetclassesdictziprangelenr   _labels)r   r   r   r   r   r   r   r9   fileliner   name	__class__r   r   r'   #   s2    	 
zDTD.__init__)r   c                 C   s
   t | jS N)r=   r2   r   r   r   r   __len__L   s    zDTD.__len__)idxr   c                 C   sP   | j | | j|  }}tj|d}| jr8| |}| jrH| |}||fS )NZRGB)r2   r>   PILZImager3   convertr   r   )r   rF   Z
image_filelabelimager   r   r   __getitem__O   s    

zDTD.__getitem__c                 C   s   d| j  d| j S )Nzsplit=z, partition=)r!   r%   r   r   r   r   
extra_repr[   s    zDTD.extra_reprc                 C   s   t j| jot j| jS rD   )ospathexistsr.   isdirr   r   r   r   r0   ^   s    zDTD._check_existsc                 C   s(   |   rd S t| jt| j| jd d S )N)Zdownload_rootmd5)r0   r   _URLstrr-   _MD5r   r   r   r   r/   a   s    zDTD._download)r   r   NNF)r+   
__module____qualname____doc__rR   rT   r   rS   r(   r)   r#   r   r   boolr'   rE   r   r   rK   rL   r0   r/   __classcell__r   r   rB   r   r      s,        )r   )rM   r(   typingr   r   r   r   r   Z	PIL.ImagerG   utilsr   r	   Zvisionr
   r   r   r   r   r   <module>   s   