
    Yh.3              
       b   U d Z ddlmZ ddlZddlmZ ddlmZ	 g dZ
 G d d	e          Z G d
 de          Z G d de          Z G d de          Zdddddddddd	Z ej        e          Zeed<   	 d Zd ZdddZeZd Zd! Zd*d#Z G d$ d%          Z G d& d'          Zd( Zd) ZdS )+zf
Base classes for MATLAB file stream reading.

MATLAB is a registered trademark of the Mathworks inc.
    )FinalN)doccer   )_byteordercodes)MatReadErrorMatReadWarningMatWriteErrorMatWriteWarningc                       e Zd ZdZdS )r   z"Exception indicating a read issue.N__name__
__module____qualname____doc__     j/var/www/tools.fuzzalab.pt/emblema-extractor/venv/lib/python3.11/site-packages/scipy/io/matlab/_miobase.pyr   r      s        ,,,,r   r   c                       e Zd ZdZdS )r	   z#Exception indicating a write issue.Nr   r   r   r   r	   r	      s        ----r   r	   c                       e Zd ZdZdS )r   zWarning class for read issues.Nr   r   r   r   r   r      s        ((((r   r   c                       e Zd ZdZdS )r
   zWarning class for write issues.Nr   r   r   r   r
   r
      s        ))))r   r
   zfile_name : str
   Name of the mat file (do not need .mat extension if
   appendmat==True) Can also pass open file-like object.zappendmat : bool, optional
   True to append the .mat extension to the end of the given
   filename, if not already present. Default is True.a  byte_order : str or None, optional
   None by default, implying byte order guessed from mat
   file. Otherwise can be one of ('native', '=', 'little', '<',
   'BIG', '>').
mat_dtype : bool, optional
   If True, return arrays in same dtype as would be loaded into
   MATLAB (instead of the dtype with which they are saved).
squeeze_me : bool, optional
   Whether to squeeze unit matrix dimensions or not.
chars_as_strings : bool, optional
   Whether to convert char arrays to string arrays.
matlab_compatible : bool, optional
   Returns matrices as would be loaded by MATLAB (implies
   squeeze_me=False, chars_as_strings=False, mat_dtype=True,
   struct_as_record=True).ab  struct_as_record : bool, optional
   Whether to load MATLAB structs as NumPy record arrays, or as
   old-style NumPy arrays with dtype=object. Setting this flag to
   False replicates the behavior of SciPy version 0.7.x (returning
   numpy object arrays). The default setting is True, because it
   allows easier round-trip load and save of MATLAB files.zAmat_stream : file-like
   Object with file API, open for reading.a  long_field_names : bool, optional
   * False - maximum field name length in a structure is 31 characters
     which is the documented maximum length. This is the default.
   * True - maximum field name length in a structure is 63 characters
     which works for MATLAB 7.6z[do_compression : bool, optional
   Whether to compress matrices on write. Default is False.zoned_as : {'row', 'column'}, optional
   If 'column', write 1-D NumPy arrays as column vectors.
   If 'row', write 1D NumPy arrays as row vectors.zbunicode_strings : bool, optional
   If True, write strings as Unicode, else MATLAB usual encoding.)	file_arg
append_arg	load_args
struct_argmatstream_arglong_fieldsdo_compressiononed_asunicode_strings	docfillerc                     |                                  }|D ]2}t          j        ||                                       |          ||<   3|S )a   Convert dtypes in mapping to given order

    Parameters
    ----------
    dtype_template : mapping
       mapping with values returning numpy dtype from ``np.dtype(val)``
    order_code : str
       an order code suitable for using in ``dtype.newbyteorder()``

    Returns
    -------
    dtypes : mapping
       mapping where values have been replaced by
       ``np.dtype(val).newbyteorder(order_code)``

    )copynpdtypenewbyteorder)dtype_template
order_codedtypesks       r   convert_dtypesr*      sR    "   ""F A AHVAY''44Z@@q		Mr   c                 j    |j         }t          j        d||                     |          d          }|S )af  
    Generic get of byte stream data of known type

    Parameters
    ----------
    mat_stream : file_like object
        MATLAB (tm) mat file stream
    a_dtype : dtype
        dtype of array to read. `a_dtype` is assumed to be correct
        endianness.

    Returns
    -------
    arr : ndarray
        Array of dtype `a_dtype` read from stream.

    r   F)shaper$   bufferorder)itemsizer#   ndarrayread)
