o
    ?Hh^}                     @   s   d Z ddlZddl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mZmZ g dZdd Zdd	 Zd
dddZdddZG dd dZdd ZdS )z
  Matrix Market I/O in Python.
  See http://math.nist.gov/MatrixMarket/formats.html
  for information about the Matrix Market format.
    N)	asarrayrealimagconjzerosndarrayconcatenateonescan_cast)	coo_arrayissparse
coo_matrix)mminfommreadmmwriteMMFilec                 C   s   t | tr
| dS t| S )Nlatin1)
isinstancebytesdecodestr)s r   N/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/scipy/io/_mmio.pyasstr   s   

r   c                 C   s
   t | S )a  
    Return size and storage parameters from Matrix Market file-like 'source'.

    Parameters
    ----------
    source : str or file-like
        Matrix Market filename (extension .mtx) or open file-like object

    Returns
    -------
    rows : int
        Number of matrix rows.
    cols : int
        Number of matrix columns.
    entries : int
        Number of non-zero entries of a sparse matrix
        or rows*cols for a dense matrix.
    format : str
        Either 'coordinate' or 'array'.
    field : str
        Either 'real', 'complex', 'pattern', or 'integer'.
    symmetry : str
        Either 'general', 'symmetric', 'skew-symmetric', or 'hermitian'.

    Examples
    --------
    >>> from io import StringIO
    >>> from scipy.io import mminfo

    >>> text = '''%%MatrixMarket matrix coordinate real general
    ...  5 5 7
    ...  2 3 1.0
    ...  3 4 2.0
    ...  3 5 3.0
    ...  4 1 4.0
    ...  4 2 5.0
    ...  4 3 6.0
    ...  4 4 7.0
    ... '''


    ``mminfo(source)`` returns the number of rows, number of columns,
    format, field type and symmetry attribute of the source file.

    >>> mminfo(StringIO(text))
    (5, 5, 7, 'coordinate', 'real', 'general')
    )r   info)sourcer   r   r   r      s   
