B
     /]=                 @   s   d Z ddlmZmZmZ dZddgZddlZddlZ	ddl
mZmZmZmZm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 yddl m!Z" W n e#k
r   dd Z"Y nX G dd deee$Z%dd Z&dS )zDictionary Of Keys based matrix    )divisionprint_functionabsolute_importzrestructuredtext en
dok_matrixisspmatrix_dokN)zipxrange	iteritemsiterkeys
itervalues   )spmatrix
isspmatrix)
IndexMixin)	isdensegetdtypeisshape	isintlikeisscalarlikeupcastupcast_scalarget_index_dtypecheck_shape)isSequenceTypec             C   s   t | dpt | dpt | dS )N__len____next__next)hasattr)x r   \/home/fristb/BIRCH/lib-linux-x86_64/python/lib64/python3.7/site-packages/scipy/sparse/dok.py_is_sequence   s    r!   c               @   s  e Zd ZdZdZdQddZdd Zd	d
 Zdd Ze	e
jedZdRddZdd Ze
jje_e
jje_dd ZdSddZdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Z d7d8 Z!d9d: Z"d;d< Z#d=d> Z$d?d@ Z%dAdB Z&dTdCdDZ'e
j'je'_dEdF Z(dGdH Z)e
j)je)_dUdIdJZ*e
j*je*_dVdKdLZ+e
j+je+_dWdMdNZ,e
j,je,_dOdP Z-e
j-je-_dS )Xr   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

    ZdokNFc       	      C   s(  t |  t|  t|td| _t|trLt|rL|\}}t	||f| _
nt|rt|rj|rj| }n| }|d k	r||}t | | t	|j| _
|j| _n~yt|}W n tk
r   tdY nX t|jdkrtdddlm} |||d }t | | t	|j| _
|j| _d S )N)defaultzInvalid input format.   z(Expected rank <=2 dense array or matrix.r   )
coo_matrix)dtype)dict__init__r   r   floatr%   
isinstancetupler   r   _shaper   r   copytodokastypeupdateshapenpasarray	Exception	TypeErrorlencoor$   )	selfarg1r0   r%   r,   MNr$   dr   r   r    r'   N   s4    




zdok_matrix.__init__c             C   s   t dd S )Nz9Direct modification to dok_matrix element is not allowed.)NotImplementedError)r7   valr   r   r    r/   q   s    zdok_matrix.updatec             C   s   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/   )r7   datar   r   r    _updatev   s    zdok_matrix._updatec             C   s8   | j |dd| j}|j| _t|  t| | d S )NF)r,   )reshapeZasformatformat__dict__r&   clearr/   )r7   r0   Z
new_matrixr   r   r    	set_shape|   s    
zdok_matrix.set_shape)fgetfsetc             C   s   |d k	rt dt| S )Nz6getnnz over an axis is not implemented for DOK format.)r<   r&   r   )r7   axisr   r   r    getnnz   s    zdok_matrix.getnnzc             C   s   t dd t| D S )Nc             s   s   | ]}|d kV  qdS )r   Nr   ).0r   r   r   r    	<genexpr>   s    z+dok_matrix.count_nonzero.<locals>.<genexpr>)sumr   )r7   r   r   r    count_nonzero   s    zdok_matrix.count_nonzeroc             C   s
   t | S )N)r&   r   )r7   r   r   r    r      s    zdok_matrix.__len__        c          
   C   s   y |\}}t |rt |stW n" tttfk
rB   tdY nX |dk sp|| jd ksp|dk sp|| jd krxtdt| ||S )ztThis overrides the dict.get method, providing type checking
        but otherwise equivalent functionality.
        z!Index must be a pair of integers.r   r   zIndex out of bounds.)r   AssertionErrorr4   
ValueError
IndexErrorr0   r&   get)r7   keyr"   ijr   r   r    rQ      s    ,zdok_matrix.getc             C   s   t | ||f| jdS )Nr   )r&   rQ   r%   type)r7   rowcolr   r   r    _get_intXint   s    zdok_matrix._get_intXintc             C   s   |  t||d |S )Nr   )_get_sliceXsliceslice)r7   rV   rW   r   r   r    _get_intXslice   s    zdok_matrix._get_intXslicec             C   s   |  |t||d S )Nr   )rY   rZ   )r7   rV   rW   r   r   r    _get_sliceXint   s    zdok_matrix._get_sliceXintc             C   s0  | | jd \}}}| | jd \}}}t|||}	t|||}
t|	t|
f}t| d|d  |d  kr|| |	|
S t|| jd}xt| D ]}tt	|d | |\}}|dks|dk s||d krqtt	|d | |\}}|dks|dk s||d kr
qt
| |}t
|||f| qW |S )Nr   r   r#   )r%   )indicesr0   r   r5   _get_columnXarrayr   r%   r
   divmodintr&   __getitem____setitem__)r7   rV   rW   Z	row_startZrow_stopZrow_stepZ	col_startZcol_stopZcol_stepZ	row_rangeZ	col_ranger0   newdokrR   rS   rirT   Zrjr   r   r   r    rY      s$    zdok_matrix._get_sliceXslicec             C   s   |  |g|S )N)r^   )r7   rV   rW   r   r   r    _get_intXarray   s    zdok_matrix._get_intXarrayc             C   s   |  ||gS )N)r^   )r7   rV   rW   r   r   r    _get_arrayXint   s    zdok_matrix._get_arrayXintc             C   s$   t t|| jd  }| ||S )Nr   )listranger]   r0   r^   )r7   rV   rW   r   r   r    _get_sliceXarray   s    zdok_matrix._get_sliceXarrayc             C   s$   t t|| jd  }| ||S )Nr   )rg   rh   r]   r0   r^   )r7   rV   rW   r   r   r    _get_arrayXslice   s    zdok_matrix._get_arrayXslicec       	      C   sr   t t|t|f| jd}xRt|D ]F\}}x<t|D ]0\}}t| ||fd}|r6t|||f| q6W q$W |S )N)r%   r   )r   r5   r%   	enumerater&   rQ   rb   )	r7   rV   rW   rc   rS   rrT   cvr   r   r    r^      s    zdok_matrix._get_columnXarrayc             C   s   t tjt||\}}t|j| jd}xTtt	|jd t	|jd D ]0}t