mat_streama_dtype	num_bytesarrs       r   
read_dtyper7      s@    $  I
*2"&OOI66     C Jr   T	appendmatc                z    ddl m}  || |          5 }t          |          cddd           S # 1 swxY w Y   dS )a  
    Return major, minor tuple depending on apparent mat file type

    Where:

     #. 0,x -> version 4 format mat files
     #. 1,x -> version 5 format mat files
     #. 2,x -> version 7.3 format mat files (HDF format)

    Parameters
    ----------
    file_name : str
       Name of the mat file (do not need .mat extension if
       appendmat==True). Can also pass open file-like object.
    appendmat : bool, optional
       True to append the .mat extension to the end of the given
       filename, if not already present. Default is True.

    Returns
    -------
    major_version : {0, 1, 2}
        major MATLAB File format version
    minor_version : int
        minor MATLAB file format version

    Raises
    ------
    MatReadError
        If the file is empty.
    ValueError
        The matfile version is unknown.

    Notes
    -----
    Has the side effect of setting the file read pointer to 0
    r   )_open_file_contextr8   N)_mior;   _get_matfile_version)	file_namer9   r;   fileobjs       r   matfile_versionr@      s    J )(((((		I	;	;	; -w#G,,- - - - - - - - - - - - - - - - - -s   044   c                    |                      d           |                     t                    }t          |          t          k     rt	          d          |                    d          t          k    rt	          dt           d          t          j        dt          j        |d d                   }d|v r|                      d           dS |                      d	           |                     d          }|                      d           t          |d
         dk              }t          ||                   }t          |d|z
                     }||f}|dv r|S t           dj        |           )Nr   z Mat file appears to be truncatedz&Mat file appears to be corrupt (first z bytes == 0))   rC   r-   r$   r.   r   r   |      I   r   )r   rG   z%Unknown mat file type, version {}, {})seekr2   _HDR_N_BYTESlenr   countr#   r1   uint8int
