
    xf?                     F   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  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 _         y# e$ r d ZY [w xY w)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                 R    t        | d      xs t        | d      xs t        | d      S )N__len____next__next)hasattrxs    3/usr/lib/python3/dist-packages/scipy/sparse/_dok.py_is_sequencer      s.    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
jF                  j                  e#_        d" Z$d# Z%e
jJ                  j                  e%_        d,d$Z&e
jL                  j                  e&_        d,d%Z'e
jN                  j                  e'_        d,d&Z(e
jP                  j                  e(_        d' Z)e
jR                  j                  e)_        y)-	_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

    dokNc                    t         j                  |        t        j                  |        t        |t              | _        t        |t              r#t        |      r|\  }}t        ||f      | _
        y t        |      r|j                  | j                  k(  r|r|j                         }n|j                         }||j                  |d      }t         j!                  | |       t        |j"                        | _
        |j
                  | _        y 	 t%        j&                  |      }t-        |j"                        dk7  rt+        d      | j/                  ||      j                         }t         j!                  | |       t        |j"                        | _
        |j
                  | _        y # t(        $ r}t+        d      |d }~ww xY w)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
dE"wt}DAq%q!f-DKd^{{dkk)dyy{zz| {{5u{5KKd#%djj1DKDJ@zz$' 4::!# JKK##D#6<<>AKKa %djj1DKDJ  @ 78a?@s   F. .	G7GGc                     t        d      )Nz8Direct modification to dok_array element is not allowed.)NotImplementedError)r;   vals     r   r3   z_dok_base.updatem   s    ! #4 5 	5r   c                 .    t         j                  | |      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                 F    |t        d      t        j                  |       S )Nz7_getnnz over an axis is not implemented for DOK format.)rB   r*   r   )r;   axiss     r   _getnnzz_dok_base._getnnzx   s)    % '8 9 9||D!!r   c                 B    t        d | j                         D              S )Nc              3   &   K   | ]	  }|d k7    yw)r   N ).0r   s     r   	<genexpr>z*_dok_base.count_nonzero.<locals>.<genexpr>   s     1a161   )sumvaluesr;   s    r   count_nonzeroz_dok_base.count_nonzero~   s    14;;=111r   c                 ,    t         j                  |       S N)r*   r   rR   s    r   r   z_dok_base.__len__   s    ||D!!r   c                 0   	 |\  }}t        |      rt        |      sJ 	 |dk  s)|| j
                  d   k\  s|dk  s|| j
                  d   k\  rt	        d      t        j                  | ||      S # t        t        t        f$ r}t	        d      |d}~ww xY w)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<IaL00L EQ$**Q-'1q5AA4F344xxc7++	 	:6 	I@AqH	Is   A0 0BBBc                 f    t         j                  | ||f| j                  j                  d            S Nr   )r*   rZ   r)   typer;   rowcols      r   _get_intXintz_dok_base._get_intXint   s&    xxsCj$**//!*<==r   c                 @    | j                  t        ||dz         |      S Nr   _get_sliceXsliceslicera   s      r   _get_intXslicez_dok_base._get_intXslice   s     $$U3A%6<<r   c                 @    | j                  |t        ||dz               S rf   rg   ra   s      r   _get_sliceXintz_dok_base._get_sliceXint   s     $$S%SU*;<<r   c                    |j                  | j                  d         \  }}}|j                  | j                  d         \  }}}t        |||      }	t        |||      }
t        |	      t        |
      f}t        |       d|d   z  |d   z  k\  r| j	                  |	|
      S | j                  || j                        }| j                         D ]  }t        t        |d         |z
  |      \  }}|dk7  s|dk  s||d   k\  r4t        t        |d         |z
  |      \  }}|dk7  s|dk  s||d   k\  ret        j                  | |      }t        j                  |||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   sg   (+DJJqM(B%	8X(+DJJqM(B%	8X)Xx8	)Xx8	YY0 t9E!HuQx//)))Y??$$U$**$=99; 	0C3s1v;2H=EArQw!a%1a=3s1v;2H=EArQw!a%1a=  s+AVaVQ/	0 r   c                 H    |j                         }| j                  |g|      S rU   squeezerp   ra   s      r   _get_intXarrayz_dok_base._get_intXarray   s"    kkm%%seS11r   c                 H    |j                         }| j                  ||g      S rU   r   ra   s      r   _get_arrayXintz_dok_base._get_arrayXint   s"    kkm%%cC511r   c                     t        t        |j                  | j                  d                }| j	                  ||      S r_   listro   rn   r4   rp   ra   s      r   _get_sliceXarrayz_dok_base._get_sliceXarray   5    5#++djjm456%%c3//r   c                     t        t        |j                  | j                  d                }| j	                  ||      S rf   r   ra   s      r   _get_arrayXslicez_dok_base._get_arrayXslice   r   r   c                    | j                  t        |      t        |      f| j                        }t        |      D ]M  \  }}t        |      D ]:  \  }}t        j                  | ||fd      }|s"t        j                  |||f|       < O |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#hC%9$LcN 	8DAq!# 81HHTAq61-$$VaVQ78	8
 r   c                    t        t        j                  t        j                  ||            \  }}| j	                  |j
                  | j                        }t        j                  t        |j
                  d         t        |j
                  d               D ];  }t        j                  | ||   ||   fd      }|s%t        j                  |||       = |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==""5"5c3"?@1$$QWWDJJ$?$$U1771:%6aggaj8IJ 	1C##/3A  a0	1 r   c                 t    ||f}|rt         j                  | ||       y t         j                  | |      r| |= y y rU   )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        |j                                     }t        t        t        |j                                     }|j                         }t        j                  | t        t        ||      |             t        j                  |dk(        d   D ])  }||   ||   f}t        j                  | |      dk(  s'| |= + y r_   )
