
    (ph2              
       .   % S r SSKJr  SSKrSSKJr  SSKJr	  / SQr
 " S S	\5      r " S
 S\5      r " S S\5      rSSSSSSSSSS.	r\R"                  " \5      r\\S'    S rS rSS.S jr\rSrS rS'S  jr " S! S"5      r " S# S$5      rS% rS& rg)(zf
Base classes for MATLAB file stream reading.

MATLAB is a registered trademark of the Mathworks inc.
    )FinalN)doccer   )_byteordercodes)MatReadErrorMatReadWarningMatWriteErrorc                       \ rS rSrSrSrg)r      z"Exception indicating a read issue. N__name__
__module____qualname____firstlineno____doc____static_attributes__r       K/var/www/html/venv/lib/python3.13/site-packages/scipy/io/matlab/_miobase.pyr   r      s    ,r   r   c                       \ rS rSrSrSrg)r	      z#Exception indicating a write issue.r   Nr   r   r   r   r	   r	      s    -r   r	   c                       \ rS rSrSrSrg)r      zWarning class for read issues.r   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                     U R                  5       nU H,  n[        R                  " X#   5      R                  U5      X#'   M.     U$ )am  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-      s>    "   "FHHVY'44Z@	 Mr   c                 j    UR                   n[        R                  " SUU R                  U5      SS9nU$ )a2  
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_dtyper:      s8    $   I
**2"&OOI6 C Jr   T	appendmatc                f    SSK Jn  U" XS9 n[        U5      sSSS5        $ ! , (       d  f       g= f)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_contextr;   N)_mior>   _get_matfile_version)	file_namer<   r>   fileobjs       r   matfile_versionrC      s&    J )	I	;w#G, 
<	;	;s   "
0r   c                 j   U R                  S5        U R                  [        5      n[        U5      [        :  a  [	        S5      eUR                  S5      [        :X  a  [	        S[         S35      e[        R                  " S[        R                  US S S9nSU;   a  U R                  S5        gU R                  S	5        U R                  S5      nU R                  S5        [        US
   S:H  5      n[        X4   5      n[        USU-
     5      nXV4nUS;   a  U$ [        SR                  " U6 5      e)Nr   z Mat file appears to be truncatedz&Mat file appears to be corrupt (first z bytes == 0))   rE   r0   r'   r1   r   r   |      I   r   )r   rI   z%Unknown mat file type, version {}, {})seekr5   _HDR_N_BYTESlenr   countr&   r4   uint8int
ValueErrorformat)rB   	hdr_bytes	mopt_intstst_strmaj_indmaj_valmin_valrets           r   r@   r@      s   LLO\*I
9~$=>>q\) %%1N,@ A 	A

RXXimLII~Q LLll1oGLLO'!*'(G'"#G'!g+&'G
C&

<CCSI
JJr   c                     U R                   nUS:X  a  g[        U5      S:X  a/  US   S:X  a  gUS:X  a  US-   $ US:X  a  SU-   $ [        S	U S
35      eU$ )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   rG   column)r   rowz1-D option "z" is strange)r0   rM   rQ   )r9   r!   r0   s      r   matdimsr]      sn    ~ IIE{
5zQ8q= 4<%<|G9LABBLr   c                   *    \ rS rSrSrS rS rS rSrg)MatVarReaderiN  z:Abstract class defining required interface for var readersc                     g )Nr   )selffile_readers     r   __init__MatVarReader.__init__P  s    r   c                     g)zReturns header Nr   ra   s    r   read_headerMatVarReader.read_headerS      r   c                     g)zReads array given header Nr   )ra   headers     r   array_from_headerMatVarReader.array_from_headerW  ri   r   r   N)	r   r   r   r   r   rc   rg   rl   r   r   r   r   r_   r_   N  s    Er   r_   c                   N    \ rS rSrSr\        S	S j5       rS rS rS r	Sr
g)
MatFileReaderi\  zBase 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
Nc
                 *   Xl         0 U l        U(       d  U R                  5       nO[        R                  " U5      nX l        Xpl        U(       a  U R                  5         OX@l        XPl	        X0l
        Xl        Xl        U	(       a  SU l        SU l        gg)z
    Initializer for mat file reader

    mat_stream : file-like
        object with file API, open for reading
%(load_args)s
    TFN)r6   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)
ra   r6   rt   ry   rw   rx   matlab_compatibleru   rz   r{   s
             r   rc   MatFileReader.__init__f  s~    $ %..0J**:6J$ 0&&((O$4!&N0P-,"DO$)D! r   c                 .    SU l         SU l        SU l        g)z3Sets options to return arrays as MATLAB loads them TFN)ry   rw   rx   rf   s    r   rv   #MatFileReader.set_matlab_compatible  s     %r   c                 "    [         R                  $ )z8As we do not know what file type we have, assume native )rr   native_coderf   s    r   rq   MatFileReader.guess_byte_order  s    r   c                     U R                   R                  S5      nU R                   R                  5       nU R                   R                  US-
  5        [	        U5      S:H  $ )Nr   r   )r6   r5   tellrK   rM   )ra   bcurposs      r   end_of_streamMatFileReader.end_of_stream  sL    OO  #%%'VAX&1v{r   )	rt   rx   r+   ry   r6   r{   rw   ru   rz   )NFFTFTTF)r   r   r   r   r   r#   rc   rv   rq   r   r   r   r   r   ro   ro   \  sC       !"&#("&26 %#* #*J&r   ro   c                 t    [         R                  " U R                  R                  SS [        U5      -   5      $ )z2Return dtype for given number of items per elementNrI   )r&   r'   str)r9   nums     r   arr_dtype_numberr     s)    88CIIMM"1%C011r   c                    [        U R                  5      nU(       d  S/nUR                  [        U R                  R
                  SS 5      5        [        R                  " U[        U S5      U S9n U [        R                  " SU R                  S9:H  /n[        R                  " U5      (       d  U $ U R                  5       n SU [        U5      '   U $ )z#Convert string array to char array r   rI   NrF    )r'    )listr0   appendrP   r'   r   r&   r4   r   arrayanyr%   tuple)r9   dimsemptiess      r   arr_to_charsr     s    		?DsKKCIIMM!"%&'
**4+C3!C bhhr334G66'??

((*CCgJr   )r[   )r   typingr   numpyr&   
scipy._libr   r   r   rr   __all__	Exceptionr   r	   UserWarningr   doc_dictfilldocr#   __annotations__r-   r:   rC   get_matfile_versionrL   r@   r]   r_   ro   r   r   r   r   r   <module>r      s       $-9 -.I .)[ )
<
9
 
>
.
#
?
6
Ea1F 	h >>(+	5 +*Z.4 -1 '-T &  K8K\ > >B2
r   