B
    0dat                 @   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 ddddg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 rddlZxTejdd D ]BZededdd ej  e Zee ede e   qW 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   ?/var/www/html/venv/lib/python3.7/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'.
    )r   info)sourcer   r   r   r      s    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   read)r   r   r   r   r   <   s     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    c            
   @   st  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'dCd8d9Z(d:d; Z)d<d= Z*d>d? Z+dDd@dAZ,d7S )Er   )_rows_cols_entries_format_field	_symmetryc             C   s   | j S )N)r%   )selfr   r   r   rowsr   s    zMMFile.rowsc             C   s   | j S )N)r&   )r+   r   r   r   colsv   s    zMMFile.colsc             C   s   | j S )N)r'   )r+   r   r   r   entriesz   s    zMMFile.entriesc             C   s   | j S )N)r(   )r+   r   r   r   format~   s    zMMFile.formatc             C   s   | j S )N)r)   )r+   r   r   r   r"      s    zMMFile.fieldc             C   s   | j S )N)r*   )r+   r   r   r   r$      s    zMMFile.symmetryc             C   s   | j | j| j| jfkS )N)r*   SYMMETRY_SYMMETRICSYMMETRY_SKEW_SYMMETRICSYMMETRY_HERMITIAN)r+   r   r   r   has_symmetry   s    zMMFile.has_symmetry
coordinatearrayc             C   s    || j krtd|| j f d S )Nz)unknown format type %s, must be one of %s)FORMAT_VALUES
ValueError)r+   r/   r   r   r   _validate_format   s    
zMMFile._validate_formatintegerzunsigned-integerr   complexpatternc             C   s    || j krtd|| j f d S )Nz(unknown field type %s, must be one of %s)FIELD_VALUESr7   )r+   r"   r   r   r   _validate_field   s    
zMMFile._validate_fieldZgeneralZ	symmetriczskew-symmetricZ	hermitianc             C   s    || j krtd|| j f d S )Nz+unknown symmetry type %s, must be one of %s)SYMMETRY_VALUESr7   )r+   r$   r   r   r   _validate_symmetry   s    
zMMFile._validate_symmetryintpuint64dDc               C   s   d S )Nr   r   r   r   r   reader   s    zMMFile.readerc               C   s   d S )Nr   r   r   r   r   writer   s    zMMFile.writerc             C   s`  |  |\}}z:| }dd | D \}}}}}	|dsHtd| dks`td| | dkrt| j}n| dkr| j}x|r|d	 d
kr| }qW x| s| }qW | }
|| jkrt	|
dkstd|
d tt|
\}}|| }n0t	|
dks$td|
d tt|
\}}}||||| |	 fS |rZ|  X dS )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>   s    zMMFile.info.<locals>.<listcomp>z%%MatrixMarketz%source is not in Matrix Market formatmatrixzProblem reading file header: r5   r4   r   )%%      zHeader line not of length 2: ascii   zHeader line not of length 3: N)_openreadlinesplit
startswithr7   lowerFORMAT_ARRAYFORMAT_COORDINATErF   lenr   mapintclose)r+   r   streamclose_itlineZmmidrJ   r/   r"   r$   Z
split_liner,   r-   r.   r   r   r   r      s>    



