U
    »mœd’‚  ã                   @   sš  d Z ddlZddlZddlZddlZddlmZ ddlZddlZ	ddl
ZddlmZmZ ddlmZmZmZmZmZmZmZmZmZ ddlmZ ddlmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- dd	l.m/Z/ d
d„ Z0dd„ Z1dd„ Z2dd„ Z3G dd„ deƒZ4dd„ Z5G dd„ dƒZ6dd„ Z7ee d d Z8ee d d Z9ee d d Z:ee d d Z;G dd „ d ƒZ<G d!d"„ d"ƒZ=dS )#zÈ Classes for read / write of matlab (TM) 5 files

The matfile specification last found here:

https://www.mathworks.com/access/helpdesk/help/pdf_doc/matlab/matfile_format.pdf

(as of December 5 2008)
é    N)ÚBytesIOé   )Únative_codeÚswapped_code)	ÚMatFileReaderÚ	docfillerÚmatdimsÚ
read_dtypeÚarr_to_charsÚarr_dtype_numberÚMatWriteErrorÚMatReadErrorÚMatReadWarning)Ú
VarReader5)ÚMatlabObjectÚMatlabFunctionÚMDTYPESÚNP_TO_MTYPESÚNP_TO_MXTYPESÚmiCOMPRESSEDÚmiMATRIXÚmiINT8ÚmiUTF8ÚmiUINT32ÚmxCELL_CLASSÚmxSTRUCT_CLASSÚmxOBJECT_CLASSÚmxCHAR_CLASSÚmxSPARSE_CLASSÚmxDOUBLE_CLASSÚmclass_infoÚ
mat_struct)ÚZlibInputStreamc                 C   s$   t | tjƒo"| jdko"t | d tƒS )zBDetermine if elem is an array and if first array item is a struct.r   )Ú
isinstanceÚnpÚndarrayÚsizer!   )Úelem© r(   úN/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scipy/io/matlab/_mio5.pyÚ_has_structj   s    ÿr*   c                 C   sN   g }| D ]@}t |tƒr&| t|ƒ¡ qt|ƒr>| t|ƒ¡ q| |¡ q|S )zyConstruct lists from cell arrays (loaded as numpy ndarrays), recursing
    into items if they contain mat_struct objects.)r#   r!   ÚappendÚ_matstruct_to_dictr*   Ú_inspect_cell_array)r%   Z	elem_listZsub_elemr(   r(   r)   r-   p   s    
r-   c                 C   sT   i }| j D ]D}| j| }t|tƒr0t|ƒ||< q
t|ƒrFt|ƒ||< q
|||< q
|S )z/Construct nested dicts from mat_struct objects.)Ú_fieldnamesÚ__dict__r#   r!   r,   r*   r-   )ZmatobjÚdÚfr'   r(   r(   r)   r,   ~   s    



r,   c                 C   sJ   | D ]@}t | | tƒr(t| | ƒ| |< qt| | ƒrt| | ƒ| |< q| S )z,Convert mat objects in dict to nested dicts.)r#   r!   r,   r*   r-   )r0   Úkeyr(   r(   r)   Ú_simplify_cellsŒ   s    r3   c                
       sb   e Zd ZdZed‡ fdd„	ƒZ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 )ÚMatFile5ReaderaØ   Reader for Mat 5 mat files
    Adds the following attribute to base class

    uint16_codec - char codec to use for uint16 char arrays
        (defaults to system default codec)

    Uses variable reader that has the following stardard interface (see
    abstract class in ``miobase``::

       __init__(self, file_reader)
       read_header(self)
       array_from_header(self)

    and added interface::

       set_stream(self, stream)
       read_full_tag(self)

    NFTc                    s>   t ƒ  |||||||||
¡	 |	s(t ¡ }	|	| _d| _d| _dS )züInitializer for matlab 5 file format reader

    %(matstream_arg)s
    %(load_args)s
    %(struct_arg)s
    uint16_codec : {None, string}
        Set codec to use for uint16 char arrays (e.g., 'utf-8').
        Use system default codec if None
        N)ÚsuperÚ__init__ÚsysÚgetdefaultencodingÚuint16_codecÚ_file_readerÚ_matrix_reader)ÚselfÚ
