B
    0dm/                 @   s   d Z ddlZddlmZ y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.
    )npZbroadcast_arraysflagsZ	writeable)abxy r
   E/var/www/html/venv/lib/python3.7/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(S ))
IndexMixinzS
    This class provides common dispatching and validation logic for indexing.
    c             C   s  |  |\}}t|trft|tr.| ||S t|trD| ||S |jdkrZ| ||S tdn&t|trt|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rt|t r| ||S t|tr| ||S nvt|tr.| ||S t|trDtdnH|jd dkr|jdksp|jd dkr| |d d df | S t||\}}|j|jkrtd|jdkr| jt|j| jdS | ||S )Nr   zindex results in >2 dimensionsr   z'number of row and column indices differ)dtype)_validate_indices
isinstance	INT_TYPES_get_intXintslice_get_intXslicendim_get_intXarray
IndexError_get_sliceXintcopy_get_sliceXslice_get_sliceXarray_get_arrayXint_get_arrayXsliceshape_get_columnXarrayZravelr   size	__class__r   Z
atleast_2dr   _get_arrayXarray)selfkeyrowcolr
   r
   r   __getitem__    sH    









,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
rtj|| jd  d d d f }n
t|}t|t
rt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std|jd dks|jd dkrd S |jdd	}|  | ||| n^tj|| jd}| j| jkr4t||j}|jdkrDd S ||j}| ||| d S )
N)r   r   z&Trying to assign a sequence to an itemr   z'number of row and column indices differ)
isspmatrixzshape mismatch in assignmentT)r   )r   r   r   r   asarrayr   r    
ValueError_set_intXintZflatr   Zarangeindicesr   Z
atleast_1dr   r   r   baser(   ZtocooZsum_duplicates_set_arrayXarray_sparseZsqueezeZbroadcast_toZreshape_set_arrayXarray)
r#   r$   r   r%   r&   ijr(   Zbroadcast_rowZbroadcast_colr
   r
   r   __setitem__K   sP    

$

"


 zIndexMixin.__setitem__c             C   s   | j \}}t|\}}t|rVt|}|| k s8||krDtd| |dk rl||7 }nt|tsl| ||}t|rt|}|| k s||krt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%   r&   r
   r
   r   r      s&    




zIndexMixin._validate_indicesc          
   C   s   yt |}W n2 tttfk
r@ } ztd|W dd}~X Y nX |jdkrTtd|jdkrb|S | }||kr~td| |	 }|dk r|| k rtd| ||ks|j
js| }||dk   |7  < |S )zConvert `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      zIndex dimension must be <= 2r   zindex (%d) out of range)r   r)   r*   	TypeErrorMemoryErrorr   r   r    maxminr   Zowndatar   )r#   idxlengthr   eZmax_indxZmin_indxr
   r
   r   r5      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.
        zindex (%d) out of ranger   N)r   r4   r   r   r   )r#   r0   r6   r7   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.
        zindex (%d) out of ranger   N)r   r4   r   r   r   )r#   r0   r6   r7   r
   r
   r   getcol   s    
zIndexMixin.getcolc             C   s
   t  d S )N)NotImplementedError)r#   r%   r&   r
   r
   r   r      s    zIndexMixin._get_intXintc             C   s
   t  d S )N)rB   )r#   r%   r&   r
   r
   r   r      s    zIndexMixin._get_intXarrayc             C   s
   t  d S )N)rB   )r#   r%   r&   r
   r
   r   r      s    zIndexMixin._get_intXslicec             C   s
   t  d S )N)rB   )r#   r%   r&   r
   r
   r   r      s    zIndexMixin._get_sliceXintc             C   s
   t  d S )N)rB   )r#   r%   r&   r
   r
   r   r      s    zIndexMixin._get_sliceXslicec             C   s
   t  d S )N)rB   )r#   r%   r&   r
   r
   r   r      s    zIndexMixin._get_sliceXarrayc             C   s
   t  d S )N)rB   )r#   r%   r&   r
   r
   r   r      s    zIndexMixin._get_arrayXintc             C   s
   t  d S )N)rB   )r#   r%   r&   r
   r
   r   r      s    zIndexMixin._get_arrayXslicec             C   s
   t  d S )N)rB   )r#   r%   r&   r
   r
   r   r      s    zIndexMixin._get_columnXarrayc             C   s
   t  d S )N)rB   )r#   r%   r&   r
   r
   r   r"      s    zIndexMixin._get_arrayXarrayc             C   s
   t  d S )N)rB   )r#   r%   r&   r   r
   r
   r   r+      s    zIndexMixin._set_intXintc             C   s
   t  d S )N)rB   )r#   r%   r&   r   r
   r
   r   r/      s    zIndexMixin._set_arrayXarrayc             C   s4   t j| | jd}t||\}}| ||| d S )N)r   )r   r)   Ztoarrayr   r   r/   )r#   r%   r&   r   _r
   r
   r   r.      s    z"IndexMixin._set_arrayXarray_sparseN)__name__
__module____qualname____doc__r'   r2   r   r5   r@   rA   r   r   r   r   r   r   r   r   r   r"   r+   r/   r.   r
   r
   r
   r   r      s(   +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rt| dkrf| \}}qt| dkr| d td }}qtdnLt| }|dkr| td }}n,|jdk rt|tdfS |jdkr|	 S ||s||rt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   )spmatrixr(   r8   r   r   Nzinvalid number of indiceszoIndexing with sparse matrices is not supported except boolean indexing where matrix and index are equal shapes.)r-   rH   r(   r   r   Zndarrayr   r   kindZnonzero_check_ellipsistuplelenr   r   _compatible_boolean_index_boolean_index_to_array)indexrH   r(   r%   r&   r=   Zbool_rowZbool_colr
   r
   r   r3      s8    






r3   c             C   s&  | t krtdtdfS t| ts&| S x&t| D ]\}}|t kr0|}P q0W | S t| dkrjtdtdfS t| dkr|dkr| d t krtdtdfS td| d fS | d tdfS g }x*| |d d D ]}|t k	r|| qW |t| }tdd| }| d| tdf|  t| S )z6Process indices with Ellipsis. Returns modified index.Nr   r8   r   )Ellipsisr   r   rK   	enumeraterL   appendr;   )rO   r1   vZfirst_ellipsistailndZnslicer
   r
   r   rJ   $  s0    
rJ   c             C   s   t | } | jjdkr| S dS )z8Returns a compatible array if elements are boolean.
    r   N)r   Z
asanyarrayr   rI   )r=   r
   r
   r   _maybe_bool_ndarrayK  s    
rV   r8   c             C   sP   |dk rdS yt t| d}W n tk
r2   dS X t|trBdS t||d S )zQReturns True if first element of the incompatible
    array type is boolean.
    r   NT)nextiterr9   r   bool_first_element_bool)r=   Zmax_dimfirstr
   r
   r   rZ   T  s    
rZ   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)hasattrrZ   rV   )r=   r
   r
   r   rM   c  s    rM   c             C   s    | j dkrtdt| d S )Nr   zinvalid index shaper   )r   r   r   where)r=   r
   r
   r   rN   m  s    
rN   )r8   )rG   numpyr   Zsputilsr   r4   longintegerr   	NameErrorr   r   r3   rJ   rV   rZ   rM   rN   r
   r
   r
   r   <module>   s    [.'	