| || || fd}|rJt
||| qJW |S )N)r%   r   r   )mapr1   
atleast_2dbroadcast_arraysr   r0   r%   	itertoolsproductr   r&   rQ   rb   )r7   rV   rW   rS   rT   rc   rR   rn   r   r   r    _get_arrayXarray   s    &zdok_matrix._get_arrayXarrayc             C   s2   ||f}|rt | || nt | |r.| |= d S )N)r&   rb   __contains__)r7   rV   rW   r   rR   r   r   r    _set_intXint   s
    zdok_matrix._set_intXintc             C   s   t tt| }t tt| }| }t| tt||| x@t|dkd D ]*}|| || f}t	| |dkrX| |= qXW d S )Nr   )
rg   ro   r`   ravelr&   r/   izipr1   nonzerora   )r7   rV   rW   r   rS   rR   r   r   r    _set_arrayXarray   s    zdok_matrix._set_arrayXarrayc          	      s$  t rjt| j}t| j|d | j\}}xtt|t|D ]"}t	| |d }|rB| |< qBW nt
rj| jkrtdt| jj}t| j|d t |  tjdd& t  fddtD  W d Q R X n8tr|  }|  ntr|    ntS  S )N)r%   r   z Matrix dimensions are not equal.ignore)overc             3   s"   | ]}| | |  fV  qd S )Nr   )rI   k)newotherr   r    rJ     s    z%dok_matrix.__add__.<locals>.<genexpr>)r   r   r%   r   r0   rr   rs   r   r&   rQ   r   rO   r   r/   r1   errstater
   r   tocscr   todenseNotImplemented)r7   r   	res_dtyper9   r:   rR   aijcscr   )r~   r   r    __add__   s0    
&


zdok_matrix.__add__c                s   t  r`tjjd}j\}}xtt|t|D ]"}t|d  }|r8|||< q8W nt	 r jjkr|t
dtjjd}t| t| fddt D  n4t rԈ }|  }nt r   }ntS |S )N)r%   r   z Matrix dimensions are not equal.c             3   s"   | ]}||  |  fV  qd S )Nr   )rI   r}   )r   r7   r   r    rJ   %  s    z&dok_matrix.__radd__.<locals>.<genexpr>)r   r   r0   r%   rr   rs   r   r&   rQ   r   rO   r/   r
   r   r   r   r   r   )r7   r   r~   r9   r:   rR   r   r   r   )r   r7   r    __radd__  s*    

