a
    CCCfCI                     @   s   d Z dZg dZddlZddlmZ ddlmZ dd	l	m
Z
mZmZmZ dd
lmZ ddlmZmZmZmZmZmZ ddlmZ G dd deZdd ZG dd deeZG dd deeZdS )zSparse DIAgonal formatzrestructuredtext en)	dia_array
dia_matrixisspmatrix_dia    N   )copy_if_needed   )spmatrix)issparse_formats_spbasesparray)_data_matrix)isshapeupcast_chargetdtypeget_sum_dtypevalidateaxischeck_shape)
dia_matvecc                   @   s   e Zd ZdZd&ddZdd Zdd	 Zd
d Zd'ddZe	jj
e_
e	jj
e_
d(ddZe	jj
e_
dd Zdd Zd)ddZd*ddZe	jj
e_
d+ddZe	jj
e_
d,ddZe	jj
e_
d-ddZe	jj
e_
d.dd Ze	jj
e_
d/d"d#Zd$d% Ze	jj
e_
dS )0	_dia_basediaNFc              
   C   s  t |  t|r|jdkrF|r(| }|j| _|j| _t|j| _	n>|j| jkr`|r`| }n|
 }|j| _|j| _t|j| _	nt|trt|rt|| _	tdt|td| _| jt| jd}tjd|d| _nz|\}}W n4 ty  }	 zd}
t|
|	W Y d }	~	nxd }	~	0 0 |d u r4td|s>t}ttj|d ||d	| _tj|d
 | jt|d|d	}t|| _t|| _	nvzt|}W n6 ty }	 ztd| j |	W Y d }	~	n
d }	~	0 0 | j|||d
 }|j| _|j| _t|j| _	|d ur | j|| _| jjd
kr6td| jjdkrLtd| jjd t| jkrtd| jjd t| jf tt| jt| jkrtdd S )Nr   )r   r   )defaultmaxvalr   dtypez+unrecognized form for dia_array constructorzexpected a shape argument)r   copyr   z+unrecognized form for %s_matrix constructor)r   shapezoffsets array must have rank 1r   zdata array must have rank 2zBnumber of diagonals (%d) does not match the number of offsets (%d)z&offset array contains duplicate values) r   __init__r	   formatr   dataoffsetsr   r   _shapetodia
isinstancetupler   npzerosr   float_get_index_dtypemax	Exception
ValueErrorr   Z
atleast_2darrayZ
atleast_1dZasarray_coo_containerastypendimlenunique)selfZarg1r   r   r   A	idx_dtyper    r!   emessage r8   M/var/www/html/django/DPS/env/lib/python3.9/site-packages/scipy/sparse/_dia.pyr      sx    



 


z_dia_base.__init__c                 C   sr   t | j \}}t| trdnd}ddd | jD }| jjd }d| d| d	| jj d
| j	 d| d| dS )Nr-   matrixxc                 s   s   | ]}t |V  qd S N)str).0r;   r8   r8   r9   	<genexpr>c       z%_dia_base.__repr__.<locals>.<genexpr>r   <z sparse z
 of type 'z'
	with z stored elements (z diagonals) in z format>)
r
   r   r$   r   joinr   r    r   typennz)r3   _fmtZ
sparse_clsZ	shape_strZndiagr8   r8   r9   __repr__`   s    z_dia_base.__repr__c                 C   sV   | j \}}t| jj d }|| jdddf  }|dk}|||k M }|||k M }|S )z~Returns a mask of the same shape as self.data, where
        mask[i,j] is True when data[i,j] corresponds to a stored element.r   Nr   )r   r&   aranger    r!   )r3   num_rowsnum_colsoffset_indsrowmaskr8   r8   r9   
_data_maskj   s    
z_dia_base._data_maskc                 C   s   |   }t| j| S r<   )rN   r&   count_nonzeror    )r3   rM   r8   r8   r9   rO   u   s    z_dia_base.count_nonzeroc                 C   s`   |d urt d| j\}}d}| jD ]2}|dkrD|t||| 7 }q$|t|| |7 }q$t|S )Nz6_getnnz over an axis is not implemented for DIA formatr   )NotImplementedErrorr   r!   minint)r3   axisMNrD   kr8   r8   r9   _getnnzy   s    

