
     h>                         d Z dZddgZddlZddlZddlmZmZ ddl	m
Z
 dd	lmZmZmZmZmZmZmZmZmZ 	 dd
lmZ n# e$ r d ZY nw xY w G d dee
e          Zd ZdS )zDictionary Of Keys based matrixzrestructuredtext en
dok_matrixisspmatrix_dok    N   )spmatrix
isspmatrix)
IndexMixin)	isdensegetdtypeisshape	isintlikeisscalarlikeupcastupcast_scalarget_index_dtypecheck_shape)isSequenceTypec                 b    t          | d          pt          | d          pt          | d          S )N__len____next__next)hasattr)xs    M/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/scipy/sparse/_dok.py_is_sequencer      s7    9%% &J)?)? &1f%%	'    c                   6   e Zd ZdZdZd,dZd Zd Zd Z e	e
j        e	          Zd-d
Zd Ze
j        j        e_        e
j        j        e_        d Zd.dZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d  Z"d! Z#d" Z$d# Z%d$ Z&d/d%Z'e
j'        j        e'_        d& Z(d' Z)e
j)        j        e)_        d0d(Z*e
j*        j        e*_        d0d)Z+e
j+        j        e+_        d0d*Z,e
j,        j        e,_        d+ Z-e
j-        j        e-_        dS )1r   a  
    Dictionary Of Keys based sparse matrix.

    This is an efficient structure for constructing sparse
    matrices incrementally.

    This can be instantiated in several ways:
        dok_matrix(D)
            with a dense matrix, D

        dok_matrix(S)
            with a sparse matrix, S

        dok_matrix((M,N), [dtype])
            create the matrix with initial shape (M,N)
            dtype is optional, defaulting to dtype='d'

    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
        Number of nonzero elements

    Notes
    -----

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

    Allows for efficient O(1) access of individual elements.
    Duplicates are not allowed.
    Can be efficiently converted to a coo_matrix once constructed.

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.sparse import dok_matrix
    >>> S = dok_matrix((5, 5), dtype=np.float32)
    >>> for i in range(5):
    ...     for j in range(5):
    ...         S[i, j] = i + j    # Update element

    dokNFc                    t                               |            t          j        |            t          |t                    | _        t          |t                    r,t          |          r|\  }}t          ||f          | _
        d S t          |          rt          |          r|r|                                }n|                                }||                    |d          }t                               | |           t          |j                  | _
        |j        | _        d S 	 t%          j        |          }n"# t(          $ r}t+          d          |d }~ww xY wt-          |j                  dk    rt+          d          |                     ||                                          }t                               | |           t          |j                  | _
        |j        | _        d S )N)defaultFcopyzInvalid input format.   z(Expected rank <=2 dense array or matrix.dtype)dict__init__r   r
   floatr$   
isinstancetupler   r   _shaper   r   r!   todokastypeupdateshapenpasarray	Exception	TypeErrorlen_coo_container)	selfarg1r.   r$   r!   MNeds	            r   r&   zdok_matrix.__init__J   s   d$eU333
dE"" 	!wt}} 	!DAq%q!f--DKKK 	!d## $ $yy{{zz|| {{5u{55KKd###%dj11DKDJJJ@z$'' @ @ @ 788a?@ 4:!## JKKK##D#66<<>>AKKa   %dj11DKDJJJs   0E 
E$EE$c                      t          d          )Nz9Direct modification to dok_matrix element is not allowed.)NotImplementedError)r5   vals     r   r-   zdok_matrix.updatel   s    ! #4 5 5 	5r   c                 8    t                               | |          S )zAn update method for dict data defined for direct access to
        `dok_matrix` data. Main purpose is to be used for effcient conversion
        from other spmatrix classes. Has no checking if `data` is valid.)r%   r-   )r5   datas     r   _updatezdok_matrix._updateq   s     {{4&&&r   c                     |                      |d                              | j                  }|j        | _        t                              |            t                              | |           d S NFr    )reshapeasformatformat__dict__r%   clearr-   )r5   r.   
new_matrixs      r   	set_shapezdok_matrix.set_shapew   s]    \\%e\44==dkJJ
"+

