
    tKgK                         d Z ddlZddlZddlmZ ddlmZmZm	Z	 ddgZ
 G d d	e      Z G d
 de      Zd Z G d d      ZddZd Zd Z G d d      Z G d d      Zd ZddZy)a  
Implementation of Harwell-Boeing read/write.

At the moment not the full Harwell-Boeing format is supported. Supported
features are:

    - assembled, non-symmetric, real matrices
    - integer for pointer/indices
    - exponential format for float values, and int format

    N)
csc_matrix   )FortranFormatParser	IntFormat	ExpFormathb_readhb_writec                       e Zd Zy)MalformedHeaderN__name__
__module____qualname__     _/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/scipy/io/_harwell_boeing/hb.pyr   r          r   r   c                       e Zd Zy)LineOverflowNr   r   r   r   r   r   "   r   r   r   c                 F    | j                   | j                  z  dz   |dz
  z  S )zcReturn the number of bytes to read to get every full lines for the
    given parsed fortran format.r   )repeatwidth)fmtnliness     r   _nbytes_fullr   &   s%     JJ"Q&6A:66r   c                   >    e Zd Zedd       Zed        Z	 ddZd Zy)HBInfoNc                    |j                  d      }|j                  }|j                  }|j                  }|j                  \  }	}
|j
                  }|Gt        j                  t        j                  |dz               }t        j                  t        j                  |dz               }|j                  j                  t        j                  d   v r=t        j                  t        j                  t        j                  |                   }n|j                  j                  t        j                  d   v r=t        j                  t        j                  t        j                  |                   }n0d|j                  j                   d}t        |      t        d      |t        j                   |      st#        d	      |j                  j                  t        j                  d   v rd
}nD|j                  j                  t        j                  d   v rd}nt        d|j                  z        t%        |dd      }nt#        d      d } |||j&                        } |||j&                        } |||j&                        }||z   |z   } | ||||||||	|
||j(                  |j(                  |j(                        S )a  Create a HBInfo instance from an existing sparse matrix.

        Parameters
        ----------
        m : sparse matrix
            the HBInfo instance will derive its parameters from m
        title : str
            Title to put in the HB header
        key : str
            Key
        mxtype : HBMatrixType
            type of the input matrix
        fmt : dict
            not implemented

        Returns
        -------
        hb_info : HBInfo instance
        Fcopyr   AllFloat
AllIntegerztype z not implemented yetzfmt argument not supported yet.z Complex values not supported yetintegerrealz"type %s for values not implementedunsymmetric	assembledz mxtype argument not handled yet.c                 R    || j                   z  }|| j                   z  |k7  r|dz  }|S )Nr   )r   )r   sizer   s      r   _nlinesz!HBInfo.from_data.<locals>._nlinesi   s/    SZZ'F

"d*!Mr   )tocscindptrindicesdatashapennzr   from_numbernpmaxdtypekind	typecodesr   absNotImplementedError	isrealobj
ValueErrorHBMatrixTyper(   fortran_format)clsmtitlekeymxtyper   pointerr,   valuesnrowsncols
nnon_zerospointer_fmtindices_fmt
values_fmtmessagetpr)   pointer_nlinesindices_nlinesvalues_nlinestotal_nliness                         r   	from_datazHBInfo.from_data-   sK   * GGG(())wwuUU
; $//wqy0ABK#//wqy0ABK||  BLL$<<&22BFF266&>4J3JK
""bll<&@@&22BFF266&>4J3JK
!&,,"3"3!44HI)'22%&GHH><<' !CDD||  BLL$>>""bll:&>>)*N,2LL+9 : :!"m[AF?@@	 !gll; gll;
FKK8%6F5#..-E5*&&(B(B%%	' 	'r   c                 .   |j                         j                  d      }t        |      dkD  st        d|z        |dd }|dd }|j                         j                  d      }t        |j	                               dk\  st        d|z        t        |dd       }t        |dd       }t        |dd	       }t        |d	d       }|dd j                         }	|	d
k(  rd}	nt        |	      }	|	dk(  st        d      |j                         j                  d      }t        |      dk\  st        d|z        |dd j                         }
t        |
      dk(  st        d      t        j                  |
      }|j                  dvrt        d|z        |j                  dk(  st        d|z        |j                  dk(  st        d      |dd dk(  st        d|z        t        |dd       }t        |dd	       }t        |d	d       }t        |dd       }|dk(  st        d|z        |j                         j                  d      }|j                         }t        |      dk(  st        d|z         | |||||||||||d   |d   |d   |	|      S )a6  Create a HBInfo instance from a file object containing a matrix in the
        HB format.

        Parameters
        ----------
        fid : file-like matrix
            File or file-like object containing a matrix in the HB format.

        Returns
        -------
        hb_info : HBInfo instance
        
