o
    iY                     @   s   d Z dZg dZddlZddlmZ ddlZddl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 G dd deeeZdd ZG dd deeZG dd de	eZdS )zDictionary Of Keys based matrixzrestructuredtext en)	dok_array
dok_matrixisspmatrix_dok    N)warn   )spmatrix)_spbasesparrayissparse)
IndexMixin)isdensegetdtypeisshape	isintlikeisscalarlikeupcastupcast_scalarcheck_shapec                       sN  e Zd ZdZdZd{ddddZdd	 Zd|d
dZd|ddZe	jj
e_
e	jj
e_
dd Zdd Zd|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}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$dCdD Z%dEdF Z&dGdH Z'dIdJ Z(dKdL Z)dMdN Z*dOdP Z+dQdR Z,dSdT Z-dUdV Z.dWdX Z/dYdZ Z0d[d\ Z1d]d^ Z2d_d` Z3dadb Z4d~ fddde	Z5ddfdgZ6e	j6j
e6_
dhdi Z7djdk Z8e	j8j
e8_
e9ddmdnZ:ddodpZ;e	j;j
e;_
ddqdrZ<e	j<j
e<_
ddsdtZ=e	j=j
e=_
dudv Z>e	j>j
e>_
ddydzZ?  Z@S )	_dok_basedok)r      NFmaxprintc             
   C   s  t j| ||d t|tr(t|| jdr(t|| jd| _i | _t	|t
d| _d S t|r_|j| jkr;|r8| n|}n| }|d urJ|j|dd}|j| _t|j| jd| _t	|j| _d S zt|}W n tyw } ztd|d }~ww |jdkrtd|j d	|jd
kr|d ur||}dd t|D | _t	|j| _n| j|||d }|j| _t	|j| _t|j| jd| _d S )Nr   Zallow_nd)defaultFcopyzInvalid input format.r   zDOK arrays don't yet support zD input.r   c                 S   s   i | ]\}}|d kr||qS r    ).0ivr   r   K/home/kim/smarthome/.venv/lib/python3.10/site-packages/scipy/sparse/_dok.py
<dictcomp>5   s    z&_dok_base.__init__.<locals>.<dictcomp>shapedtype)r   __init__
isinstancetupler   	_allow_ndr   _shape_dictr   floatr&   r
   formatr   todokastyper%   npasarray	Exception	TypeErrorndim
ValueError	enumerate_coo_container)selfZarg1r%   r&   r   r   edr   r   r"   r'      s>   



z_dok_base.__init__c                 C      t d)Nz2Direct update to DOK sparse format is not allowed.)NotImplementedError)r9   valr   r   r"   update=   s   z_dok_base.updatec                 C   s   |d urt dt| jS )Nz7_getnnz over an axis is not implemented for DOK format.)r=   lenr,   r9   Zaxisr   r   r"   _getnnzA   s
   
z_dok_base._getnnzc                 C   s&   |d urt dtdd |  D S )Nz=count_nonzero over an axis is not implemented for DOK format.c                 s   s    | ]}|d kV  qdS r   Nr   )r   xr   r   r"   	<genexpr>M   s    z*_dok_base.count_nonzero.<locals>.<genexpr>)r=   sumvaluesrA   r   r   r"   count_nonzeroH   s
   z_dok_base.count_nonzeroc                 C   s
   t | jS N)r@   r,   r9   r   r   r"   __len__R      
z_dok_base.__len__c                 C   s
   || j v S rI   r,   r9   keyr   r   r"   __contains__U   rL   z_dok_base.__contains__c                C   s   | j ||S rI   )r,   
setdefault)r9   rO   r   r   r   r"   rQ   X   s   z_dok_base.setdefaultc                C   s   | j |= d S rI   rM   rN   r   r   r"   __delitem__[      z_dok_base.__delitem__c                 C   
   | j  S rI   )r,   clearrJ   r   r   r"   rU   ^   rL   z_dok_base.clearc                G   s   | j j| S rI   )r,   pop)r9   argsr   r   r"   rV   a   rS   z_dok_base.popc                 C   r<   )Nz*reversed is not defined for dok_array type)r4   rJ   r   r   r"   __reversed__d      z_dok_base.__reversed__c                 C   (   t | j dt |j }td| Nz and z unsupported operand type for |: type__name__r4   r9   otherZ
