a
    aK=                     @   s   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 zdd
lmZ W n ey   dd ZY n0 G dd dee
eZd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                 C   s   t | dpt | dpt | dS )N__len____next__next)hasattrx r   `/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/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 ur|j|dd}t | | t	|j| _
|j| _nzt|}W n. ty } ztd|W Y d }~n
d }~0 0 t|jdkrtdddlm} |||d	 }	t | |	 t	|j| _
|	j| _d S )
N)defaultFcopyz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   r   todokZastypeupdateshapenpZasarray	Exception	TypeErrorlencoor    )
selfZarg1r+   r"   r   MNer    dr   r   r   r$   J   s4    



 zdok_matrix.__init__c                 C   s   t dd S )Nz9Direct modification to dok_matrix element is not allowed.)NotImplementedError)r1   valr   r   r   r*   m   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*   )r1   datar   r   r   _updater   s    zdok_matrix._updatec                 C   s8   | j |dd| j}|j| _t|  t| | d S NFr   )ZreshapeZasformatformat__dict__r#   clearr*   )r1   r+   Z
new_matrixr   r   r   	set_shapex   s    
zdok_matrix.set_shape)fgetfsetc                 C   s   |d urt dt| S )Nz6getnnz over an axis is not implemented for DOK format.)r6   r#   r   )r1   Zaxisr   r   r   getnnz   s    zdok_matrix.getnnzc                 C   s   t dd |  D S )Nc                 s   s   | ]}|d kV  qdS )r   Nr   ).0r   r   r   r   	<genexpr>       z+dok_matrix.count_nonzero.<locals>.<genexpr>)sumvaluesr1   r   r   r   count_nonzero   s    zdok_matrix.count_nonzeroc                 C   s
   t | S N)r#   r   rG   r   r   r   r      s    zdok_matrix.__len__        c              
   C   s   z |\}}t |rt |sJ W n4 tttfyT } ztd|W Y d}~n
d}~0 0 |dk s|| jd ks|dk s|| jd krt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   AssertionErrorr.   
ValueError
IndexErrorr+   r#   get)r1   keyr   ijr4   r   r   r   rN      s     ,zdok_matrix.getc                 C   s   t | ||f| jdS Nr   )r#   rN   r"   typer1   rowcolr   r   r   _get_intXint   s    zdok_matrix._get_intXintc                 C   s   |  t||d |S Nr   _get_sliceXsliceslicerT   r   r   r   _get_intXslice   s    zdok_matrix._get_intXslicec                 C   s   |  |t||d S rX   rY   rT   r   r   r   _get_sliceXint   s    zdok_matrix._get_sliceXintc                 C   s,  | | jd \}}}| | jd \}}}t|||}	t|||}
t|	t|
f}t| d|d  |d  kr|| |	|
S t|| jd}|  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| q|S )Nr   r   r   r!   )indicesr+   ranger/   _get_columnXarrayr   r"   keysdivmodintr#   __getitem____setitem__)r1   rU   rV   Z	row_startZrow_stopZrow_stepZ	col_startZcol_stopZcol_stepZ	row_rangeZ	col_ranger+   newdokrO   rP   rirQ   Zrjr   r   r   r   rZ      s$    zdok_matrix._get_sliceXslicec                 C   s   |  |g|S rI   r`   rT   r   r   r   _get_intXarray   s    zdok_matrix._get_intXarrayc                 C   s   |  ||gS rI   rh   rT   r   r   r   _get_arrayXint   s    zdok_matrix._get_arrayXintc                 C   s$   t t|| jd  }| ||S rR   listr_   r^   r+   r`   rT   r   r   r   _get_sliceXarray   s    zdok_matrix._get_sliceXarrayc                 C   s$   t t|| jd  }| ||S rX   rk   rT   r   r   r   _get_arrayXslice   s    zdok_matrix._get_arrayXslicec           	      C   sj   t t|t|f| jd}t|D ]B\}}t|D ]0\}}t| ||fd}|r2t|||f| q2q"|S )Nr!   r   )r   r/   r"   	enumerater#   rN   re   )	r1   rU   rV   rf   rP   rrQ   cvr   r   r   r`      s    zdok_matrix._get_columnXarrayc                 C   s~   t tjt||\}}t|j| jd}tt	|jd t	|jd D ]0}t
| || || fd}|rHt
||| qH|S )Nr!   r   r   )mapr,   Z
atleast_2dZbroadcast_arraysr   r+   r"   	itertoolsproductr_   r#   rN   re   )r1   rU   rV   rP   rQ   rf   rO   rr   r   r   r   _get_arrayXarray   s    $zdok_matrix._get_arrayXarrayc                 C   s2   ||f}|rt | || nt | |r.| |= d S rI   )r#   re   __contains__)r1   rU   rV   r   rO   r   r   r   _set_intXint   s
    zdok_matrix._set_intXintc                 C   s   t tt| }t tt| }| }t| tt||| t|dkd D ]*}|| || f}t	| |dkrV| |= qVd S rR   )