H   z8Expected at least 72 characters for first line, got: 
%sN8   z9Expected at least 56 characters for second line, got: 
%s      *    r   z5Only files without right hand side supported for now.F   z6Expected at least 72 character for third line, got:
%s   z'mxtype expected to be 3 characters long)r$   r#   z=Only real or integer matrices supported for now (detected %s)r%   z9Only unsymmetric matrices supported for now (detected %s)r&   z)Only assembled matrices supported for nowz           z!Malformed data for third line: %sz4Unexpected value %d for nltvl (last entry of line 3)zExpected 3 formats, got %sr      )readlinestriplenr9   rstrip_expect_intupperr:   from_fortran
value_type	structurestoragesplit)r<   fidliner>   r?   rN   rK   rL   rM   
rhs_nlinesmxtype_sr@   rC   rD   rE   nelementalscts                    r   	from_filezHBInfo.from_file{   s    ||~##D)4y2~ )+/0 1 1Sb	23i ||~##D)4;;=!R' )+/0 1 1"49-$T"R[1$T"R[1#DBK0"R[&&(
J$Z0JQ $ % % ||~##D)4yB "$() * * 8>>#8}!FGG**84$77 139: ; ;=0 139: ; ;~~,HIIAbzX%@4GHHDBK(DBK( b-
!$r"+.aS*+ , , ||~##D)ZZ\2w!|9B>??5#5%a5"Q%A{	, 	,r   c                 P   || _         || _        |d}t        |      dkD  rt        d      |d}t        |      dkD  rt	        j
                  d|z  t        d	       || _        || _        || _	        || _
        t               }|j                  |      }t        |t              st        d
|z        |j                  |      }t        |t              st        d|z        |j                  |      }t        |t              r0|j                   dvrt        d| d|       t"        j$                  }nDt        |t              r&|j                   dvrt        d| d|       t&        }nt        d|      || _        || _        || _        t"        j.                  | _        t"        j.                  | _        || _        || _        t7        ||      | _        || _	        t7        ||      | _        || _
        t7        ||      | _        || _        |	| _         |
| _!        || _"        || _#        y)z@Do not use this directly, but the class ctrs (from_* functions).NzNo TitlerR   ztitle cannot be > 72 charactersz|No Key   z!key is > 8 characters (key is %s)rY   )
stacklevelz.Expected int format for pointer format, got %sz.Expected int format for indices format, got %s)r$   complexz"Inconsistency between matrix type z and value type )r#   zUnsupported format for values )$r>   r?   r]   r9   warningswarnr   rN   rK   rL   rM   r   parse
isinstancer   r   rb   r1   float64intpointer_formatindices_formatvalues_formatint32pointer_dtypeindices_dtypevalues_dtyper   pointer_nbytes_fullindices_nbytes_fullvalues_nbytes_fullrC   rD   rE   rj   r@   )selfr>   r?   rN   rK   rL   rM   r@   rC   rD   rE   pointer_format_strindices_format_strvalues_format_strright_hand_sides_nlinesrj   parserrw   rx   ry   r}   s                        r   __init__zHBInfo.__init__   sB    
=Eu:?>??;Cs8a<MM=C&16 ),,*$&&89.)4M-. / /  &89.)4M+, - - %67mY/  (;; #EfX N//<o"? @ @::Ly1  3 #EfX N//<o"? @ @ L=m=NOPP,,*XXXX(,#/#O ,#/#O *".}m"L

$&r   c                    | j                   j                  d      | j                  j                  d      z   g}|j                  d| j                  | j
                  | j                  | j                  fz         |j                  d| j                  j                  j                  d      | j                  | j                  | j                  dfz         | j                  j                  }| j                  j                  }| j                  j                  }|j                  |j                  d      d|j                  d      d|j                  d	      d
       dj!                  |      S )z<Gives the header corresponding to this instance as a string.rR   rn   z%14d%14d%14d%14dz%14s%14d%14d%14d%14drT   r      z>16   z>20rQ   )r>   ljustr?   appendrN   rK   rL   rM   r@   r;   rC   rD   rE   rw   rx   ry   join)r   headerpffmtiffmtvffmts        r   dumpzHBInfo.dump  s'   **""2&)::;((($*=*=**D,>,>@@ 	A 	,{{1177;TZZzz4??A77 	8 ##22##22""11{{2BRJ 	Kyy  r   )zDefault title0NN)r   r   )r   r   r   classmethodrO   rl   r   r   r   r   r   r   r   ,   s?    K' K'Z R, R,p 45	GR!r   r   c                 b    	 t        |       S # t        $ r}|d}t        || z        |d }~ww xY w)NzExpected an int, got %s)rv   r9   )valuemsges      r   r_   r_   ,  s<    -5z -;+Cu%1,-s   
 	.).c                    dj                  | j                  |j                        | j                         g      }t	        j
                  |t        d      }dj                  | j                  |j                        | j                         g      }t	        j
                  |t        d      }dj                  | j                  |j                        | j                         g      }t	        j
                  ||j                  d      }	 t        ||dz
  |dz
  f|j                  |j                  f      S # t        $ r}|d }~ww xY w)NrW    )r3   sepr   )r.   )r   readr~   r[   r1   
