
    UgNM                         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e          Zd Zd Z G d dee          Z G 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                      e Zd ZdZddZd Zd Zd ZddZe	j        j
        e_
        e	j        j
        e_
        dd	Ze	j        j
        e_
        d
 Zd Zd ZddZddZe	j        j
        e_
        ddZe	j        j
        e_
        ddZe	j        j
        e_
        ddZe	j        j
        e_
        ddZe	j        j
        e_
        ddZd Ze	j        j
        e_
        dS )	_dia_basediaNFc                    t          j        | |           t          |          r|j        dk    rI|r|                                }|j        | _        |j        | _        t          |j                  | _	        n|j        | j        k    r|r|                                }n|
                                }|j        | _        |j        | _        t          |j                  | _	        nct          |t                    rzt          |          rt          |          | _	        t          j        dt!          |t"                              | _        |                     t'          | j                            }t          j        d|          | _        n	 |\  }}|t)          d          |st*          }t          j        t          j        |d         ||                    | _        t          j        |d	         |                     t'          |                    |          }t          j        |          | _        t          |          | _	        n# t2          $ r}	d
}
t)          |
          |	d }	~	ww xY w	 t          j        |          }n*# t2          $ r}	t)          d| j        z            |	d }	~	ww xY wt          | t6                    r#|j        dk    rt)          d|j         d          |                     |||          
                                }|j        | _        |j        | _        t          |j                  | _	        || j                            |          | _        | j        j        d	k    rt)          d          | j        j        dk    rt)          d          | j        j        d         t?          | j                  k    r6t)          d| j        j        d         t?          | j                  fz            t?          t          j         | j                            t?          | j                  k    rt)          d          d S )Nr   )r   r   )defaultmaxvalr   dtypezexpected a shape argument)r   copyr   z+unrecognized form for dia_array constructorz+unrecognized form for %s_matrix constructorr   zDIA arrays don't support zD input. Use 2D)r   shapezoffsets array must have rank 1z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
ValueErrorr   
atleast_2darray
atleast_1d	Exceptionasarrayr   ndim_coo_containerastypelenunique)selfarg1r    r   r   A	idx_dtyper#   r$   emessages              P/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/scipy/sparse/_dia.pyr!   z_dia_base.__init__   s
   dD)))D>> 5	/{e## '99;;D I	#|)$*55;$+--$-		AA

AF	 y)!'22e$$ &	/t}} 5 *$//HUHUE,J,J,JKK	 11TZ1II	!x9===5$(MD'
 }()DEEE .- "bhtAweRV.W.W.W X XDI htAw-1-B-B#e**-B-U-U,02 2 2G $&=#9#9DL"-e"4"4DKK ! 5 5 5KG$W--145 Gz$'' G G G  "137;"? @ @EFGG $(( YTY!^^ !WTY!W!W!WXXX##DU#CCIIKKADI9DL%ag..DK	((//DI <!!=>>>9>Q:;;;9?1T\!2!222 @yq)3t|+<+<=> ? ? ? ry&&''3t|+<+<<<EFFF =<s0   I 
I4I//I48J 
J4J//J4c                     t           | j                 \  }}t          | t                    rdnd}| j        j        d         }d| d| d| j         d| j         d| d	| j         d
S )Nr0   matrixr   <z sparse z of dtype 'z'
	with z stored elements (z diagonals) and shape >)r   r"   r'   r   r#   r    r   nnz)r9   _fmt
sparse_clsds        r?   __repr__z_dia_base.__repr__b   s    $+&3 *4 9 9GWWx
IOAY Y YZ Y YDJ Y YhY Y23Y YKO:Y Y Y	
    c                     | j         \  }}t          j        | j        j         d                   }|| j        dddf         z
  }|dk    }|||k     z  }|||k     z  }|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$   )r9   num_rowsnum_colsoffset_indsrowmasks         r?   
_data_maskz_dia_base._data_maskk   sl     "Z(i	 233DL400qx x'(rJ   c                 h    |                                  }t          j        | j        |                   S N)rR   r)   count_nonzeror#   )r9   rQ   s     r?   rU   z_dia_base.count_nonzerov   s(      	$000rJ   c                     |t          d          | j        \  }}d}| j        D ]5}|dk    r|t          |||z
            z  }|t          ||z   |          z  }6t	          |          S )Nz6_getnnz over an axis is not implemented for DIA formatr   )NotImplementedErrorr    r$   minint)r9   axisMNrD   ks         r?   _getnnzz_dia_base._getnnzz   s    % '7 8 8 8j! 	" 	"A1uus1QqSzz!s1Q3qzz!3xxrJ   c           
         t          |           ||dk     r|dz  }t          | j                  }| j        \  }}d }|dk    r|                                 }| j        |z                      d          }	|	j        d         |k    r|	}
n-t          j        ||	j                  }
|	|
d |	j        d         <   | 	                    |
|          }nt          j        |df|          }t          j
        ||          }t          ||t          | j                  | j        j        d         | j        | j        ||           | 	                    |          }||                    ||          S | 	                    |                    |                    }||j        |j        k    rt          d          |                    d||	          S )