0r   Tspmatrixc                C   s   t  j| |dS )a  
    Reads the contents of a Matrix Market file-like 'source' into a matrix.

    Parameters
    ----------
    source : str or file-like
        Matrix Market filename (extensions .mtx, .mtz.gz)
        or open file-like object.
    spmatrix : bool, optional (default: True)
        If ``True``, return sparse ``coo_matrix``. Otherwise return ``coo_array``.

    Returns
    -------
    a : ndarray or coo_array or coo_matrix
        Dense or sparse array depending on the matrix format in the
        Matrix Market file.

    Examples
    --------
    >>> from io import StringIO
    >>> from scipy.io import mmread

    >>> text = '''%%MatrixMarket matrix coordinate real general
    ...  5 5 7
    ...  2 3 1.0
    ...  3 4 2.0
    ...  3 5 3.0
    ...  4 1 4.0
    ...  4 2 5.0
    ...  4 3 6.0
    ...  4 4 7.0
    ... '''

    ``mmread(source)`` returns the data as sparse matrix in COO format.

    >>> m = mmread(StringIO(text), spmatrix=False)
    >>> m
    <COOrdinate sparse array of dtype 'float64'
         with 7 stored elements and shape (5, 5)>
    >>> m.toarray()
    array([[0., 0., 0., 0., 0.],
           [0., 0., 1., 0., 0.],
           [0., 0., 0., 2., 3.],
           [4., 5., 6., 7., 0.],
           [0., 0., 0., 0., 0.]])
    r   )r   read)r   r   r   r   r   r   T   s   /r    c                 C   s   t  | ||||| dS )a  
    Writes the sparse or dense array `a` to Matrix Market file-like `target`.

    Parameters
    ----------
    target : str or file-like
        Matrix Market filename (extension .mtx) or open file-like object.
    a : array like
        Sparse or dense 2-D array.
    comment : str, optional
        Comments to be prepended to the Matrix Market file.
    field : None or str, optional
        Either 'real', 'complex', 'pattern', or 'integer'.
    precision : None or int, optional
        Number of digits to display for real or complex values.
    symmetry : None or str, optional
        Either 'general', 'symmetric', 'skew-symmetric', or 'hermitian'.
        If symmetry is None the symmetry type of 'a' is determined by its
        values.

    Returns
    -------
    None

    Examples
    --------
    >>> from io import BytesIO
    >>> import numpy as np
    >>> from scipy.sparse import coo_array
    >>> from scipy.io import mmwrite

    Write a small NumPy array to a matrix market file.  The file will be
    written in the ``'array'`` format.

    >>> a = np.array([[1.0, 0, 0, 0], [0, 2.5, 0, 6.25]])
    >>> target = BytesIO()
    >>> mmwrite(target, a)
    >>> print(target.getvalue().decode('latin1'))
    %%MatrixMarket matrix array real general
    %
    2 4
    1
    0
    0
    2.5
    0
    0
    0
    6.25

    Add a comment to the output file, and set the precision to 3.

    >>> target = BytesIO()
    >>> mmwrite(target, a, comment='\n Some test data.\n', precision=3)
    >>> print(target.getvalue().decode('latin1'))
    %%MatrixMarket matrix array real general
    %
    % Some test data.
    %
    2 4
    1.00e+00
    0.00e+00
    0.00e+00
    2.50e+00
    0.00e+00
    0.00e+00
    0.00e+00
    6.25e+00

    Convert to a sparse matrix before calling ``mmwrite``.  This will
    result in the output format being ``'coordinate'`` rather than
    ``'array'``.

    >>> target = BytesIO()
    >>> mmwrite(target, coo_array(a), precision=3)
    >>> print(target.getvalue().decode('latin1'))
    %%MatrixMarket matrix coordinate real general
    %
    2 4 3
    1 1 1.00e+00
    2 2 2.50e+00
    2 4 6.25e+00

    Write a complex Hermitian array to a matrix market file.  Note that
    only six values are actually written to the file; the other values
    are implied by the symmetry.

    >>> z = np.array([[3, 1+2j, 4-3j], [1-2j, 1, -5j], [4+3j, 5j, 2.5]])
    >>> z
    array([[ 3. +0.j,  1. +2.j,  4. -3.j],
           [ 1. -2.j,  1. +0.j, -0. -5.j],
           [ 4. +3.j,  0. +5.j,  2.5+0.j]])

    >>> target = BytesIO()
    >>> mmwrite(target, z, precision=2)
    >>> print(target.getvalue().decode('latin1'))
    %%MatrixMarket matrix array complex hermitian
    %
    3 3
    3.0e+00 0.0e+00
    1.0e+00 -2.0e+00
    4.0e+00 3.0e+00
    1.0e+00 0.0e+00
    0.0e+00 5.0e+00
    2.5e+00 0.0e+00

    N)r   write)targetacommentfield	precisionsymmetryr   r   r   r      s   lr   c                
   @   s  e Zd ZdZedd Zedd Zedd Zedd	 Zed
d Z	edd Z
edd ZdZdZeefZedd ZdZdZdZdZdZeeeeefZedd ZdZdZdZdZeeeefZedd  Zed!ed"ed#ed$ed#iZed%d& Z ed'd( Z!ed)d* Z"edDd,d-Z#ed.d/ Z$ed0d1 Z%d2d3 Z&d4d5d6d7Z'	9	9dEd:d;Z(d<d= Z)d>d? Z*d@dA Z+	9	9dEdBdCZ,d9S )Fr   )_rows_cols_entries_format_field	_symmetryc                 C      | j S N)r(   selfr   r   r   rows      zMMFile.rowsc                 C   r.   r/   )r)   r0   r   r   r   cols  r3   zMMFile.colsc                 C   r.   r/   )r*   r0   r   r   r   entries  r3   zMMFile.entriesc                 C   r.   r/   )r+   r0   r   r   r   format  r3   zMMFile.formatc                 C   r.   r/   )r,   r0   r   r   r   r%     r3   zMMFile.fieldc                 C   r.   r/   )r-   r0   r   r   r   r'     r3   zMMFile.symmetryc                 C   s   | j | j| j| jfv S r/   )r-   SYMMETRY_SYMMETRICSYMMETRY_SKEW_SYMMETRICSYMMETRY_HERMITIANr0   r   r   r   has_symmetry  s   zMMFile.has_symmetry
coordinatearrayc                 C   (   || j vrd| d| j  }t|d S )Nzunknown format type , must be one of )FORMAT_VALUES
ValueError)r1   r6   msgr   r   r   _validate_format#     
zMMFile._validate_formatintegerunsigned-integerr   complexpatternc                 C   r=   )Nzunknown field type r>   )FIELD_VALUESr@   )r1   r%   rA   r   r   r   _validate_field2  rC   zMMFile._validate_fieldgeneral	symmetriczskew-symmetric	hermitianc                 C   s$   || j vrtd| d| j  d S )Nzunknown symmetry type r>   )SYMMETRY_VALUESr@   )r1   r'   r   r   r   _validate_symmetry@  s
   