fromstringrv   r   r   r}   r   rC   rD   r9   )	contentr   
ptr_stringptr
ind_stringind
val_stringvalr   s	            r   _read_hb_datar   5  s#   ',,v'A'AB"++-/ 0J
--
3 C ',,v'A'AB'')+ ,J
--
3 C ',,v'@'@A!**,. /J
--
%%30C3As1u-!'v|| <> 	> s   
+D6 6	E?EEc                    | j                  d      } d }|j                  |j                                |j                  d        ||| j                  dz   |j                  |j
                          ||| j                  dz   |j                  |j                          ||| j                  |j                  |j                         y )NFr   c                    |j                   }||j                  z  }|d |dz
  |j                  z   }|j                  |dz
  |j                  f      D ]"  }| j                  |t	        |      z  dz          $ |j
                  |j
                  z
  }|dkD  r4| j                  ||z  t	        ||j
                  |z
  d        z  dz          y y )Nr   rQ   r   )python_formatr   reshapewritetupler(   )	farr   r   pyfmt
pyfmt_fullfullrownremains	            r   write_arrayz _write_data.<locals>.write_arrayP  s     !!SZZ'
 ,FQJ#**,-<<3:: 67CGGJs+d23 8''DII%Q;GGUW_b71B1C.D(EELM r   rQ   r   )r*   r   r   r+   rK   rw   r,   rL   rx   r-   rM   ry   )r=   rf   r   r   s       r   _write_datar   M  s    	UAN IIfkkmIIdOQXXaZ!6!6%%'QYYq[&"7"7%%'QVVV11$$&r   c                   t   e Zd ZdZdddddZddd	d
ddZdddZej                         D  ci c]  \  }}||
 c}}} Zej                         D  ci c]  \  }}||
 c}}} Z	ej                         D  ci c]  \  }}||
 c}}} Z
ed        ZddZed        Zd Zyc c}}} w c c}}} w c c}}} w )r:   zClass to hold the matrix type.RCPI)r$   rp   patternr#   SUHZ)	symmetricr%   	hermitianskewsymmetricrectangularAE)r&   	elementalc                     t        |      dk(  st        d      	 | j                  |d      }| j                  |d      }| j                  |d      } | |||      S # t
        $ r}t        d|z        |d }~ww xY w)NrY   z:Fortran format for matrix type should be 3 characters longr   r   rZ   zUnrecognized format %s)r]   r9   	_f2q_type_f2q_structure_f2q_storageKeyError)r<   r   rb   rc   rd   r   s         r   ra   zHBMatrixType.from_fortran  s    3x1} / 0 0	Ds1v.J**3q62I&&s1v.Gz9g66 	D5;<!C	Ds   ?A 	A8$A33A8c                     || _         || _        || _        || j                  vrt	        d|z        || j
                  vrt	        d|z        || j                  vrt	        d|z        y )NzUnrecognized type %szUnrecognized structure %szUnrecognized storage %s)rb   rc   rd   	_q2f_typer9   _q2f_structure_q2f_storage)r   rb   rc   rd   s       r   r   zHBMatrixType.__init__  sw    $"T^^+3j@AAD///89DEE$+++6@AA ,r   c                     | j                   | j                     | j                  | j                     z   | j                  | j
                     z   S N)r   rb   r   rc   r   rd   r   s    r   r;   zHBMatrixType.fortran_format  sE    ~~doo.""4>>23  ./ 	/r   c                 V    d| j                    d| j                   d| j                   dS )NzHBMatrixType(z, ))rb   rc   rd   r   s    r   __repr__zHBMatrixType.__repr__  s,    t/r$..1ADLL>QRSSr   N)r&   )r   r   r   __doc__r   r   r   itemsr   r   r   r   ra   r   propertyr;   r   ).0ijs   000r   r:   r:   j  s    ( 	I  N L
 #,//"34"3$!QA"34I'5';';'=>'=tq!ad'=>N%1%7%7%9:%9TQAqD%9:L
D 
D
B / /
TG 5>:s   B%B,;B3r:   c                   p    e Zd Zd
dZed        Zed        Zed        Zed        Zed        Z	d Z
d	 Zy)HBFileNc                 Z    || _         |t        j                  |      | _        y|| _        y)a  Create a HBFile instance.

        Parameters
        ----------
        file : file-object
            StringIO work as well
        hb_info : HBInfo, optional
            Should be given as an argument for writing, in which case the file
            should be writable.
        N)_fidr   rl   _hb_info)r   filehb_infos      r   r   zHBFile.__init__  s+     	?",,T2DM $DMr   c                 .    | j                   j                  S r   )r   r>   r   s    r   r>   zHBFile.title  s    }}"""r   c                 .    | j                   j                  S r   )r   r?   r   s    r   r?   z