rl   rs   rc   Zravelr#   r*   zipr,   Znonzerord   )r1   rU   rV   r   rP   rO   r   r   r   _set_arrayXarray   s    zdok_matrix._set_arrayXarrayc                    s4  t rft| j}t| j|d | j\}}tt|t|D ]"}t	| |d }|r@| |< q@nt
rj| jkrtdt| jj}t| j|d t |  tjdd0 t  fdd D  W d    n1 s0    Y  n8tr|  }|  ntr,|    ntS  S )Nr!   r    Matrix dimensions are not equal.ignore)Zoverc                 3   s"   | ]}| | |  fV  qd S rI   r   rB   knewotherr   r   rC   	  rD   z%dok_matrix.__add__.<locals>.<genexpr>)r   r   r"   r   r+   rt   ru   r_   r#   rN   r   rL   r   r*   r,   Zerrstatera   r   tocscr   todenseNotImplemented)r1   r   	res_dtyper2   r3   rO   aijcscr   r   r   __add__   s2    
$


zdok_matrix.__add__c                    s   t  r\tjjd}j\}}tt|t|D ]"}t|d  }|r6|||< q6nt	 r jjkrxt
dtjjd}t| t| fdd  D  n4t rЈ }|  }nt r   }ntS |S )Nr!   r   r{   c                 3   s"   | ]}||  |  fV  qd S rI   r   r}   r   r1   r   r   rC   !  rD   z&dok_matrix.__radd__.<locals>.<genexpr>)r   r   r+   r"   rt   ru   r_   r#   rN   r   rL   r*   ra   r   r   r   r   r   )r1   r   r   r2   r3   rO   r   r   r   r   r   __radd__  s,    

zdok_matrix.__radd__c                    sF    j jdkrtdt j j d}t| fdd  D  |S )Nbz2Negating a sparse boolean matrix is not supported.r!   c                 3   s   | ]}| |  fV  qd S rI   r   r}   rG   r   r   rC   0  rD   z%dok_matrix.__neg__.<locals>.<genexpr>)r"   kindr6   r   r+   r#   r*   ra   r1   r   r   rG   r   __neg__+  s
    zdok_matrix.__neg__c                    s<   t | j }t| j|d}t| fdd|  D  |S )Nr!   c                 3   s   | ]\}}||  fV  qd S rI   r   rB   r~   rr   r   r   r   rC   7  rD   z)dok_matrix._mul_scalar.<locals>.<genexpr>)r   r"   r   r+   r#   r*   itemsr1   r   r   r   r   r   r   _mul_scalar3  s    zdok_matrix._mul_scalarc                 C   sP   t j| jd t| j|jd}|  D ]$\\}}}||  |||  7  < q&|S )Nr   r!   )r,   zerosr+   r   r"   r   )r1   r   resultrP   rQ   rr   r   r   r   _mul_vector:  s    zdok_matrix._mul_vectorc              	   C   sr   | j d |j d f}t| j|j}tj||d}|  D ]4\\}}}||d d f  |||d d f  7  < q8|S )Nr   r   r!   )r+   r   r"   r,   r   r   )r1   r   Zresult_shapeZresult_dtyper   rP   rQ   rr   r   r   r   _mul_multivectorA  s    *zdok_matrix._mul_multivectorc                    s.   t  r*t|  fdd|  D  | S tS )Nc                 3   s   | ]\}}||  fV  qd S rI   r   r   r   r   r   rC   L  rD   z&dok_matrix.__imul__.<locals>.<genexpr>r   r#   r*   r   r   r1   r   r   r   r   __imul__J  s    zdok_matrix.__imul__c                    sP   t  rDt| j }t| j|d}t| fdd|  D  |S |    S )Nr!   c                 3   s   | ]\}}||  fV  qd S rI   r   r   r   r   r   rC   T  rD   z)dok_matrix.__truediv__.<locals>.<genexpr>)	r   r   r"   r   r+   r#   r*   r   Ztocsrr   r   r   r   __truediv__P  s    zdok_matrix.__truediv__c                    s.   t  r*t|  fdd|  D  | S tS )Nc                 3   s   | ]\}}||  fV  qd S rI   r   r   r   r   r   rC   Z  rD   z*dok_matrix.__itruediv__.<locals>.<genexpr>r   r   r   r   r   __itruediv__X  s    zdok_matrix.__itruediv__c                 C   s
   t | S rI   )r#   
