U
    ½mœd¤  ã                   @   s°   d Z ddlmZ ddlmZmZ ddlZddl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mZ edddd�Zddddd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/
é    )Úexists)ÚmakedirsÚremoveN)Úloadmaté   )Úget_data_home)Ú_fetch_remote)ÚRemoteFileMetadata)Ú_pkl_filepath)Ú
load_descré   )Úcheck_random_stateÚBunchzolivettifaces.matz.https://ndownloader.figshare.com/files/5976027Z@b612fb967f2dc77c9c62d3e1266e0c73d5fca46a4b8906c18e454d41af987794)ÚfilenameÚurlZchecksumFT)Ú	data_homeÚshuffleÚrandom_stateÚdownload_if_missingÚ
return_X_yc                 C   sD  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|ƒd¡}tdƒ}|�r4||	fS t|||	|d�S )a	  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 : str, 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 : bool, default=False
        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 : bool, default=True
        If False, raise a IOError if the data is not locally available
        instead of trying to download the data from the source site.

    return_X_y : bool, default=False
        If True, returns `(data, target)` instead of a `Bunch` object. See
        below for more information about the `data` and `target` object.

        .. versionadded:: 0.22

    Returns
    -------
    data : :class:`~sklearn.utils.Bunch`
        Dictionary-like object, with the following attributes.

        data: ndarray, shape (400, 4096)
            Each row corresponds to a ravelled
            face image of original size 64 x 64 pixels.
        images : ndarray, shape (400, 64, 64)
            Each row is a face image
            corresponding to one of the 40 subjects of the dataset.
        target : ndarray, shape (400,)
            Labels associated to each face image.
            Those labels are ranging from 0-39 and correspond to the
            Subject IDs.
        DESCR : str
            Description of the modified Olivetti Faces Dataset.

    (data, target) : tuple if `return_X_y=True`
        Tuple with the `data` and `target` objects described above.

        .. versionadded:: 0.22
    )r   zolivetti.pkzz1Data not found and `download_if_missing` is Falsez(downloading Olivetti faces from %s to %s)Údirname)Ú	file_nameÚfacesé   )Úcompress)é�  é@   r   r   r   r   c                 S   s   g | ]}|d  ‘qS )é
   © )Ú.0Úir   r   úY/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/sklearn/datasets/_olivetti_faces.pyÚ
<listcomp>‡   s     z(fetch_olivetti_faces.<locals>.<listcomp>r   éÿÿÿÿzolivetti_faces.rst)ÚdataZimagesÚtargetZDESCR)r   r   r   r
   ÚIOErrorÚprintÚFACESr   r   r   r   ÚTÚcopyÚjoblibÚdumpÚloadÚnpZfloat32ÚminÚmaxZreshapeZ	transposeÚarrayÚranger   ZpermutationÚlenr   r   )r   r   r   r   r   ÚfilepathZmat_pathZmfiler   r%   ÚorderZfaces_vectorizedZfdescrr   r   r!   Úfetch_olivetti_faces'   s<    E




r6   )Ú__doc__Úos.pathr   Úosr   r   Únumpyr.   Zscipy.ior   r+   Ú r   Ú_baser   r	   r
   r   Úutilsr   r   r(   r6   r   r   r   r!   Ú<module>   s,   ý	ú