mat_streamÚ
byte_orderZ	mat_dtypeZ
squeeze_meZchars_as_stringsZmatlab_compatibleZstruct_as_recordÚ verify_compressed_data_integrityr9   Úsimplify_cells©Ú	__class__r(   r)   r6   ª   s     ÷zMatFile5Reader.__init__c                 C   s4   | j  d¡ | j  d¡}| j  d¡ |dkr0dp2dS )z3 Guess byte order.
        Sets stream pointer to 0é~   é   r   s   IMú<ú>)r=   ÚseekÚread)r<   Úmir(   r(   r)   Úguess_byte_orderÑ   s    zMatFile5Reader.guess_byte_orderc                 C   sd   i }t | j d d }t| j|ƒ}|d  ¡  d¡|d< |d d? }|d d@ }d	||f |d
< |S )z Read in mat 5 file header ÚdtypesÚfile_headerÚdescriptions    	
 Z
__header__Úversioné   éÿ   z%d.%dÚ__version__)r   r>   r	   r=   ÚitemÚstrip)r<   ZhdictZ	hdr_dtypeÚhdrZv_majorZv_minorr(   r(   r)   Úread_file_headerÙ   s    zMatFile5Reader.read_file_headerc                 C   s   t | ƒ| _t | ƒ| _dS )za Run when beginning read of variables

        Sets up readers from parameters in `self`
        N)r   r:   r;   ©r<   r(   r(   r)   Úinitialize_readä   s    
zMatFile5Reader.initialize_readc                 C   sœ   | j  ¡ \}}|dkstdƒ‚| j ¡ | }|tkrbt| j|ƒ}| j |¡ | j	}| j ¡ \}}nd}| j | j¡ |t
ksˆtd| ƒ‚| j |¡}||fS )aœ   Read header, return header, next position

        Header has to define at least .name and .is_global

        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
        r   zDid not read any bytesFz$Expecting miMATRIX type here, got %d)r:   Zread_full_tagÚ
ValueErrorr=   Útellr   r"   r;   Z
set_streamr?   r   Ú	TypeErrorZread_header)r<   ÚmdtypeÚ
byte_countZnext_posÚstreamZcheck_stream_limitÚheaderr(   r(   r)   Úread_var_headerð   s    zMatFile5Reader.read_var_headerc                 C   s   | j  ||¡S )aµ   Read array, given `header`

        Parameters
        ----------
        header : header object
           object with fields defining variable header
        process : {True, False} bool, 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;   Zarray_from_header)r<   r^   Úprocessr(   r(   r)   Úread_var_array  s    zMatFile5Reader.read_var_arrayc           	   
   C   s‚  t |tƒr|g}n|dk	r"t|ƒ}| j d¡ |  ¡  |  ¡ }g |d< |  ¡ �sj|  ¡ \}}|j	dkrjdn
|j	 
d¡}||kr’tjd| tdd� |d	kr¤d
}d}nd}|dk	rÆ||krÆ| j |¡ qFz|  ||¡}W nD tk
�r } z$tjd||f tdd� d| }W 5 d}~X Y nX | j |¡ |||< |j�rF|d  |¡ |dk	rF| |¡ t|ƒdkrF�qjqF| j�rzt|ƒS |S dS )z· get variables from stream as dictionary

        variable_names   - optional list of variable names to get

        If variable_names is None, then get all variables in file
        Nr   Ú__globals__ÚNoneÚlatin1zŒDuplicate variable name "%s" in stream - replacing previous with new
Consider mio5.varmats_from_mat to split file into single variable filesrD   )Ú
stacklevelÚ Ú__function_workspace__FTz&Unreadable variable "%s", because "%s"zRead error: %s)r#   ÚstrÚlistr=   rG   rW   rU   Úend_of_streamr_   ÚnameÚdecodeÚwarningsÚwarnr   ra   r   ÚWarningÚ	is_globalr+   ÚremoveÚlenr@   r3   )	r<   Zvariable_namesÚmdictrT   Únext_positionrk   r`   ÚresÚerrr(   r(   r)   Úget_variables&  s^    

