
    _Mh;L                         d Z ddlZddlZddlmZ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d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_array
csc_matrix   )FortranFormatParser	IntFormat	ExpFormathb_readhb_writec                       e Zd ZdS )MalformedHeaderN__name__
__module____qualname__     [/var/www/html/test/jupyter/venv/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}n9|j
        j        t          j        d         v rd}nt          d|j
         d          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 array or 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 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-   sm   * 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:&>>>)EFLEEEG G G!"m[AAFF?@@@	 	 	 !gl;; gl;;
FK88%6Fs5#..-E5*&(B%	' ' 	'r   c                    |                                                     d          }t          |          dk    st          d|           |dd         }|dd         }|                                                     d          }t          |                                          dk    st          d|           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|           |dd                                         }
t          |
          dk    st          d          t                              |
          }|j	        dvrt          d| d          |j
        dk    st          d| d          |j        dk    st          d          |dd         dk    st          d|           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|            | |||||||||||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   z6Expected at least 72 characters for first line, got: 
N8   z7Expected at least 56 characters for second line, got: 
      *    r   z5Only files without right hand side supported for now.F   z4Expected at least 72 character for third line, got:
   z'mxtype expected to be 3 characters long)r'   r&   z:Only real or integer matrices supported for now (detected )r(   z6Only unsymmetric matrices supported for now (detected r)   z)Only assembled matrices supported for nowz           zMalformed data for third line: z4Unexpected value %d for nltvl (last entry of line 3)zExpected 3 formats, got r      )readlinestriplenr<   rstrip_expect_intupperr=   from_fortran
value_type	structurestoragesplit)r?   fidlinerA   rB   rQ   rN   rO   rP   
rhs_nlinesmxtype_srC   rF   rG   rH   nelementalscts                    r   	from_filezHBInfo.from_file{   s    ||~~##D))4yy2~~ .'+. . / / /SbS	233i ||~~##D))4;;==!!R'' .'+. . / / /"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 8.48 8 8 9 9 9=00 8.48 8 8 9 9 9~,,HIIIAbDzX%%EtEEFFFDBK((DBK(( be--
!$r"u+..aS*+ , , , ||~~##D))ZZ\\2ww!||<<<===s5#5%a5"Q%A{	, , 	,r   r   c                    |d}t          |          dk    rt          d          |d}t          |          dk    r t          j        d| dt          d	
           || _        || _        || _        || _        || _	        || _
        t                      }|                    |          }t          |t                    st          d|           |                    |          }t          |t                    st          d|           |                    |          }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 TitlerU   ztitle cannot be > 72 charactersz|No Key   zkey is > 8 characters (key is r]   r\   )
