U
    Ë»|e€2  ã                   @   s”   d Z ddlZddlmZ zeeejfZW n e	k
rF   eejfZY nX dd„ Z
G dd„ dƒZd	d
„ Zdd„ Zdd„ Zddd„Zdd„ Zdd„ ZdS )z*Indexing mixin for sparse matrix classes.
é    Né   )Ú	isintlikec                 C   s0   t  | |¡\}}| jj|j_|jj|j_||fS )a   
    Same as np.broadcast_arrays(a, b) but old writeability rules.

    NumPy >= 1.17.0 transitions broadcast_arrays to return
    read-only arrays. Set writeability explicitly to avoid warnings.
    Retain the old writeability rules, as our Cython code assumes
    the old behavior.
    )ÚnpÚbroadcast_arraysÚflagsÚ	writeable)ÚaÚbÚxÚy© r   úP/var/www/website-v5/atlas_env/lib/python3.8/site-packages/scipy/sparse/_index.pyÚ_broadcast_arrays   s    	r   c                   @   s°   e Zd Z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d„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*S )+Ú
IndexMixinzS
    This class provides common dispatching and validation logic for indexing.
    c                 C   s   | j rtdƒ‚dS )zçWe do not currently support 1D sparse arrays.

        This function is called each time that a 1D array would
        result, raising an error instead.

        Once 1D sparse arrays are implemented, it should be removed.
        zcWe have not yet implemented 1D sparse slices; please index using explicit indices, e.g. `x[:, [0]]`N)Ú	_is_arrayÚNotImplementedError)Úselfr   r   r   Ú_raise_on_1d_array_slice    s    ÿz#IndexMixin._raise_on_1d_array_slicec                 C   s  |   |¡\}}t|tƒrŒt|tƒr.|  ||¡S t|tƒrL|  ¡  |  ||¡S |jdkrj|  ¡  |  ||¡S |jdkr€|  ||¡S t	dƒ‚�n:t|tƒ�r
t|tƒr¶|  ¡  |  
||¡S t|tƒrè|td ƒkrÜ||krÜ|  ¡ S |  ||¡S |jdk�r |  ||¡S t	dƒ‚n¼|jdk�rPt|tƒ�r6|  ¡  |  ||¡S t|tƒ�rÆ|  ||¡S nvt|tƒ�rh|  ||¡S t|tƒ�r~t	dƒ‚nH|jd dk�rÆ|jdk�sª|jd dk�rÆ|  |d d …df | ¡ ¡S t||ƒ\}}|j|jk�rêt	dƒ‚|jdk�r| jt |¡j| jd�S |  ||¡S )Nr   é   zindex results in >2 dimensionsr   ú'number of row and column indices differ©Údtype)Ú_validate_indicesÚ
isinstanceÚ	INT_TYPESÚ_get_intXintÚslicer   Ú_get_intXsliceÚndimÚ_get_intXarrayÚ
IndexErrorÚ_get_sliceXintÚcopyÚ_get_sliceXsliceÚ_get_sliceXarrayÚ_get_arrayXintÚ_get_arrayXsliceÚshapeÚ_get_columnXarrayÚravelr   ÚsizeÚ	__class__r   Ú
atleast_2dr   Ú_get_arrayXarray)r   ÚkeyÚrowÚcolr   r   r   Ú__getitem__.   sT    








,zIndexMixin.__getitem__c           
      C   sb  |   |¡\}}t|tƒr\t|tƒr\tj|| jd�}|jdkrDtdƒ‚|  |||j	d ¡ d S t|t