ý üÿ ý
zMatFile5Reader.get_variablesc                 C   s¢   | j  d¡ |  ¡  |  ¡  g }|  ¡ sž|  ¡ \}}|jdkrBdn
|j d¡}|dkrZd}| j 	|¡}|j
rrd}nt |jd¡}| |||f¡ | j  |¡ q |S )	z list variables from stream r   Nrc   rd   rf   rg   ZlogicalÚunknown)r=   rG   rW   rU   rj   r_   rk   rl   r;   Zshape_from_headerÚ
is_logicalr    ÚgetÚmclassr+   )r<   ÚvarsrT   rt   rk   ÚshapeÚinfor(   r(   r)   Úlist_variables`  s     zMatFile5Reader.list_variables)	NFFTFTTNF)T)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r6   rJ   rU   rW   r_   ra   rw   r   Ú__classcell__r(   r(   rA   r)   r4   –   s&            ö&#

:r4   c                 C   sÚ   t | ƒ}|  d¡ tt d d j}|  |¡}|  d¡ | ¡  | ¡  |  ¡ }g }| 	¡ sÖ|}| 
¡ \}}|jdkrzdn
|j d¡}|  |¡ || }	|  |	¡}
tƒ }| |¡ | |
¡ | d¡ | ||f¡ qT|S )a   Pull variables out of mat 5 file as a sequence of mat file objects

    This can be useful with a difficult mat file, containing unreadable
    variables. This routine pulls the variables out in raw form and puts them,
    unread, back into a file stream for saving or reading. Another use is the
    pathological case where there is more than one variable of the same name in
    the file; this routine returns the duplicates, whereas the standard reader
    will overwrite duplicates in the returned dictionary.

    The file pointer in `file_obj` will be undefined. File pointers for the
    returned file-like objects are set at 0.

    Parameters
    ----------
    file_obj : file-like
        file object containing mat file

    Returns
    -------
    named_mats : list
        list contains tuples of (name, BytesIO) where BytesIO is a file-like
        object containing mat file contents as for a single variable. The
        BytesIO contains a string with the original header and a single var. If
        ``var_file_obj`` is an individual BytesIO instance, then save as a mat
        file with something like ``open('test.mat',
        'wb').write(var_file_obj.read())``

    Examples
    --------
    >>> import scipy.io

    BytesIO is from the ``io`` module in Python 3, and is ``cStringIO`` for
    Python < 3.

    >>> mat_fileobj = BytesIO()
    >>> scipy.io.savemat(mat_fileobj, {'b': np.arange(10), 'a': 'a string'})
    >>> varmats = varmats_from_mat(mat_fileobj)
    >>> sorted([name for name, str_obj in varmats])
    ['a', 'b']
    r   rK   rL   Nrc   rd   )r4   rG   r   r   ÚitemsizerH   rW   rU   rY   rj   r_   rk   rl   r   Úwriter+   )Zfile_objÚrdrZhdr_lenZraw_hdrrt   Z
named_matsZstart_positionrT   rk   r\   Zvar_strZout_objr(   r(   r)   Úvarmats_from_maty  s,    )







rˆ   c                   @   s   e Zd ZdZdS )ÚEmptyStructMarkerz= Class to indicate presence of empty matlab struct on output N)r€   r�   r‚   rƒ   r(   r(   r(   r)   r‰   ¾  s   r‰   c                 C   s  t | tjƒr| S | dkrdS t| dƒo8t| dƒo8t| dƒ}t | tjƒrHn*|srt| dƒrrtdd„ | j ¡ D ƒƒ} d}|rÜg }g }|  ¡ D ]:\}}t |tƒr†|d	 d
kr†| 	t|ƒt
f¡ | 	|¡ q†|rØt t|ƒg|¡S tS t | ¡}|jjt
tjfk�r|jdk�r|| k�rdS |S )aÙ   Convert input object ``source`` to something we can write

    Parameters
    ----------
    source : object

    Returns
    -------
    arr : None or ndarray or EmptyStructMarker
        If `source` cannot be converted to something we can write to a matfile,
        return None.  If `source` is equivalent to an empty dictionary, return
        ``EmptyStructMarker``.  Otherwise return `source` converted to an
        ndarray with contents for writing to matfile.
    NÚkeysÚvaluesÚitemsr/   c                 s   s$   | ]\}}|  d ¡s||fV  qdS )Ú_N)Ú
startswith)Ú.0r2   Úvaluer(   r(   r)   Ú	<genexpr>Ý  s    
ÿzto_writeable.<locals>.<genexpr>Tr   Z_0123456789r(   )r#   r$   r%   ÚhasattrZgenericÚdictr/   rŒ   rh   r+   ÚobjectÚarrayÚtupler‰   Z
asanyarrayÚdtypeÚtypeZobject_r}   )ÚsourceZ
is_mappingr—   r‹   Úfieldr�   Únarrr(   r(   r)   Úto_writeableÂ  s@    ÿ

ÿ
ÿÿrœ   rK   rL   Ztag_fullZtag_smalldataZarray_flagsc                   @   sº   e Zd ZdZe de¡Zeed< dd„ Z	dd„ Z
dd	„ Zd,dd„Zdd„ Zdd„ Zd-dd„Zdd„ Zdd„ Zdd„ Zdd„ Zd.dd„Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd
S )/Ú
VarWriter5z% Generic matlab matrix writing class r(   r[   c                 C   s0   |j | _ |j| _|j| _|j| _d | _d| _d S )NF)Úfile_streamÚunicode_stringsÚlong_field_namesÚoned_asÚ	_var_nameÚ_var_is_global)r<   Zfile_writerr(   r(   r)   r6     s    zVarWriter5.__init__c                 C   s   | j  |jdd�¡ d S )NÚF©Úorder)rž   r†   Útobytes©r<   Úarrr(   r(   r)   Úwrite_bytes
  s    zVarWriter5.write_bytesc                 C   s   | j  |¡ d S ©N)rž   r†   )r<   Úsr(   r(   r)   Úwrite_string  s    zVarWriter5.write_stringNc                 C   sj   |dkrt |jjdd…  }|jjtkr4| ¡  ¡ }|j|j }|dkrX|  	|||¡ n|  
|||¡ dS )z write tag and data Nr   é   )r   r—   rh   Ú	byteorderr   ÚbyteswapZnewbyteorderr&   r…   Úwrite_smalldata_elementÚwrite_regular_element)r<   r©   r[   r\   r(   r(   r)   Úwrite_element  s    zVarWriter5.write_elementc                 C   s:   t  dt¡}|d> | |d< |jdd�|d< |  |¡ d S )Nr(   é   Zbyte_count_mdtyper¤   r¥   Údata)r$   ÚzerosÚNDT_TAG_SMALLr§   rª   )r<   r©   r[   r\   Útagr(   r(   r)   r±     s    z"VarWriter5.write_smalldata_elementc                 C   sT   t  dt¡}||d< ||d< |  |¡ |  |¡ |d }|rP| j dd|  ¡ d S )Nr(   r[   r\   rO   ó    )r$   r¶   ÚNDT_TAG_FULLrª   rž   r†   )r<   r©   r[   r\   r¸   Zbc_mod_8r(   r(   r)   r²   %  s    

z VarWriter5.write_regular_elementFr   c           
      C   sÌ   | j }| j}| j ¡ | _|  | j¡ t dt	¡}t
|d< d|d< |d> |d> B |d> B }	||	d> B |d< ||d	< |  |¡ |  tj|d
d�¡ t |¡}|dkr°|  |td¡ n|  |t¡ d| _ d| _dS )a›   Write header for given data options
        shape : sequence
           array shape
        mclass      - mat5 matrix class
        is_complex  - True if matrix is complex
        is_logical  - True if matrix is logical
        nzmax        - max non zero elements for sparse arrays

        We get the name and the global flag from the object, and reset
        them to defaults after we've used them
        r(   Z	data_typerO   r\   é   rD   r   Zflags_classÚnzmaxÚi4©r—   rf   r   FN)r¢   r£   rž   rY   Z_mat_tag_posrª   Úmat_tagr$   r¶   ÚNDT_ARRAY_FLAGSr   r³   r•   Zasarrayr±   r   )
r<   r}   r{   Ú
is_complexry   r¼   rk   rp   ÚafÚflagsr(   r(   r)   Úwrite_header1  s$    

zVarWriter5.write_headerc                 C   sX   | j  ¡ }| j  |¡ || d }|dkr2tdƒ‚|| jd< |  | j¡ | j  |¡ d S )NrO   l        z-Matrix too large to save with Matlab 5 formatr\   )rž   rY   rG   r   r¿   rª   )r<   Ú	start_posÚcurr_posr\   r(   r(   r)   Úupdate_matrix_tag\  s    

zVarWriter5.update_matrix_tagc                 C   s   || _ || _|  |¡ dS )aˆ   Write variable at top level of mat file

        Parameters
        ----------
        arr : array_like
            array-like object to create writer for
        name : str, optional
            name as it will appear in matlab workspace
            default is empty string
        is_global : {False, True}, optional
            whether variable will be global on load into matlab
        N)r£   r¢   r†   )r<   r©   rk   rp   r(   r(   r)   Ú	write_topg  s    zVarWriter5.write_topc                 C   sø   | j  ¡ }tj |¡r.|  |¡ |  |¡ dS t|ƒ}|dkrRtd|t	|ƒf ƒ‚t
|tƒrh|  |¡ n‚t
|tƒr|tdƒ‚nn|tkrŽ|  ¡  n\|jjr¢|  |¡ nH|jjr¶|  |¡ n4|jjdkrà| jrÎd}nd}|  ||¡ n
|  |¡ |  |¡ dS )z¨ Write `arr` to stream at top and sub levels

        Parameters
        ----------
        arr : array_like
            array-like object to create writer for
        Nz'Could not convert %s (type %s) to arrayzCannot write matlab functions)ÚUÚSÚUTF8Úascii)rž   rY   ÚscipyÚsparseÚissparseÚwrite_sparserÇ   rœ   rZ   r˜   r#   r   Úwrite_objectr   r   r‰   Úwrite_empty_structr—   ÚfieldsÚwrite_structZ	hasobjectÚwrite_cellsÚkindrŸ   Ú
write_charÚwrite_numeric)r<   r©   Zmat_tag_posr›   Úcodecr(   r(   r)   r†   {  s6    	



ÿ




zVarWriter5.writec                 C   sº   |j jdk}|j jdk}zt|j jdd …  }W nB tk
rr   |rP| d¡}n|r`| d¡}n
| d¡}t}Y nX | jt|| j	ƒ|||d� |r¬|  
|j¡ |  
|j¡ n
|  
|¡ d S )NÚcÚbr   Zc128Úi1Zf8)rÁ   ry   )r—   rÖ   r   rh   ÚKeyErrorÚastyper   rÄ   r   r¡   r³   ÚrealÚimag)r<   r©   ZimagfZlogifr{   r(   r(   r)   rØ   £  s(    

ýzVarWriter5.write_numericrÌ   c                 C   sÒ   |j dkst |dk¡rJdt |jdg¡ }|  |t¡ |  |td¡ dS t	|ƒ}|j
}|  |t¡ |jjdkrÀ|j rÀt |¡}tjdt||ƒ|j ¡ d�}| ¡  |¡}tjt|ƒfd	|d�}| j|td
� dS )z5 Write string array `arr` with given `codec`
        r   rf   ©r   rD   NrÉ   r(   ©r}   r—   ÚbufferZS1©r[   )r&   r$   ÚallÚmaxÚndimrÄ   r   r±   r   r
   r}   r—   rÖ   Úprodr%   r   ÚTÚcopyrR   Úencoderr   r³   )r<   r©   rÙ   r}   Zn_charsZst_arrÚstr(   r(   r)   r×   ¼  s(    

þþzVarWriter5.write_charc                 C   sž   |  ¡ }| ¡  |jjdk}|jjdk}|j}| jt|| jƒt|||dkrNdn|d� |  	|j
 d¡¡ |  	|j d¡¡ |  	|jj¡ |rš|  	|jj¡ dS )z  Sparse matrices are 2D
        rÚ   rÛ   r   r   )rÁ   ry   r¼   r½   N)ZtocscZsort_indicesr—   rÖ   ZnnzrÄ   r   r¡   r   r³   ÚindicesrÞ   Zindptrrµ   rß   rà   )r<   r©   ÚArÁ   ry   Znzr(   r(   r)   rÐ   ç  s     ûzVarWriter5.write_sparsec                 C   s<   |   t|| jƒt¡ t |¡ d¡}|D ]}|  |¡ q(d S )Nr¤   )rÄ   r   r¡   r   r$   Ú