4D*%%%%%r   )fgetfsetc                 X    |t          d          t                              |           S )Nz6getnnz over an axis is not implemented for DOK format.)r<   r%   r   )r5   axiss     r   getnnzzdok_matrix.getnnz   s1    % '8 9 9 9||D!!!r   c                 X    t          d |                                 D                       S )Nc              3   "   K   | ]
}|d k    V  dS )r   N ).0r   s     r   	<genexpr>z+dok_matrix.count_nonzero.<locals>.<genexpr>   s&      11a16111111r   )sumvaluesr5   s    r   count_nonzerozdok_matrix.count_nonzero   s'    114;;==111111r   c                 6    t                               |           S N)r%   r   rV   s    r   r   zdok_matrix.__len__   s    ||D!!!r           c                 `   	 |\  }}t          |          rt          |          sJ n/# t          t          t          f$ r}t	          d          |d}~ww xY w|dk     s(|| j        d         k    s|dk     s|| j        d         k    rt	          d          t                              | ||          S )ztThis overrides the dict.get method, providing type checking
        but otherwise equivalent functionality.
        z!Index must be a pair of integers.Nr   r   zIndex out of bounds.)r   AssertionErrorr2   
ValueError
IndexErrorr.   r%   get)r5   keyr   ijr9   s         r   r_   zdok_matrix.get   s    	IDAqQ<<0IaLL0000	:6 	I 	I 	I@AAqH	IEEQ$*Q-''1q55AA4F4F3444xxc7+++s   %( AAAc                 n    t                               | ||f| j                            d                    S Nr   )r%   r_   r$   typer5   rowcols      r   _get_intXintzdok_matrix._get_intXint   s*    xxsCj$*//!*<*<===r   c                 P    |                      t          ||dz             |          S Nr   _get_sliceXsliceslicerf   s      r   _get_intXslicezdok_matrix._get_intXslice   s&    $$U3A%6%6<<<r   c                 P    |                      |t          ||dz                       S rk   rl   rf   s      r   _get_sliceXintzdok_matrix._get_sliceXint   s&    $$S%SU*;*;<<<r   c                 l   |                     | j        d                   \  }}}|                     | j        d                   \  }}}t          |||          }	t          |||          }
t          |	          t          |
          f}t          |           d|d         z  |d         z  k    r|                     |	|
          S |                     || j                  }|                                 D ]}t          t          |d                   |z
  |          \  }}|dk    s|dk     s||d         k    rDt          t          |d                   |z
  |          \  }}|dk    s|dk     s||d         k    rt                              | |          }t                              |||f|           |S )Nr   r   r"   r#   )indicesr.   ranger3   _get_columnXarray_dok_containerr$   keysdivmodintr%   __getitem____setitem__)r5   rg   rh   	row_startrow_stoprow_step	col_startcol_stopcol_step	row_range	col_ranger.   newdokr`   ra   rirb   rjr   s                      r   rm   zdok_matrix._get_sliceXslice   s   (+DJqM(B(B%	8X(+DJqM(B(B%	8X)Xx88	)Xx88	YY0 t99E!HuQx///)))Y???$$U$*$==99;; 	0 	0C3s1v;;2H==EArQww!a%%1a==3s1v;;2H==EArQww!a%%1a==  s++AVaVQ////r   c                 X    |                                 }|                     |g|          S rY   squeezeru   rf   s      r   _get_intXarrayzdok_matrix._get_intXarray   s'    kkmm%%seS111r   c                 X    |                                 }|                     ||g          S rY   r   rf   s      r   _get_arrayXintzdok_matrix._get_arrayXint   s'    kkmm%%cC5111r   c                     t          t          |                    | j        d                              }|                     ||          S rd   listrt   rs   r.   ru   rf   s      r   _get_sliceXarrayzdok_matrix._get_sliceXarray   <    5#++djm44566%%c3///r   c                     t          t          |                    | j        d                              }|                     ||          S rk   r   rf   s      r   _get_arrayXslicezdok_matrix._get_arrayXslice   r   r   c                 F   |                      t          |          t          |          f| j                  }t          |          D ]X\  }}t          |          D ]C\  }}t                              | ||fd          }|rt                              |||f|           DY|S )Nr#   r   )rv   r3   r$   	enumerater%   r_   r{   )	r5   rg   rh   r   ra   rrb   cvs	            r   ru   zdok_matrix._get_columnXarray   s    $$c#hhC%9$LLcNN 	8 	8DAq!# 8 81HHTAq61-- 8$$VaVQ7778 r   c                    t          t          j        t          j        ||                    \  }}|                     |j        | j                  }t          j        t          |j        d                   t          |j        d                             D ]J}t                              | ||         ||         fd          }|rt                              |||           K|S )Nr#   r   r   )mapr/   
