3
Pd!O                 @   sj  d Z ddlZddlZddlZddlmZmZ ddlZ	ddl
mZmZmZmZmZmZmZ ddlmZmZ ddlmZ ejdkZdZdZd	Zd
ZdZdZededededededdd1d2d3d4d5gddiZeeeeeeeeeeedZ dZ!dZ"d	Z#dddddd Z$e!d!e"d"e#d#iZ%G d$d% d%e&Z'G d&d' d'e&Z(G d(d) d)eZ)d6d+d,Z*G d-d. d.e&Z+G d/d0 d0e&Z,dS )7z1 Classes for read / write of matlab (TM) 4 files
    N)asbytesasstr   )MatFileReader	docfillermatdims
read_dtypeconvert_dtypesarr_to_charsarr_dtype_number)squeeze_elementchars_to_strings)reducelittle            f8f4i4i2u2u1headermoptmrowsncolsimagfnamlenU1)r   Zc32Zc24Zc16r   Zc8r   r   r   r   S1<>zVAX D-floatzVAX G-floatZCray)r   r   r   r   r   doublecharsparsec               @   s   e Zd ZdZdZdd ZdS )
VarHeader4Fc             C   s"   || _ || _|| _|| _|| _d S )N)namedtypemclassdims
is_complex)selfr(   r)   r*   r+   r,    r.   H/var/www/html/virt/lib64/python3.6/site-packages/scipy/io/matlab/mio4.py__init__Q   s
    zVarHeader4.__init__N)__name__
__module____qualname__Z
is_logical	is_globalr0   r.   r.   r.   r/   r'   L   s   r'   c               @   sT   e Zd ZdZdd Zdd ZdddZdd	d
Zdd Zdd Z	dd Z
dd ZdS )
VarReader4z" Class to read matlab 4 variables c             C   s*   || _ |j| _|j| _|j| _|j| _d S )N)file_reader
mat_streamdtypeschars_as_strings
squeeze_me)r-   r6   r.   r.   r/   r0   a   s
    zVarReader4.__init__c             C   s   t | j| jd }| jjt|d jd}|d dk sD|d dkrLtdt|d d\}}|dkrztj	d
t
|  t t|d\}}|dkrtdt|d\}}|}|d |d f}|d d	k}	| j| }
t||
|||	S )z% Read and return header for variable r   r       r   r   i  z.Mat 4 mopt wrong format, byteswapping problem?i  r   zBWe do not support byte ordering '%s'; returned data may be corruptd   z,O in MOPT integer should be 0, wrong format?
   r   r   r   )r   r   )r   r7   r8   readintstrip
ValueErrordivmodwarningswarnorder_codesUserWarningr'   )r-   datar(   MrestOPTr+   r,   r)   r.   r.   r/   read_headerh   s.    
zVarReader4.read_headerTc             C   st   |j }|tkr| j|}nD|tkr@| j|}|r^| jr^t|}n|tkrR| j|S t	d| |rp| j
rpt|S |S )NzNo reader for class code %s)r*   mxFULL_CLASSread_full_arraymxCHAR_CLASSread_char_arrayr9   r   mxSPARSE_CLASSread_sparse_array	TypeErrorr:   r   )r-   hdrprocessr*   arrr.   r.   r/   array_from_header   s    