__reduce__rG   r   r   r   r   ^  s    zdok_matrix.__reduce__c                 C   sL   |d urt d| j\}}t||f| j|d}t|dd |  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 rI   r   rB   leftrightr7   r   r   r   rC   p  s   
z'dok_matrix.transpose.<locals>.<genexpr>)rL   r+   r   r"   r#   r*   r   )r1   Zaxesr   r2   r3   r   r   r   r   	transposeh  s    
zdok_matrix.transposec                 C   s:   | j \}}t||f| jd}t|dd |  D  |S )zReturn the conjugate transpose.r!   c                 s   s(   | ] \\}}}||ft |fV  qd S rI   )r,   Zconjr   r   r   r   rC   z  s   
z(dok_matrix.conjtransp.<locals>.<genexpr>)r+   r   r"   r#   r*   r   )r1   r2   r3   r   r   r   r   
conjtranspv  s    
zdok_matrix.conjtranspc                 C   s    t | j| jd}t||  |S )Nr!   )r   r+   r"   r#   r*   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| 	 | j| jd}tjdd | 
 D || jd}tjd	d | 
 D || jd}||||ff| j| jd
}d|_|S )Nr   r   r   r!   )maxval)r"   countc                 s   s   | ]\}}|V  qd S rI   r   )rB   rP   _r   r   r   rC     rD   z#dok_matrix.tocoo.<locals>.<genexpr>c                 s   s   | ]\}}|V  qd S rI   r   )rB   r   rQ   r   r   r   rC     rD   )r+   r"   T)r0   r    Znnzr+   r"   r   maxr,   ZfromiterrF   ra   Zhas_canonical_format)r1   r   r    Z	idx_dtyper8   rU   rV   Ar   r   r   tocoo  s    
  zdok_matrix.tocooc                 C   s   |r|   S | S rI   r   r1   r   r   r   r   r)     s    zdok_matrix.todokc                 C   s   | j ddj|dS r:   )r   r   r   r   r   r   r     s    zdok_matrix.tocscc                 G   sd   t |}|\}}| j\}}||k s*||k rZt|  D ]"\}}||ksN||kr6| ||f= q6|| _d S rI   )r   r+   rl   ra   r(   )r1   r+   ZnewMZnewNr2   r3   rP   rQ   r   r   r   resize  s    
zdok_matrix.resize)NNF)N)rJ   )NF)F)F)F).__name__
__module____qualname____doc__r;   r$   r*   r9   r>   propertyr   Z	get_shaper+   rA   rH   r   rN   rW   r\   r]   rZ   ri   rj   rm   rn   r`   rv   rx   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   Z__docformat____all__rt   Znumpyr,   baser   r   _indexr   Zsputilsr   r	   r
   r   r   r   r   r   r   operatorr   r   ImportErrorr#   r   r   r   r   r   r   <module>   s    ,   