
    tKgNM                         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y)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                   p   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_
        y)	_dia_basediaNc                    t        j                  | |       t        |      r|j                  dk(  rP|r|j	                         }|j
                  | _        |j                  | _        t        |j                        | _	        nl|j                  | j                  k(  r|r|j	                         }n|j                         }|j
                  | _        |j                  | _        t        |j                        | _	        nt        |t              r5t        |      r}t        |      | _	        t        j                  dt!        |t"                    | _        | j%                  t'        | j                              }t        j                  d|      | _        nY	 |\  }}|t)        d      |st*        }t        j,                  t        j.                  |d   ||            | _        t        j.                  |d	   | j%                  t'        |            |      }t        j0                  |      | _        t        |      | _	        n	 t        j4                  |      }t        | t6              r(|j8                  dk7  rt)        d|j8                   d      | j;                  |||      j                         }|j
                  | _        |j                  | _        t        |j                        | _	        | | j
                  j=                  |      | _        | j                  j8                  d	k7  rt)        d      | j
                  j8                  dk7  rt)        d      | j
                  j                  d   t?        | j                        k7  r:t)        d| j
                  j                  d   t?        | j                        fz        t?        t        j@                  | j                              t?        | j                        k7  rt)        d      y # t2        $ r}	d
}
t)        |
      |	d }	~	ww xY w# t2        $ r}	t)        d| j                  z        |	d }	~	ww xY w)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              U/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/scipy/sparse/_dia.pyr!   z_dia_base.__init__   sg   dD)D>{{e#99;D II	#||)$**5;;$++-$		A

AFF	 yy)!''2e$t} *$/HHUHUE,JK	 11TZZ1I	!xx9=5$(MD'
 }()DEE- "bhhtAweRV.W XDI hhtAw-1-B-B#e*-B-U,02G $&==#9DL"-e"4DKGzz$' $(TYY!^ #<TYYK!WXX##DU#CIIKADI99DL%agg.DK		((/DI <<!=>>99>>Q:;;99??1T\\!22 @yyq)3t||+<=> ? ? ryy&'3t||+<<EFF =W ! 5KG$W-145$  G  "137;;"? @EFGGs0   P
 P) 
	P&P!!P&)	Q2QQ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 9Wx
IIOOAuHZLDJJ< @hhZ1!4J4::,VW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   so     "ZZ(ii		 23DLL400qx x'(rJ   c                 f    | j                         }t        j                  | j                  |         S N)rR   r)   count_nonzeror#   )r9   rQ   s     r?   rU   z_dia_base.count_nonzerov   s'     		$00rJ   c                     |t        d      | j                  \  }}d}| j                  D ],  }|dkD  r|t        |||z
        z  }|t        ||z   |      z  }. t	        |      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   st    % '7 8 8jj!A1us1QqSz!s1Q3qz!	 
 3xrJ   c           
         t        |       |
|dk  r|dz  }t        | j                        }| j                  \  }}d }|dk(  r| j	                         }| j
                  |z  j                  d      }	|	j                  d   |k(  r|	}
n3t        j                  ||	j                        }
|	|
d |	j                  d    | j                  |
|      }nt        j                  |df|      }t        j                  ||      }t        ||t        | j                        | j
                  j                  d   | j                  | j
                  ||       | j                  |      }||j                  ||      S | j                  |j                  |            }|$|j                  |j                  k7  rt        d      |j                  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!$**-	!ZZ(19??$DT!&&A&.AwwqzX%hhxqww7#$KQWWQZ ##Cy#9C xx1Y?H''()4Cx3t||+<yyq)4<<CS ((2H|||%S|99##HLLdL$;<C?syyCII5677wwBew55rJ   c                 D   t        |t              s|j                  |       S t        j                  | j
                  |j
                        r(| j                  | j                  |j                  z         S t        j                  | j
                  |j
                        }t        j                  || j
                        }t        j                  ||j
                        }| j                  j                  d   }|j                  j                  d   }||k(  rVt        |      t        | j
                        k(  r5| j                  t        |         }||d d fxx   |j                  z  cc<   n||k(  rUt        |      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<   | j!                  ||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   s   %+$$T** >>$,,6??499uzz#9:: jju}}=??;=OOK?	#**""1% W[!1S5F!Fyyx!89HY\"ejj0"w3{#3s5==7I#Izz-	":;HXq[!TYY.! DJJqMKO3TZZ]CA xx[!1%nnTYY

;H Xww&'499QU+;;'Y()UZZ2A2->>)""Hk#:$**"MMrJ   c                 >    | j                  | j                  |z        S rT   )rq   r#   )r9   rw   s     r?   _mul_scalarz_dia_base._mul_scalar   s    tyy5011rJ   c                    |}t        j                  | j                  d   t        | j                  j
                  |j                  j
                              }| j                  j                  d   }| j                  \  }}t        ||t        | j                        || j                  | 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    HHTZZ]+djjoo78ww||+E F IIOOAjj!1QDLL)1dllDII779aggi	) rJ   c                    | j                   \  }}|j                  dk(  rt        j                  }nt	        |      }|dk  rt        ||z   ||      }d}|}nt        |||z
  |      }|}||z   }|j                  dk7  r|d | }| j                  j                   \  }	}