zVarReader4.array_from_headerc       	      C   st   |j }|j}|j}x|D ]}||9 }qW | jjt|}t||krRtd|j t	j
|||dd}|rp|j }|S )a   Mat4 read using header `hdr` dtype and dims

        Parameters
        ----------
        hdr : object
           object with attributes ``dtype``, ``dims``. dtype is assumed to be
           the correct endianness
        copy : bool, optional
           copies array before return if True (default True)
           (buffer is usually read only)

        Returns
        -------
        arr : ndarray
            of dtype given by `hdr` ``dtype`` and shape given by `hdr` ``dims``
        zNot enough bytes to read matrix '%s'; is this a badly-formed file? Consider listing matrices with `whosmat` and loading named matrices with `variable_names` kwarg to `loadmat`F)shaper)   bufferorder)r)   r+   itemsizer7   r>   r?   lenrA   r(   npndarraycopy)	r-   rU   ra   dtr+   	num_bytesdr[   rW   r.   r.   r/   read_sub_array   s     

zVarReader4.read_sub_arrayc             C   s8   |j r.| j|dd}| j|dd}||d  S | j|S )aM   Full (rather than sparse) matrix getter

        Read matrix (array) can be real or complex

        Parameters
        ----------
        hdr : ``VarHeader4`` instance

        Returns
        -------
        arr : ndarray
            complex array if ``hdr.is_complex`` is True, otherwise a real
            numeric array
        F)ra   y              ?)r,   re   )r-   rU   resZres_jr.   r.   r/   rO      s
    zVarReader4.read_full_arrayc             C   sB   | j |jtj}|j jd}tj|jtjdtj	|dj
 S )z latin-1 text matrix (char matrix) reader

        Parameters
        ----------
        hdr : ``VarHeader4`` instance

        Returns
        -------
        arr : ndarray
            with dtype 'U1', shape given by `hdr` ``dims``
        zlatin-1r    )rZ   r)   r[   )re   astyper_   Zuint8tobytesdecoder`   r+   r)   arrayra   )r-   rU   rW   Sr.   r.   r/   rQ      s
    zVarReader4.read_char_arrayc             C   s   | j |}|dd
ddf }t|d t|d f}tj|dddf dd}tj|dddf dd}|d8 }|d8 }|jd dkrtj|dddf dd}n,tj|dddf d	d}|dddf |_tjj|||ff|S )a   Read and return sparse matrix type

        Parameters
        ----------
        hdr : ``VarHeader4`` instance

        Returns
        -------
        arr : ``scipy.sparse.coo_matrix``
            with dtype ``float`` and shape read from the sparse matrix data

        Notes
        -----
        MATLAB 4 real sparse arrays are saved in a N+1 by 3 array format, where
        N is the number of non-zero values. Column 1 values [0:N] are the
        (1-based) row indices of the each non-zero value, column 2 [0:N] are the
        column indices, column 3 [0:N] are the (real) values. The last values
        [-1,0:2] of the rows, column indices are shape[0] and shape[1]
        respectively of the output matrix. The last value for the values column
        is a padding 0. mrows and ncols values from the header give the shape of
        the stored matrix, here [N+1, 3]. Complex data are saved as a 4 column
        matrix, where the fourth column contains the imaginary component; the
        last value is again 0. Complex sparse data do *not* have the header
        ``imagf`` field set to True; the fact that the data are complex is only
        detectable because there are 4 storage columns.
        Nr   r   Zintc)r)   r   r   floatcomplexrn   )rn   r   rn   )rn   r   )	re   r?   r_   ZascontiguousarrayrZ   imagscipyr&   Z
coo_matrix)r-   rU   rf   tmpr+   IJVr.   r.   r/   rS      s    
zVarReader4.read_sparse_arrayc             C   s2  |j }|tkr ttt|j}n|tkrLttt|j}| jrJ|dd	 }n|tkr|j	}|j}t
|dko|d dko|d dksf S | jj|j|d d  d tjf || jj|jd}| jj|j|d d  d tjf || jj|jd}t|t|f}ntd| | jr.tdd |D }|S )
zwRead the shape of the array described by the header.
        The file position after this call is unspecified.
        Nr   r   r   )rZ   r)   r[   zNo reader for class code %sc             S   s   g | ]}|d kr|qS )r   r.   ).0xr.   r.   r/   
<listcomp>(  s    z0VarReader4.shape_from_header.<locals>.<listcomp>rn   )r*   rN   tuplemapr?   r+   rP   r9   rR   r)   r^   r7   seekr]   r_   r`   r>   rT   r:   )r-   rU   r*   rZ   rb   r+   rowscolsr.   r.   r/   shape_from_header	  s.    
$zVarReader4.shape_from_headerN)T)T)r1   r2   r3   __doc__r0   rM   rX   re   rO   rQ   rS   r}   r.   r.   r.   r/   r5   ^   s   

$*r5   c                   sX   e Zd ZdZe fddZdd Zdd Zdd	 ZdddZ	dddZ
dd Z  ZS )MatFile4Readerz Reader for Mat4 files c                s"   t t| j|f|| d| _dS )zR Initialize matlab 4 file reader

    %(matstream_arg)s
    %(load_args)s
        N)superr   r0   _matrix_reader)r-   r7   argskwargs)	__class__r.   r/   r0   .  s    zMatFile4Reader.__init__c             C   s^   | j jd t| j tjd}| j jd |dkr6dS |dk sF|dkrRtrNdpPdS trZdp\dS )Nr   r   r"   i  r#   )r7   rz   r   r_   r)   SYS_LITTLE_ENDIAN)r-   r   r.   r.   r/   guess_byte_order8  s    zMatFile4Reader.guess_byte_orderc             C   s   t t| j| _t| | _dS )za Run when beginning read of variables

        Sets up readers from parameters in `self`
        N)r	   mdtypes_templateZ