type_namesr   r   r"   __or__g      z_dok_base.__or__c                 C   rZ   r[   r\   r_   r   r   r"   __ror__k   rb   z_dok_base.__ror__c                 C   rZ   r[   r\   r_   r   r   r"   __ior__o   rb   z_dok_base.__ior__c                 C   rT   rI   )r,   popitemrJ   r   r   r"   re   s   rL   z_dok_base.popitemc                 C   rT   rI   )r,   itemsrJ   r   r   r"   rf   v   rL   z_dok_base.itemsc                 C   rT   rI   )r,   keysrJ   r   r   r"   rg   y   rL   z_dok_base.keysc                 C   rT   rI   )r,   rG   rJ   r   r   r"   rG   |   rL   z_dok_base.values        c              
   C   s   || j v r
| j | S t|r| jdkr|f}| jt|kr%td| dz|D ]}t|s0J q(W n tttfyF } ztd|d}~ww tdd t	|| j
D }tdd t	|| j
D retd	| jdkrn|d
 }| j ||S )z>This provides dict.get method functionality with type checkingr   zIndex z! length needs to match self.shapez%Index must be or consist of integers.Nc                 s   s(    | ]\}}|d k r|| n|V  qdS rC   r   r   r    Mr   r   r"   rE      s   & z _dok_base.get.<locals>.<genexpr>c                 s   s$    | ]\}}|d k p||kV  qdS rC   r   ri   r   r   r"   rE         " zIndex out of bounds.r   )r,   r   r5   r@   
IndexErrorAssertionErrorr4   r6   r)   zipr%   anyget)r9   rO   r   r    r:   r   r   r"   rp      s(   



z_dok_base.getc                 C   s   | j || jdS Nr   r,   rp   r&   r]   )r9   idxr   r   r"   _get_int      z_dok_base._get_intc                 C   s"   t || jd  }| t|S rq   )rangeindicesr%   
_get_arraylist)r9   rs   Zi_ranger   r   r"   
_get_slice   s   z_dok_base._get_slicec                    s   t |}|jdkr jt| jd}t j| jdS  j	|j
 jd} fdd| D }|r{t|j
dkrNt|D ]\}}|rK||j|< q@|S t t t||j
}t|dkrd|d nt| }t||ddD ]\}}|rz||j|< qo|S )	Nr   )styper&   c                    s   g | ]	} j |d qS r   )r,   rp   )r   r    rJ   r   r"   
<listcomp>   s    z(_dok_base._get_array.<locals>.<listcomp>r   T)strict)r1   r2   r5   r,   rp   intr&   r]   array_dok_containerr%   ravelr@   r7   Zunravel_indexZarangern   )r9   rs   r>   Znew_dokZdok_valsr    r!   Znew_idxr   rJ   r"   rx      s(   



z_dok_base._get_arrayc                 C   s   | j ||f| jdS rq   rr   r9   rowcolr   r   r"   _get_intXint   s   z_dok_base._get_intXintc                 C   s   |  t||d |S Nr   _get_sliceXsliceslicer   r   r   r"   _get_intXslice   ru   z_dok_base._get_intXslicec                 C   s   |  |t||d S r   r   r   r   r   r"   _get_sliceXint   ru   z_dok_base._get_sliceXintc                 C   s"  | | jd \}}}| | jd \}}}t|||}	t|||}
t|	t|
f}t| d|d  |d  kr>| |	|
S | j|| jd}|  D ]D}tt	|d | |\}}|dksg|dk sg||d krhqJtt	|d | |\}}|dks|dk s||d krqJ| j
| |j
||f< qJ|S )Nr   r   r   r|   )rw   r%   rv   r@   _get_columnXarrayr   r&   rg   divmodr   r,   )r9   r   r   Z	row_startZrow_stopZrow_stepZ	col_startZcol_stopZcol_stepZ	row_rangeZ	col_ranger%   newdokrO   r    rijZrjr   r   r"   r      s"   z_dok_base._get_sliceXslicec                 C   s   |  |g| S rI   )r   r   r   r   r   r"   _get_intXarray   s   z_dok_base._get_intXarrayc                 C   s,   |  | |g}|jdkr||jS |S r   )r   r   r5   reshaper%   )r9   r   r   resr   r   r"   _get_arrayXint   s   
z_dok_base._get_arrayXintc                 C   s$   t t|| jd  }| ||S rq   ry   rv   rw   r%   r   r   r   r   r"   _get_sliceXarray      z_dok_base._get_sliceXarrayc                 C   s$   t t|| jd  }| ||S r   r   r   r   r   r"   _get_arrayXslice   r   z_dok_base._get_arrayXslicec           	      C   sh   | j t|t|f| jd}t|D ]\}}t|D ]\}}| j||fd}|r0||j||f< qq|S )Nr|   r   )r   r@   r&   r7   r,   rp   )	r9   r   r   r   r    rr   cr!   r   r   r"   r      s   z_dok_base._get_columnXarrayc                 C   s|   t tjt||\}}| j|j| jd}tt	|jd t	|jd D ]}| j
|| || fd}|r;||j
|< q%|S )Nr|   r   r   )mapr1   Z
atleast_2dZbroadcast_arraysr   r%   r&   	itertoolsproductrv   r,   rp   )r9   r   r   r    r   r   rO   r!   r   r   r"   _get_arrayXarray   s   $
z_dok_base._get_arrayXarrayc                 C   s,   |r	|| j |< d S || j v r| j |= d S d S rI   rM   )r9   rs   rD   r   r   r"   _set_int   s
   