z_dia_base._getnnzc              	   C   sL  t | |d ur |dk r |d7 }t| j}| j\}}d }|dkr|  }| j| jdd}	|	jd |krn|	}
n"tj||	jd}
|	|
d |	jd < | j	|
|d}n|tj|df|d}tj
||d}t||t| j| jjd | j| j|| | 	|}|d u r
|j||dS | 	|j|d}|d ur<|j|jkr<td|jd||d	S )
Nr   r   rS   r   r   )r   outzdimensions do not matchr8   )rS   r   rY   )r   r   r   r   rN   r    sumr&   r'   Z_ascontainerZonesr   r1   r!   r,   )r3   rS   r   rY   Z	res_dtyperI   rJ   retrM   r;   resZrow_sumsoner8   r8   r9   rZ      s4    



z_dia_base.sumc                 C   s   t |t| s|  |S t| j|j}| j|dd}|jD ]>}||jv rl|	|
||
| | q@|	|
|| q@|S )NTr   )r$   rC   Ztocsr_add_sparser&   Zpromote_typesr   r/   r!   Zsetdiagdiagonal)r3   otherr   mdr8   r8   r9   r_      s    

z_dia_base._add_sparsec              
   C   sh   |}t j| jd t| jj|jjd}| jjd }| j\}}t||t| j	|| j	| j|
 |
  |S )Nr   r   r   )r&   r'   r   r   r   charr    r   r1   r!   ravel)r3   ra   r;   yLrT   rU   r8   r8   r9   _matmul_vector   s    
z_dia_base._matmul_vectorr   c                 C   sP  | j \}}|jdkrtj}nt|}|dk rFt|| ||}d}|}nt||| |}|}|| }|jdkrx|d | }| jj \}	}
|| jv r||
krtj|	|f| jj	d}| j|d d d |
f< || _|| j| j|k||f< njt
| j| jj	|| _t||
}tj|	d |f| jj	d}| j|d dd |
f< ||d||f< || _d S )Nr   r   r   )r   r0   r&   infr1   rQ   r    r!   r'   r   appendrC   r*   )r3   valuesrV   rT   rU   Zvalues_nn	min_indexZ	max_indexZ	data_rowsZ	data_colsr    rb   r8   r8   r9   _setdiag   s4    




z_dia_base._setdiagc                 C   s   |r|   S | S d S r<   r^   )r3   r   r8   r8   r9   r#      s    z_dia_base.todiac                 C   s   |d ur|dkrt d| j\}}t| j}| j }tjt|tjdd d d f }tj|tjd|| d d d f  }td|| jjd  }	t	| jtj
| jjd |	f| jjdf}
|
||f }
| j|
|f||f|dS )N)r   r   zvSparse arrays/matrices do not support an 'axes' parameter because swapping dimensions is the only logical permutation.r   r   r   )r   r   )r,   r   r*   r!   r&   rH   r1   Zintcr    Zhstackr'   r   _dia_container)r3   Zaxesr   rI   rJ   Zmax_dimr!   rcZ
pad_amountr    r8   r8   r9   	transpose  s"    

 $

z_dia_base.transposec           
      C   s   | j \}}|| ks||kr.tjd| jjdS t| j|k\}td|}t|| |}|| }|j	dkr|tj
