
    9=e?                     N   d Z dZg dZddlZddlZddlmZmZ ddl	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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 G d dee          Zej         e_          G d dee          Z  eej                   e _         dS )zDictionary Of Keys based matrixzrestructuredtext en)	dok_array
dok_matrixisspmatrix_dok    N   )spmatrix_array_doc_to_matrix)_spbasesparrayissparse)
IndexMixin)isdensegetdtypeisshape	isintlikeisscalarlikeupcastupcast_scalarcheck_shape)isSequenceTypec                 b    t          | d          pt          | d          pt          | d          S )N__len____next__next)hasattrxs    1lib/python3.11/site-packages/scipy/sparse/_dok.py_is_sequencer      s7    9%% &J)?)? &1f%%	'    c                      e Zd ZdZdZd*dZd Zd 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%_        d.d&Z&e
j&        j        e&_        d.d'Z'e
j'        j        e'_        d.d(Z(e
j(        j        e(_        d) Z)e
j)        j        e)_        dS )/	_dok_basea  
    Dictionary Of Keys based sparse matrix.

    This is an efficient structure for constructing sparse
    matrices incrementally.

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

        dok_array(S)
            with a sparse matrix, S

        dok_array((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_array
    >>> S = dok_array((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          |          r|j        | j        k    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   formatr&   todokastypeupdateshapenpasarray	Exception	TypeErrorlen_coo_container)	selfarg1r4   r)   r&   MNeds	            r   r+   z_dok_base.__init__K   s   deU333
dE"" 	!wt}} 	!DAq%q!f--DKKKd^^ 	!{dk))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   1E 
E%E  E%c                      t          d          )Nz8Direct modification to dok_array element is not allowed.)NotImplementedError)r;   vals     r   r3   z_dok_base.updatem   s    ! #4 5 5 	5r   c                 8    t                               | |          S )zAn update method for dict data defined for direct access to
        `dok_array` data. Main purpose is to be used for effcient conversion
        from other _spbase classes. Has no checking if `data` is valid.)r*   r3   )r;   datas     r   _updatez_dok_base._updater   s     {{4&&&r   c                 X    |t          d          t                              |           S )Nz7_getnnz over an axis is not implemented for DOK format.)rB   r*   r   )r;   axiss     r   _getnnzz_dok_base._getnnzx   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_base.count_nonzero.<locals>.<genexpr>   s&      11a16111111r   )sumvaluesr;   s    r   count_nonzeroz_dok_base.count_nonzero~   s'    114;;==111111r   c                 6    t                               |           S N)r*   r   rQ   s    r   r   z_dok_base.__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   AssertionErrorr8   
ValueError
IndexErrorr4   r*   get)r;   keyr$   ijr?   s         r   rZ   z_dok_base.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*   rZ   r)   typer;   rowcols      r   _get_intXintz_dok_base._get_intXint   s*    xxsCj$*//!*<*<===r   c                 P    |                      t          ||dz             |          S Nr   _get_sliceXsliceslicera   s      r   _get_intXslicez_dok_base._get_intXslice   s&    $$U3A%6%6<<<r   c                 P    |                      |t          ||dz                       S rf   rg   ra   s      r   _get_sliceXintz_dok_base._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(   )indicesr4   ranger9   _get_columnXarray_dok_containerr)   keysdivmodintr*   __getitem____setitem__)r;   rb   rc   	row_startrow_stoprow_step	col_startcol_stopcol_step	row_range	col_ranger4   newdokr[   r\   rir]   rjr   s                      r   rh   z_dok_base._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 rT   squeezerp   ra   s      r   _get_intXarrayz_dok_base._get_intXarray   s'    kkmm%%seS111r   c                 X    |                                 }|                     ||g          S rT   r   ra   s      r   _get_arrayXintz_dok_base._get_arrayXint   s'    kkmm%%cC5111r   c                     t          t          |                    | j        d                              }|                     ||          S r_   listro   rn   r4   rp   ra   s      r   _get_sliceXarrayz_dok_base._get_sliceXarray   <    5#++djm44566%%c3///r   c                     t          t          |                    | j        d                              }|                     ||          S rf   r   ra   s      r   _get_arrayXslicez_dok_base._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   )rq   r9   r)   	enumerater*   rZ   rv   )	r;   rb   rc   r   r\   rr]   cvs	            r   rp   z_dok_base._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   )mapr5   
atleast_2dbroadcast_arraysrq   r4   r)   	itertoolsproductro   r*   rZ   rv   )r;   rb   rc   r\   r]   r   r[   r   s           r   _get_arrayXarrayz_dok_base._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 rT   )r*   rv   __contains__)r;   rb   rc   r   r[   s        r   _set_intXintz_dok_base._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 r_   )
r   r   rt   ravelr*   r3   zipr5   nonzeroru   )r;   rb   rc   r   r\   r[   s         r   _set_arrayXarrayz_dok_base._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        dk    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   nH|                                 }|z   n.t'                    r|                                 z   nt*          S S )Nr(   r   r"    Matrix dimensions are not equal.ignore)overc              3   >   K   | ]}||         |         z   fV  d S rT   rL   )rM   knewothers     r   rN   z$_dok_base.__add__.<locals>.<genexpr>  s5      MM1CFU1X$5 6MMMMMMr   )r   r   r)   rq   r4   r   r   ro   r*   rZ   r   r0   rX   r   r3   r5   errstaterr   tocscr   todenseNotImplemented)	r;   r   	res_dtyper=   r>   r[   aijcscr   s	    `      @r   __add__z_dok_base.__add__   s    	"%dj%88I%%dj	%BBC:DAq (q588<< # #hhtcA..6 #"CH#
 e__ 	"|u$$;$*,,$%GHHH #4:u{;;	))$*I)FFC&&&[h/// O OKKMMMMM

