L i^}dZddlZddlZddlmZmZmZmZmZm Z m Z m Z m Z ddl mZmZmZgdZdZdZdd d Zdd ZGd d ZdZy)z Matrix Market I/O in Python. See http://math.nist.gov/MatrixMarket/formats.html for information about the Matrix Market format. N) asarrayrealimagconjzerosndarray concatenateonescan_cast) coo_arrayissparse coo_matrix)mminfommreadmmwriteMMFilecZt|tr|jdSt|S)Nlatin1) isinstancebytesdecodestr)ss T/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/scipy/io/_mmio.pyasstrrs$!Uxx!! q6Mc,tj|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') )rinfo)sources rrrs` ;;v rTspmatrixc8tj||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 >>> 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 )rread)rr!s rrrTs^ 8==(= 33rc@tj||||||y)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)rwrite)targetacommentfield precisionsymmetrys rrrsX HNN61guiBrc eZdZdZedZedZedZedZedZ edZ edZ d Z d Z e e fZed Zd Zd ZdZdZdZeeeeefZedZdZdZdZdZeeeefZedZededededediZedZ edZ!edZ"ed+dZ#edZ$ed Z%d!Z&d"d#d$Z' d,d&Z(d'Z)d(Z*d)Z+ d,d*Z,y%)-r)_rows_cols_entries_format_field _symmetryc|jSN)r-selfs rrowsz MMFile.rows zzrc|jSr4)r.r5s rcolsz MMFile.colsr8rc|jSr4)r/r5s rentrieszMMFile.entriess }}rc|jSr4)r0r5s rformatz MMFile.format s ||rc|jSr4)r1r5s rr)z MMFile.fields {{rc|jSr4)r2r5s rr+zMMFile.symmetrys ~~rc`|j|j|j|jfvSr4)r2SYMMETRY_SYMMETRICSYMMETRY_SKEW_SYMMETRICSYMMETRY_HERMITIANr5s r has_symmetryzMMFile.has_symmetrys2~~$"9"9"&">">"&"9"9";; ;r coordinatearraycZ||jvrd|d|j}t|y)Nzunknown format type , must be one of ) FORMAT_VALUES ValueError)r6r>msgs r_validate_formatzMMFile._validate_format#s9 ++ +(0A$BTBTAUVCS/ ! ,rintegerunsigned-integerrcomplexpatterncZ||jvrd|d|j}t|y)Nzunknown field type rI) FIELD_VALUESrK)r6r)rLs r_validate_fieldzMMFile._validate_field2s9 )) )'w.?@Q@Q?RSCS/ ! *rgeneral symmetriczskew-symmetric hermitiancV||jvrtd|d|jy)Nzunknown symmetry type rI)SYMMETRY_VALUESrK)r6r+s r_validate_symmetryzMMFile._validate_symmetry@sC 4// /5hZ@//3/C/C.DFG G 0rintpuint64dDcyr4r`rrreaderz MMFile.readerM rcyr4r`r`rrwriterz MMFile.writerRrbrc:|j|\}} |j}d|jD\}}}}} |jds t d|j dk(st d|z|j dk(r |j }n|j dk(r |j}|r:|jr&|jdd vr|j}nn|r:|js!|j}|js!|j} ||j k(rDt| d k(st d |jd ztt| \} } | | z} n?t| d k(st d|jd ztt| \} } } | | | ||j | j f|r|jSS#|r|jwwxYw)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'. c3NK|]}t|jywr4)rstrip).0parts r zMMFile.info..ys>tzz|$>s#%z%%MatrixMarketz%source is not in Matrix Market formatmatrixzProblem reading file header: rGrFr%%zHeader line not of length 2: asciizHeader line not of length 3: )_openreadlinesplit startswithrKlower FORMAT_ARRAYFORMAT_COORDINATElstriprglenrmapintclose)r6rstreamclose_itlinemmidrkr>r)r+ split_liner7r:r<s rrz MMFile.infoWs6 ::f-/ ??$D>> 2D&&%??#34 !HII<<>X- !@4!GHH||~(**<///;;=T[[]1%5%B!??,D jjl(jjlJ***:!+$%D%)[[%9&:;; j1 d+:!+$%D%)[[%9&:;;&)#z&:#dG$NN$& x sC$H;0H,CHHc tj|}|ddk(rtjj |swtjj |dzr|dz}nOtjj |dzr|dz}n'tjj |dzr|dz}|j drddl}|j||}|d fS|j d rddl}|j|d }|d fSt||}|d fS|d ddk7r|dz}t||}|d fS#t$r|dfcYSwxYw) 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. Frrz.mtxz.mtx.gzz.mtx.bz2z.gzNz.bz2rbT) osfspath TypeErrorpathisfileendswithgzipopenbz2BZ2File)filespecmoderr~rs rrrz MMFile._opensR4 #yy*H 7c>77>>(+77>>(6/2'&0HWW^^HY$67')3HWW^^HZ$78'*4H  '8T2t|""6*Xt4t|h-t| }&#f,(D)Ft|A #U? " #sD88 EEc j\} | k7rtjSd}d}jjdv}t rpj j\}}||kj||kDjk7rtjSjfd}n fd}|D]`\}} } |r | r|dk7rd}nD|r|| k7rd}tjd5|r|| k7rd}ddd|r|t| k7rd}|rZ|r]|r`n|rtjS|rtjS|rtjStjS#1swYmxYw) NTFDc3KjD])\\}}}||kDr||f}||df||k(s#||df+yw)NFT)items)ijaijajir's r symm_iteratorz+MMFile._get_symmetry..symm_iteratorsY%&WWY/MVaS1u1g"C//a"C.. /s 3A Ac3KtD]-}t|D]}||||}}||||k(f/ywr4)range)rrrrr'ns rrz+MMFile._get_symmetry..symm_iteratorsYq1A"1a[1#$Q47AaDGS"Ca0011s=ArFignore)over)shaperSYMMETRY_GENERALdtypecharr tocoononzerosumtodoknperrstaterrBrCrD) r'missymmisskewishermrowcolrrr is_diagonalrs ` @r _get_symmetryzMMFile._get_symmetryshww1 6** *% A; AJS#c  S3YOO$55... A / 1(5  #S#{+#(cSj"F[[h/'##+!&'cT#Y."Ff  ,, , 11 1 ,, ,&&&!''s = E44E= c tjd|ztjdtjdtjd||fzij |dS)Nz%%.%ie z%i z%u z%%.%ie %%.%ie )r FIELD_REAL FIELD_INTEGERFIELD_UNSIGNED FIELD_COMPLEXget)r)r*s r_field_templatezMMFile._field_template&sY!!: #9$$f%%v$$&7 *'+ #eT"  #rc (|jdi|y)Nr`) _init_attrs)r6kwargss r__init__zMMFile.__init__0s"6"rTr c|j|\}} |j||j|}|r|j |rt |t r t |}|S#|r|jwwxYw)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. )rr _parse_header _parse_bodyr}rr r)r6rr!r~rdatas rr#z MMFile.read4sx$ ::f-    v &##F+D   43d#D  s "A**A?Nc|j|d\}} |j|||||||r|jy|jy#|r|jw|jwxYw)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)rr_writer}flush) r6r&r'r(r)r*r+r~rs rr%z MMFile.writeUsd. ::fd3  KK7E9h G    s A%A6c .|jj}|Dcgc]}|dd }}t|jt|z }|rt dt |d||D]"}t |||j|ddd$ycc}w)zr Initialize each attributes with the corresponding keyword arg value or a default of None Nzfound z, invalid keyword arguments, please only use ) __class__ __slots__setkeysrKtuplesetattrr)r6rattrsattr public_attrs invalid_keyss rrzMMFile._init_attrsxs ((-23TQR3 36;;=)C ,== veL&9%:;;;G.JK K r)r+)rrr)r6r~r7r:r<r>r)r+s rrzMMFile._parse_headersE NN   ' 5dGVUH dwv$x  9rc |j|j|j|j|j|j f\}}}}}}|j j|d}|j} ||jk(} ||jk(} ||jk(} ||jk(} ||jk(}||jk(}||jk(r?t!||f|}d}d\}}| rd|||f<||dz kr|dz }|r|j#}|r|ddvs|j%s,| r t'|}n@| r t'|}n2| r%t)t+t,|j/}n t-|}||||f<| r*||k7r%| r | |||f<n|rt1||||f<n||||f<||dz kr|dz}n"|dz}| sd}n|}| rd|||f<||dz kr|dz }|r| r|d|fvr||dz k(s!t3d|d|fvr||k(s t3d|S||j4k(r|dk(rt7||f|St!|d}t!|d}|rt9|d}n=| rt!|d }n-| rt!|d }n| rt!|d }n t!|d }d}|D]}|r|ddvs|j%s|dz|kDr t3d |j/}t+t&|dd\||<||<|sX| rt'|d||<nD| rt'|d||<n0| rt)t+t,|dd||<nt-|d||<|dz }||kr t3d|dz}|dz}| rU||k7}||}||}||}t;||f}t;||f}| r|dz}n|r|j=}t;||f}t7|||ff||f|}|St?|)N)rr)rrrrlz$Parse error, did not read all lines.intcint8r[r\rPfloatz5'entries' in header is smaller than number of entriesroz4'entries' in header is larger than number of entries)rr) r7r:r<r>r)r+DTYPES_BY_FIELDrrErrrrCrD FIELD_PATTERNrwrrsrgr|rPr{rrtrrKrxr r r conjugateNotImplementedError)r6r~r7r:r<r>r)symmrrE is_integeris_unsigned_integer is_complexis_skewis_herm is_patternr'rrrrIJV entry_numberlmaskod_Iod_Jod_Vs rrzMMFile._parse_bodys48IItyy48LL$++48JJ 4O0dGVUD$$((5(( d000 #t':'::d000 $666$111d000 T&& &tTl%0ADDAq!Q$tax<FA(tAw)34::<d)C(d)C!3udjjl#;G+$&9::JJL36sAbqE?0,<!!*-ad),,*-ad),#*13uae3D*E,*/!+,! ) "*g% "566 FA FAQwwwD *D *BJD>>+DD *1q!f+dD\GA&f- -rct|ts,t|tst|ts t |dr|j }t |}t|jdk7r td|j\}} |||jk(r3t|jds td|jd}n||jk(r*|jj dvr~|jd}nl||j"k(r]|jj dvrE|jd }n3t%|std t'|d }|j\}} |jj } | | d vrd }nd}|e|jj(} | dk(r$t|jds tdd}n&| dk(rd}n| dk(rd}n| dk(rd}nt+d| z||j-|}|j.j1||j.j3||j.j5|d|d|d|d} |j7| j9d|j;dD](} d| d} |j7| j9d*|j=||}||j k(rZd|| fz} |j7| j9d||j|j|j>fvr||j@k(rKtC| D]<}tC|D],}||||fz} |j7| j9d.>y||jDk(rOtC| D]@}tC|dz|D],}||||fz} |j7| j9d.BytC| D]=}tC||D],}||||fz} |j7| j9d.?y||j"k(r||j@k(ratC| D]R}tC|D]B}|||f}|tG|tI|fz} |j7| j9dDTytC| D]S}tC||D]B}|||f}|tG|tI|fz} |j7| j9dDUy||jJk(r tdt+d ||jM}||j@k7r[|jN|jPk\}tS|jT||jN||jP|ff|j!}d"|| |jVfz} |j7| j9d|j=||dz }||jJk(rVtY|jNdz|jPdzD],\}}d||fz} |j7| j9d.y||j|j|j>fvrhtY|jNdz|jPdz|jTD]3\}}}d#||fz||zz} |j7| j9d5y||j"k(r~tY|jNdz|jPdz|jTD]I\}}}d#||fz||jF|jHfzz} |j7| j9dKyt+d |)$N __array__rozExpected 2 dimensional arrayr[zBmmwrite does not support integer dtypes larger than native 'intp'.fdr]rr^zunknown matrix type: rFfFrrNfrcrPurOzunexpected dtype kind z%%MatrixMarket matrix   rrmz%i %i rz*pattern type inconsisted with dense formatzUnknown field type )rz %i %i %i z%i %i )-rlistrrhasattrrwrrzrrKrr r OverflowErrorastyperrrr typekindrrrrMrTrZr%encodertrrrrrCrrrrrrr rnnzzip)r6r~r'r(r)r*r+repr7r:typecoderrrtemplaterrrcoolower_triangle_maskrrr]s rrz MMFile._writesJ a *Q"8 a 71k#:##C A177|q  !?@@JD$ D...#AGGV4+-PQQ(Adoo-ww||4/HHSMd000ww||4/HHSMA; #8a !BCCCJD$77<<  4  =77<?@@ !=!=="4[@!&q1ud!3@A#+a1g#5D"LLX)>?@@ #4[@!&q$@A#+a1g#5D"LLX)>?@@ $,,,t444"4[@!&t@A"#AqD'C#+tCy$s).D#DD"LLX)>?@@ #4[@!&q$@A"#AqD'C#+tCy$s).D#DD"LLX)>?@@ $,,, !MNN "5eW =>>'')C4000&)gg&8#*=!>!$)>r)rNNN)-__name__ __module__ __qualname__rpropertyr7r:r<r>r)r+rErxrwrJ classmethodrMrrrrrrSrTrrBrCrDrYrZr staticmethodrardrrrrrrr#r%rrrrr`rrrrs$I;; %L& 5M"" M'NJMM!>:}!#L"" !$.$');.0BDOGG %f%x!3$c$c +O    KK\;;|='='@###(,BBF F<$9EPCGW?rrcg} ddl}|j|j ddl}|j|j t |}t|| S#t$rYCwxYw#t$rY2wxYw)z Check whether `stream` is compatible with numpy.fromfile. Passing a gzipped file object to ``fromfile/fromstring`` doesn't work with Python 3. rN)rappendGzipFile ImportErrorrrrr)r~bad_clsrrs r_is_fromfile_compatiblers{G t}}% s{{#GnG&'* **       s"AA* A'&A'* A65A6r)__doc__rnumpyrrrrrrrr r r scipy.sparser r r__all__rrrrrrr`rrrs^ ###98 3 0j $/4hlC`x ?x ?v+r