3

6^=q                 @   s*  d Z ddlmZmZm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lmZ ddlmZmZ dd	d
dgZdd Zdd	 Zddd
ZG dd deZdd Ze dkr&ddl!Z!xTej"dd D ]BZ#e$de#ddd ej%j&  e!j! Z'ee# e$de!j! 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.
    )divisionprint_functionabsolute_importN)	asarrayrealimagconjzerosndarrayconcatenateonescan_cast)asbytesasstr)string_types)
coo_matrix
isspmatrixmminfommreadmmwriteMMFilec             C   s
   t j| 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)source r   ./tmp/pip-build-vw4w4j08/scipy/scipy/io/mmio.pyr      s    c             C   s   t  j| 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  j| ||||| 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 2D 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   P   s    c            
   @   st  e Zd ZdGZ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dHd1d2Z#ed3d4 Z$ed5d6 Z%d7d8 Z&d9d: Z'dId=d>Z(d?d@ Z)dAdB Z*dCdD Z+dJdEdFZ,d<S )Kr   _rows_cols_entries_format_field	_symmetryc             C   s   | j S )N)r$   )selfr   r   r   rowsq   s    zMMFile.rowsc             C   s   | j S )N)r%   )r*   r   r   r   colsu   s    zMMFile.colsc             C   s   | j S )N)r&   )r*   r   r   r   entriesy   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_VALUESr6   )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_VALUESr6   )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   sL  | j |\}}z&|j }dd |j D \}}}}}	|jdsHtd|j dks`td| |j dkrt| j}n|j dkr| j}x|jd	r|j }qW x|j s|j }qW |j }|| jkrt	|d
kstd| t
t|\}
}|
| }n*t	|dkstd| t
t|\}
}}|
||||j |	j fS |rF|j  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 |j 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: r4   r3      %   zHeader line not of length 2:    zHeader line not of length 3: N)_openreadlinesplit
startswithr6   lowerFORMAT_ARRAYFORMAT_COORDINATErE   lenmapintclose)r*   r   streamclose_itlineZmmidrI   r.   r!   r#   r+   r,   r-   r   r   r   r      s:    




zMMFile.inforbc             C   s   d}t | trd}|d dkrtjj| svtjj| d rD| d } n2tjj| d r^| d } ntjj| d rv| d } | jdrdd	l}|j| |}q| jd
rdd	l}|j	| d}qt| |}q| dd	 dkr| d } t| |}n| }||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.
        FTr   rz.mtxz.mtx.gzz.mtx.bz2z.gzNz.bz2r[      )

isinstancer   ospathisfileendswithgzipopenbz2BZ2File)ZfilespecmoderY   rd   rX   rf   r   r   r   rM     s.    




zMMFile._openc       
         s   j \}|krtjS d}d} jjdk}t r| j   j \}}||k j ||kj krftjS  j	   fdd}n fdd}xV| D ]L\}}	|r||	krd}|r||	 krd}|r|t
|	krd}|p|p|sP qW |rtjS |rtjS |rtjS tjS )NTFDc              3   s<   x6 j  D ]*\\} }}| |kr
 || f }||fV  q
W d S )N)items)ijaijaji)r   r   r   symm_iterator_  s    z+MMFile._get_symmetry.<locals>.symm_iteratorc              3   sR   xLt D ]@} x:t | d D ](} | |   |  |  }}||fV  qW q
W d S )N   )range)rl   rk   rm   rn   )r   nr   r   ro   h  s    F)shaper   SYMMETRY_GENERALdtypecharr   tocooZnonzerosumZtodokr   r/   r0   r1   )
r   mZissymmZisskewZishermrowcolro   rm   rn   r   )r   rr   r   _get_symmetryJ  s<    
	zMMFile._get_symmetryc          
   C   s0   t jd| t jdt jdt jd||f ij| 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   | j |\}}z| j| | j|S |r0|j  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)rM   _parse_header_parse_bodyrW   )r*   r   rX   rY   r   r   r   r     s    

zMMFile.readr   Nc       	      C   sF   | j |d\}}z| j|||||| W d|r8|j  n|j  X dS )a6  
        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 2D 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)rM   _writerW   flush)	r*   r   r   r    r!   r"   r#   rX   rY   r   r   r   r     s    
zMMFile.writec             K   sp   | j j}dd |D }t|j t| }|rBtdt||f x(|D ] }t| ||j|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 )rp   Nr   )rF   attrr   r   r   rH     s    z&MMFile._init_attrs.<locals>.<listcomp>zVfound %s invalid keyword arguments, please only
                                use %srp   N)	__class__	__slots__setkeysr6   tuplesetattrr   )r*   r   attrsZpublic_attrsZinvalid_keysr   r   r   r   r     s    