r   r   rt   ravelr*   r3   zipr5   nonzeroru   )r;   rb   rc   r   r\   r[   s         r   _set_arrayXarrayz_dok_base._set_arrayXarray   s    3sCIIK()3sCIIK()GGID#c#smQ/0AF#A& 	Aq63q6"Cc*a/I		r   c                    t              rt        | j                        }| j                  | j                  |      | j                  \  }}t        j                  t        |      t        |            D ]$  }t        j                  | |d      z   }|s ||<   & S t              rj                  dk(  rƉj                  | j                  k7  rt        d      t        | j                  j                        }| j                  | j                  |      t        j                  |        t        j                   d      5  t        j                  fdj#                         D               d d d        S | j%                         }|z   S t'              r| j)                         z   S t*        S # 1 sw Y   S xY w)Nr(   r   r"    Matrix dimensions are not equal.ignore)overc              3   8   K   | ]  }||   |   z   f  y wrU   rL   )rM   knewothers     r   rN   z$_dok_base.__add__.<locals>.<genexpr>  s#     M1CFU1X$5 6M   )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   %djj%8I%%djj	%BC::DAq ((q58< #hhtcA.6"CH#0 
' e_||u$;;$**,$%GHH #4::u{{;	))$**I)FC&[[h/ OKKM

MOO 
 jjlEk
 
	 U^,,.5(C 
 "!O 
s   /F>>Gc                     t              r j                   j                   j                        } j                  \  }}t	        j
                  t        |      t        |            D ]$  }t        j                   |d      z   }|s |||<   & |S t              rj                  dk(  rj                   j                  k7  rt        d       j                   j                   j                        }t        j                  |        t        j                  | fdj                         D               |S  j                         }|z   }|S t              r j!                         z   }|S t"        S )Nr(   r   r"   r   c              3   8   K   | ]  }||   |   z   f  y wrU   rL   )rM   r   r   r;   s     r   rN   z%_dok_base.__radd__.<locals>.<genexpr>  s#     JQQ%( 23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__  sH   %%djj

%CC::DAq ((q58< #hhtcA.6"CH#& 
 e_||u$;;$**,$%GHH))$**DJJ)GC&CJUZZ\JL 
 jjlEk
 
	 U^$,,.(C 
 "!r   c                       j                   j                  dk(  rt        d       j                   j                   j                         }t
        j                  | fd j                         D               |S )Nbz2Negating a sparse boolean matrix is not supported.r(   c              3   .   K   | ]  }||    f  y wrU   rL   )rM   r   r;   s     r   rN   z$_dok_base.__neg__.<locals>.<genexpr>,  s     =A1tAwh-=s   )r)   kindrB   rq   r4   r*   r3   rr   r;   r   s   ` r   __neg__z_dok_base.__neg__'  sa    ::??c!% '4 5 5!!$**DJJ!?C==>
r   c                     t        | j                        }| j                  | j                  |      }t        j                  |fd| j                         D               |S )Nr(   c              3   2   K   | ]  \  }}||z  f  y wrU   rL   rM   r   r   r   s      r   rN   z(_dok_base._mul_scalar.<locals>.<genexpr>3  s     BTQ1a%i.B   )r   r)   rq   r4   r*   r3   itemsr;   r   r   r   s    `  r   _mul_scalarz_dok_base._mul_scalar/  sK    !$**e4	!!$**I!>CBTZZ\BC
r   c                     t        j                  | j                  d   t        | j                  |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  sa    $**Q-vdjj%++/NO 	&IFQA1IU1X%I	&r   c           	         | j                   d   |j                   d   f}t        | j                  |j                        }t        j                  ||      }| 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djj%++6,l; 	*IFQA1Q3K1uQqSz>)K	*r   c                     t              r/t        j                  | fd| j                         D               | S t        S )Nc              3   2   K   | ]  \  }}||z  f  y wrU   rL   r   s      r   rN   z%_dok_base.__imul__.<locals>.<genexpr>H       G$!Q1u9~Gr   r   r*   r3   r   r   r;   r   s    `r   __imul__z_dok_base.__imul__F  0    KKG$**,GHKr   c                    t              rbt        | j                        }| j                  | j                  |      }t
        j                  |fd| j                         D               |S | j                         z  S )Nr(   c              3   2   K   | ]  \  }}||z  f  y wrU   rL   r   s      r   rN   z(_dok_base.__truediv__.<locals>.<genexpr>P  s     FAq!e)nFr   )	r   r   r)   rq   r4   r*   r3   r   tocsrr   s    `  r   __truediv__z_dok_base.__truediv__L  sd    %djj%8I%%djj	%BCKKFFGJzz|e##r   c                     t              r/t        j                  | fd| j                         D               | S t        S )Nc              3   2   K   | ]  \  }}||z  f  y wrU   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                 ,    t         j                  |       S rU   )r*   