HBFile.key  s    }}   r   c                 B    | j                   j                  j                  S r   )r   r@   rb   r   s    r   typezHBFile.type  s    }}##...r   c                 B    | j                   j                  j                  S r   )r   r@   rc   r   s    r   rc   zHBFile.structure  s    }}##---r   c                 B    | j                   j                  j                  S r   )r   r@   rd   r   s    r   rd   zHBFile.storage  s    }}##+++r   c                 B    t        | j                  | j                        S r   )r   r   r   r   s    r   read_matrixzHBFile.read_matrix  s    TYY66r   c                 D    t        || j                  | j                        S r   )r   r   r   )r   r=   s     r   write_matrixzHBFile.write_matrix  s    1dii77r   r   )r   r   r   r   r   r>   r?   r   rc   rd   r   r   r   r   r   r   r     su    $& # # ! ! / / . . , ,78r   r   c                     d }t        | d      r ||       S t        |       5 } ||      cddd       S # 1 sw Y   yxY w)ah  Read HB-format file.

    Parameters
    ----------
    path_or_open_file : path-like or file-like
        If a file-like object, it is used as-is. Otherwise, it is opened
        before reading.

    Returns
    -------
    data : scipy.sparse.csc_matrix instance
        The data read from the HB file as a sparse matrix.

    Notes
    -----
    At the moment not the full Harwell-Boeing format is supported. Supported
    features are:

        - assembled, non-symmetric, real matrices
        - integer for pointer/indices
        - exponential format for float values, and int format

    Examples
    --------
    We can read and write a harwell-boeing format file:

    >>> from scipy.io import hb_read, hb_write
    >>> from scipy.sparse import csr_array, eye
    >>> data = csr_array(eye(3))  # create a sparse array
    >>> hb_write("data.hb", data)  # write a hb file
    >>> print(hb_read("data.hb"))  # read a hb file
    <Compressed Sparse Column sparse matrix of dtype 'float64'
        with 3 stored elements and shape (3, 3)>
        Coords	Values
        (0, 0)	1.0
        (1, 1)	1.0
        (2, 2)	1.0
    c                 8    t        |       }|j                         S r   )r   r   )rf   hbs     r   _get_matrixzhb_read.<locals>._get_matrix  s    C[~~r   r   N)hasattropen)path_or_open_filer   r   s      r   r   r     s?    N   &),--#$q> %$$s   5>c                     j                  d      t        j                        fd}t        | d      r ||       S t	        | d      5 } ||      cddd       S # 1 sw Y   yxY w)a  Write HB-format file.

    Parameters
    ----------
    path_or_open_file : path-like or file-like
        If a file-like object, it is used as-is. Otherwise, it is opened
        before writing.
    m : sparse-matrix
        the sparse matrix to write
    hb_info : HBInfo
        contains the meta-data for write

    Returns
    -------
    None

    Notes
    -----
    At the moment not the full Harwell-Boeing format is supported. Supported
    features are:

        - assembled, non-symmetric, real matrices
        - integer for pointer/indices
        - exponential format for float values, and int format

    Examples
    --------
    We can read and write a harwell-boeing format file:

    >>> from scipy.io import hb_read, hb_write
    >>> from scipy.sparse import csr_array, eye
    >>> data = csr_array(eye(3))  # create a sparse array
    >>> hb_write("data.hb", data)  # write a hb file
    >>> print(hb_read("data.hb"))  # read a hb file
    <Compressed Sparse Column sparse matrix of dtype 'float64'
        with 3 stored elements and shape (3, 3)>
        Coords	Values
        (0, 0)	1.0
        (1, 1)	1.0
        (2, 2)	1.0
    Fr   Nc                 >    t        |       }|j                        S r   )r   r   )rf   r   r   r=   s     r   _set_matrixzhb_write.<locals>._set_matrix6  s    C!q!!r   r   w)r*   r   rO   r   r   )r   r=   r   r   r   s    ``  r   r	   r	     si    T 	
UA""1%"  '*,--#S)Qq> *))s   A$$A-r   )r   rq   numpyr1   scipy.sparser   _fortran_format_parserr   r   r   __all__	Exceptionr   Warningr   r   r   r_   r   r   r:   r   r   r	   r   r   r   <module>r      s   
(   # M Mj
!	i 		7 	7}! }!@-0&:9T 9Tx,8 ,8^/"d7"r   