z_dok_base._set_intc                 C   s   |  }|  }t|t|kr(t|dkr$tjt||d | jd}ntdt||D ]\}}|r9|| j|< q-|| jv rB| j|= q-d S )Nr   r   r|   z*Need len(index)==len(data) or len(data)==1)r   r@   r1   fullr&   r6   rn   r,   )r9   rs   rD   Zidx_setZx_setr    r!   r   r   r"   
_set_array   s   
z_dok_base._set_arrayc                 C   s4   ||f}|r|| j |< d S || j v r| j |= d S d S rI   rM   )r9   r   r   rD   rO   r   r   r"   _set_intXint  s   
z_dok_base._set_intXintc                 C   s   t tt| }t tt| }| }| jtt||| t|dkd D ]}|| || f}| j| dkr@| j|= q+d S rq   )	ry   r   r   r   r,   r?   rn   r1   Znonzero)r9   r   r   rD   r    rO   r   r   r"   _set_arrayXarray  s   z_dok_base._set_arrayXarrayc                    s\  t |r1t| j|}| j| j|d tjdd | jD  D ]}| j|d| }|r.| |< q S t	|r|j| jkr?t
dt| j|j}| j| j|d | j  _|jdkr^| }n| }| jdkrqt|jd |j}n	tt|j |j}tjdd	  j fd
d|D  W d     S 1 sw   Y   S t|r|  |   S tS )Nr|   c                 S   s   g | ]}t |qS r   )rv   )r   r;   r   r   r"   r}   %  s    z%_dok_base.__add__.<locals>.<listcomp>r   z Matrix dimensions are not equal.r   r   ignore)Zoverc                 3   s$    | ]\}}| | | fV  qd S rI   r   r   kr!   newr   r"   rE   8  rk   z$_dok_base.__add__.<locals>.<genexpr>)r   r   r&   r   r%   r   r   r,   rp   r
   r6   r   r   r.   rf   tocoor5   rn   coordsdatar1   Zerrstater?   r   ZtodenseNotImplemented)r9   r`   	res_dtyperO   ZaijZo_itemsr   r   r"   __add__   s>   



z_dok_base.__add__c                 C   s   | | S rI   r   r9   r`   r   r   r"   __radd__?  rY   z_dok_base.__radd__c                 C   sD   | j jdkr
td| j| j| j d}|jdd |  D  |S )Nbz2Negating a sparse boolean matrix is not supported.r|   c                 s   s    | ]
\}}|| fV  qd S rI   r   r   r   r   r"   rE   H  s    z$_dok_base.__neg__.<locals>.<genexpr>)r&   kindr=   r   r%   r,   r?   rf   r9   r   r   r   r"   __neg__B  s   z_dok_base.__neg__c                    s>   t | j }| j| j|d}|j fdd|  D  |S )Nr|   c                 3        | ]\}}||  fV  qd S rI   r   r   r`   r   r"   rE   O      z(_dok_base._mul_scalar.<locals>.<genexpr>)r   r&   r   r%   r,   r?   rf   r9   r`   r   r   r   r   r"   _mul_scalarK  s   z_dok_base._mul_scalarc                    s   t j j}jdkrLt r7 jdkr   @ }n   jd @ }|t fdd|D S t	 rJ|t fdd
 D S tS tjjd |d}
 D ]\\}}}||  | |  7  < qZ|S )Nr   r   r   c                 3   s$    | ]}j |  j |  V  qd S rI   rM   )r   r   r`   r9   r   r"   rE   \  rk   z+_dok_base._matmul_vector.<locals>.<genexpr>c                 3   s     | ]\}} | | V  qd S rI   r   r   r   r   r"   rE   ^  r   r|   )r   r&   r5   r
   r.   rg   r   r   rF   r   rf   r   r1   zerosr%   )r9   r`   r   rg   resultr    r   r!   r   r   r"   _matmul_vectorR  s   