|| jjdS | j|d ||f }|t| }	|	dkrtj|d|	fdd}|S )Nr   r   Zconstant)mode)r   r&   emptyr    r   Znonzeror!   r*   rQ   sizer'   r1   pad)
r3   rV   rowscolsidxZ	first_colZlast_colZresult_sizeresultpaddingr8   r8   r9   r`     s    


z_dia_base.diagonalc                 C   s$  | j dkr| j| j| jdS | j\}}| jj\}}t|}|| jd d d f  }|dk}|||k M }|||k M }|| jdkM }| jt	| jd}	tj
|d |	d}
t|jddd | |
d|d < ||k r|
| |
|d d < |j|j j|	dd}| jj|j }| j|||
f| j| jdS )	Nr   r   r   r   rX   Fr^   )r   r   )rD   Z_csc_containerr   r   r    r&   rH   r!   r)   r*   r'   ZcumsumrZ   Tr/   )r3   r   rI   rJ   num_offsets
offset_lenrK   rL   rM   r5   Zindptrindicesr    r8   r8   r9   tocsc1  s(    


&z_dia_base.tocscc                 C   s   | j \}}| jj \}}t|}|| jd d d f  }|dk}|||k M }|||k M }|| jdkM }|| }t|||  }	| j| jft| j d}
|j	|
dd}|	j	|
dd}	| j| }| j
|||	ff| j | jddS )Nr   )Zarraysr   Fr^   )r   r   r   )r   r    r&   rH   r!   Ztilere   r)   r*   r/   r.   r   )r3   r   rI   rJ   r~   r   rK   rL   rM   colr5   r    r8   r8   r9   tocooK  s&    


z_dia_base.tocooTc                 C   s8   |r| j || j f| jdS | j || jf| jdS dS )zReturns a matrix with the same sparsity structure as self,
        but with different data.  By default the structure arrays are copied.
        )r   N)rp   r!   r   r   )r3   r    r   r8   r8   r9   
_with_dataf  s    z_dia_base._with_datac                 G   s   t |}|\}}| jd d d |f | _|| jd krt| j| jd  | jjd k r| jd d d f | jd  t| jjd k}d| j|< || _d S )Nr   r   )r   r    r   r&   anyr!   rH   r"   )r3   r   rT   rU   rM   r8   r8   r9   resizes  s     
z_dia_base.resize)NNF)N)NNN)r   )F)NF)r   )F)F)T)__name__
__module____qualname___formatr   rG   rN   rO   rW   r   __doc__rZ   r_   rh   ro   r#   rs   r`   r   r   r   r   r8   r8   r8   r9   r      s4   
J




&

%










