a
    hJ                     @   s   d Z ddlZddlZddlmZ ddlmZmZm	Z	 g dZ
G dd deZG d	d
 d
eZdd ZG dd dZdddZdd Zdd ZG dd dZG dd dZdd Zd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)MalformedHeaderhb_readhb_writeHBInfoHBFileHBMatrixTypec                   @   s   e Zd ZdS )r   N__name__
__module____qualname__ r   r   W/var/www/html/assistant/venv/lib/python3.9/site-packages/scipy/io/_harwell_boeing/hb.pyr      s   r   c                   @   s   e Zd ZdS )LineOverflowNr   r   r   r   r   r   #   s   r   c                 C   s   | j | j d |d  S )zcReturn the number of bytes to read to get every full lines for the
    given parsed fortran format.r   )repeatwidth)fmtnlinesr   r   r   _nbytes_full'   s    r   c                   @   s8   e Zd ZedddZedd Zdd	d
Zdd ZdS )r
   Default title0Nc                 C   s  |j dd}|j}|j}|j}|j\}	}
|j}|du rtt	|d }tt	|d }|j
jtjd v rtt	t| }q|j
jtjd v rtt	t| }qd|j
j d}t|ntd	|du rDt|std
|j
jtjd v rd}n(|j
jtjd v r(d}ntd|j
 t|dd}ntddd }|||j}|||j}|||j}|| | }| ||||||||	|
||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   ZAllFloatZ
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                 S   s$   || j  }|| j  |kr |d7 }|S )Nr   )r   )r   sizer   r   r   r   _nlinesj   s    
z!HBInfo.from_data.<locals>._nlines)tocscindptrindicesdatashapeZnnzr   Zfrom_numbernpmaxdtypekind	typecodesr   absNotImplementedErrorZ	isrealobj
ValueErrorr   r!   fortran_format)clsmtitlekeymxtyper   Zpointerr%   valuesnrowsncols
nnon_zerosZpointer_fmtZindices_fmtZ
values_fmtmessagetpr"   pointer_nlinesindices_nlinesvalues_nlinestotal_nlinesr   r   r   	from_data.   sN    



zHBInfo.from_datac                 C   sN  |  d}t|dks&td| |dd }|dd }|  d}t| dkshtd| t|dd }t|dd }t|dd	 }t|d	d }|dd  }	|	d
krd}	nt|	}	|	dkstd|  d}t|dkstd| |dd  }
t|
dks,tdt|
}|j	dvrNtd| |j
dksftd| |jdksztd|dd dkstd| t|dd }t|dd	 }t|d	d }t|dd }|dkstd| |  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   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)r1   fidliner3   r4   r?   r<   r=   r>   Z
rhs_nlinesZmxtype_sr5   r7   r8   r9   nelementalsctr   r   r   	from_file|   sz    

zHBInfo.from_filer   c                 C   s  || _ || _|du rd}t|dkr,td|du r8d}t|dkrXtjd| tdd	 || _|| _|| _	|| _
t }||}t|tstd
| ||}t|tstd| ||}t|tr|jdvrtd| d| tj}n@t|tr"|jdvrtd| d| t}ntd||| _|| _|| _tj| _tj| _|| _|| _t||| _|| _	t||| _|| _
t||| _|| _|	| _ |
| _!|| _"|| _#dS )z@Do not use this directly, but the class ctrs (from_* functions).NzNo TitlerB   ztitle cannot be > 72 charactersz|No Key   z!key is > 8 characters (key is %s)rI   )
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 )$r3   r4   rM   r/   warningswarnr   r?   r<   r=   r>   r   parse
isinstancer   r   rR   r(   Zfloat64intpointer_formatindices_formatvalues_formatZint32Zpointer_dtypeZindices_dtypevalues_dtyper   pointer_nbytes_fullindices_nbytes_fullvalues_nbytes_fullr7   r8   r9   rX   r5   )selfr3   r4   r?   r<   r=   r>   r5   r7   r8   r9   Zpointer_format_strZindices_format_strZvalues_format_strZright_hand_sides_nlinesrX   parserrc   rd   re   rf   r   r   r   __init__   st    









zHBInfo.__init__c                 C   s   | j d| jd g}|d| j| j| j| jf  |d| jj	d| j
| j| jdf  | jj	}| jj	}| jj	}|d|d|d|d	f  d
|S )z<Gives the header corresponding to this instance as a string.rB   r[   z%14d%14d%14d%14dz%14s%14d%14d%14d%14drD   r   z%16s%16s%20s      rA   )r3   ljustr4   appendr?   r<   r=   r>   r5   r0   r7   r8   r9   rc   rd   re   join)rj   headerZpffmtZiffmtZvffmtr   r   r   dump  s$    
zHBInfo.dump)r   r   NN)r   r   )r   r   r   classmethodr@   rZ   rl   rs   r   r   r   r   r
   -   s   M
X 
Ir
   c              
   C   sN   z
t | W S  tyH } z&|d u r&d}t||  |W Y d }~n
d }~0 0 d S )NzExpected an int, got %s)rb   r/   )valuemsger   r   r   rO   -  s    
rO   c           	   
   C   s   d | |j|  g}tj|tdd}d | |j|  g}tj|tdd}d | |j|  g}tj||j	dd}z$t