atleast_2dÚflattenr†   )r<   r©   rî   Úelr(   r(   r)   rÕ   û  s    ÿzVarWriter5.write_cellsc                 C   s<   |   dt¡ |  tjdtjd�¡ |  tjg tjd�¡ d S )N)r   r   r   r¾   )rÄ   r   r³   r$   r•   Zint32Zint8rV   r(   r(   r)   rÒ     s    zVarWriter5.write_empty_structc                 C   s"   |   t|| jƒt¡ |  |¡ d S r«   )rÄ   r   r¡   r   Ú_write_itemsr¨   r(   r(   r)   rÔ   
  s    ÿzVarWriter5.write_structc                 C   s¶   dd„ |j jD ƒ}tdd„ |D ƒƒd }| jr2dp4d}||krNtd|d  ƒ‚|  tj|gdd	�¡ | jtj|d
| d	�td� t 	|¡ 
d¡}|D ]}|D ]}|  || ¡ qœq”d S )Nc                 S   s   g | ]}|d  ‘qS rá   r(   )r�   r1   r(   r(   r)   Ú
<listcomp>  s     z+VarWriter5._write_items.<locals>.<listcomp>c                 S   s   g | ]}t |ƒ‘qS r(   )rr   )r�   Ú	fieldnamer(   r(   r)   ró     s     r   é@   é    z+Field names are restricted to %d charactersr½   r¾   zS%drä   r¤   )r—   Údescrræ   r    rX   r³   r$   r•   r   rï   rð   r†   )r<   r©   Ú
fieldnamesÚlengthÚ
max_lengthrî   rñ   r1   r(   r(   r)   rò     s     ÿþzVarWriter5._write_itemsc                 C   s<   |   t|| jƒt¡ | jtj|jdd�td� |  	|¡ dS )zmSame as writing structs, except different mx class, and extra
        classname element after header
        rÊ   r¾   rä   N)
