o
    5BiV                     @   s   d Z dZg dZddl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   )spmatrix)_spbasesparrayissparse)
IndexMixin)isdensegetdtypeisshape	isintlikeisscalarlikeupcastupcast_scalarcheck_shapec                       sB  e Zd ZdZdwddZdd Zdxdd	Zd
d Zejj	e_	ejj	e_	dd Z
dd Zdxd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dyd)d*Z f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$ f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^ Z2dz fd`da	Z3d{dbdcZ4ej4j	e4_	ddde Z5dfdg Z6ej6j	e6_	e7d|didjZ8d}dkdlZ9ej9j	e9_	d}dmdnZ:ej:j	e:_	d}dodpZ;ej;j	e;_	dqdr Z<ej<j	e<_	d~dudvZ=  Z>S )	_dok_basedokNFc              
   C   sl  t |  t| t}t|tr(t||dr(t||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|d| _|j| _d S zt|}W n tyt } ztd|d }~ww |jdkr~td|jdkr|d ur||}d	d
 t|D | _|j| _n| j||d }|j| _|j| _t|j|d| _d S )Nallow_1d)defaultFcopyzInvalid input format.   z(Expected rank <=2 dense array or matrix.r   c                 S   s   i | ]\}}|d kr||qS r    ).0ivr   r   Q/var/www/html/Trade-python/venv/lib/python3.10/site-packages/scipy/sparse/_dok.py
<dictcomp>4   s    z&_dok_base.__init__.<locals>.<dictcomp>dtype)r   __init__
isinstancer   tupler   r   _shape_dictr   floatr#   r	   formatr   todokastypeshapenpasarray	Exception	TypeErrorndim	enumerate_coo_container)selfarg1r-   r#   r   is_arrayedr   r   r    r$      s@   






z_dok_base.__init__c                 C      t d)Nz2Direct update to DOK sparse format is not allowed.)NotImplementedError)r5   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(   )r5   axisr   r   r    _getnnz@   s
   
z_dok_base._getnnzc                 C   s   t dd |  D S )Nc                 s   s    | ]}|d kV  qdS r   Nr   )r   xr   r   r    	<genexpr>H   s    z*_dok_base.count_nonzero.<locals>.<genexpr>)sumvaluesr5   r   r   r    count_nonzeroG      z_dok_base.count_nonzeroc                 C   s
   t | jS N)r>   r(   rF   r   r   r    __len__M      
z_dok_base.__len__c                 C   s
   || j v S rI   r(   r5   keyr   r   r    __contains__P   rK   z_dok_base.__contains__c                C   s   | j ||S rI   )r(   
setdefault)r5   rN   r   r   r   r    rP   S   s   z_dok_base.setdefaultc                C   s   | j |= d S rI   rL   rM   r   r   r    __delitem__V      z_dok_base.__delitem__c                 C   
   | j  S rI   )r(   clearrF   r   r   r    rT   Y   rK   z_dok_base.clearc                G   s   | j j| S rI   )r(   pop)r5   argsr   r   r    rU   \   rR   z_dok_base.popc                 C   r:   )Nz*reversed is not defined for dok_array type)r1   rF   r   r   r    __reversed___      z_dok_base.__reversed__c                 C   (   t | j dt |j }td| Nz and z unsupported operand type for |: type__name__r1   r5   other
type_namesr   r   r    __or__b      z_dok_base.__or__c                 C   rY   rZ   r[   r^   r   r   r    __ror__f   rb   z_dok_base.__ror__c                 C   rY   rZ   r[   r^   r   r   r    __ior__j   rb   z_dok_base.__ior__c                 C   rS   rI   )r(   popitemrF   r   r   r    re   n   rK   z_dok_base.popitemc                 C   rS   rI   )r(   itemsrF   r   r   r    rf   q   rK   z_dok_base.itemsc                 C   rS   rI   )r(   keysrF   r   r   r    rg   t   rK   z_dok_base.keysc                 C   rS   rI   )r(   rE   rF   r   r   r    rE   w   rK   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 rA   r   r   r   Mr   r   r    rC      s   & z _dok_base.get.<locals>.<genexpr>c                 s   s$    | ]\}}|d k p||kV  qdS rA   r   ri   r   r   r    rC         " zIndex out of bounds.r   )r(   r   r2   r>   
IndexErrorAssertionErrorr1   
ValueErrorr&   zipr-   anyget)r5   rN   r   r   r8   r   r   r    rq   z   s(   



z_dok_base.getc                    s   | j dkrt |S t|trt|dkr|d }ttjf}t||rC|dk r/|| j	d 7 }|dk s:|| j	d kr>t
d| |S t
d)Nr   r   r   index value out of boundsz4array/slice index for 1d dok_array not yet supported)r2   super__getitem__r%   r&   r>   intr.   integerr-   rl   _get_int)r5   rN   	INT_TYPES	__class__r   r    ru      s   



z_dok_base.__getitem__c                 C   s   | j || jdS Nr   r(   rq   r#   r\   )r5   idxr   r   r    rx      rH   z_dok_base._get_intc                 C   s   | j ||f| jdS r|   r}   r5   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   rH   z_dok_base._get_intXslicec                 C   s   |  |t||d S r   r   r   r   r   r    _get_sliceXint   rH   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"   )indicesr-   ranger>   _get_columnXarray_dok_containerr#   rg   divmodrv   r(   )r5   r   r   	row_startrow_stoprow_step	col_startcol_stopcol_step	row_range	col_ranger-   newdokrN   r   rijrjr   r   r    r      s"   z_dok_base._get_sliceXslicec                 C   s   |  }| |g|S rI   squeezer   r   r   r   r    _get_intXarray      z_dok_base._get_intXarrayc                 C   s   |  }| ||gS rI   r   r   r   r   r    _get_arrayXint   r   z_dok_base._get_arrayXintc                 C   s$   t t|| jd  }| ||S r|   listr   r   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#   r3   r(   rq   )	r5   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   )mapr.   
atleast_2dbroadcast_arraysr   r-   r#   	itertoolsproductr   r(   rq   )r5   r   r   r   r   r   rN   r   r   r   r    _get_arrayXarray   s   $
z_dok_base._get_arrayXarrayc                    s   | j dkrt ||S t|trt|dkr|d }ttjf}t||rE|dk r0|| j	d 7 }|dk s;|| j	d kr?t
d| ||S t
d)Nr   r   r   rr   rs   z-array index for 1d dok_array not yet provided)r2   rt   __setitem__r%   r&   r>   rv   r.   rw   r-   rl   _set_int)r5   rN   valuery   rz   r   r    r      s   


z_dok_base.__setitem__c                 C   s,   |r	|| j |< d S || j v r| j |= d S d S rI   rL   )r5   r~   rB   r   r   r    r      s
   
z_dok_base._set_intc                 C   s4   ||f}|r|| j |< d S || j v r| j |= d S d S rI   rL   )r5   r   r   rB   rN   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 r|   )	r   r   rv   ravelr(   r=   ro   r.   nonzero)r5   r   r   rB   r   rN   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   )r   )r   r9   r   r   r    
<listcomp>  s    z%_dok_base.__add__.<locals>.<listcomp>r   z Matrix dimensions are not equal.r   r   ignore)overc                 3   s$    | ]\}}| | | fV  qd S rI   r   r   kr   newr   r    rC   .  rk   z$_dok_base.__add__.<locals>.<genexpr>)r   r   r#   r   r-   r   r   r(   rq   r	   rn   r   r   r*   rf   tocoor2   ro   coordsdatar.   errstater=   r   todenseNotImplemented)r5   r_   	res_dtyperN   aijo_itemsr   r   r    __add__  s>   



z_dok_base.__add__c                 C   s   | | S rI   r   r5   r_   r   r   r    __radd__5  rX   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    rC   >  s    z$_dok_base.__neg__.<locals>.<genexpr>)r#   kindr;   r   r-   r(   r=   rf   r5   r   r   r   r    __neg__8  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    rC   E      z(_dok_base._mul_scalar.<locals>.<genexpr>)r   r#   r   r-   r(   r=   rf   r5   r_   r   r   r   r   r    _mul_scalarA  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   rL   )r   r   r_   r5   r   r    rC   R  rk   z+_dok_base._matmul_vector.<locals>.<genexpr>c                 3   s     | ]\}} | | V  qd S rI   r   r   r   r   r    rC   T  r   r"   )r   r#   r2   r	   r*   rg   r   r   rD   r   rf   r   r.   zerosr-   )r5   r_   r   rg   resultr   r   r   r   r   r    _matmul_vectorH  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    rC   c  r   z0_dok_base._matmul_multivector.<locals>.<genexpr>r   r"   )	r   r#   r2   rD   r(   rf   r-   r.   r   )	r5   r_   result_dtyperj   	new_shaper   r   r   r   r   r   r    _matmul_multivector^  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    rC   o  r   z%_dok_base.__imul__.<locals>.<genexpr>r   r(   r=   rf   r   r   r   r   r    __imul__m     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    rC   w  r   z(_dok_base.__truediv__.<locals>.<genexpr>)	r   r   r#   r   r-   r(   r=   rf   tocsrr   r   r   r    __truediv__s  s   z_dok_base.__truediv__c                    r   )Nc                 3   r   rI   r   r   r   r   r    rC   }  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__rF   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)r2   rt   diagonalrn   )r5   r   rz   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    rC     rk   z&_dok_base.transpose.<locals>.<genexpr>)	r2   r   rn   r-   r   r#   r(   r=   rf   )r5   axesr   rj   Nr   r   r   r    	transpose  s   

z_dok_base.transposec                 C   sX   | j dkr|  }|j |_|S | j\}}| j||f| jd}dd |  D |_|S )zReturn the conjugate transpose.r   r"   c                 S   s$   i | ]\\}}}||ft |qS r   )r.   conjr   r   r   r    r!     s   $ z(_dok_base.conjtransp.<locals>.<dictcomp>)	r2   r   r   	conjugater-   r   r#   rf   r(   )r5   r   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   r~   r   r   r    rC     s    z%_dok_base.fromkeys.<locals>.<genexpr>r   r"   )
r   fromkeysr%   nextiterr&   ro   r   r\   r(   )clsiterabler   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)r.   fromiter)r   ix	idx_dtypennzr   r    rC     r   z"_dok_base.tocoo.<locals>.<genexpr>)r-   r#   T)r   r4   r-   r#   _get_index_dtyper   r.   r   rE   r2   ro   rg   r&   has_canonical_format)r5   r   r   indsr   Ar   r   r    r     s    z_dok_base.tocooc                 C   s   |r|   S | S rI   r   r5   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   )r2   r;   r   tocscr   r   r   r    r     s   
z_dok_base.tocscc           	      G   s   t | t}t||d}t|t| jkrt| jdkr4|d }t| jD ]
}||kr.| j|= q$|| _	d S |\}}| j\}}||k sE||k r^t| 
 D ]\}}||ksW||kr]| j||f= qK|| _	d S )Nr   r   rr   )r%   r   r   r>   r-   r;   r2   r   r(   r'   rg   )	r5   r-   r7   newNr   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   )r.   r#   r   r-   arrayr   r(   rE   r   ro   r   )r5   r#   castingr   r   r   r   r   r    r,     s   

z_dok_base.astype)NNFrI   )rh   r   )NF)r   )F)r  T)?r]   
__module____qualname___formatr$   r=   r@   rG   r   __doc__rJ   rO   rP   rQ   rT   rU   rW   ra   rc   rd   re   rf   rg   rE   rq   ru   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  r,   __classcell__r   r   rz   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   )rB   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   )reshapeasformatr*   __dict__)r5   r-   
new_matrixr   r   r    	set_shape  s   zdok_matrix.set_shapec                 C   s   | j S )zGet shape of a sparse matrix.)r'   rF   r   r   r    	get_shape  s   zdok_matrix.get_shape)fgetfsetc                 C   rS   rI   )r(   rW   rF   r   r   r    rW     rK   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-   rW   ra   rc   rd   r   r   r   r    r   P  s    3r   )r	  __docformat____all__r   numpyr.   _matrixr   _baser   r   r	   _indexr
   _sputilsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    <module>   s     (   r5