zMMFile.inforbc             C   s  yt | } W n tk
r&   | dfS X |d dkrt j| st j| d rZ| d } n2t j| d rt| d } nt j| d r| d } | drddl}|| |}q| d	rddl}|	| d
}qt| |}n"| 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.bz2r^   T)
osfspath	TypeErrorpathisfileendswithgzipopenbz2BZ2File)Zfilespecmoderg   r[   ri   r   r   r   rP     s.    





zMMFile._openc                s$   j \}|krtjS d}d} jjdk}t r|     \}}||k  ||k krftjS  	   fdd}n fdd}xn| D ]d\}}	}
|r|
r|dkrd}n6|r||	krd}|r||	 krd}|r|t
|	krd}|s|s|sP qW |rtjS |rtjS |rtjS tjS )NTFDc              3   sT   xN   D ]B\\} }}| |kr8 || f }||dfV  q
| |kr
||dfV  q
W d S )NFT)items)ijaijaji)r    r   r   symm_iteratorh  s    z+MMFile._get_symmetry.<locals>.symm_iteratorc              3   sT   xNt D ]B} x<t | D ].} | |   |  |  }}|||| kfV  qW q
W d S )N)range)ro   rn   rp   rq   )r    nr   r   rr   s  s    r   F)shaper   SYMMETRY_GENERALdtypecharr   tocooZnonzerosumZtodokr   r0   r1   r2   )r    mZissymmZisskewZishermrowcolrr   rp   rq   Zis_diagonalr   )r    rt   r   _get_symmetryS  s@    
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 f | d S )N)_init_attrs)r+   kwargsr   r   r   __init__  s    zMMFile.__init__c             C   s6   |  |\}}z| | | |S |r0|  X 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 object.

        Returns
        -------
        a : ndarray or coo_matrix
            Dense or sparse matrix depending on the matrix format in the
            Matrix Market file.
        N)rP   _parse_header_parse_bodyrZ   )r+   r   r[   r\   r   r   r   r     s    

zMMFile.readr   Nc       	      C   sF   |  |d\}}z| |||||| W d|r8|  n|  X dS )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)rP   _writerZ   flush)	r+   r   r    r!   r"   r#   r$   r[   r\   r   r   r   r     s    
zMMFile.writec          	   K   sp   | j j}dd |D }t| t| }|rBtdt||f x(|D ] }t| |||dd d qHW 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   )rG   attrr   r   r   rI     s    z&MMFile._init_attrs.<locals>.<listcomp>zVfound %s invalid keyword arguments, please only
                                use %sr   N)	__class__	__slots__setkeysr7   tuplesetattrr   )r+   r   attrsZpublic_attrsZinvalid_keysr   r   r   r   r     s    

zMMFile._init_attrsc             C   s2   | j |\}}}}}}| j||||||d d S )N)r,   r-   r.   r/   r"   r$   )r   r   r   )r+   r[   r,   r-   r.   r/   r"   r$   r   r   r   r     s    zMMFile._parse_headerc              C   s  | j | j| j| j| j| jf\}}}}}}yddlm} W n tk
rP   d }Y nX | j	
|d }	| j}
|| jk}|| jk}|| jk}|| jk}|| jk}|| jk}|| jkr\t||f|	d}d}d\}}|rd|||f< ||d k r|d7 }x|r
| }|r|d dks| sq|r,t|}n2|r<t|}n"|rVttt|  }nt|}||||f< |
r||kr|r| |||f< n$|rt||||f< n||||f< ||d k r|d }q|d }|
sd}q|}|rd|||f< ||d k r|d7 }qW |r8|d|gkr.||d ksXtdn |d|gkrP||kstdn|| jkr|d krt||f|	d}d}d}x|r| }|r|d dks| sq| }tt|d d \}}|d |d  }}|rt|d }n>|rt|d }n*|r4ttt|dd   }nt|d }||||f< |
r||kr|rr| |||f< n$|rt||||f< n||||f< |d }qW ||kstd	 n*|| jkr|dkr|||f|	dS t|d
d}t|d
d}|rt|dd}nH|r t|dd}n4|r4t|dd}n |rHt|dd}nt|dd}d}x|D ]}|r^|d dks^| sq^|d |krtd| }tt|d d \||< ||< |s(|rt|d ||< nJ|rt|d ||< n2|rttt|dd   ||< nt|d ||< |d7 }q^W ||k rHtd|d8 }|d8 }|
r||k}|| }|| }|| }t||f}t||f}|r|d9 }n|r|  }t||f}||||ff||f|	d}nt!||S )Nr   )r   )rw   r   )r   r   )rK   rL   z$Parse error, did not read all lines.rM   zDid not read all entriesZintcZint8r@   rA   r:   floatz5'entries' in header is smaller than number of entriesz4'entries' in header is larger than number of entries)ru   rw   )"r,   r-   r.   r/   r"   r$   scipy.sparser   ImportErrorDTYPES_BY_FIELDr   r3   r   r   r   r1   r2   FIELD_PATTERNrU   r   rQ   rF   rY   r:   rX   r   rR   r   r7   rV   r	   r   	conjugateNotImplementedError) r+   r[   r,   r-   r.   r/   r"   Zsymmr   rw   r3   
is_integerZis_unsigned_integerZ
is_complexZis_skewZis_hermZ
is_patternr    r]   rn   ro   rp   klIJVZentry_numbermaskZod_IZod_JZod_Vr   r   r   r     s   

