zMMFile._init_attrsc             C   s2   | j j|\}}}}}}| j||||||d d S )N)r+   r,   r-   r.   r!   r#   )r   r   r   )r*   rX   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	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|j }| s|jds|j  rq|r.t|}n2|r>t|}n"|rXttt|j  }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 |r:|d|gko,||d ksZtdn |d|gkoN||kstdn|| jkr|d krt||f|	d}d}d}x|r|j }| s|jds|j  rq|j }tt|d d \}}|d |d  }}|rt|d }n>|rt|d }n*|r8ttt|dd   }nt|d }||||f< |
r||kr|rv| |||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|r8t|dd}n |rLt|dd}nt|dd}d}x|D ]}| sb|jdsb|j  rqb|d |krtd|j }tt|d d \||< ||< |s.|rt|d ||< nJ|rt|d ||< n2|rttt|dd   ||< nt|d ||< |d7 }qbW ||k rNtd|d8 }|d8 }|
r||k}|| }|| }|| }t ||f}t ||f}|r|d9 }n|r|j! }t ||f}||||ff||f|	d}nt"||S )Nr   )r   )ru   rp   rJ   z$Parse error, did not read all lines.rK   zDid not read all entriesZintcZint8r?   r@   r9   floatz5'entries' in header is smaller than number of entriesz4'entries' in header is larger than number of entries)rs   ru   )r   r   )#r+   r,   r-   r.   r!   r#   scipy.sparser   ImportErrorDTYPES_BY_FIELDr   r2   r~   r   r   r0   r1   FIELD_PATTERNrR   r	   rN   rP   rE   rV   r9   rU   r   rO   r   r6   rS   r   r   	conjugateNotImplementedError) r*   rX   r+   r,   r-   r.   r!   Zsymmr   ru   r2   
is_integerZis_unsigned_integerZ
is_complexZis_skewZis_hermZ
is_patternr   rZ   rk   rl   rm   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|jd}q|| jkr|jjdkr|jd}q|| jkr|jjdkr|j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| | jj| | jj| |jtdj||| x&|jdD ]}|jtd|  qW | j||}|| jkr|jtd||	f  || j
| j| j fkr4|| j!krxt"|	D ]4}x,t"|D ] }|jt||||f   qlW q^W n|| j#krxt"|	D ]:}x2t"|d |D ] }|jt||||f   qW qW nDxBt"|	D ]6}x.t"||D ] }|jt||||f   qW qW n|| jkr|| j!krxt"|	D ]D}x<t"|D ]0}|||f }|jt|t$|t%|f  qdW qVW nTxvt"|	D ]F}x>t"||D ]0}|||f }|jt|t$|t%|f  qW qW n"|| j&krt	dntd| n|j' }|| j!krd|j(|j)k}t*|j+| |j(| |j)| ff|jd}|jtd ||	|j,f  | j||d }|| j&krx:t-|j(d |j)d D ] \}}|jtd||f  qW n|| j
| j| j fkr:xt-|j(d |j)d |j+D ]*\}}}|jtd!||f ||   q
W nl|| jkrx^t-|j(d |j)d |j+D ]2\}}}|jtd!||f ||j$|j%f   qbW ntd| d S )"NZ	__array__rK   zExpected 2 dimensional arrayr?   zBmmwrite does not support integer dtypes larger than native 'intp'.fdrA   ri   rB   zunknown matrix type: %sr3   ZfF      rk   r8   fr   cr9   uzunsigned-integerzunexpected dtype kind z"%%MatrixMarket matrix {0} {1} {2}

z%%%s
z%i %i
rp   z*pattern type inconsisted with dense formatzUnknown field type %s)rs   z	%i %i %i
z%i %i ).r_   listr
   r   hasattrrR   r   rT   rs   r6   r~   r   ru   OverflowErrorZastyper}   rv   r   r   typekind	TypeErrorr|   r   r7   r<   r>   r   r   r.   rO   r   r   rt   rq   r0   r   r   r   rw   rz   r{   r   dataZnnzzip)r*   rX   r   r    r!   r"   r#   repr+   r,   typecoder   rZ   templaterl   rk   rm   ZcooZlower_triangle_maskr\   r   rA   r   r   r   r     s    













(((


 &&zMMFile._write)r$   r%   r&   r'   r(   r)   )r[   )r   NNN)r   NNN)-__name__
__module____qualname__r   propertyr+   r,   r-   r.   r!   r#   r2   rS   rR   r5   classmethodr7   r~   r   r}   r   r   r;   r<   rt   r/   r0   r1   r=   r>   r   staticmethodrC   rD   r   rM   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   i   sj        I99
 
" , c             C   s   t jd dk rdS g }yddl}|j|j W n tk
rB   Y nX yddl}|j|j W n tk
rp   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
    Python3.
    r   rL   TN)
sysversion_inford   appendGzipFiler   rf   rg   r   r_   )rX   Zbad_clsrd   rf   r   r   r   _is_fromfile_compatible%  s    r   __main__rp   ZReadingz... )endztook %s seconds)r   NNN)(__doc__
__future__r   r   r   r`   r   Znumpyr   r   r   r   r	   r
   r   r   r   Znumpy.compatr   r   Zscipy._lib.sixr   r   r   r   __all__r   r   r   objectr   r   r   timeargvfilenameprintstdoutr   tr   r   r   r   <module>   s4   ,
     A

