
    UgK                         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dS )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dS )MalformedHeaderN__name__
__module____qualname__     Z/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/scipy/io/_harwell_boeing/hb.pyr   r              Dr   r   c                       e Zd ZdS )LineOverflowNr   r   r   r   r   r   "   r   r   r   c                 2    | 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!     J"Q&6A:66r   c                   L    e Zd Zed	d            Zed             Z	 d
dZd ZdS )HBInfoDefault title0Nc                    |                     d          }|j        }|j        }|j        }|j        \  }	}
|j        }|!t          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        |                               }n.d|j
        j         d}t          |          t          d	          |t          j        |          st#          d
          |j
        j        t          j        d         v rd}n8|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copyNr   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                 @    || j         z  }|| j         z  |k    r|dz  }|S )Nr   )r   )r   sizer   s      r   _nlinesz!HBInfo.from_data.<locals>._nlinesi   s.    SZ'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-   sg   * GGG()wuU
; $/wqy0A0ABBK#/wqy0A0ABBK| BL$<<<&2BF26&>>4J4J3JKK

"bl<&@@@&2BF26&>>4J4J3JKK

I&,"3III)'222%&GHHH><'' E !CDDD| BL$>>>"bl:&>>>)*N,2L+9 : : :!"m[AAFF?@@@	 	 	 !gl;; gl;;
FK88%6Fs5#..-E5*&(B%	' ' 	'r   c                    |                                                     d          }t          |          dk    st          d|z            |dd         }|dd         }|                                                     d          }t          |                                          dk    st          d|z            t          |dd                   }t          |dd                   }t          |dd	                   }t          |d	d                   }|dd                                         }	|	d
k    rd}	nt          |	          }	|	dk    st          d          |                                                     d          }t          |          dk    st          d|z            |dd                                         }
t          |
          dk    st          d          t                              |
          }|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            |                                                     d          }|                                }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lenr;   rstrip_expect_intupperr<   from_fortran
value_type	structurestoragesplit)r>   fidliner@   rA   rP   rM   rN   rO   
rhs_nlinesmxtype_srB   rE   rF   rG   nelementalscts                    r   	from_filezHBInfo.from_file{   s    ||~~##D))4yy2~~ )+/0 1 1 1SbS	233i ||~~##D))4;;==!!R'' )+/0 1 1 1"49--$T"R%[11$T"R%[11#DBK00"R%[&&((
JJ$Z00JQ $ % % % ||~~##D))4yyB "$() * * * 8>>##8}}!!FGGG**844$777 139: ; ; ;=00 139: ; ; ;~,,HIIIAbDzX%%@4GHHHDBK((DBK(( be--
!$r"u+..aS*+ , , , ||~~##D))ZZ\\2ww!||9B>???s5#5%a5"Q%A{	, , 	,r   r   c                    || _         || _        |d}t          |          dk    rt          d          |d}t          |          dk    rt	          j        d|z  t          d	           || _        || _        || _	        || _
        t                      }|                    |          }t          |t                    st          d
|z            |                    |          }t          |t                    st          d|z            |                    |          }t          |t                    r+|j        dvrt          d| d|           t"          j        }nMt          |t                    r&|j        dvrt          d| d|           t&          }nt          d|          || _        || _        || _        t"          j        | _        t"          j        | _        || _        || _        t7          ||          | _        || _	        t7          ||          | _        || _
        t7          ||          | _        || _        |	| _         |
| _!        || _"        || _#        dS )z@Do not use this directly, but the class ctrs (from_* functions).NzNo TitlerT   ztitle cannot be > 72 charactersz|No Key   z!key is > 8 characters (key is %s)r[   )
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@   rA   r_   r;   warningswarnr   rP   rM   rN   rO   r   parse
isinstancer   r   rd   r3   float64intpointer_formatindices_formatvalues_formatint32pointer_dtypeindices_dtypevalues_dtyper   pointer_nbytes_fullindices_nbytes_fullvalues_nbytes_fullrE   rF   rG   rl   rB   )selfr@   rA   rP   rM   rN   rO   rB   rE   rF   rG   pointer_format_strindices_format_strvalues_format_strright_hand_sides_nlinesrl   parserry   rz   r{   r   s                        r   __init__zHBInfo.__init__   s    
=Eu::??>???;Cs88a<<M=C&16 6 6 6 ),,*$&&&899.)44 	/M-. / / /  &899.)44 	-M+, - - - %677mY// 	Q (;;;  "?f "? "?/<"? "? @ @ @:LLy11 	Q 33  "?f "? "?/<"? "? @ @ @ LLOmOOPPP,,*XX(,#/#O#O ,#/#O#O *".}m"L"L