__reduce__rR   s    r   r   z_dok_base.__reduce__Z  s     t$$r   c                     |t        d      | j                  \  }}| j                  ||f| j                  |      }t        j                  |d | j                         D               |S )NzoSparse matrices do not support an 'axes' parameter because swapping dimensions is the only logical permutation.)r)   r&   c              3   4   K   | ]  \  \  }}}||f|f  y wrU   rL   rM   leftrightrC   s       r   rN   z&_dok_base.transpose.<locals>.<genexpr>l  s+      B0mtUS "4=#. Bs   )rX   r4   rq   r)   r*   r3   r   )r;   axesr&   r=   r>   r   s         r   	transposez_dok_base.transposed  st     K L L zz1!!1a&

!FC B48JJLB 	C
r   c                     | j                   \  }}| j                  ||f| j                        }t        j	                  |d | j                         D               |S )zReturn the conjugate transpose.r(   c              3   Z   K   | ]#  \  \  }}}||ft        j                  |      f % y wrU   )r5   conjr   s       r   rN   z'_dok_base.conjtransp.<locals>.<genexpr>v  s3      B0mtUS "4="''#,7 Bs   )+)r4   rq   r)   r*   r3   r   )r;   r=   r>   r   s       r   
conjtranspz_dok_base.conjtranspr  sU    zz1!!1a&

!;C B48JJLB 	C
r   c                     | j                  | j                  | j                        }t        j	                  ||        |S )Nr(   )rq   r4   r)   r*   r3   r   s     r   r&   z_dok_base.copyz  s2    !!$**DJJ!?C
r   c                 r   | j                   dk(  r'| j                  | j                  | j                        S | j	                  t        | j                              }t        j                  | j                         | j                  | j                         }t        j                  d | j                         D        || j                         }t        j                  d | j                         D        || j                         }| j                  |||ff| j                  | j                        }d|_
        |S )	Nr   r(   )maxval)r)   countc              3   &   K   | ]	  \  }}|  y wrU   rL   )rM   r\   _s      r   rN   z"_dok_base.tocoo.<locals>.<genexpr>       5A15rO   c              3   &   K   | ]	  \  }}|  y wrU   rL   )rM   r   r]   s      r   rN   z"_dok_base.tocoo.<locals>.<genexpr>  r   rO   )r4   r)   T)nnzr:   r4   r)   _get_index_dtypemaxr5   fromiterrQ   rr   has_canonical_format)r;   r&   	idx_dtyperE   rb   rc   As          r   tocooz_dok_base.tocoo  s    88q=&&tzz&DD))TZZ)A	{{4;;=

$((Kkk55YdhhWkk55YdhhWC:djj

   
 "&r   c                 *    |r| j                         S | S rU   r%   r;   r&   s     r   r1   z_dok_base.todok  s    99;r   c                 F    | j                  d      j                  |      S NFr%   )r   r   r   s     r   r   z_dok_base.tocsc  s!    zzuz%+++66r   c                     t        |      }|\  }}| j                  \  }}||k  s||k  r1t        | j                               D ]  \  }}||k\  s||k\  s| ||f=  || _        y rU   )r   r4   r   rr   r/   )r;   r4   newMnewNr=   r>   r\   r]   s           r   resizez_dok_base.resize  sn    E"
dzz1!8taxtyy{+ #A9T	QT
# r   )NNFrU   )g        )NF)F)*__name__
__module____qualname____doc___formatr+   r3   rF   rI   rS   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!      sa   /` G !D5
'"2 oo--GO#1199M",>==02200		
@2$%
  ))11I
 <<''DL MM))EM
 MM))EM7 MM))EM	 ^^++FNr   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y)r   N)r   r   r  rL   r   r   r   r     s    r   r   c                   ,    e Zd Zd Zd Z eee      Zy)r   c                     | j                  |d      j                  | j                        }|j                  | _        t        j                  |        t        j                  | |       y r   )reshapeasformatr0   __dict__r*   clearr3   )r;   r4   
new_matrixs      r   	set_shapezdok_matrix.set_shape  sJ    \\%e\4==dkkJ
"++

4D*%r   c                     | j                   S )zGet shape of a sparse array.)r/   rR   s    r   	get_shapezdok_matrix.get_shape  s    {{r   )fgetfsetN)r   r   r  r  r  propertyr4   rL   r   r   r   r     s    & ))4Er   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   3 - - ; ; ;'7P,T P,f%6		7 	 %%	 59 5 *)*;*;<
 M  '''s   B B B 