rÄ   r   r¡   r   r³   r$   r•   Ú	classnamer   rò   r¨   r(   r(   r)   rÑ      s    ÿÿzVarWriter5.write_object)N)FFr   )rÌ   )r€   r�   r‚   rƒ   r$   r¶   rº   r¿   r   r6   rª   r­   r³   r±   r²   rÄ   rÇ   rÈ   r†   rØ   r×   rÐ   rÕ   rÒ   rÔ   rò   rÑ   r(   r(   r(   r)   r�   ü  s0   	
   û
+(
+r�   c                   @   s0   e Zd ZdZeddd„ƒZdd„ Zdd	d
„ZdS )ÚMatFile5Writerz Class for writing mat5 files FNÚrowc                 C   s:   || _ || _|| _|r|| _ng | _|| _|| _d| _dS )a<   Initialize writer for matlab 5 format files

        Parameters
        ----------
        %(do_compression)s
        %(unicode_strings)s
        global_vars : None or sequence of strings, optional
            Names of variables to be marked as global for matlab
        %(long_fields)s
        %(oned_as)s
        N)rž   Údo_compressionrŸ   Úglobal_varsr    r¡   Ú_matrix_writer)r<   rž   rþ   rŸ   rÿ   r    r¡   r(   r(   r)   r6   .  s    zMatFile5Writer.__init__c                 C   sX   t  dt¡}dtjt ¡ f |d< d|d< t jddt  d¡d�|d	< | j	 