byte_orderr8   r5   r   )r-   r.   r.   r/   initialize_readD  s    zMatFile4Reader.initialize_readc             C   sX   | j j }tdd |jd}|jj| }|jrB|jtk rB|d9 }| j	j
 | }||fS )ab   Read and return header, next position

        Parameters
        ----------
        None

        Returns
        -------
        header : object
           object that can be passed to self.read_var_array, and that
           has attributes ``name`` and ``is_global``
        next_position : int
           position in stream of next variable
        c             S   s   | | S )Nr.   )rv   yr.   r.   r/   <lambda>\  s    z0MatFile4Reader.read_var_header.<locals>.<lambda>r   r   )r   rM   r   r+   r)   r]   r,   r*   rR   r7   tell)r-   rU   nZremaining_bytesnext_positionr.   r.   r/   read_var_headerL  s    
zMatFile4Reader.read_var_headerTc             C   s   | j j||S )a   Read array, given `header`

        Parameters
        ----------
        header : header object
           object with fields defining variable header
        process : {True, False}, optional
           If True, apply recursive post-processing during loading of array.

        Returns
        -------
        arr : array
           array with post-processing applied or not according to
           `process`.
        )r   rX   )r-   r   rV   r.   r.   r/   read_var_arrayc  s    zMatFile4Reader.read_var_arrayNc             C   s   t |tr|g}n|dk	r"t|}| jjd | j  i }xz| j s| j \}}t|j	}|dk	rx||krx| jj| q<| j
|||< | jj| |dk	r<|j| t|dkr<P q<W |S )a,   get variables from stream as dictionary

        Parameters
        ----------
        variable_names : None or str or sequence of str, optional
            variable name, or sequence of variable names to get from Mat file /
            file stream. If None, then get all variables in file.
        Nr   )
isinstancestrlistr7   rz   r   end_of_streamr   r   r(   r   remover^   )r-   Zvariable_namesmdictrU   r   r(   r.   r.   r/   get_variablesu  s(    	



zMatFile4Reader.get_variablesc             C   sv   | j jd | j  g }xX| j sp| j \}}t|j}| jj|}t	j
|jd}|j|||f | j j| qW |S )z list variables from stream r   unknown)r7   rz   r   r   r   r   r(   r   r}   mclass_infogetr*   append)r-   varsrU   r   r(   rZ   infor.   r.   r/   list_variables  s    

zMatFile4Reader.list_variables)T)N)r1   r2   r3   r~   r   r0   r   r   r   r   r   r   __classcell__r.   r.   )r   r/   r   ,  s   


r   rowc             C   s(   t | |}t|dkrtd| j|S )a   Make ``arr`` exactly two dimensional

    If `arr` has more than 2 dimensions, raise a ValueError

    Parameters
    ----------
    arr : array
    oned_as : {'row', 'column'}, optional
       Whether to reshape 1-D vectors as row vectors or column vectors.
       See documentation for ``matdims`` for more detail

    Returns
    -------
    arr2d : array
       2-D version of the array
    r   z=Matlab 4 files cannot save arrays with more than 2 dimensions)r   r^   rA   Zreshape)rW   oned_asr+   r.   r.   r/   	arr_to_2d  s    
r   c               @   sT   e Zd Zdd Zdd Zdd Zeedfdd	Zd
d Z	dd Z
dd Zdd ZdS )
VarWriter4c             C   s   |j | _ |j| _d S )N)file_streamr   )r-   Zfile_writerr.   r.   r/   r0     s    zVarWriter4.__init__c             C   s   | j j|jdd d S )NrY   )r\   )r   writerh   )r-   rW   r.   r.   r/   write_bytes  s    zVarWriter4.write_bytesc             C   s   | j j| d S )N)r   r   )r-   sr.   r.   r/   write_string  s    zVarWriter4.write_stringr   c       	      C   s   t jf td }t }d}|d |d  |d  | |d< |d |d< |d |d	< ||d
< t|d |d< | j| | jt|d  dS )a(   Write header for given data options

        Parameters
        ----------
        name : str
            name of variable
        shape : sequence
           Shape of array as it will be read in matlab
        P : int, optional
            code for mat4 data type, one of ``miDOUBLE, miSINGLE, miINT32,
            miINT16, miUINT16, miUINT8``
        T : int, optional
            code for mat4 matrix class, one of ``mxFULL_CLASS, mxCHAR_CLASS,
            mxSPARSE_CLASS``
        imagf : int, optional
            flag indicating complex
        r   r   i  r<   r=   r   r   r   r   r   r    N)r_   emptyr   r   r^   r   r   r   )	r-   r(   rZ   rK   rL   r   r   rH   rJ   r.   r.   r/   write_header  s    

zVarWriter4.write_headerc             C   s   t jj|r| j|| dS tj|}|j}|jsB|j|j	d}|j
}|tjkr\tdn4|tjkrptdn |tjtjfkr| j|| dS | j|| dS )z Write matrix `arr`, with name `name`

        Parameters
        ----------
        arr : array_like
           array to write
        name : str
           name in matlab workspace
        N=z!Cannot save object arrays in Mat4zCannot save void type arrays)rp   r&   issparsewrite_sparser_   Zasarrayr)   Zisnativerg   ZnewbyteordertypeZobject_rT   voidZunicode_Zstring_