|| j                  v ro||
kD  rIt        j                  |	|f| j                  j                        }| j                  |d d d |
f<   || _        || j                  | j                  |k(  ||f<   y t        j                  | j                  | j                  j                  j                  |            | _        t        ||
      }t        j                  |	dz   |f| j                  j                        }| j                  |d dd |
f<   ||d||f<   || _        y )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   zz1;;!vvH6{Hq5AE1h'AIIAq1uh'AIAI;;!BQZF#yy	99$xxI 6diiooN&*iiQ

]# 	@FDIIdlla'9)<<=99T\\4<<3E3E3J3J13MNDLIy)A88Y]A.diiooFD$(IID"jyj!,2DYy(()DIrJ   c                 *    |r| j                         S | S rT   r   )r9   r   s     r?   r&   z_dia_base.todia  s    99;KrJ   c                    ||dk7  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   }
| j                  |
|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  s3    L M M "ZZ(djj/ <<- IIc'l"''21d7;IIhbgg.'G2CQW1MMGDIIOOA$667
yy$))RXXtyyq/A:.N48IIOO&E F 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kD  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    ZZ
d:d88ATYY__55zz$,,!+,1I	tax&*88q=88Ktyy??3q69X#556F+Q;VVFQLzBFrJ   c                 L   | j                   dk(  r'| j                  | j                  | j                        S | j                  \  }}| j                  j                  \  }}t        j                  |      }|| j                  d d d f   z
  }|dk\  }|||k  z  }|||k  z  }|| j                  dk7  z  }| j                  t        | j                              }	t        j                  |dz   |	      }
t        j                  |j                  d      d |       |
d|dz    ||k  r|
|   |
|dz   d  |j                  |j                     j                  |	d      }| j                  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   88q=&&tzz&DD!ZZ("&))//Zii
+DLL400qx x'(a ))TZZ)A	(Q,i8!#4888+;IX+F!GqA $*:$6F:a<=!%%-&&yu&=yy{{466"""D'6#:$**)- # 5 	5rJ   c                 t   | j                   \  }}| j                  j                   \  }}t        j                  |      }|| j                  d d d f   z
  }|dk\  }|||k  z  }|||k  z  }|| j                  dk7  z  }||   }t        j
                  ||      |j                            }	| j                  | j                  ft        | j                               }
|j                  |
d      }|	j                  |
d      }	| j                  |   }| 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  s2   !ZZ("&))//Zii
+DLL400qx x'(a $iggk;/

=))LL?3tzz? * 
	 jjj/jjj/yy ""C:djj

 # 
 	
rJ   c                     |r7| j                  || j                  j                         f| j                        S | j                  || 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  sf     &&t||((*+4:: '   &&t||$DJJ '  rJ   c                    t        |      }|\  }}| j                  d d d |f   | _        || j                  d   kD  rt        j                  | j
                  | j                  d   z   | j                  j                  d   k        r_| j
                  d d d f   | j                  d   z   t        j                  | j                  j                  d         k  }d| j                  |<   || _        y )Nr   r   )r   r#   r    r)   anyr$   rL   r%   )r9   r    r[   r\   rQ   s        r?   resizez_dia_base.resize  s    E"1IIa!e$	

1t||djjm3diiooa6HHILLD)DJJqM9IIdiiooa012DDIIdO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X
	1 oo--GO#1199M$6L ++%%CK#NJ2#J MM))EM,,  ))11I  ''//H50 MM))EM
0 MM))EM ^^++FNrJ   r   c                 r    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yy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y)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rJ   r   c                       e Zd ZdZy)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      sm    %
7  '  7 7   %~, ~,B%6H	7 HVH9 HrJ   