| ¡ ¡ d S )
Nr(   z0MATLAB 5.0 MAT-file Platform: %s, Created on: %srM   é   rN   ZS2iIM  râ   Zendian_test)r$   r¶   ÚNDT_FILE_HDRÚosrk   ÚtimeÚasctimer%   Zuint16rž   r†   r§   )r<   rT   r(   r(   r)   Úwrite_file_headerK  s    ÿþ
z MatFile5Writer.write_file_headerc           	      C   sæ   |dkr| j  ¡ dk}|r"|  ¡  t| ƒ| _| ¡ D ]¬\}}|d dkrJq4|| jk}| jrÊtƒ }|| j_ | j 	|| 
d¡|¡ t | ¡ ¡}t dt¡}t|d< t|ƒ|d< | j  | ¡ ¡ | j  |¡ q4| j 	|| 
d¡|¡ q4dS )aò   Write variables in `mdict` to stream

        Parameters
        ----------
        mdict : mapping
           mapping with method ``items`` returns name, contents pairs where
           ``name`` which will appear 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}, optional
           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
        Nr   r�   rd   r(   r[   r\   )rž   rY   r  r�   r   rŒ   rÿ   rþ   r   rÈ   rë   ÚzlibÚcompressÚgetvaluer$   Úemptyrº   r   rr   r†   r§   )	r<   rs   rÄ   rk   Úvarrp   r]   Zout_strr¸   r(   r(   r)   Úput_variablesV  s(    

zMatFile5Writer.put_variables)FFNFrý   )N)r€   r�   r‚   rƒ   r   r6   r  r  r(   r(   r(   r)   rü   +  s        ûrü   )>rƒ   r  r  r7   r  Úior   rm   Únumpyr$   Zscipy.sparserÍ   Z_byteordercodesr   r   Z_miobaser   r   r   r	   r
   r   r   r   r   Z_mio5_utilsr   Z_mio5_paramsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   Z_streamsr"   r*   r-   r,   r3   r4   rˆ   r‰   rœ   r  rº   r·   rÀ   r�   rü   r(   r(   r(   r)   Ú<module>   s<   I,P
 dE4  1