zMMFile._validate_symmetryintpuint64dDc                   C      d S r/   r   r   r   r   r   readerM     zMMFile.readerc                   C   rS   r/   r   r   r   r   r   writerR  rU   zMMFile.writerc                 C   sv  |  |\}}z| }dd | D \}}}}}	|ds#td| dks/td| | dkr9| j}n	| dkrB| j}|rX| rU| d	 d
v rU| }nn|sD|	 sd| }|	 r\| }
|| jkrt
|
dks|td|d tt|
\}}|| }nt
|
dkstd|d tt|
\}}}||||| |	 fW |r|  S S |r|  w w )a  
        Return size, storage parameters from Matrix Market file-like 'source'.

        Parameters
        ----------
        source : str or file-like
            Matrix Market filename (extension .mtx) or open file-like object

        Returns
        -------
        rows : int
            Number of matrix rows.
        cols : int
            Number of matrix columns.
        entries : int
            Number of non-zero entries of a sparse matrix
            or rows*cols for a dense matrix.
        format : str
            Either 'coordinate' or 'array'.
        field : str
            Either 'real', 'complex', 'pattern', or 'integer'.
        symmetry : str
            Either 'general', 'symmetric', 'skew-symmetric', or 'hermitian'.
        c                 s   s    | ]	}t | V  qd S r/   )r   strip).0partr   r   r   	<genexpr>y  s    zMMFile.info.<locals>.<genexpr>z%%MatrixMarketz%source is not in Matrix Market formatmatrixzProblem reading file header: r<   r;   r   %%      zHeader line not of length 2: ascii   zHeader line not of length 3: )_openreadlinesplit
startswithr@   lowerFORMAT_ARRAYFORMAT_COORDINATElstriprW   lenr   mapintclose)r1   r   streamclose_itlinemmidr[   r6   r%   r'   
split_liner2   r4   r5   r   r   r   r   W  sT   





zMMFile.inforbc                 C   s  zt | } W n ty   | df Y S w |d dkrvt j| sGt j| d r.| d } nt j| d r;| d } nt j| d rG| d } | drZddl}|| |}|dfS | d	rmddl}|	| d
}|dfS t| |}|dfS | dd dkr| d } t| |}|dfS )a   Return an open file stream for reading based on source.

        If source is a file name, open it (after trying to find it with mtx and
        gzipped mtx extensions). Otherwise, just return source.

        Parameters
        ----------
        filespec : str or file-like
            String giving file name or file-like object
        mode : str, optional
            Mode with which to open file, if `filespec` is a file name.

        Returns
        -------
        fobj : file-like
            Open file-like object.
        close_it : bool
            True if the calling function should close this file when done,
            false otherwise.
        Fr   rz.mtxz.mtx.gzz.mtx.bz2z.gzNz.bz2rs   T)
osfspath	TypeErrorpathisfileendswithgzipopenbz2BZ2File)filespecmoder|   rn   r~   r   r   r   rb     s6   






zMMFile._openc              	      sH   j \}|krtjS d}d} jjdv }t r>     \}}||k  ||k kr3tjS  	   fdd}n fdd}| D ]I\}}	}
|rX|
rX|dkrXd}n1|r`||	kr`d}t
jdd	 |rp||	 krpd}W d    n1 szw   Y  |r|t|	krd}|s|s|s nqH|rtjS |rtjS |rtjS tjS )
NTFDc                  3   sR       D ]!\\} }}| |kr || f }||dfV  q| |kr&||dfV  qd S )NFT)items)ijaijaji)r#   r   r   symm_iterator  s   z+MMFile._get_symmetry.<locals>.symm_iteratorc                  3   sN    t D ]} t | D ]} | |   |  | }}|||| kfV  qqd S r/   )range)r   r   r   r   r#   nr   r   r     s   r   Fignore)over)shaper   SYMMETRY_GENERALdtypecharr   tocoononzerosumtodoknperrstater   r7   r8   r9   )r#   missymmisskewishermrowcolr   r   r   is_diagonalr   r   r   _get_symmetry  sH   
zMMFile._get_symmetryc              
   C   s0   t jd| t jdt jdt jd||f i| d S )Nz%%.%ie