Nr   r   rZ   r   r   )r   outzdimensions do not match )rZ   r   ra   )r   r   r   r    rR   r#   sumr)   r*   _ascontaineronesr   r7   r$   r.   )r9   rZ   r   ra   	res_dtyperM   rN   retrQ   xresrow_sumsones                r?   rc   z_dia_base.sum   s   TqAID!$*--	!Z(199??$$DT!&&A&..AwqzX%%hxqw777#$KQWQZK ##Cy#99CC x1Y???H'()444Cx3t|+<+<yq)4<CS S S ((22H|||%S|999##HLLdL$;$;<<C?syCI556777wwBew555rJ   c                    t          |t                    s|                    |           S t          j        | j        |j                  r"|                     | j        |j        z             S t          j        | j        |j                  }t          j	        || j                  }t          j	        ||j                  }| j        j
        d         }|j        j
        d         }||k    rZt          |          t          | j                  k    r5| j        t          |                   }||d d fxx         |j        z  cc<   n||k    rYt          |          t          |j                  k    r4|j        t          |                   }||d d fxx         | j        z  cc<   nt          | j
        d         |d         z   | j
        d                   }t          j        t          |          |ft          j        | j        |j                            }||d |fxx         | j        d d d |f         z  cc<   ||d |fxx         |j        d d d |f         z  cc<   |                     ||f| j
                  S )Nr   r   r   r    )r'   r   _add_sparser)   array_equalr$   
_with_datar#   union1dsearchsortedr    r7   _invert_indexrX   r*   result_type_dia_container)	r9   othernew_offsetsself_idx	other_idxself_dother_dnew_datarH   s	            r?   ro   z_dia_base._add_sparse   st   %++ 	+$$T*** >$,66 	;??49uz#9::: ju}==?;==OK??	#*"1% W[!1!1S5F5F!F!Fyx!8!89HY\"""ej0""""w3{#3#3s5=7I7I#I#Iz-	":":;HXqqq[!!!TY.!!!! DJqMKO3TZ]CCA x[!!1%nTY
;;  H Xww&'''49QQQU+;;'''Y()))UZ2A2->>)))""Hk#:$*"MMMrJ   c                 <    |                      | j        |z            S rT   )rq   r#   )r9   rw   s     r?   _mul_scalarz_dia_base._mul_scalar   s    ty50111rJ   c                 t   |}t          j        | j        d         t          | j        j        |j        j                            }| j        j        d         }| j        \  }}t          ||t          | j	                  || j	        | j        |
                                |
                                           |S )Nr   r   r   )r)   r*   r    r   r   charr#   r   r7   r$   ravel)r9   rw   rh   yLr[   r\   s          r?   _matmul_vectorz_dia_base._matmul_vector   s    HTZ]+djo78w|+E +E F F F IOAj!1QDL))1dlDI7799aggii	) 	) 	) rJ   r   c                    | j         \  }}|j        dk    rt          j        }nt	          |          }|dk     rt          ||z   ||          }d}|}nt          |||z
  |          }|}||z   }|j        dk    r
|d |         }| j        j         \  }	}
|| j        v rX||
k    r9t          j        |	|f| j        j	                  }| j        |d d d |
f<   || _        || j        | j        |k    ||f<   d S t          j
        | j        | j        j	                            |                    | _        t          ||
          }t          j        |	dz   |f| j        j	                  }| j        |d dd |
f<   ||d||f<   || _        d S )Nr   r   r   rm   )r    r4   r)   infr7   rX   r#   r$   r*   r   appendtyper-   )r9   valuesr]   r[   r\   values_nn	min_index	max_index	data_rows	data_colsr#   ms                r?   _setdiagz_dia_base._setdiag   s   z1;!vHH6{{Hq55AE1h''AIIIAq1uh''AIAI;!BQBZF#y	99$$xI 6dioNNN&*iQQQ

]# 	@FDIdla'9)<<===9T\4<3E3J3J13M3MNNDLIy))A8Y]A.dioFFFD$(ID"jyj!,2DYy(()DIIIrJ   c                 2    |r|                                  S | S rT   r   )r9   r   s     r?   r&   z_dia_base.todia  s     	99;;KrJ   c                 r   ||dk    rt          d          | j        \  }}t          | j                  }| j         }t	          j        t          |          t          j                  d d d f         }t	          j        |t          j                  ||z  d d d f         z
  }t          d|| j        j        d         z
            }	t	          j	        | j        t	          j
        | j        j        d         |	f| j        j                  f          }
|
||f         }
|                     |
|f||f|          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)   rL   r7   intcr#   hstackr*   r   rv   )r9   axesr   rM   rN   max_dimr$   rc
pad_amountr#   s              r?   	transposez_dia_base.transpose  sM    L M M M "Z(dj// <- Ic'll"'222111d7;Ihbg...'G2CQQQW1MMGDIOA$6677
y$)RXtyq/A:.N48IO&E &E &E F G GAqDz""D'?h; &* # , , 	,rJ   c                    | j         \  }}|| k    s||k    r t          j        d| j        j                  S t          j        | j        |k              \  }t          d|          }t          ||z   |          }||z
  }|j	        dk    r t          j
        || j        j                  S | j        |d         ||f         }|t          |          z
  }	|	dk    rt          j        |d|	fd          }|S )Nr   r   constant)mode)r    r)   emptyr#   r   nonzeror$   r-   rX   sizer*   r7   pad)