$&r   c                    | j                             d          | j                            d          z   g}|                    d| j        | j        | j        | j        fz             |                    d| j        j	                            d          | j
        | j        | j        dfz             | j        j	        }| j        j	        }| j        j	        }|                    |                    d          d|                    d          d|                    d	          d
           d                    |          S )z<Gives the header corresponding to this instance as a string.rT   rp   z%14d%14d%14d%14dz%14s%14d%14d%14d%14drV   r      z>16   z>20rS   )r@   ljustrA   appendrP   rM   rN   rO   rB   r=   rE   rF   rG   ry   rz   r{   join)r   headerpffmtiffmtvffmts        r   dumpzHBInfo.dump  s:   *""2&&):)::;(($*=*D,>@@ 	A 	A 	A 	,{177;;TZz4?A77 	8 	8 	8 #2#2"1{{2BRJ 	K 	K 	Kyy   r   )r   r   NN)r   r   )r   r   r   classmethodrQ   rn   r   r   r   r   r   r   r   ,   s        K' K' K' [K'Z R, R, [R,p 45	G G G GR! ! ! ! !r   r   c                 t    	 t          |           S # t          $ r}|d}t          || z            |d }~ww xY w)NzExpected an int, got %s)rx   r;   )valuemsges      r   ra   ra   ,  sP    -5zz - - -;+Cu%%1,-s    
727c                    d                     |                     |j                  |                                 g          }t	          j        |t          d          }d                     |                     |j                  |                                 g          }t	          j        |t          d          }d                     |                     |j                  |                                 g          }t	          j        ||j	        d          }	 t          ||dz
  |dz
  f|j        |j        f          S # t          $ r}|d }~ww xY w)NrY    )r5   sepr   )r0   )r   readr   r]   r3   
fromstringrx   r   r   r   r   rE   rF   r;   )	contentr   
ptr_stringptr
ind_stringind
val_stringvalr   s	            r   _read_hb_datar   5  se   ',,v'ABB"++--/ 0 0J
-
3     C ',,v'ABB''))+ , ,J
-
3     C ',,v'@AA!**,,. / /J
-
%30 0 0C3As1u-!'v| <> > > 	>   s   %D? ?
E	EEc                 j   |                      d          } d }|                    |                                           |                    d            ||| j        dz   |j        |j                    ||| j        dz   |j        |j                    ||| j	        |j
        |j                   d S )NFr!   c                    |j         }||j        z  }|d |dz
  |j        z           }|                    |dz
  |j        f          D ]*}|                     |t	          |          z  dz              +|j        |j        z
  }|dk    r=|                     ||z  t	          ||j        |z
  d                    z  dz              d S d S )Nr   rS   r   )python_formatr   reshapewritetupler*   )	farr   r   pyfmt
pyfmt_fullfullrownremains	            r   write_arrayz _write_data.<locals>.write_arrayP  s     !SZ'
 ,FQJ#*,,-<<3: 677 	4 	4CGGJs+d23333'DI%Q;;GGUW_b71B1C1C.D(E(EELMMMMM ;r   rS   r   )r,   r   r   r-   rM   ry   r.   rN   rz   r/   rO   r{   )r?   rh   r   r   s       r   _write_datar   M  s    	UAN N N IIfkkmmIIdOOOKQXaZ!6%' ' 'KQYq[&"7%' ' 'KQVV1$& & & & &r   c                   (   e Zd ZdZdddddZddd	d
ddZdddZd e                                D             Zd e                                D             Z	d e                                D             Z
ed             ZddZed             Zd ZdS )r<   zClass to hold the matrix type.RCPI)r&   rr   patternr%   SUHZ)	symmetricr'   	hermitianskewsymmetricrectangularAE)r(   	elementalc                     i | ]\  }}||	S r   r   .0ijs      r   
<dictcomp>zHBMatrixType.<dictcomp>  s    444$!QA444r   c                     i | ]\  }}||	S r   r   r   s      r   r   zHBMatrixType.<dictcomp>  s    >>>tq!a>>>r   c                     i | ]\  }}||	S r   r   r   s      r   r   zHBMatrixType.<dictcomp>  s    :::TQAq:::r   c                    t          |          dk    st          d          	 | j        |d                  }| j        |d                  }| j        |d                  } | |||          S # t
          $ r}t          d|z            |d }~ww xY w)Nr[   z:Fortran format for matrix type should be 3 characters longr   r   r\   zUnrecognized format %s)r_   r;   	_f2q_type_f2q_structure_f2q_storageKeyError)r>   r   rd   re   rf   r   s         r   rc   zHBMatrixType.from_fortran  s    3xx1}} / 0 0 0	Ds1v.J*3q62I&s1v.G3z9g666 	D 	D 	D5;<<!C	Ds   AA* *