z%i
z%u
z%%.%ie %%.%ie
)r   
FIELD_REALFIELD_INTEGERFIELD_UNSIGNEDFIELD_COMPLEXget)r%   r&   r   r   r   _field_template&  s   
zMMFile._field_templatec                 K   s   | j di | d S )Nr   )_init_attrs)r1   kwargsr   r   r   __init__0  s   zMMFile.__init__Tr   c                C   s^   |  |\}}z| | | |}W |r|  n|r!|  w w |r-t|tr-t|}|S )aB  
        Reads the contents of a Matrix Market file-like 'source' into a matrix.

        Parameters
        ----------
        source : str or file-like
            Matrix Market filename (extensions .mtx, .mtz.gz)
            or open file object.
        spmatrix : bool, optional (default: True)
            If ``True``, return sparse ``coo_matrix``. Otherwise return ``coo_array``.

        Returns
        -------
        a : ndarray or coo_array or coo_matrix
            Dense or sparse array depending on the matrix format in the
            Matrix Market file.
        )rb   _parse_header_parse_bodyrm   r   r   r   )r1   r   r   rn   ro   datar   r   r   r   4  s   

zMMFile.readr    Nc           	      C   s\   |  |d\}}z| |||||| W |r|  dS |  dS |r)|  w |  w )a7  
        Writes sparse or dense array `a` to Matrix Market file-like `target`.

        Parameters
        ----------
        target : str or file-like
            Matrix Market filename (extension .mtx) or open file-like object.
        a : array like
            Sparse or dense 2-D array.
        comment : str, optional
            Comments to be prepended to the Matrix Market file.
        field : None or str, optional
            Either 'real', 'complex', 'pattern', or 'integer'.
        precision : None or int, optional
            Number of digits to display for real or complex values.
        symmetry : None or str, optional
            Either 'general', 'symmetric', 'skew-symmetric', or 'hermitian'.
            If symmetry is None the symmetry type of 'a' is determined by its
            values.
        wbN)rb   _writerm   flush)	r1   r"   r#   r$   r%   r&   r'   rn   ro   r   r   r   r!   U  s   

zMMFile.writec              	   K   sp   | j j}dd |D }t| t| }|r#tdt| d| |D ]}t| |||dd d q%dS )zr
        Initialize each attributes with the corresponding keyword arg value
        or a default of None
        c                 S   s   g | ]}|d d qS )   Nr   )rX   attrr   r   r   
<listcomp>  s    z&MMFile._init_attrs.<locals>.<listcomp>zfound z, invalid keyword arguments, please only use r   N)	__class__	__slots__setkeysr@   tuplesetattrr   )r1   r   attrspublic_attrsinvalid_keysr   r   r   r   r   x  s   zMMFile._init_attrsc                 C   s2   | j |\}}}}}}| j||||||d d S )N)r2   r4   r5   r6   r%   r'   )r   r   r   )r1   rn   r2   r4   r5   r6   r%   r'   r   r   r   r     s
   

zMMFile._parse_headerc                 C   s<  | j | j| j| j| j| jf\}}}}}}| j|d }| j}	|| j	k}
|| j
k}|| jk}|| jk}|| jk}|| jk}|| jkr
t||f|d}d}d\}}|rbd|||f< ||d k rb|d7 }|r| }|rt|d dv st| suqb|
r|t|}n|rt|}n|rttt|  }nt|}||||f< |	r||kr|r| |||f< n|rt||||f< n||||f< ||d k r|d }n|d }|	sd}n|}|rd|||f< ||d k r|d7 }|sd|r|d|fv r||d kstd|S |d|fv r||kstd|S || jkr|dkrt||f|dS t|dd}t|dd}|r3t|dd}n$|
r=t|d	d}n|rGt|d
d}n|rQt|dd}nt|dd}d}|D ]j}|rl|d dv sl| snq[|d |krytd| }tt|d d \||< ||< |s|
rt|d ||< n%|rt|d ||< n|rttt|dd   ||< nt|d ||< |d7 }q[||k rtd|d8 }|d8 }|	r||k}|| }|| }|| }t||f}t||f}|r|d9 }n|r| }t||f}t|||ff||f|d}|S t|)N)r   r   )r   r   r   r\   z$Parse error, did not read all lines.intcint8rO   rP   rF   floatz5'entries' in header is smaller than number of entriesr_   z4'entries' in header is larger than number of entries)r   r   ) r2   r4   r5   r6   r%   r'   DTYPES_BY_FIELDr   r:   r   r   r   r8   r9   FIELD_PATTERNrg   r   rc   rW   rl   rF   rk   r   rd   r   r@   rh   r   r	   r   	conjugateNotImplementedError)r1   rn   r2   r4   r5   r6   r%   symmr   r:   
is_integeris_unsigned_integer
is_complexis_skewis_herm
is_patternr#   rp   r   r   r   IJVentry_numberlmaskod_Iod_Jod_Vr   r   r   r     s   