zMMFile._parse_bodyc             C   s  t |ts(t |ts(t |ts(t|dr| j}t|}t|jdkrLt	d|j\}}	|d k	r|| j
krt|jds|td|d}q|| jkr|jjdkr|d}q|| jkr|jjdkr|d	}n&t|st	d
t| d}|j\}}	|jj}
|d kr|
dkrd}nd}|d kr|jj}|dkrPt|jdsJtdd}n<|dkr`d}n,|dkrpd}n|dkrd}ntd| |d kr| |}| j| | j| | j| d|||}||d x,|dD ]}d| }||d qW | ||}|| jkrLd||	f }||d || j
| j| j fkrX|| j!krxt"|	D ]:}x2t"|D ]&}||||f  }||d q~W qpW n|| j#krxt"|	D ]@}x8t"|d |D ]&}||||f  }||d qW qW nJxHt"|	D ]<}x4t"||D ]&}||||f  }||d q&W qW n|| jkr&|| j!krxt"|	D ]J}xBt"|D ]6}|||f }|t$|t%|f }||d qW qzW nZx|t"|	D ]L}xDt"||D ]6}|||f }|t$|t%|f }||d qW qW n"|| j&kr<t	dntd| n|' }|| j!kr|j(|j)k}t*|j+| |j(| |j)| ff|jd }d!||	|j,f }||d | ||d }|| j&krx@t-|j(d |j)d D ]&\}}d||f }||d qW n|| j
| j| j fkr|xt-|j(d |j)d |j+D ]0\}}}d"||f ||  }||d qFW nr|| jkrxdt-|j(d |j)d |j+D ]8\}}}d"||f ||j$|j%f  }||d qW ntd| d S )#NZ	__array__rM   zExpected 2 dimensional arrayr@   zBmmwrite does not support integer dtypes larger than native 'intp'.fdrB   rl   rC   zunknown matrix type: %sr4   ZfF      rn   r9   fr   cr:   uzunsigned-integerz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)ru   z	%i %i %i
z%i %i ).r   listr   r   hasattrrU   r   rW   ru   r7   r   r
   rw   OverflowErrorZastyper   rx   r   r   typekindrc   r~   r   r8   r=   r?   r/   r   encoderR   r   r   rv   rs   r1   r   r   r   ry   r|   r}   r   dataZnnzzip)r+   r[   r    r!   r"   r#   r$   repr,   r-   typecoder   r   r]   templatero   rn   rp   ZcooZlower_triangle_maskr_   r   rB   r   r   r   r     s    
















 &&zMMFile._write)r^   )r   NNN)r   NNN)-__name__
__module____qualname__r   propertyr,   r-   r.   r/   r"   r$   r3   rV   rU   r6   classmethodr8   r   r   r   r   r   r<   r=   rv   r0   r1   r2   r>   r?   r   staticmethodrD   rE   r   rP   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   j   s`   L>?
 
" / c             C   st   g }yddl }||j W n tk
r0   Y nX yddl}||j W n tk
r^   Y nX 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)rg   appendGzipFiler   ri   rj   r   r   )r[   Zbad_clsrg   ri   r   r   r   _is_fromfile_compatible>  s    r   __main__r   ZReadingz... )endztook %s seconds)r   NNN)__doc__ra   sys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>   s0   ,
     Y