atleast_2dbroadcast_arraysrv   r.   r$   	itertoolsproductrt   r%   r_   r{   )r5   rg   rh   ra   rb   r   r`   r   s           r   _get_arrayXarrayzdok_matrix._get_arrayXarray   s    2=""5c3"?"?@@1$$QWDJ$??$U171:%6%6agaj8I8IJJ 	1 	1C##/33A 1  a000r   c                     ||f}|rt                               | ||           d S t                               | |          r| |= d S d S rY   )r%   r{   __contains__)r5   rg   rh   r   r`   s        r   _set_intXintzdok_matrix._set_intXint   s^    Cj 	T3*****tS)) 	S				 	r   c           	         t          t          t          |                                                    }t          t          t          |                                                    }|                                }t                              | t          t          ||          |                     t          j        |dk              d         D ]4}||         ||         f}t          	                    | |          dk    r| |= 5d S rd   )
r   r   ry   ravelr%   r-   zipr/   nonzerorz   )r5   rg   rh   r   ra   r`   s         r   _set_arrayXarrayzdok_matrix._set_arrayXarray   s    3sCIIKK(())3sCIIKK(())GGIID#c#smmQ//000AF##A& 	 	Aq63q6"Cc**a//I		 	r   c                    t                    rt          | j                  }|                     | j        |          | j        \  }}t          j        t          |          t          |                    D ](}t          	                    | |d          z   }|r||<   )n>t                    r؉j        | j        k    rt          d          t          | j        j                  }|                     | j        |          t                              |            t          j        d          5  t                              fd                                D                        d d d            n# 1 swxY w Y   nWt#                    r|                                 }|z   n.t'                    r|                                 z   nt*          S S )Nr#   r    Matrix dimensions are not equal.ignore)overc              3   >   K   | ]}||         |         z   fV  d S rY   rQ   )rR   knewothers     r   rS   z%dok_matrix.__add__.<locals>.<genexpr>
  s5      IIqQAq 12IIIIIIr   )r   r   r$   rv   r.   r   r   rt   r%   r_   r   r]   r   r-   r/   errstaterw   r   tocscr	   todenseNotImplemented)	r5   r   	res_dtyper7   r8   r`   aijcscr   s	    `      @r   __add__zdok_matrix.__add__   s$    	"%dj%88I%%dj	%BBC:DAq (q588<< # #hhtcA..6 #"CH#
 E"" 	"{dj(( !CDDD tz5;77I%%dj	%BBCKKT"""(+++ K KCIIIIIEJJLLIIIK K KK K K K K K K K K K K K K K K  	"**,,C+CCU^^ 	",,..5(CC!!
s   ;;FF	Fc                 (    t                    r                      j         j                  } j        \  }}t	          j        t          |          t          |                    D ](}t                               |d          z   }|r|||<   )nt                    rj         j        k    rt          d                                j         j                  }t                              |            t                              | fd                                D                        nWt                    r                                 }|z   }n.t                    r                                 z   }nt"          S |S )Nr#   r   r   c              3   >   K   | ]}||         |         z   fV  d S rY   rQ   )rR   r   r   r5   s     r   rS   z&dok_matrix.__radd__.<locals>.<genexpr>"  s5      FFADGeAh./FFFFFFr   )r   rv   r.   r$   r   r   rt   r%   r_   r   r]   r-   rw   r   r   r	   r   r   )r5   r   r   r7   r8   r`   r   r   s   ``      r   __radd__zdok_matrix.__radd__  s    	"%%dj
%CCC:DAq (q588<< # #hhtcA..6 #"CH# E"" 	"{dj(( !CDDD%%dj
%CCCKKT"""KKFFFFFFFFH H H H 	"**,,C+CCU^^ 	"$,,..(CC!!
r   c                       j         j        dk    rt          d                                j         j                   }t
                              | fd                                 D                        |S )Nbz2Negating a sparse boolean matrix is not supported.r#   c              3   .   K   | ]}||          fV  d S rY   rQ   )rR   r   r5   s     r   rS   z%dok_matrix.__neg__.<locals>.<genexpr>1  s-      ==A1tAwh-======r   )r$   kindr<   rv   r.   r%   r-   rw   r5   r   s   ` r   __neg__zdok_matrix.__neg__,  s{    :?c!!% '4 5 5 5!!$*DJ!??C=======>>>
r   c                     t          | j                  }|                     | j        |          }t                              |fd|                                 D                        |S )Nr#   c              3   ,   K   | ]\  }}||z  fV  d S rY   rQ   rR   r   r   r   s      r   rS   z)dok_matrix._mul_scalar.<locals>.<genexpr>8  s/      BBTQ1a%i.BBBBBBr   )r   r$   rv   r.   r%   r-   itemsr5   r   r   r   s    `  r   _mul_scalarzdok_matrix._mul_scalar4  sd    !$*e44	!!$*I!>>CBBBBTZZ\\BBBCCC
r   c                     t          j        | j        d         t          | j        |j                            }|                                 D ]!\  \  }}}||xx         |||         z  z  cc<   "|S )Nr   r#   )r/   zerosr.   r   r$   r   )r5   r   resultra   rb   r   s         r   _mul_vectorzdok_matrix._mul_vector;  sn    $*Q-vdj%+/N/NOOO 	& 	&IFQA1IIIU1X%IIIIr   c           	         | j         d         |j         d         f}t          | j        |j                  }t          j        ||          }|                                 D ])\  \  }}}||d d fxx         |||d d f         z  z  cc<   *|S )Nr   r   r#   )r.   r   r$   r/   r   r   )r5   r   result_shaperesult_dtyper   ra   rb   r   s           r   _mul_multivectorzdok_matrix._mul_multivectorB  s    
1u{1~6dj%+66,l;;; 	* 	*IFQA1QQQ3KKK1uQqqqSz>)KKKKr   c                     t                    r;t                              | fd|                                 D                        | S t          S )Nc              3   ,   K   | ]\  }}||z  fV  d S rY   rQ   r   s      r   rS   z&dok_matrix.__imul__.<locals>.<genexpr>M  /      GG$!Q1u9~GGGGGGr   r   r%   r-   r   r   r5   r   s    `r   __imul__zdok_matrix.__imul__K  O     	KKGGGG$**,,GGGHHHKr   c                 (   t                    rlt          | j                  }|                     | j        |          }t
                              |fd|                                 D                        |S |                                 z  S )Nr#   c              3   ,   K   | ]\  }}||z  fV  d S rY   rQ   r   s      r   rS   z)dok_matrix.__truediv__.<locals>.<genexpr>U  s/      FFAq!e)nFFFFFFr   )	r   r   r$   rv   r.   r%   r-   r   tocsrr   s    `  r   __truediv__zdok_matrix.__truediv__Q  s     	%dj%88I%%dj	%BBCKKFFFFFFFGGGJzz||e##r   c                     t                    r;t                              | fd|                                 D                        | S t          S )Nc              3   ,   K   | ]\  }}||z  fV  d S rY   rQ   r   s      r   rS   z*dok_matrix.__itruediv__.<locals>.<genexpr>[  r   r   r   r   s    `r   __itruediv__zdok_matrix.__itruediv__Y  r   r   c                 6    t                               |           S rY   )r%   
__reduce__rV   s    r   r   zdok_matrix.__reduce___  s     t$$$r   c                     |t          d          | j        \  }}|                     ||f| j        |          }t                              |d |                                 D                        |S )NzoSparse matrices do not support an 'axes' parameter because swapping dimensions is the only logical permutation.)r$   r!   c              3   .   K   | ]\  \  }}}||f|fV  d S rY   rQ   rR   leftrightr=   s       r   rS   z'dok_matrix.transpose.<locals>.<genexpr>q  sO       B B0mtUS "4=#. B B B B B Br   )r]   r.   rv   r$   r%   r-   r   )r5   axesr!   r7   r8   r   s         r   	transposezdok_matrix.transposei  s     K L L L z1!!1a&
!FFC B B48JJLLB B B 	C 	C 	C
r   c                     | j         \  }}|                     ||f| j                  }t                              |d |                                 D                        |S )zReturn the conjugate transpose.r#   c              3   R   K   | ]"\  \  }}}||ft          j        |          fV  #d S rY   )r/   conjr   s       r   rS   z(dok_matrix.conjtransp.<locals>.<genexpr>{  sW       B B0mtUS "4="'#,,7 B B B B B Br   )r.   rv   r$   r%   r-   r   )r5   r7   r8   r   s       r   
conjtranspzdok_matrix.conjtranspw  st    z1!!1a&
!;;C B B48JJLLB B B 	C 	C 	C
r   c                 ~    |                      | j        | j                  }t                              ||            |S )Nr#   )rv   r.   r$   r%   r-   r   s     r   r!   zdok_matrix.copy  s7    !!$*DJ!??C
r   c                 B   | j         dk    r!|                     | j        | j                  S t	          t          | j                            }t          j        |                                 | j        | j                   }t          j        d | 	                                D             || j                   }t          j        d | 	                                D             || j                   }|                     |||ff| j        | j                  }d|_
        |S )	Nr   r#   )maxval)r$   countc              3       K   | ]	\  }}|V  
d S rY   rQ   )rR   ra   _s      r   rS   z#dok_matrix.tocoo.<locals>.<genexpr>  &      55A1555555r   c              3       K   | ]	\  }}|V  
d S rY   rQ   )rR   r   rb   s      r   rS   z#dok_matrix.tocoo.<locals>.<genexpr>  r   r   )r.   r$   T)nnzr4   r.   r$   r   maxr/   fromiterrU   rw   has_canonical_format)r5   r!   	idx_dtyper?   rg   rh   As          r   tocoozdok_matrix.tocoo  s    8q==&&tz&DDD#3tz??;;;	{4;;==
$(KKKk55555YdhWWWk55555YdhWWWC:dj
   
 
 "&r   c                 2    |r|                                  S | S rY   r    r5   r!   s     r   r+   zdok_matrix.todok  s     	99;;r   c                 V    |                      d                              |          S rB   )r   r   r   s     r   r   zdok_matrix.tocsc  s'    zzuz%%+++666r   c                     t          |          }|\  }}| j        \  }}||k     s||k     r8t          |                                           D ]\  }}||k    s||k    r| ||f= || _        d S rY   )r   r.   r   rw   r*   )r5   r.   newMnewNr7   r8   ra   rb   s           r   resizezdok_matrix.resize  s    E""
dz1!88taxxtyy{{++ # #A99T		QT
r   )NNFrY   )rZ   )NF)F).__name__
__module____qualname____doc__rE   r&   r-   r@   rI   propertyr   	get_shaper.   rN   rW   r   r_   ri   ro   rq   rm   r   r   r   r   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r!   r   r+   r   r   rQ   r   r   r   r      s       / /` F !  !  !  !D5 5 5
' ' '& & & H(,9===E" " " "2 2 2 _,FN$2:M" " ", , , ,> > >= = == = =  02 2 22 2 20 0 00 0 0	 	 		 	 	  
 
 
  >  0          $ $ $  % % %
 
 
 
 !*2I    
 =(DL    N*EM   
 N*EM7 7 7 7 N*EM	 	 	 _,FNNNr   c                 X    ddl m} t          | t                    pt          | |          S )a  Is x of dok_matrix type?

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

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

    Examples
    --------
    >>> from scipy.sparse import dok_matrix, isspmatrix_dok
    >>> isspmatrix_dok(dok_matrix([[5]]))
    True

    >>> from scipy.sparse import dok_matrix, csr_matrix, isspmatrix_dok
    >>> isspmatrix_dok(csr_matrix([[5]]))
    False
    r   )	dok_array)_arraysr  r(   r   )r   r  s     r   r   r     s5    . #"""""a$$@
1i(@(@@r   )r  __docformat____all__r   numpyr/   _baser   r   _indexr   _sputilsr	   r
   r   r   r   r   r   r   r   operatorr   r   ImportErrorr%   r   r   rQ   r   r   <module>r     s   % %%)
*         ' ' ' ' ' ' ' '      L L L L L L L L L L L L L L L L L L L L L L'7777777 ' ' '' ' ' ' ''V- V- V- V- V-:t V- V- V-rA A A A As   = AA