ƒrŠtj| | jd ¡Ž d d …d f }n
t |¡}t|t
ƒrÜtj| | jd ¡Ž d d d …f }|jdkræ|d d …d f }n
t |¡}t||ƒ\}}|j|jk�r
tdƒ‚ddlm} ||ƒ�r |jdk�r<|d  }|d  }|jd dk�oX|jd dk}|jd dk�ov|jd dk}	|�s”|jd |jd k�r°|	�s¸|jd |jd k�s¸tdƒ‚|jd dk�sØ|jd dk�rÜd S |jdd	�}| ¡  |  |||¡ n^tj|| jd�}| ¡ j| ¡ jk�r4t ||j¡}|jdk�rDd S | |j¡}|  |||¡ d S )
Nr   r   z&Trying to assign a sequence to an itemr   r   )Ú
isspmatrixzshape mismatch in assignmentT)r"   )r   r   r   r   Úasarrayr   r*   Ú
ValueErrorÚ_set_intXintÚflatr   ÚarangeÚindicesr'   Ú
atleast_1dr   r   r    Ú_baser2   ÚtocooÚsum_duplicatesÚ_set_arrayXarray_sparseÚsqueezeÚbroadcast_toÚreshapeÚ_set_arrayXarray)
r   r.   r
   r/   r0   ÚiÚjr2   Úbroadcast_rowÚbroadcast_colr   r   r   Ú__setitem__`   sV    

$

"


ÿÿ zIndexMixin.__setitem__c                 C   sÊ   | j \}}t|ƒ\}}t|ƒrVt|ƒ}|| k s8||krDtd| ƒ‚|dk rl||7 }nt|tƒsl|  ||¡}t|ƒr¬t|ƒ}|| k sŽ||krštd| ƒ‚|dk rÂ||7 }nt|tƒsÂ|  ||¡}||fS )Nzrow index (%d) out of ranger   zcolumn index (%d) out of range)r'   Ú_unpack_indexr   Úintr    r   r   Ú
_asindices)r   r.   ÚMÚNr/   r0   r   r   r   r   ”   s&    




zIndexMixin._validate_indicesc              
   C   sÔ   zt  |¡}W n2 tttfk
r@ } ztdƒ|‚W 5 d}~X Y nX |jdkrTtdƒ‚|jdkrb|S | ¡ }||kr~td| ƒ‚| 	¡ }|dk rÐ|| k r¤td| ƒ‚||ks´|j
js¼| ¡ }||dk   |7  < |S )z“Convert `idx` to a valid index for an axis with a given length.

        Subclasses that need special validation can override this method.
        zinvalid indexN)r   r   zIndex dimension must be 1 or 2r   úindex (%d) out of range)r   r3   r4   Ú	TypeErrorÚMemoryErrorr    r   r*   ÚmaxÚminr   Úowndatar"   )r   ÚidxÚlengthr
   ÚeZmax_indxZmin_indxr   r   r   rI   ¬   s&    


zIndexMixin._asindicesc                 C   sP   | j \}}t|ƒ}|| k s$||kr0td| ƒ‚|dk r@||7 }|  |tdƒ¡S )zGReturn a copy of row i of the matrix, as a (1 x n) row vector.
        rL   r   N)r'   rH   r    r   r   ©r   rB   rJ   rK   r   r   r   ÚgetrowÊ   s    
zIndexMixin.getrowc                 C   sP   | j \}}t|ƒ}|| k s$||kr0td| ƒ‚|dk r@||7 }|  tdƒ|¡S )zMReturn a copy of column i of the matrix, as a (m x 1) column vector.
        rL   r   N)r'   rH   r    r!   r   rU   r   r   r   ÚgetcolÕ   s    
zIndexMixin.getcolc                 C   s
   t ƒ ‚d S ©N©r   ©r   r/   r0   r   r   r   r   à   s    zIndexMixin._get_intXintc                 C   s
   t ƒ ‚d S rX   rY   rZ   r   r   r   r   ã   s    zIndexMixin._get_intXarrayc                 C   s
   t ƒ ‚d S rX   rY   rZ   r   r   r   r   æ   s    zIndexMixin._get_intXslicec                 C   s
   t ƒ ‚d S rX   rY   rZ   r   r   r   r!   é   s    zIndexMixin._get_sliceXintc                 C   s
   t ƒ ‚d S rX   rY   rZ   r   r   r   r#   ì   s    zIndexMixin._get_sliceXslicec                 C   s
   t ƒ ‚d S rX   rY   rZ   r   r   r   r$   ï   s    zIndexMixin._get_sliceXarrayc                 C   s
   t ƒ ‚d S rX   rY   rZ   r   r   r   r%   ò   s    zIndexMixin._get_arrayXintc                 C   s
   t ƒ ‚d S rX   rY   rZ   r   r   r   r&   õ   s    zIndexMixin._get_arrayXslicec                 C   s
   t ƒ ‚d S rX   rY   rZ   r   r   r   r(   ø   s    zIndexMixin._get_columnXarrayc                 C   s
   t ƒ ‚d S rX   rY   rZ   r   r   r   r-   û   s    zIndexMixin._get_arrayXarrayc                 C   s
   t ƒ ‚d S rX   rY   ©r   r/   r0   r
   r   r   r   r5   þ   s    zIndexMixin._set_intXintc                 C   s
   t ƒ ‚d S rX   rY   r[   r   r   r   rA     s    zIndexMixin._set_arrayXarrayc                 C   s4   t j| ¡ | jd�}t||ƒ\}}|  |||¡ d S )Nr   )r   r3   Útoarrayr   r   rA   )r   r/   r0   r
   Ú_r   r   r   r=     s    z"IndexMixin._set_arrayXarray_sparseN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r1   rF   r   rI   rV   rW   r   r   r   r!   r#   r$   r%   r&   r(   r-   r5   rA   r=   r   r   r   r   r      s*   24r   c                 C   s0  ddl m}m} t| |tjfƒr>| jdkr>| jjdkr>|  	¡ S t
| ƒ} t| tƒr�t| ƒdkrf| \}}qÜt| ƒdkr†| d tdƒ }}qÜtdƒ‚nLt| ƒ}|dkr°| tdƒ }}n,|jdk rÊt|ƒtdƒfS |jdkrÜ| 	¡ S ||ƒsì||ƒrôtdƒ‚t|ƒ}t|ƒ}|dk	�rt|ƒ}|dk	�r(t|ƒ}||fS )	z„ Parse index. Always return a tuple of the form (row, col).
    Valid type for row/col is integer, slice, or array of integers.
    r   )Úspmatrixr2   r   r	   r   Nzinvalid number of indiceszoIndexing with sparse matrices is not supported except boolean indexing where matrix and index are equal shapes.)r:   rb   r2   r   r   Úndarrayr   r   ÚkindÚnonzeroÚ_check_ellipsisÚtupleÚlenr   r    Ú_compatible_boolean_indexÚ_boolean_index_to_array)Úindexrb   r2   r/   r0   rR   Zbool_rowZbool_colr   r   r   rG     s@    ÿ
ÿ




ÿ

rG   c                 C   s   | t krtdƒtdƒfS t| tƒs&| S t| ƒD ]\}}|t kr.|} qLq.| S t| ƒdkrhtdƒtdƒfS t| ƒdkr¸|dkr¨| d t kr˜tdƒtdƒfS tdƒ| d fS | d tdƒfS g }| |d d… D ]}|t k	rÌ| |¡ qÌ|t|ƒ }tdd| ƒ}| d|… tdƒf|  t|ƒ S )z6Process indices with Ellipsis. Returns modified index.Nr   r   r   )ÚEllipsisr   r   rg   Ú	enumeraterh   ÚappendrO   )rk   rC   ÚvZfirst_ellipsisÚtailÚndZnslicer   r   r   rf   9  s0    
rf   c                 C   s   t  | ¡} | jjdkr| S dS )z8Returns a compatible array if elements are boolean.
    r	   N)r   Ú
asanyarrayr   rd   ©rR   r   r   r   Ú_maybe_bool_ndarray`  s    
rt   r   c                 C   sR   |dk rdS zt t| ƒdƒ}W n tk
r4   Y dS X t|tƒrDdS t||d ƒS )zQReturns True if first element of the incompatible
    array type is boolean.
    r   NT)ÚnextÚiterrM   r   ÚboolÚ_first_element_bool)rR   Zmax_dimÚfirstr   r   r   rx   i  s    
rx   c                 C   s   t | dƒst| ƒrt| ƒS dS )ztReturns a boolean index array that can be converted to
    integer array. Returns None if no such array exists.
    r   N)Úhasattrrx   rt   rs   r   r   r   ri   x  s    ri   c                 C   s    | j dkrtdƒ‚t | ¡d S )Nr   zinvalid index shaper   )r   r    r   Úwherers   r   r   r   rj   ‚  s    
rj   )r   )ra   Únumpyr   Ú_sputilsr   rH   ÚlongÚintegerr   Ú	NameErrorr   r   rG   rf   rt   rx   ri   rj   r   r   r   r   Ú<module>   s    p.'	

