B
    	\,                 @   s   d Z ddlmZmZmZ ddlmZm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 dd
lmZ ddlmZ ddlmZmZ eddddZdddZdS )a  Modified Olivetti faces dataset.

The original database was available from (now defunct)

    https://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html

The version retrieved here comes in MATLAB format from the personal
web page of Sam Roweis:

    https://cs.nyu.edu/~roweis/
    )dirnameexistsjoin)makedirsremoveN)loadmat   )get_data_home)_fetch_remote)RemoteFileMetadata)_pkl_filepath   )_joblib)check_random_stateBunchzolivettifaces.matz.https://ndownloader.figshare.com/files/5976027Z@b612fb967f2dc77c9c62d3e1266e0c73d5fca46a4b8906c18e454d41af987794)filenameurlZchecksumFTc          	   C   sV  t | d} t| st|  t| d}t|s|s8tdtdtj| f  tt| d}t	|d}t
| |d j }tj||dd	 ~n
t|}t|}||  }||  }|d
ddd}tdd tdD }|rt|}|t|}	||	 }||	 }tt}
tt|
dd}| }W dQ R X t |t|d|||dS )aE  Load the Olivetti faces data-set from AT&T (classification).

    Download it if necessary.

    =================   =====================
    Classes                                40
    Samples total                         400
    Dimensionality                       4096
    Features            real, between 0 and 1
    =================   =====================

    Read more in the :ref:`User Guide <olivetti_faces_dataset>`.

    Parameters
    ----------
    data_home : optional, default: None
        Specify another download and cache folder for the datasets. By default
        all scikit-learn data is stored in '~/scikit_learn_data' subfolders.

    shuffle : boolean, optional
        If True the order of the dataset is shuffled to avoid having
        images of the same person grouped.

    random_state : int, RandomState instance or None (default=0)
        Determines random number generation for dataset shuffling. Pass an int
        for reproducible output across multiple function calls.
        See :term:`Glossary <random_state>`.

    download_if_missing : optional, True by default
        If False, raise a IOError if the data is not locally available
        instead of trying to download the data from the source site.

    Returns
    -------
    An object with the following attributes:

    data : numpy array of shape (400, 4096)
        Each row corresponds to a ravelled face image of original size
        64 x 64 pixels.

    images : numpy array of shape (400, 64, 64)
        Each row is a face image corresponding to one of the 40 subjects
        of the dataset.

    target : numpy array of shape (400, )
        Labels associated to each face image. Those labels are ranging from
        0-39 and correspond to the Subject IDs.

    DESCR : string
        Description of the modified Olivetti Faces Dataset.
    )	data_homezolivetti.pkzz1Data not found and `download_if_missing` is Falsez(downloading Olivetti faces from %s to %s)r   )	file_namefaces   )compress)i  @   r   r   r   r   c             S   s   g | ]}|d  qS )
    ).0ir   r   >lib/python3.7/site-packages/sklearn/datasets/olivetti_faces.py
<listcomp>w   s    z(fetch_olivetti_faces.<locals>.<listcomp>i  Zdescrzolivetti_faces.rstN)dataZimagestargetZDESCR)!r	   r   r   r   IOErrorprintFACESr   r
   r   r   Tcopyr   dumploadnpZfloat32minmaxZreshapeZ	transposeZarrayranger   Zpermutationlenr   __file__openr   readr   )r   ZshuffleZrandom_stateZdownload_if_missingfilepathZmat_pathZmfiler   r!   orderZmodule_pathZrst_fileZfdescrr   r   r   fetch_olivetti_faces&   sB    5




r3   )NFr   T)__doc__os.pathr   r   r   osr   r   Znumpyr)   Zscipy.io.matlabr   baser	   r
   r   r   Zutilsr   r   r   r$   r3   r   r   r   r   <module>   s     