MMMO O OO O O O O O O O O O O O O O O jjllEk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
        dk    rj         j        k    rt          d                                j         j                  }t                              |            t                              | fd                                D                        nH                                 }|z   }n.t                    r                                 z   }nt"          S |S )Nr(   r   r"   r   c              3   >   K   | ]}||         |         z   fV  d S rT   rL   )rM   r   r   r;   s     r   rN   z%_dok_base.__radd__.<locals>.<genexpr>  s5      JJQQ%( 23JJJJJJr   )r   rq   r4   r)   r   r   ro   r*   rZ   r   r0   rX   r3   rr   r   r   r   r   )r;   r   r   r=   r>   r[   r   r   s   ``      r   __radd__z_dok_base.__radd__  s    	"%%dj
%CCC:DAq (q588<< # #hhtcA..6 #"CH# e__ 	"|u$$;$*,,$%GHHH))$*DJ)GGC&&&CJJJJJUZZ\\JJJL L L L jjllEk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 rT   rL   )rM   r   r;   s     r   rN   z$_dok_base.__neg__.<locals>.<genexpr>,  s-      ==A1tAwh-======r   )r)   kindrB   rq   r4   r*   r3   rr   r;   r   s   ` r   __neg__z_dok_base.__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 rT   rL   rM   r   r   r   s      r   rN   z(_dok_base._mul_scalar.<locals>.<genexpr>3  s/      BBTQ1a%i.BBBBBBr   )r   r)   rq   r4   r*   r3   itemsr;   r   r   r   s    `  r   _mul_scalarz_dok_base._mul_scalar/  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(   )r5   zerosr4   r   r)   r   )r;   r   resultr\   r]   r   s         r   _mul_vectorz_dok_base._mul_vector6  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(   )r4   r   r)   r5   r   r   )r;   r   result_shaperesult_dtyper   r\   r]   r   s           r   _mul_multivectorz_dok_base._mul_multivector=  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 rT   rL   r   s      r   rN   z%_dok_base.__imul__.<locals>.<genexpr>H  /      GG$!Q1u9~GGGGGGr   r   r*   r3   r   r   r;   r   s    `r   __imul__z_dok_base.__imul__F  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 rT   rL   r   s      r   rN   z(_dok_base.__truediv__.<locals>.<genexpr>P  s/      FFAq!e)nFFFFFFr   )	r   r   r)   rq   r4   r*   r3   r   tocsrr   s    `  r   __truediv__z_dok_base.__truediv__L  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 rT   rL   r   s      r   rN   z)_dok_base.__itruediv__.<locals>.<genexpr>V  r   r   r   r   s    `r   __itruediv__z_dok_base.__itruediv__T  r   r   c                 6    t                               |           S rT   )r*   
__reduce__rQ   s    r   r   z_dok_base.__reduce__Z  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 rT   rL   rM   leftrightrC   s       r   rN   z&_dok_base.transpose.<locals>.<genexpr>l  sO       B B0mtUS "4=#. B B B B B Br   )rX   r4   rq   r)   r*   r3   r   )r;   axesr&   r=   r>   r   s         r   	transposez_dok_base.transposed  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 rT   )r5   conjr   s       r   rN   z'_dok_base.conjtransp.<locals>.<genexpr>v  sW       B B0mtUS "4="'#,,7 B B B B B Br   )r4   rq   r)   r*   r3   r   )r;   r=   r>   r   s       r   
conjtranspz_dok_base.conjtranspr  st    z1!!1a&
!;;C B B48JJLLB B B 	C 	C 	C
r   c                 ~    |                      | j        | j                  }t                              ||            |S )Nr(   )rq   r4   r)   r*   r3   r   s     r   r&   z_dok_base.copyz  s7    !!$*DJ!??C
r   c                 N   | j         dk    r!|                     | j        | j                  S |                     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 rT   rL   )rM   r\   _s      r   rN   z"_dok_base.tocoo.<locals>.<genexpr>  &      55A1555555r   c              3       K   | ]	\  }}|V  
d S rT   rL   )rM   r   r]   s      r   rN   z"_dok_base.tocoo.<locals>.<genexpr>  r   r   )r4   r)   T)nnzr:   r4   r)   _get_index_dtypemaxr5   fromiterrP   rr   has_canonical_format)r;   r&   	idx_dtyperE   rb   rc   As          r   tocooz_dok_base.tocoo  s   8q==&&tz&DDD))TZ)AA	{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 rT   r%   r;   r&   s     r   r1   z_dok_base.todok  s     	99;;r   c                 V    |                      d                              |          S NFr%   )r   r   r   s     r   r   z_dok_base.tocsc  s'    zzuz%%+++666r   c                     t          |          }|\  }}| j        \  }}||k     s||k     r8t          |                                           D ]\  }}||k    s||k    r| ||f= || _        d S rT   )r   r4   r   rr   r/   )r;   r4   newMnewNr=   r>   r\   r]   s           r   resizez_dok_base.resize  s    E""
dz1!88taxxtyy{{++ # #A99T		QT
r   )NNFrT   )rU   )NF)F)*__name__
__module____qualname____doc___formatr+   r3   rF   rI   rR   r	   r   rZ   rd   rj   rl   rh   r   r   r   r   rp   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r&   r   r1   r   r   rL   r   r   r!   r!      s       / /` G !  !  !  !D5 5 5
' ' '" " " "2 2 2 o-GO#19M" " ", , , ,> > >= = == = =  02 2 22 2 20 0 00 0 0	 	 		 	 	  
 
 
  @  2          $ $ $  % % %
 
 
 
  )1I    
 <'DL    M)EM   
 M)EM7 7 7 7 M)EM	 	 	 ^+FNNNr   r!   c                 ,    t          | t                    S )a  Is `x` of dok_array 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_array, dok_matrix, coo_matrix, isspmatrix_dok
    >>> isspmatrix_dok(dok_matrix([[5]]))
    True
    >>> isspmatrix_dok(dok_array([[5]]))
    False
    >>> isspmatrix_dok(coo_matrix([[5]]))
    False
    )r-   r   r   s    r   r   r     s    . a$$$r   c                       e Zd ZdS )r   N)r   r   r   rL   r   r   r   r     s        Dr   r   c                   4    e Zd Zd Zd Z eee          ZdS )r   c                     |                      |d                              | j                  }|j        | _        t                              |            t                              | |           d S r   )reshapeasformatr0   __dict__r*   clearr3   )r;   r4   
new_matrixs      r   	set_shapezdok_matrix.set_shape  s]    \\%e\44==dkJJ
"+

4D*%%%%%r   c                     | j         S )zGet shape of a sparse array.)r/   rQ   s    r   	get_shapezdok_matrix.get_shape  s
    {r   )fgetfsetN)r   r   r   r  r  propertyr4   rL   r   r   r   r     sB        & & &   H))444EEEr   r   )!r   __docformat____all__r   numpyr5   _matrixr   r   _baser	   r
   r   _indexr   _sputilsr   r   r   r   r   r   r   r   operatorr   r   ImportErrorr*   r!   r   r   r   rL   r   r   <module>r     s   % %%
7
7
7         3 3 3 3 3 3 3 3 - - - - - - - - - -      ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;'7777777 ' ' '' ' ' ' ''P, P, P, P, P,T P, P, P,f% % %6	 	 	 	 		7 	 	 	 %	 5 5 5 5 59 5 5 5 *))*;<<
   s   A AA