o
    Ebat                     @   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 g dZdd Zdd	 Zd
d ZdddZG dd dZdd ZedkryddlZejdd D ]#Zededdd ej  e Zee ede e   qWdS 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_matrix
isspmatrix)mminfommreadmmwriteMMFilec                 C   s   t | tr
| dS t| S )Nlatin1)
isinstancebytesdecodestr)s r   0/usr/lib/python3/dist-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'.
    )r   infosourcer   r   r   r      s   
r   c                 C   s   t  | 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.

    Returns
    -------
    a : ndarray or coo_matrix
        Dense or sparse matrix depending on the matrix format in the
        Matrix Market file.
    )r   readr   r   r   r   r   <   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.
    N)r   write)targetacommentfield	precisionsymmetryr   r   r   r   Q   s   r   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dBd,d-Z#ed.d/ Z$ed0d1 Z%d2d3 Z&d4d5 Z'	7	7dCd8d9Z(d:d; Z)d<d= Z*d>d? Z+	7	7dCd@dAZ,d7S )Dr   )_rows_cols_entries_format_field	_symmetryc                 C      | j S N)r&   selfr   r   r   rowsr      zMMFile.rowsc                 C   r,   r-   )r'   r.   r   r   r   colsv   r1   zMMFile.colsc                 C   r,   r-   )r(   r.   r   r   r   entriesz   r1   zMMFile.entriesc                 C   r,   r-   )r)   r.   r   r   r   format~   r1   zMMFile.formatc                 C   r,   r-   )r*   r.   r   r   r   r#      r1   zMMFile.fieldc                 C   r,   r-   )r+   r.   r   r   r   r%      r1   zMMFile.symmetryc                 C   s   | j | j| j| jfv S r-   )r+   SYMMETRY_SYMMETRICSYMMETRY_SKEW_SYMMETRICSYMMETRY_HERMITIANr.   r   r   r   has_symmetry   s   zMMFile.has_symmetry
coordinatearrayc                 C       || j vrtd|| j f d S )Nz)unknown format type %s, must be one of %s)FORMAT_VALUES
ValueError)r/   r4   r   r   r   _validate_format   
   
zMMFile._validate_formatintegerunsigned-integerr   complexpatternc                 C   r;   )Nz(unknown field type %s, must be one of %s)FIELD_VALUESr=   )r/   r#   r   r   r   _validate_field   r?   zMMFile._validate_fieldZgeneralZ	symmetriczskew-symmetricZ	hermitianc                 C   r;   )Nz+unknown symmetry type %s, must be one of %s)SYMMETRY_VALUESr=   )r/   r%   r   r   r   _validate_symmetry   r?   zMMFile._validate_symmetryintpuint64dDc                   C      d S r-   r   r   r   r   r   reader      zMMFile.readerc                   C   rL   r-   r   r   r   r   r   writer   rN   zMMFile.writerc                 C   sr  |  |\}}z| }dd | D \}}}}}	|ds#td| dks/td| | dkr9| j}n	| dkrB| j}|rV|d	 d
v rV| }|rV|d	 d
v sJ| sb| }| rZ| }
|| jkrt	|
dkszt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   g | ]}t | qS r   )r   strip).0partr   r   r   
<listcomp>       zMMFile.info.<locals>.<listcomp>z%%MatrixMarketz%source is not in Matrix Market formatmatrixzProblem reading file header: r:   r9   r   %%      zHeader line not of length 2: ascii   zHeader line not of length 3: )_openreadlinesplit
startswithr=   lowerFORMAT_ARRAYFORMAT_COORDINATErP   lenr   mapintclose)r/   r   streamclose_itlineZmmidrU   r4   r#   r%   Z
split_liner0   r2   r3   r   r   r   r      sP   




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.bz2rj   T)
osfspath	TypeErrorpathisfileendswithgzipopenbz2BZ2File)Zfilespecmoders   rg   ru   r   r   r   r\     s6   






zMMFile._openc                    s   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 ]3\}}	}
|rX|
rX|dkrXd}n|r`||	kr`d}|ri||	 krid}|rs|t
|	krsd}|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_iteratorh  s   z+MMFile._get_symmetry.<locals>.symm_iteratorc                  3   sN    t D ]} t | D ]} | |   |  | }}|||| kfV  qqd S r-   )range)r{   rz   r|   r}   r!   nr   r   r~   s  s   r   F)shaper   SYMMETRY_GENERALdtypecharr   tocooZnonzerosumZtodokr   r5   r6   r7   )r!   mZissymmZisskewZishermrowcolr~   r|   r}   Zis_diagonalr   r   r   _get_symmetryS  sB   
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)r/   kwargsr   r   r   __init__  s   zMMFile.__init__c                 C   sD   |  |\}}z| | | |W |r|  S S |r!|  w w )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 object.

        Returns
        -------
        a : ndarray or coo_matrix
            Dense or sparse matrix depending on the matrix format in the
            Matrix Market file.
        )r\   _parse_header_parse_bodyrf   )r/   r   rg   rh   r   r   r   r     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)r\   _writerf   flush)	r/   r    r!   r"   r#   r$   r%   rg   rh   r   r   r   r     s   