write_charwrite_numeric)r-   rW   r(   rb   Zdttr.   r.   r/   r     s     




zVarWriter4.writec             C   s   t || j}|jjdk}yt|jjdd   }W n2 tk
rb   |rP|jd}n
|jd}t}Y nX | j	||j
|t|d |r| j|j | j|j n
| j| d S )Ncr   Zc128r   )rK   rL   r   )r   r   r)   kindnp_to_mtypesr   KeyErrorrg   miDOUBLEr   rZ   rN   r   realro   )r-   rW   r(   r   rK   r.   r.   r/   r     s$    

zVarWriter4.write_numericc             C   s   t |}t|| j}|j}| j||ttd |jjdkrvt	j
|}t	jf t|||d}|j jd}t	j|d|d}| j| d S )N)rK   rL   U)rZ   r)   r[   zlatin-1r!   )r
   r   r   rZ   r   miUINT8rP   r)   r   r_   prodr`   r   itemencoder   )r-   rW   r(   r+   Zn_charsZst_arrstr.   r.   r/   r     s     
zVarWriter4.write_charc             C   s   |j  }|jjdk}tj|jd d| fdd}|j|dd
df< |j|dddf< |ddddf  d7  < |r|jj	|dddf< |jj
|dddf< n|j|dddf< |j|dddf< | j||jttd	 | j| dS )zY Sparse matrices are 2-D

        See docstring for VarReader4.read_sparse_array
        r   r   r   r   )r)   Nr   r   )rK   rL   rn   rn   rn   rn   rn   rn   rn   )Ztocoor)   r   r_   ZzerosZnnzr   colrG   r   ro   rZ   r   r   rR   r   )r-   rW   r(   Ar   Zijvr.   r.   r/   r   .  s"    zVarWriter4.write_sparseN)r1   r2   r3   r0   r   r   r   rN   r   r   r   r   r   r.   r.   r.   r/   r     s    r   c               @   s$   e Zd ZdZdddZdddZdS )	MatFile4Writerz) Class for writing matlab 4 format files Nc             C   s"   || _ |d krd}|| _d | _d S )Nr   )r   r   _matrix_writer)r-   r   r   r.   r.   r/   r0   I  s
    zMatFile4Writer.__init__c             C   s2   t | | _x"|j D ]\}}| jj|| qW dS )a   Write variables in `mdict` to stream

        Parameters
        ----------
        mdict : mapping
           mapping with method ``items`` return name, contents pairs
           where ``name`` which will appeak in the matlab workspace in
           file load, and ``contents`` is something writeable to a
           matlab file, such as a NumPy array.
        write_header : {None, True, False}
           If True, then write the matlab file header before writing the
           variables. If None (the default) then write the file header
           if we are at position 0 in the stream. By setting False
           here, and setting the stream position to the end of the file,
           you can append variables to a matlab file
        N)r   r   itemsr   )r-   r   r   r(   varr.   r.   r/   put_variablesP  s    
zMatFile4Writer.put_variables)N)N)r1   r2   r3   r~   r0   r   r.   r.   r.   r/   r   G  s   
r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   )-r~   sysrC   Znumpyr_   Znumpy.compatr   r   Zscipy.sparserp   Zmiobaser   r   r   r   r	   r
   r   Z	mio_utilsr   r   	functoolsr   	byteorderr   r   ZmiSINGLEZmiINT32ZmiINT16ZmiUINT16r   r   r   rN   rP   rR   rE   r   objectr'   r5   r   r   r   r   r.   r.   r.   r/   <module>   sr   $
 Oy
 