r   c                 C   s
   t | tS )a  Is `x` of dia_matrix type?

    Parameters
    ----------
    x
        object to check for being a dia matrix

    Returns
    -------
    bool
        True if `x` is a dia matrix, False otherwise

    Examples
    --------
    >>> from scipy.sparse import dia_array, dia_matrix, coo_matrix, isspmatrix_dia
    >>> isspmatrix_dia(dia_matrix([[5]]))
    True
    >>> isspmatrix_dia(dia_array([[5]]))
    False
    >>> isspmatrix_dia(coo_matrix([[5]]))
    False
    )r$   r   )r;   r8   r8   r9   r     s    r   c                   @   s   e Zd ZdZdS )r   a  
    Sparse array with DIAgonal storage.

    This can be instantiated in several ways:
        dia_array(D)
            where D is a 2-D ndarray

        dia_array(S)
            with another sparse array or matrix S (equivalent to S.todia())

        dia_array((M, N), [dtype])
            to construct an empty array with shape (M, N),
            dtype is optional, defaulting to dtype='d'.

        dia_array((data, offsets), shape=(M, N))
            where the ``data[k,:]`` stores the diagonal entries for
            diagonal ``offsets[k]`` (See example below)

    Attributes
    ----------
    dtype : dtype
        Data type of the array
    shape : 2-tuple
        Shape of the array
    ndim : int
        Number of dimensions (this is always 2)
    nnz
    size
    data
        DIA format data array of the array
    offsets
        DIA format offset array of the array
    T

    Notes
    -----

    Sparse arrays can be used in arithmetic operations: they support
    addition, subtraction, multiplication, division, and matrix power.

    Examples
    --------

    >>> import numpy as np
    >>> from scipy.sparse import dia_array
    >>> dia_array((3, 4), dtype=np.int8).toarray()
    array([[0, 0, 0, 0],
           [0, 0, 0, 0],
           [0, 0, 0, 0]], dtype=int8)

    >>> data = np.array([[1, 2, 3, 4]]).repeat(3, axis=0)
    >>> offsets = np.array([0, -1, 2])
    >>> dia_array((data, offsets), shape=(4, 4)).toarray()
    array([[1, 0, 3, 0],
           [1, 2, 0, 4],
           [0, 2, 3, 0],
           [0, 0, 3, 4]])

    >>> from scipy.sparse import dia_array
    >>> n = 10
    >>> ex = np.ones(n)
    >>> data = np.array([ex, 2 * ex, ex])
    >>> offsets = np.array([-1, 0, 1])
    >>> dia_array((data, offsets), shape=(n, n)).toarray()
    array([[2., 1., 0., ..., 0., 0., 0.],
           [1., 2., 1., ..., 0., 0., 0.],
           [0., 1., 2., ..., 0., 0., 0.],
           ...,
           [0., 0., 0., ..., 2., 1., 0.],
           [0., 0., 0., ..., 1., 2., 1.],
           [0., 0., 0., ..., 0., 1., 2.]])
    Nr   r   r   r   r8   r8   r8   r9   r     s   r   c                   @   s   e Zd ZdZdS )r   a  
    Sparse matrix with DIAgonal storage.

    This can be instantiated in several ways:
        dia_matrix(D)
            where D is a 2-D ndarray

        dia_matrix(S)
            with another sparse array or matrix S (equivalent to S.todia())

        dia_matrix((M, N), [dtype])
            to construct an empty matrix with shape (M, N),
            dtype is optional, defaulting to dtype='d'.

        dia_matrix((data, offsets), shape=(M, N))
            where the ``data[k,:]`` stores the diagonal entries for
            diagonal ``offsets[k]`` (See example below)

    Attributes
    ----------
    dtype : dtype
        Data type of the matrix
    shape : 2-tuple
        Shape of the matrix
    ndim : int
        Number of dimensions (this is always 2)
    nnz
    size
    data
        DIA format data array of the matrix
    offsets
        DIA format offset array of the matrix
    T

    Notes
    -----

    Sparse matrices can be used in arithmetic operations: they support
    addition, subtraction, multiplication, division, and matrix power.

    Examples
    --------

    >>> import numpy as np
    >>> from scipy.sparse import dia_matrix
    >>> dia_matrix((3, 4), dtype=np.int8).toarray()
    array([[0, 0, 0, 0],
           [0, 0, 0, 0],
           [0, 0, 0, 0]], dtype=int8)

    >>> data = np.array([[1, 2, 3, 4]]).repeat(3, axis=0)
    >>> offsets = np.array([0, -1, 2])
    >>> dia_matrix((data, offsets), shape=(4, 4)).toarray()
    array([[1, 0, 3, 0],
           [1, 2, 0, 4],
           [0, 2, 3, 0],
           [0, 0, 3, 4]])

    >>> from scipy.sparse import dia_matrix
    >>> n = 10
    >>> ex = np.ones(n)
    >>> data = np.array([ex, 2 * ex, ex])
    >>> offsets = np.array([-1, 0, 1])
    >>> dia_matrix((data, offsets), shape=(n, n)).toarray()
    array([[2., 1., 0., ..., 0., 0., 0.],
           [1., 2., 1., ..., 0., 0., 0.],
           [0., 1., 2., ..., 0., 0., 0.],
           ...,
           [0., 0., 0., ..., 2., 1., 0.],
           [0., 0., 0., ..., 1., 2., 1.],
           [0., 0., 0., ..., 0., 1., 2.]])
    Nr   r8   r8   r8   r9   r     s   r   )r   __docformat____all__numpyr&   Z
_lib._utilr   Z_matrixr   _baser	   r
   r   r   _datar   Z_sputilsr   r   r   r   r   r   Z_sparsetoolsr   r   r   r   r   r8   r8   r8   r9   <module>   s      tK