r9   r]   rowscolsidx	first_collast_colresult_sizeresultpaddings
             r?   diagonalz_dia_base.diagonal.  s    Z
d::d8ATY_5555z$,!+,,1II	tax&&*8q==8Kty????3q69X#556F+Q;;VFQLzBBBFrJ   c                    | j         dk    r!|                     | j        | j                  S | j        \  }}| j        j        \  }}t          j        |          }|| j        d d d f         z
  }|dk    }|||k     z  }|||k     z  }|| j        dk    z  }|                     t          | j                            }	t          j
        |dz   |	          }
t          j        |                    d          d |                   |
d|dz   <   ||k     r|
|         |
|dz   d <   |j        |j                                     |	d          }| j        j        |j                 }|                     |||
f| j        | j                  S )	Nr   r   r   r   r`   Fr   )r    r   )rD   _csc_containerr    r   r#   r)   rL   r$   r,   r-   r*   cumsumrc   Tr6   )r9   r   rM   rN   num_offsets
offset_lenrO   rP   rQ   r<   indptrindicesr#   s                r?   tocscz_dia_base.tocsc@  s   8q==&&tz&DDD!Z("&)/Zi
++DL400qx x'(a ))TZ)AA	(Q,i888!#4888+;+;IXI+F!G!GqA~  $*:$6F:a<==!%-&&yu&==y{46"""D'6#:$*)- # 5 5 	5rJ   c                 \   | j         \  }}| j        j         \  }}t          j        |          }|| j        d d d f         z
  }|dk    }|||k     z  }|||k     z  }|| j        dk    z  }||         }t          j        ||          |                                         }	|                     | j        ft          | j                             }
|	                    |
d          }|		                    |
d          }	| j        |         }| 
                    |||	ff| j         | j        d          S )Nr   )arraysr   Fr   )r    r   r   )r    r#   r)   rL   r$   tiler   r,   r-   r6   r5   r   )r9   r   rM   rN   r   r   rO   rP   rQ   colr<   r#   s               r?   tocooz_dia_base.tocooZ  s8   !Z("&)/Zi
++DL400qx x'(a $igk;//

=))L?3tz?? * 
 
	 jjj//jjj//y ""C:dj
 # 
 
 	
rJ   Tc                     |r5|                      || j                                        f| j                  S |                      || j        f| j                  S )zReturns a matrix with the same sparsity structure as self,
        but with different data.  By default the structure arrays are copied.
        rn   )rv   r$   r   r    )r9   r#   r   s      r?   rq   z_dia_base._with_datau  sp      	&&t|((**+4: '    &&t|$DJ '   rJ   c                    t          |          }|\  }}| j        d d d |f         | _        || j        d         k    rt          j        | j        | j        d         z   | j        j        d         k               rO| j        d d d f         | j        d         z   t          j        | j        j        d                   k    }d| j        |<   || _        d S )Nr   r   )r   r#   r    r)   anyr$   rL   r%   )r9   r    r[   r\   rQ   s        r?   resizez_dia_base.resize  s    E""1Iaaa!e$	
1t|djm3dioa6HHII  LD)DJqM9Idioa0112DDIdOrJ   )NNFrT   )NNN)r   )F)NF)T)__name__
__module____qualname___formatr!   rI   rR   rU   r^   r   __doc__rc   ro   r   r   r   r&   r   r   r   r   rq   r   rb   rJ   r?   r   r      s       GJG JG JG JGX
 
 
	 	 	1 1 1    o-GO#19M$6 $6 $6 $6L +%CK#N #N #NJ2 2 2  # # # #J    M)EM, , , ,,  )1I     '/H5 5 5 50 M)EM
 
 
 
0 M)EM      ^+FNNNrJ   r   c                 v    t          j        |           }t          j        t          |                     || <   |S )z)Helper function to invert an index array.)r)   
zeros_likerL   r7   )r   invs     r?   rt   rt     s/    
-

CyS""CHJrJ   c                 ,    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   )rh   s    r?   r   r     s    . a$$$rJ   c                       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   rb   rJ   r?   r   r     "        G G G GrJ   r   c                       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   rb   rJ   r?   r   r     r   rJ   r   )r   __docformat____all__numpyr)   
_lib._utilr   _matrixr	   _baser
   r   r   r   _datar   _sputilsr   r   r   r   r   r   _sparsetoolsr   r   rt   r   r   r   rb   rJ   r?   <module>r      s    %
7
7
7     ' ' ' ' ' '       7 7 7 7 7 7 7 7 7 7 7 7                      % $ $ $ $ $~, ~, ~, ~, ~, ~, ~, ~,B  % % %6H H H H H	7 H H HVH H H H H9 H H H H HrJ   