zdok_matrix.__radd__c                sF    j jdkrtdt j j d}t| fddt D  |S )Nbz2Negating a sparse boolean matrix is not supported.)r%   c             3   s   | ]}| |  fV  qd S )Nr   )rI   r}   )r7   r   r    rJ   4  s    z%dok_matrix.__neg__.<locals>.<genexpr>)r%   kindr<   r   r0   r&   r/   r
   )r7   r~   r   )r7   r    __neg__/  s
    zdok_matrix.__neg__c                s<   t | j }t| j|d}t| fddt| D  |S )N)r%   c             3   s   | ]\}}||  fV  qd S )Nr   )rI   r}   rn   )r   r   r    rJ   ;  s    z)dok_matrix._mul_scalar.<locals>.<genexpr>)r   r%   r   r0   r&   r/   r	   )r7   r   r   r~   r   )r   r    _mul_scalar7  s    zdok_matrix._mul_scalarc             C   sT   t j| jd t| j|jd}x0t| D ]$\\}}}||  |||  7  < q(W |S )Nr   )r%   )r1   zerosr0   r   r%   r	   )r7   r   resultrS   rT   rn   r   r   r    _mul_vector>  s    zdok_matrix._mul_vectorc          	   C   sv   | j d |j d f}t| j|j}tj||d}x@t| D ]4\\}}}||d d f  |||d d f  7  < q:W |S )Nr   r   )r%   )r0   r   r%   r1   r   r	   )r7   r   result_shaperesult_dtyper   rS   rT   rn   r   r   r    _mul_multivectorE  s    ,zdok_matrix._mul_multivectorc                s.   t  r*t|  fddt| D  | S tS )Nc             3   s   | ]\}}||  fV  qd S )Nr   )rI   r}   rn   )r   r   r    rJ   P  s    z&dok_matrix.__imul__.<locals>.<genexpr>)r   r&   r/   r	   r   )r7   r   r   )r   r    __imul__N  s    zdok_matrix.__imul__c                sP   t  rDt| j }t| j|d}t| fddt| D  |S |    S )N)r%   c             3   s   | ]\}}||  fV  qd S )Nr   )rI   r}   rn   )r   r   r    rJ   X  s    z)dok_matrix.__truediv__.<locals>.<genexpr>)	r   r   r%   r   r0   r&   r/   r	   Ztocsr)r7   r   r   r~   r   )r   r    __truediv__T  s    zdok_matrix.__truediv__c                s.   t  r*t|  fddt| D  | S tS )Nc             3   s   | ]\}}||  fV  qd S )Nr   )rI   r}   rn   )r   r   r    rJ   ^  s    z*dok_matrix.__itruediv__.<locals>.<genexpr>)r   r&   r/   r	   r   )r7   r   r   )r   r    __itruediv__\  s    zdok_matrix.__itruediv__c             C   s
   t | S )N)r&   
__reduce__)r7   r   r   r    r   b  s    zdok_matrix.__reduce__c             C   sL   |d k	rt d| j\}}t||f| j|d}t|dd t| D  |S )NzoSparse matrices do not support an 'axes' parameter because swapping dimensions is the only logical permutation.)r%   r,   c             s   s"   | ]\\}}}||f|fV  qd S )Nr   )rI   leftrightr=   r   r   r    rJ   t  s   z'dok_matrix.transpose.<locals>.<genexpr>)rO   r0   r   r%   r&   r/   r	   )r7   axesr,   r9   r:   r~   r   r   r    	transposel  s    
zdok_matrix.transposec             C   s:   | j \}}t||f| jd}t|dd t| D  |S )zReturn the conjugate transpose.)r%   c             s   s(   | ] \\}}}||ft |fV  qd S )N)r1   conj)rI   r   r   r=   r   r   r    rJ   ~  s   z(dok_matrix.conjtransp.<locals>.<genexpr>)r0   r   r%   r&   r/   r	   )r7   r9   r:   r~   r   r   r    
conjtranspz  s
    
zdok_matrix.conjtranspc             C   s    t | j| jd}t||  |S )N)r%   )r   r0   r%   r&   r/   )r7   r~   r   r   r    r,     s    zdok_matrix.copyc             C   s   ddl m} | jdkr&|| j| jdS tt| jd}tjt	| | j| jd}tjdd t
| D || jd}tjd	d t
| D || jd}||||ff| j| jd
}d|_|S )Nr   )r$   r   )r%   )Zmaxval)r%   countc             s   s   | ]\}}|V  qd S )Nr   )rI   rS   _r   r   r    rJ     s    z#dok_matrix.tocoo.<locals>.<genexpr>c             s   s   | ]\}}|V  qd S )Nr   )rI   r   rT   r   r   r    rJ     s    )r0   r%   T)r6   r$   Znnzr0   r%   r   maxr1   fromiterr   r
   Zhas_canonical_format)r7   r,   r$   Z	idx_dtyper>   rV   rW   Ar   r   r    tocoo  s    
  zdok_matrix.tocooc             C   s   |r|   S | S )N)r,   )r7   r,   r   r   r    r-     s    zdok_matrix.todokc             C   s   | j ddj|dS )NF)r,   )r   r   )r7   r,   r   r   r    r     s    zdok_matrix.tocscc             G   sh   t |}|\}}| j\}}||k s*||k r^x2tt| D ]"\}}||ksP||kr8| ||f= q8W || _d S )N)r   r0   rg   r
   r+   )r7   r0   ZnewMZnewNr9   r:   rS   rT   r   r   r    resize  s    
zdok_matrix.resize)NNF)N)rM   )NF)F)F)F).__name__
__module____qualname____doc__rA   r'   r/   r?   rD   propertyr   	get_shaper0   rH   rL   r   rQ   rX   r[   r\   rY   re   rf   ri   rj   r^   rt   rv   rz   r   r   r   r   r   r   r   r   r   r   r   r   r,   r   r-   r   r   r   r   r   r    r      s`   0
#



	









c             C   s
   t | 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)   r   )r   r   r   r    r     s    )'r   
__future__r   r   r   __docformat____all__rr   numpyr1   scipy._lib.sixr   rx   r   r	   r
   r   baser   r   _indexr   Zsputilsr   r   r   r   r   r   r   r   r   operatorr   r!   ImportErrorr&   r   r   r   r   r   r    <module>   s$   ,   