B4BBr(   c                     || _         || _        || _        || j        vrt	          d|z            || j        vrt	          d|z            || j        vrt	          d|z            d S )NzUnrecognized type %szUnrecognized structure %szUnrecognized storage %s)rd   re   rf   	_q2f_typer;   _q2f_structure_q2f_storage)r   rd   re   rf   s       r   r   zHBMatrixType.__init__  s    $"T^++3j@AAAD///89DEEE$+++6@AAA ,+r   c                 r    | j         | j                 | j        | j                 z   | j        | j                 z   S N)r   rd   r   re   r   rf   r   s    r   r=   zHBMatrixType.fortran_format  s7    ~do."4>23 ./ 	/r   c                 8    d| j          d| j         d| j         dS )NzHBMatrixType(z, ))rd   re   rf   r   s    r   __repr__zHBMatrixType.__repr__  s)    StSS$.SSDLSSSSr   N)r(   )r   r   r   __doc__r   r   r   itemsr   r   r   r   rc   r   propertyr=   r   r   r   r   r<   r<   j  s%       (( 	 I   N  L
 54)//"3"3444I>>~';';'='=>>>N::\%7%7%9%9:::L
D 
D [
D
B 
B 
B 
B / / X/
T T T T Tr   r<   c                       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dS )HBFileNc                 h    || _         |!t                              |          | _        dS || _        dS )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   rn   _hb_info)r   filehb_infos      r   r   zHBFile.__init__  s6     	?",,T22DMMM $DMMMr   c                     | j         j        S r   )r   r@   r   s    r   r@   zHBFile.title  s    }""r   c                     | j         j        S r   )r   rA   r   s    r   rA   z
HBFile.key  s    }  r   c                 $    | j         j        j        S r   )r   rB   rd   r   s    r   typezHBFile.type  s    }#..r   c                 $    | j         j        j        S r   )r   rB   re   r   s    r   re   zHBFile.structure  s    }#--r   c                 $    | j         j        j        S r   )r   rB   rf   r   s    r   rf   zHBFile.storage  s    }#++r   c                 6    t          | j        | j                  S r   )r   r   r   r   s    r   read_matrixzHBFile.read_matrix  s    TY666r   c                 8    t          || j        | j                  S r   )r   r   r   )r   r?   s     r   write_matrixzHBFile.write_matrix  s    1di777r   r   )r   r   r   r   r   r@   rA   r   re   rf   r   r   r   r   r   r   r     s        $ $ $ $& # # X# ! ! X! / / X/ . . X. , , X,7 7 78 8 8 8 8r   r   c                     d }t          | d          r ||           S t          |           5 } ||          cddd           S # 1 swxY w Y   dS )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                 H    t          |           }|                                S r   )r   r   )rh   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   AA
A
c                                         d          t                                        fd}t          | d          r ||           S t	          | d          5 } ||          cddd           S # 1 swxY w Y   dS )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                 N    t          |           }|                              S r   )r   r   )rh   r   r   r?   s     r   _set_matrixzhb_write.<locals>._set_matrix6  s$    C!!q!!!r   r   w)r,   r   rQ   r   r   )r   r?   r   r   r   s    ``  r   r	   r	     s    T 	
UA""1%%" " " " " "  '** "{,---#S)) 	"Q;q>>	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s   &A>>BBr   )r   rs   numpyr3   scipy.sparser   _fortran_format_parserr   r   r   __all__	Exceptionr   Warningr   r   r   ra   r   r   r<   r   r   r	   r   r   r   <module>r     s  
 
(      # # # # # # M M M M M M M M M Mj
!	 	 	 	 	i 	 	 		 	 	 	 	7 	 	 	7 7 7}! }! }! }! }! }! }! }!@- - - -  0& & &:9T 9T 9T 9T 9T 9T 9T 9Tx,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8^/" /" /"d7" 7" 7" 7" 7" 7"r   