z_dok_base._matmul_vectorc           	         s   t | j j}| jdkrt fdd| j D S | jd } jdkr'|fn| jd f}tj||d}|  D ]\\}}}||  | |  7  < q9|S )Nr   c                 3   s     | ]\}}| |  V  qd S rI   r   )r   r   r!   r   r   r"   rE   m  r   z0_dok_base._matmul_multivector.<locals>.<genexpr>r   r|   )	r   r&   r5   rF   r,   rf   r%   r1   r   )	r9   r`   Zresult_dtyperj   Z	new_shaper   r    r   r!   r   r   r"   _matmul_multivectorh  s   

z_dok_base._matmul_multivectorc                    .   t  r| j fdd|  D  | S tS )Nc                 3   r   rI   r   r   r   r   r"   rE   y  r   z%_dok_base.__imul__.<locals>.<genexpr>r   r,   r?   rf   r   r   r   r   r"   __imul__w     z_dok_base.__imul__c                    sR   t  r#t| j }| j| j|d}|j fdd|  D  |S |    S )Nr|   c                 3        | ]\}}||  fV  qd S rI   r   r   r   r   r"   rE     r   z(_dok_base.__truediv__.<locals>.<genexpr>)	r   r   r&   r   r%   r,   r?   rf   Ztocsrr   r   r   r"   __truediv__}  s   z_dok_base.__truediv__c                    r   )Nc                 3   r   rI   r   r   r   r   r"   rE     r   z)_dok_base.__itruediv__.<locals>.<genexpr>r   r   r   r   r"   __itruediv__  r   z_dok_base.__itruediv__c                 C   s
   t | S rI   )dict
__reduce__rJ   r   r   r"   r     s   
z_dok_base.__reduce__r   c                    s   | j dkrt |S td)Nr   z diagonal requires two dimensions)r5   superdiagonalr6   )r9   r   	__class__r   r"   r     s   
z_dok_base.diagonalc                 C   sh   | j dkr	|  S |d ur|dkrtd| j\}}| j||f| j|d}|jdd |  D  |S )Nr   )r   r   zvSparse arrays/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   r   leftrightr>   r   r   r"   rE     rk   z&_dok_base.transpose.<locals>.<genexpr>)	r5   r   r6   r%   r   r&   r,   r?   rf   )r9   Zaxesr   rj   Nr   r   r   r"   	transpose  s   

z_dok_base.transposec                 C   sj   d}t |tdd | jdkr|  }|j |_|S | j\}}| j||f| jd}dd | 	 D |_
|S )zDEPRECATED: Return the conjugate transpose.

        .. deprecated:: 1.14.0

            `conjtransp` is deprecated and will be removed in v1.16.0.
            Use ``.T.conj()`` instead.
        zS`conjtransp` is deprecated and will be removed in v1.16.0. Use `.T.conj()` instead.r   )
stacklevelr   r|   c                 S   s$   i | ]\\}}}||ft |qS r   )r1   Zconjr   r   r   r"   r#     s   $ z(_dok_base.conjtransp.<locals>.<dictcomp>)r   DeprecationWarningr5   r   r   	conjugater%   r   r&   rf   r,   )r9   msgr   rj   r   r   r   r"   
conjtransp  s   