zMMFile.writec              	   K   sl   | j j}dd |D }t| t| }|r!tdt||f |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   )rQ   attrr   r   r   rS     rT   z&MMFile._init_attrs.<locals>.<listcomp>zVfound %s invalid keyword arguments, please only
                                use %sr   N)	__class__	__slots__setkeysr=   tuplesetattrr   )r/   r   ZattrsZpublic_attrsZinvalid_keysr   r   r   r   r     s   zMMFile._init_attrsc                 C   s2   | j |\}}}}}}| j||||||d d S )N)r0   r2   r3   r4   r#   r%   )r   r   r   )r/   rg   r0   r2   r3   r4   r#   r%   r   r   r   r     s
   

zMMFile._parse_headerc                  C   s  | j | j| j| j| j| jf\}}}}}}zddlm} W n ty'   d }Y nw | j	
|d }	| j}
|| jk}|| jk}|| jk}|| jk}|| jk}|| jk}|| jkr!t||f|	d}d}d\}}|rvd|||f< ||d k rv|d7 }|r| }|r|d dv s| sqv|rt|}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 }|sx|r|d|fv r	||d kstd|S |d|fv r||kstd|S || jkr|d u rt||f|	d}d}d}|r| }|rN|d dv sN| sPq8| }tt|d d \}}|d |d }}|rrt|d }n|r|t|d }n|rttt|dd   }nt|d }||||f< |
r||kr|r| |||f< n|rt||||f< n||||f< |d }|s;||kstd	 |S || jkr|dkr|||f|	dS t|d
d}t|d
d}|rt|dd}n$|rt|dd}n|rt|dd}n|rt|dd}nt|dd}d}|D ]j}|r0|d dv s0| s2q|d |kr=td| }tt|d d \||< ||< |s|r_t|d ||< n%|rkt|d ||< n|r|t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}||||ff||f|	d}|S t!|)Nr   )r   )r   r   )r   r   rV   z$Parse error, did not read all lines.rY   zDid not read all entriesZintcZint8rH   rI   rB   floatz5'entries' in header is smaller than number of entriesz4'entries' in header is larger than number of entries)r   r   )"r0   r2   r3   r4   r#   r%   scipy.sparser   ImportErrorDTYPES_BY_FIELDr   r8   r   r   r   r6   r7   FIELD_PATTERNra   r   r]   rP   re   rB   rd   r   r^   r   r=   rb   r	   r   	conjugateNotImplementedError) r/   rg   r0   r2   r3   r4   r#   Zsymmr   r   r8   
is_integerZis_unsigned_integerZ
is_complexZis_skewZis_hermZ
is_patternr!   ri   rz   r{   r|   klIJVZentry_numbermaskZod_IZod_JZod_Vr   r   r   r     s  








"kh
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}n5|| jkrU|jjdvrT|d}n$|| jkre|jjdvre|d	}nt|srt	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 q| ||}|| jkrd||	f }||d || j
| j| j fv r|| j!krIt"|	D ]}t"|D ]}||||f  }||d q1q+d S || j#krtt"|	D ]}t"|d |D ]}||||f  }||d q\qSd S t"|	D ]}t"||D ]}||||f  }||d qqxd 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r,|j(|j)k}t*|j+| |j(| |j)| ff|jd }d!||	|j,f }||d | ||d }|| j&krkt-|j(d |j)d D ]\}}d||f }||d qUd 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| )#NZ	__array__rY   zExpected 2 dimensional arrayrH   zBmmwrite does not support integer dtypes larger than native 'intp'.fdrJ   rx   rK   zunknown matrix type: %sr9   ZfF      rz   r@   fr   crB   urA   zunexpected dtype kind z"%%MatrixMarket matrix {0} {1} {2}
r   
z%%%s
z%i %i
r   z*pattern type inconsisted with dense formatzUnknown field type %s)r   z	%i %i %i
z%i %i ).r   listr   r   hasattrra   r   rc   r   r=   r   r
   r   OverflowErrorZastyper   r   r   r   typekindro   r   r   r>   rE   rG   r4   r   encoder^   r   r   r   r   r6   r   r   r   r   r   r   r   dataZnnzzip)r/   rg   r!   r"   r#   r$   r%   Zrepr0   r2   typecoder   r   ri   templater{   rz   r|   ZcooZlower_triangle_maskrk   r   rJ   r   r   r   r     s   








$$zMMFile._write)rj   r   NNN)-__name__
__module____qualname__r   propertyr0   r2   r3   r4   r#   r%   r8   rb   ra   r<   classmethodr>   r   r   r   r   r   rD   rE   r   r5   r6   r7   rF   rG   r   staticmethodrM   rO   r   r\   r   r   r   r   r   r   r   r   r   r   r   r   r   r   j   s    












K>
>
	
# /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)rs   appendZGzipFiler   ru   rv   r   r   )rg   Zbad_clsrs   ru   r   r   r   _is_fromfile_compatible>  s   r   __main__r   ZReadingz... )endztook %s secondsr   )__doc__rm   sysZnumpyr   r   r   r   r   r   r   r	   r
   r   r   r   __all__r   r   r   r   r   r   r   timeargvfilenameprintstdoutr   tr   r   r   r   <module>   s6    ,
     Y