ValueErrorformat)r?   	hdr_bytes	mopt_intstst_strmaj_indmaj_valmin_valrets           r   r=   r=      sj   LLOOO\**I
9~~$$=>>>q\)) @%1@ @ @ A A 	A
RXimLLLII~~Qu LLll1ooGLLOOO'!*'((G''"##G'!g+&''GG
C&

C<CSI
J
JJr   columnc                     | j         }|dk    rdS t          |          dk    r7|d         dk    rdS |dk    r|dz   S |dk    rd|z   S t          d	| d
          |S )a  
    Determine equivalent MATLAB dimensions for given array

    Parameters
    ----------
    arr : ndarray
        Input array
    oned_as : {'column', 'row'}, optional
        Whether 1-D arrays are returned as MATLAB row or column matrices.
        Default is 'column'.

    Returns
    -------
    dims : tuple
        Shape tuple, in the form MATLAB expects it.

    Notes
    -----
    We had to decide what shape a 1 dimensional array would be by
    default. ``np.atleast_2d`` thinks it is a row vector. The
    default for a vector in MATLAB (e.g., ``>> 1:12``) is a row vector.

    Versions of scipy up to and including 0.11 resulted (accidentally)
    in 1-D arrays being read as column vectors. For the moment, we
    maintain the same tradition here.

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.io.matlab._miobase import matdims
    >>> matdims(np.array(1)) # NumPy scalar
    (1, 1)
    >>> matdims(np.array([1])) # 1-D array, 1 element
    (1, 1)
    >>> matdims(np.array([1,2])) # 1-D array, 2 elements
    (2, 1)
    >>> matdims(np.array([[2],[3]])) # 2-D array, column vector
    (2, 1)
    >>> matdims(np.array([[2,3]])) # 2-D array, row vector
    (1, 2)
    >>> matdims(np.array([[[2,3]]])) # 3-D array, rowish vector
    (1, 1, 2)
    >>> matdims(np.array([])) # empty 1-D array
    (0, 0)
    >>> matdims(np.array([[]])) # empty 2-D array
    (0, 0)
    >>> matdims(np.array([[[]]])) # empty 3-D array
    (0, 0, 0)

    Optional argument flips 1-D shape behavior.

    >>> matdims(np.array([1,2]), 'row') # 1-D array, 2 elements
    (1, 2)

    The argument has to make sense though

    >>> matdims(np.array([1,2]), 'bizarre')
    Traceback (most recent call last):
       ...
    ValueError: 1-D option "bizarre" is strange

    r   )r   r   r   r   rE   rX   )r   rowz1-D option "z" is strange)r-   rK   rO   )r6   r   r-   s      r   matdimsr[     s    ~ IE{{v
5zzQ8q==6  4<%<AGAAABBBLr   c                   $    e Zd ZdZd Zd Zd ZdS )MatVarReaderz; Abstract class defining required interface for var readersc                     d S )Nr   )selffile_readers     r   __init__zMatVarReader.__init__S  s    r   c                     dS )z Returns header Nr   r_   s    r   read_headerzMatVarReader.read_headerV      r   c                     dS )z Reads array given header Nr   )r_   headers     r   array_from_headerzMatVarReader.array_from_headerZ  re   r   N)r   r   r   r   ra   rd   rh   r   r   r   r]   r]   Q  sG        EE        r   r]   c                   L    e Zd ZdZe	 	 	 	 	 	 	 	 d	d            Zd Zd Zd ZdS )
MatFileReadera   Base object for reading mat files

    To make this class functional, you will need to override the
    following methods:

    matrix_getter_factory   - gives object to fetch next matrix from stream
    guess_byte_order        - guesses file byte order from file
    NFTc
                 ,   || _         i | _        |s|                                 }nt          j        |          }|| _        || _        |r|                                  n|| _        || _	        || _
        || _        |	| _        |	rd| _        d| _        dS dS )z
        Initializer for mat file reader

        mat_stream : file-like
            object with file API, open for reading
    %(load_args)s
        TFN)r3   r(   guess_byte_orderbocto_numpy_code
byte_orderstruct_as_recordset_matlab_compatible
squeeze_mechars_as_strings	mat_dtype verify_compressed_data_integritysimplify_cells)
r_   r3   ro   rt   rr   rs   matlab_compatiblerp   ru   rv   s
             r   ra   zMatFileReader.__init__i  s    $ % 	7..00JJ*:66J$ 0 	'&&(((((DO$4D!&DN0P-, 	*"DO$)D!!!	* 	*r   c                 0    d| _         d| _        d| _        dS )z4 Sets options to return arrays as MATLAB loads them TFN)rt   rr   rs   rc   s    r   rq   z#MatFileReader.set_matlab_compatible  s     %r   c                     t           j        S )z9 As we do not know what file type we have, assume native )rm   native_coderc   s    r   rl   zMatFileReader.guess_byte_order  s
    r   c                     | j                             d          }| j                                         }| j                             |dz
             t	          |          dk    S )Nr   r   )r3   r2   tellrI   rK   )r_   bcurposs      r   end_of_streamzMatFileReader.end_of_stream  sT    O  ##%%''VAX&&&1vv{r   )NFFTFTTF)	r   r   r   r   r    ra   rq   rl   r   r   r   r   rj   rj   _  s            !"&#("&26 %#* #* #* Y#*J& & &      r   rj   c                 n    t          j        | j        j        dd         t          |          z             S )z3 Return dtype for given number of items per elementNrG   )r#   r$   str)r6   nums     r   arr_dtype_numberr     s*    8CIM"1"%C0111r   c                    t          | j                  }|sdg}|                    t          | j        j        dd                              t          j        |t          | d          |           } | t          j	        d| j                  k    g}t          j
        |          s| S |                                 } d| t          |          <   | S )z$ Convert string array to char array r   rG   NrD    )r$    )listr-   appendrN   r$   r   r#   r1   r   arrayanyr"   tuple)r6   dimsemptiess      r   arr_to_charsr     s    	??D sKKCIM!""%&&'''
*4+C33! ! !C bhr33334G6'?? 

((**CCgJr   )rX   ) r   typingr   numpyr#   
scipy._libr   r   r   rm   __all__	Exceptionr   r	   UserWarningr   r
   doc_dictfilldocr    __annotations__r*   r7   r@   get_matfile_versionrJ   r=   r[   r]   rj   r   r   r   r   r   <module>r      sf                     $ $ $ $ $ $  - - - - -9 - - -. . . . .I . . .) ) ) ) )[ ) ) )* * * * *k * * *
<
9
 
>
.
#
?
6
Ea1F 1F 	h "6>(++	5 + + +*Z  .  4 -1 '- '- '- '- '-T &  K K K8K K K K\       > > > > > > > >B2 2 2
    r   