"JG


zMMFile._parse_bodyc                 C   s  t |tst |tst |tst|drf| j}t|}t|jdkr&t	d|j\}}	|d ure|| j
krDt|jds>td|d}n6|| jkrU|jjdvrT|d}n%|| jkre|jjdvre|d	}nt|sst	d
t| d}|j\}}	|jj}
|d u r|
dv rd}nd}|d u r|jj}|dkrt|jdstdd}n|dkrd}n|dkrd}n|dkrd}ntd| |d u r| |}| j| | j| | j| d| d| d| d}||d |dD ]}d| d}||d q| ||}|| jkrd||	f }||d || j
| j| jfv r|| j krQt!|	D ]}t!|D ]}||||f  }||d q9q3d S || j"kr|t!|	D ]}t!|d |D ]}||||f  }||d qdq[d S t!|	D ]}t!||D ]}||||f  }||d qqd S || jkr || j krt!|	D ]#}t!|D ]}|||f }|t#|t$|f }||d qqd S t!|	D ]$}t!||D ]}|||f }|t#|t$|f }||d qqd S || j%kr
t	dtd | |& }|| j kr5|j'|j(k}t)|j*| |j'| |j(| ff|jd!}d"||	|j+f }||d | ||d }|| j%krtt,|j'd |j(d D ]\}}d||f }||d q^d S || j
| j| jfv rt,|j'd |j(d |j*D ]\}}}d#||f ||  }||d qd S || jkrt,|j'd |j(d |j*D ]\}}}d#||f ||j#|j$f  }||d qd S td | )$N	__array__r_   zExpected 2 dimensional arrayrO   zBmmwrite does not support integer dtypes larger than native 'intp'.fdrQ   r   rR   zunknown matrix type: r;   fF      r   rD   fr   crF   urE   zunexpected dtype kind z%%MatrixMarket matrix  
r   r]   z%i %i
r   z*pattern type inconsisted with dense formatzUnknown field type )r   z	%i %i %i
z%i %i )-r   listr   r   hasattrrg   r   rj   r   r@   r   r
   r   OverflowErrorastyper   r   r   r   typekindrx   r   r   rB   rI   rN   r!   encoderd   r   r   r   r   r8   r   r   r   r   r   r   r   r   nnzzip)r1   rn   r#   r$   r%   r&   r'   repr2   r4   typecoder   r   rp   templater   r   r   coolower_triangle_maskrt   r   rQ   r   r   r   r     s  










$$zMMFile._write)rs   r    NNN)-__name__
__module____qualname__r   propertyr2   r4   r5   r6   r%   r'   r:   rh   rg   r?   classmethodrB   r   r   r   r   r   rH   rI   r   r7   r8   r9   rM   rN   r   staticmethodrT   rV   r   rb   r   r   r   r   r!   r   r   r   r   r   r   r   r   r      s    












N>
@
	!
# 	r   c                 C   sp   g }zddl }||j W n	 ty   Y nw zddl}||j W n	 ty-   Y nw t|}t| | S )z
    Check whether `stream` is compatible with numpy.fromfile.

    Passing a gzipped file object to ``fromfile/fromstring`` doesn't work with
    Python 3.
    r   N)r|   appendGzipFileImportErrorr~   r   r   r   )rn   bad_clsr|   r~   r   r   r   _is_fromfile_compatible  s   r   r   )__doc__rv   numpyr   r   r   r   r   r   r   r   r	   r
   scipy.sparser   r   r   __all__r   r   r   r   r   r   r   r   r   r   <module>   s"    ,5
4p     @