||d |d f|j|jfdW S  ty } z|W Y d }~n
d }~0 0 d S )NrG    )r*   sepr   )r'   )rq   readrg   rK   r(   Z
fromstringrb   rh   ri   rf   r   r7   r8   r/   )	contentrr   Z
ptr_stringZptrZ
ind_stringindZ
val_stringvalrw   r   r   r   _read_hb_data6  s0    
r~   c                 C   st   | j dd} dd }||  |d ||| jd |j|j ||| jd |j|j ||| j	|j
|j d S )NFr   c           	      S   s   |j }||j }|d |d |j  }||d |jfD ]}| |t| d  q:|j|j }|dkr| || t||j| d   d  d S )Nr   rA   r   )Zpython_formatr   Zreshapewritetupler!   )	farr   r   ZpyfmtZ
pyfmt_fullfullrowZnremainr   r   r   write_arrayQ  s    
z _write_data.<locals>.write_arrayrA   r   )r#   r   rs   r$   r<   rc   r%   r=   rd   r&   r>   re   )r2   rV   rr   r   r   r   r   _write_dataN  s    
r   c                   @   s   e Zd ZdZdddddZddd	d
ddZdddZdd e D Zdd e D Z	dd e D Z
edd ZdddZedd Zdd ZdS )r   zClass to hold the matrix type.RCPI)r   r]   patternr   SUHZ)Z	symmetricr   Z	hermitianZskewsymmetricZrectangularAE)r    Z	elementalc                 C   s   i | ]\}}||qS r   r   .0ijr   r   r   
<dictcomp>      zHBMatrixType.<dictcomp>c                 C   s   i | ]\}}||qS r   r   r   r   r   r   r     r   c                 C   s   i | ]\}}||qS r   r   r   r   r   r   r     r   c              
   C   s   t |dkstdz8| j|d  }| j|d  }| j|d  }| |||W S  ty~ } ztd| |W Y d }~n
d }~0 0 d S )NrI   z:Fortran format for matrix type should be 3 characters longr   r   rJ   zUnrecognized format %s)rM   r/   	_f2q_type_f2q_structure_f2q_storageKeyError)r1   r   rR   rS   rT   rw   r   r   r   rQ     s    zHBMatrixType.from_fortranr    c                 C   sX   || _ || _|| _|| jvr(td| || jvr>td| || jvrTtd| d S )NzUnrecognized type %szUnrecognized structure %szUnrecognized storage %s)rR   rS   rT   	_q2f_typer/   _q2f_structure_q2f_storage)rj   rR   rS   rT   r   r   r   rl     s    


zHBMatrixType.__init__c                 C   s$   | j | j | j| j  | j| j  S N)r   rR   r   rS   r   rT   rj   r   r   r   r0     s
    


zHBMatrixType.fortran_formatc                 C   s   d| j  d| j d| j dS )NzHBMatrixType(z, ))rR   rS   rT   r   r   r   r   __repr__  s    zHBMatrixType.__repr__N)r    )r   r   r   __doc__r   r   r   itemsr   r   r   rt   rQ   rl   propertyr0   r   r   r   r   r   r   k  s0   


r   c                   @   sb   e Zd ZdddZedd Zedd Zedd	 Zed
d Zedd Z	dd Z
dd ZdS )r   Nc                 C   s&   || _ |du rt|| _n|| _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
   rZ   _hb_info)rj   filehb_infor   r   r   rl     s    zHBFile.__init__c                 C   s   | j jS r   )r   r3   r   r   r   r   r3     s    zHBFile.titlec                 C   s   | j jS r   )r   r4   r   r   r   r   r4     s    z
HBFile.keyc                 C   s
   | j jjS r   )r   r5   rR   r   r   r   r   type  s    zHBFile.typec                 C   s
   | j jjS r   )r   r5   rS   r   r   r   r   rS     s    zHBFile.structurec                 C   s
   | j jjS r   )r   r5   rT   r   r   r   r   rT     s    zHBFile.storagec                 C   s   t | j| jS r   )r~   r   r   r   r   r   r   read_matrix  s    zHBFile.read_matrixc                 C   s   t || j| jS r   )r   r   r   )rj   r2   r   r   r   write_matrix  s    zHBFile.write_matrix)N)r   r   r   rl   r   r3   r4   r   rS   rT   r   r   r   r   r   r   r     s   





r   c                 C   sN   dd }t | dr|| S t| }||W  d   S 1 s@0    Y  d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.

    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_matrix, eye
    >>> data = csr_matrix(eye(3))  # create a sparse matrix
    >>> hb_write("data.hb", data)  # write a hb file
    >>> print(hb_read("data.hb"))  # read a hb file
      (0, 0)	1.0
      (1, 1)	1.0
      (2, 2)	1.0

    c                 S   s   t | }| S r   )r   r   rV   Zhbr   r   r   _get_matrix  s    zhb_read.<locals>._get_matrixrz   N)hasattropen)path_or_open_filer   r   r   r   r   r     s
    %

r   c                    st   j dd du rt  fdd}t| dr>|| S t| d}||W  d   S 1 sf0    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_matrix, eye
    >>> data = csr_matrix(eye(3))  # create a sparse matrix
    >>> hb_write("data.hb", data)  # write a hb file
    >>> print(hb_read("data.hb"))  # read a hb file
      (0, 0)	1.0
      (1, 1)	1.0
      (2, 2)	1.0

    Fr   Nc                    s   t |  }|S r   )r   r   r   r   r2   r   r   _set_matrix3  s    
zhb_write.<locals>._set_matrixr   w)r#   r
   r@   r   r   )r   r2   r   r   r   r   r   r   r	     s    (

r	   )N)N)r   r^   numpyr(   Zscipy.sparser   Z_fortran_format_parserr   r   r   __all__	Exceptionr   Warningr   r   r
   rO   r~   r   r   r   r   r	   r   r   r   r   <module>   s$     
	</0