U
    ­Ê¹jA  ã                   @   sl   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 ddlmZmZmZ ddlmZ G dd„ deƒZdS )	é    N)ÚAnyÚCallableÚcastÚOptionalÚTuple)ÚImageé   )Úcheck_integrityÚdownload_and_extract_archiveÚverify_str_arg)ÚVisionDatasetc                	       s&  e Zd ZdZdZdZdZdZdZdZ	dd	gd
dgddggZ
ddgddggZdZd-eeee ee ee eddœ‡ fdd„Zee ee dœdd„Zeeeef dœdd„Zedœd d!„Zd.eee eejeej f d"œd#d$„Zedœd%d&„Zddœd'd(„Zedœd)d*„Zee ddœd+d,„Z‡  ZS )/ÚSTL10a   `STL10 <https://cs.stanford.edu/~acoates/stl10/>`_ Dataset.

    Args:
        root (string): Root directory of dataset where directory
            ``stl10_binary`` exists.
        split (string): One of {'train', 'test', 'unlabeled', 'train+unlabeled'}.
            Accordingly, dataset is selected.
        folds (int, optional): One of {0-9} or None.
            For training, loads one of the 10 pre-defined folds of 1k samples for the
            standard evaluation procedure. If no value is passed, loads the 5k samples.
        transform (callable, optional): A function/transform that  takes in an 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.
    Zstl10_binaryz9http://ai.stanford.edu/~acoates/stl10/stl10_binary.tar.gzzstl10_binary.tar.gzZ 91f7769df0f17e558f3565bffb0c7dfbzclass_names.txtzfold_indices.txtztrain_X.binZ 918c2871b30a85fa023e0c44e0bee87fztrain_y.binZ 5a34089d4802c674881badbb80307741zunlabeled_X.binZ 5242ba1fed5e4be9e1e742405eb56ca4z
test_X.binZ 7f263ba9f9e0b06b93213547f721ac82z
test_y.binZ 36f9794fa4beb8a2c72628de14fa638e)Útrainútrain+unlabeledÚ	unlabeledÚtestr   NF)ÚrootÚsplitÚfoldsÚ	transformÚtarget_transformÚdownloadÚreturnc              	      sò  t ƒ j|||d� t|d| jƒ| _|  |¡| _|r<|  ¡  n|  ¡ sLt	dƒ‚|  | jdkr |  
| jd d | jd d ¡\| _| _ttj| jƒ| _|  |¡ �n| jdk�r>|  
| jd d | jd d ¡\| _| _ttj| jƒ| _|  |¡ |  
| jd d ¡\}}t | j|f¡| _t | jt d	g|jd  ¡f¡| _nj| jd
k�r€|  
| jd d ¡\| _}t d	g| jjd  ¡| _n(|  
| jd d | jd d ¡\| _| _tj | j| j| j¡}	tj |	¡�rît|	ƒ�}
|
 ¡  ¡ | _ W 5 Q R X d S )N)r   r   r   zHDataset not found or corrupted. You can use download=True to download itr   r   r   r   é   éÿÿÿÿr   )!ÚsuperÚ__init__r   Úsplitsr   Ú_verify_foldsr   r   Ú_check_integrityÚRuntimeErrorÚ_STL10__loadfileÚ
train_listÚdataÚlabelsr   ÚnpÚndarrayÚ_STL10__load_foldsZconcatenateZasarrayÚshapeÚ	test_listÚosÚpathÚjoinr   Úbase_folderÚclass_names_fileÚisfileÚopenÚreadÚ
splitlinesÚclasses)Úselfr   r   r   r   r   r   Zunlabeled_dataÚ_Z
class_fileÚf©Ú	__class__© úY/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torchvision/datasets/stl10.pyr   .   s6    	

((
&(
zSTL10.__init__)r   r   c                 C   sT   |d kr|S t |tƒr:|tdƒkr&|S d}t| |¡ƒ‚nd}t| t|ƒ¡ƒ‚d S )Né
   zDValue for argument folds should be in the range [0, 10), but got {}.z>Expected type None or int for argument folds, but got type {}.)Ú
isinstanceÚintÚrangeÚ
ValueErrorÚformatÚtype)r4   r   Úmsgr9   r9   r:   r   Z   s    
zSTL10._verify_folds)Úindexr   c                 C   sx   | j dk	r&| j| t| j | ƒ }}n| j| d }}t t |d¡¡}| jdk	r\|  |¡}| jdk	rp|  |¡}||fS )z–
        Args:
            index (int): Index

        Returns:
            tuple: (image, target) where target is index of the target class.
        N)r   r   r   )	r$   r#   r=   r   Z	fromarrayr%   Ú	transposer   r   )r4   rC   ZimgÚtargetr9   r9   r:   Ú__getitem__f   s    	




zSTL10.__getitem__)r   c                 C   s   | j jd S )Nr   )r#   r(   ©r4   r9   r9   r:   Ú__len__€   s    zSTL10.__len__)Ú	data_fileÚlabels_filer   c           	   	   C   s    d }|rFt j | j| j|¡}t|dƒ�}tj|tjd�d }W 5 Q R X t j | j| j|¡}t|dƒ�.}tj|tjd�}t 	|d¡}t 
|d¡}W 5 Q R X ||fS )NÚrb)Údtyper   )r   é   é`   rN   )r   r   rM   r   )r*   r+   r,   r   r-   r0   r%   ÚfromfileZuint8ZreshaperD   )	r4   rI   rJ   r$   Zpath_to_labelsr6   Zpath_to_dataZ
everythingZimagesr9   r9   r:   Z
__loadfileƒ   s    zSTL10.__loadfilec                 C   s>   | j | j D ],\}}tj | j| j|¡}t||ƒs dS qdS )NFT)r"   r)   r*   r+   r,   r   r-   r	   )r4   ÚfilenameÚmd5Zfpathr9   r9   r:   r   “   s
    
zSTL10._check_integrityc                 C   s8   |   ¡ rtdƒ d S t| j| j| j| jd� |   ¡  d S )Nz%Files already downloaded and verified)rP   rQ   )r   Úprintr
   Úurlr   rP   Útgz_md5rG   r9   r9   r:   r   š   s
    zSTL10.downloadc                 C   s   dj f | jŽS )NzSplit: {split})r@   Ú__dict__rG   r9   r9   r:   Ú
extra_repr¡   s    zSTL10.extra_reprc              	   C   s’   |d krd S t j | j| j| j¡}t|ƒ�^}| ¡  ¡ | }t	j
|t	jdd�}| j|d d …d d …d d …f | _| jd k	r„| j| | _W 5 Q R X d S )Nú )rL   Úsep)r*   r+   r,   r   r-   Úfolds_list_filer0   r1   r2   r%   Ú
fromstringZint64r#   r$   )r4   r   Zpath_to_foldsr6   Zstr_idxZlist_idxr9   r9   r:   Z__load_folds¤   s    
 
zSTL10.__load_folds)r   NNNF)N) Ú__name__Ú
__module__Ú__qualname__Ú__doc__r-   rS   rP   rT   r.   rY   r"   r)   r   Ústrr   r=   r   Úboolr   r   r   r   rF   rH   r%   r&   r!   r   r   rV   r'   Ú__classcell__r9   r9   r7   r:   r      sF   ý     ùø,(r   )Úos.pathr*   Útypingr   r   r   r   r   Únumpyr%   ZPILr   Úutilsr	   r
   r   Zvisionr   r   r9   r9   r9   r:   Ú<module>   s   