stacklevelz,Expected int format for pointer format, got z,Expected int format for indices format, got )r'   complexz"Inconsistency between matrix type z and value type )r&   zUnsupported format for values )$ra   r<   warningswarnr   rA   rB   rQ   rN   rO   rP   r   parse
isinstancer   r   rf   r4   float64intpointer_formatindices_formatvalues_formatint32pointer_dtypeindices_dtypevalues_dtyper   pointer_nbytes_fullindices_nbytes_fullvalues_nbytes_fullrF   rG   rH   rn   rC   )selfrA   rB   rQ   rN   rO   rP   rC   rF   rG   rH   pointer_format_strindices_format_strvalues_format_strright_hand_sides_nlinesrn   parserr{   r|   r}   r   s                        r   __init__zHBInfo.__init__   s    =Eu::??>???;Cs88a<<MA3AAA&16 6 6 6
(,,*$&&&899.)44 	2 1 .1 1 2 2 2  &899.)44 	2 1 .1 1 2 2 2 %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.rU   rr   z%14d%14d%14d%14dz%14s%14d%14d%14d%14drW   r      z>16   z>20rT   )rA   ljustrB   appendrQ   rN   rO   rP   rC   r>   rF   rG   rH   r{   r|   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   classmethodrR   rp   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)rz   r<   )valuemsges      r   rc   rc   ,  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 )NrZ    )r6   sepr   )r1   )r   readr   r_   r4   
fromstringrz   r   r   r   r   rF   rG   )contentr   
ptr_stringptr
ind_stringind
val_stringvals           r   _read_hb_datar   5  s5   ',,v'ABB"++--/ 0 0J
-
3     C ',,v'ABB''))+ , ,J
-
3     C ',,v'@AA!**,,. / /J
-
%30 0 0C c3q5#a%(v|0LMMMMr   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   rT   r   )python_formatr   reshapewritetupler+   )	farr   r   pyfmt
pyfmt_fullfullrownremains	            r   write_arrayz _write_data.<locals>.write_arrayL  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   rT   r   )r-   r   r   r.   rN   r{   r/   rO   r|   r0   rP   r}   )r@   rj   r   r   s       r   _write_datar   I  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'   rt   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|           |d }~ww xY w)Nr\   z:Fortran format for matrix type should be 3 characters longr   r   r^   zUnrecognized format )ra   r<   	_f2q_type_f2q_structure_f2q_storageKeyError)r?   r   rf   rg   rh   r   s         r   re   zHBMatrixType.from_fortran  s    3xx1}} / 0 0 0	Bs1v.J*3q62I&s1v.G3z9g666 	B 	B 	B9C99::A	Bs   AA* *
B4BBr)   c                     || _         || _        || _        || j        vrt	          d|           || j        vrt	          d|           || j        vrt	          d|           d S )NzUnrecognized type zUnrecognized structure zUnrecognized storage )rf   rg   rh   	_q2f_typer<   _q2f_structure_q2f_storage)r   rf   rg   rh   s       r   r   zHBMatrixType.__init__  s    $"T^++>*>>???D///ByBBCCC$+++>W>>??? ,+r   c                 r    | j         | j                 | j        | j                 z   | j        | j                 z   S N)r   rf   r   rg   r   rh   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, r]   )rf   rg   rh   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   re   r   propertyr>   r   r   r   r   r=   r=   f  s%       (( 	 I   N  L
 54)//"3"3444I>>~';';'='=>>>N::\%7%7%9%9:::L
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   rp   _hb_info)r   filehb_infos      r   r   zHBFile.__init__  s6     	?",,T22DMMM $DMMMr   c                     | j         j        S r   )r   rA   r   s    r   rA   zHBFile.title  s    }""r   c                     | j         j        S r   )r   rB   r   s    r   rB   z
HBFile.key  s    }  r   c                 $    | j         j        j        S r   )r   rC   rf   r   s    r   typezHBFile.type  s    }#..r   c                 $    | j         j        j        S r   )r   rC   rg   r   s    r   rg   zHBFile.structure  s    }#--r   c                 $    | j         j        j        S r   )r   rC   rh   r   s    r   rh   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   rA   rB   r   rg   rh   r   r   r   r   r   r   r     s        $ $ $ $& # # X# ! ! X! / / X/ . . X. , , X,7 7 78 8 8 8 8r   r   T)spmatrixc                    d }t          | d          r ||           }n2t          |           5 } ||          }ddd           n# 1 swxY w Y   |rt          |          S |S )a  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.
    spmatrix : bool, optional (default: True)
        If ``True``, return sparse ``coo_matrix``. Otherwise return ``coo_array``.

    Returns
    -------
    data : csc_array or csc_matrix
        The data read from the HB file as a sparse array.

    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", spmatrix=False))  # read a hb file
    <Compressed Sparse Column sparse array 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   )rj   hbs     r   _get_matrixzhb_read.<locals>._get_matrix  s    C[[~~r   r   N)hasattropenr   )path_or_open_filer   r   r0   r   s        r   r	   r	     s    R       &)) "{,--#$$ 	";q>>D	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"  $Ks   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 array or matrix
        the sparse array 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", spmatrix=False))  # read a hb file
    <Compressed Sparse Column sparse array 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   )rj   r   r   r@   s     r   _set_matrixzhb_write.<locals>._set_matrix7  s$    C!!q!!!r   r   w)r-   r   rR   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   ru   numpyr4   scipy.sparser   r   _fortran_format_parserr   r   r   __all__	Exceptionr   Warningr   r   r   rc   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}! }! }! }! }! }! }! }!@- - - -N N N(& & &: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^ ,0 4 4 4 4 4n7" 7" 7" 7" 7" 7"r   