z_dok_base.conjtranspc                 C   s$   | j | j| jd}|j| j |S Nr|   )r   r%   r&   r,   r?   r   r   r   r"   r     s   z_dok_base.copyr   c                C   s^   t ||}ttt|trtdd t| D }nt|d f}| |t|d}||_	|S )Nc                 s   s    | ]	}t |d  V  qdS )r   N)max)r   rs   r   r   r"   rE     s    z%_dok_base.fromkeys.<locals>.<genexpr>r   r|   )
r   fromkeysr(   nextiterr)   rn   r   r]   r,   )clsiterablevaluetmpr%   r   r   r   r"   r     s   z_dok_base.fromkeysc                    s   | j dkr| j| j| jdS | jt| jd tj|  | jd}| j	dkr/t
|   n|  f}t fdd|D }| j||f| j| jd}d	|_|S )
Nr   r|   )maxvalr&   countr   c                 3   s     | ]}t j| d V  qdS )r   N)r1   fromiter)r   ZixZ	idx_dtypennzr   r"   rE     r   z"_dok_base.tocoo.<locals>.<genexpr>r$   T)r   r8   r%   r&   Z_get_index_dtyper   r1   r   rG   r5   rn   rg   r)   Zhas_canonical_format)r9   r   r   Zindsr   Ar   r   r"   r     s    z_dok_base.tocooc                 C   s   |r|   S | S rI   r   r9   r   r   r   r"   r/     s   z_dok_base.todokc                 C   s&   | j dkr	td| jddj|dS )Nr   z%tocsr() not valid for 1d sparse arrayFr   )r5   r=   r   tocscr   r   r   r"   r     s   
z_dok_base.tocscc                 G   s   t || jd}t|t| jkrt| jdkr0|d }t| jD ]
}||kr*| j|= q || _d S |\}}| j\}}||k sA||k rZt| 	 D ]\}}||ksS||krY| j||f= qG|| _d S )Nr   r   )
r   r*   r@   r%   r=   r5   ry   r,   r+   rg   )r9   r%   ZnewNr    ZnewMrj   r   r   r   r   r"   resize  s&   


z_dok_base.resizeunsafeTc                 C   sb   t |}| j|kr)| j| j|d}t jt| j |d}tt	| j||_|S |r/| 
 S | S r   )r1   r&   r   r%   r   ry   r,   rG   r   rn   r   )r9   r&   Zcastingr   r   r   r   r   r"   r0     s   

z_dok_base.astype)NNFrI   )rh   r   )NF)r   )F)r   T)Ar^   
__module____qualname___formatr*   r'   r?   rB   rH   r   __doc__rK   rP   rQ   rR   rU   rV   rX   ra   rc   rd   re   rf   rg   rG   rp   rt   rz   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   classmethodr   r   r/   r   r   r0   __classcell__r   r   r   r"   r      s    '





	










r   c                 C   s
   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   )rD   r   r   r"   r     s   
r   c                   @   s   e Zd ZdZdS )r   a!  
    Dictionary Of Keys based sparse array.

    This is an efficient structure for constructing sparse
    arrays incrementally.

    This can be instantiated in several ways:
        dok_array(D)
            where D is a 2-D ndarray

        dok_array(S)
            with another sparse array or matrix S (equivalent to S.todok())

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

    Attributes
    ----------
    dtype : dtype
        Data type of the array
    shape : 2-tuple
        Shape of the array
    ndim : int
        Number of dimensions (this is always 2)
    nnz
        Number of nonzero elements
    size
    T

    Notes
    -----

    Sparse arrays 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_array 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

    N)r^   r   r   r   r   r   r   r"   r   /  s    r   c                   @   sL   e Zd ZdZdd Zdd ZeeedZdd Zd	d
 Z	dd Z
dd ZdS )r   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)
            where D is a 2-D ndarray

        dok_matrix(S)
            with another sparse array or matrix S (equivalent to S.todok())

        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
    size
    T

    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

    c                 C   s"   | j |dd| j}|j| _d S )NFr   )r   Zasformatr.   __dict__)r9   r%   Z
new_matrixr   r   r"   	set_shape  s   zdok_matrix.set_shapec                 C   s   | j S )zGet shape of a sparse matrix.)r+   rJ   r   r   r"   	get_shape  s   zdok_matrix.get_shape)fgetfsetc                 C   rT   rI   )r,   rX   rJ   r   r   r"   rX     rL   zdok_matrix.__reversed__c                 C       t |tr| j|jB S | j|B S rI   r(   r   r,   r   r   r   r"   ra        

zdok_matrix.__or__c                 C   r   rI   r   r   r   r   r"   rc     r   zdok_matrix.__ror__c                 C   s0   t |tr|  j|jO  _| S |  j|O  _| S rI   r   r   r   r   r"   rd     s
   
zdok_matrix.__ior__N)r^   r   r   r   r   r   propertyr%   rX   ra   rc   rd   r   r   r   r"   r   d  s    3r   )r   __docformat____all__r   warningsr   numpyr1   Z_matrixr   Z_baser   r	   r
   _indexr   Z_sputilsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   <module>   s$    (    5