3
5^*                 @   s   d Z ddlmZmZmZ ddlZddlmZ ye	e
ejfZW n ek
rZ   e	ejfZY nX dd ZG dd	 d	eZd
d Zdd Zdd ZdS )z*Indexing mixin for sparse matrix classes.
    )divisionprint_functionabsolute_importN   )	isintlikec             C   s0   t j| |\}}| 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   2lib/python3.6/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  | j |\}}t|trft|tr.| j||S t|trD| j||S |jdkrZ| j||S tdnt|trt|tr| j	||S t|tr|td kr||kr| j
 S | j||S |jdkr| j||S tdn|jdkrt|t r| j||S t|trx| j||S nbt|tr.| j||S t|trDtdn4|jd dkrx|jdkrx| j|d d df |S t||\}}|j|jkrtd|jdkr| jtj|j| jdS | j||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_columnXarrayr   size	__class__r   Z
atleast_2dr   _get_arrayXarray)selfkeyrowcolr   r   r   __getitem__"   sH    









zIndexMixin.__getitem__c             C   s8  | j |\}}t|tr\t|tr\tj|| jd}|jdkrDtd| j|||j	d  d S t|t
rtj|j| jd  d d d f }n
tj|}t|t
rtj|j| jd  d d d f }|jdkr|d d d f }n
tj|}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o|	p|jd |jd kstd|jdkrd S |jdd	}|j  | j||| nHtj|| jd}t||\}}
|jdkrd S |j|j}| 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reshape_set_arrayXarray)r&   r'   r   r(   r)   ijr+   Zbroadcast_rowZbroadcast_col_r   r   r   __setitem__M   sN    

$

"


zIndexMixin.__setitem__c             C   s   | j \}}t|\}}t|rVt|}|| k s8||krDtd| |dk rl||7 }nt|tsl| j||}t|rt|}|| k s||krtd| |dk r||7 }nt|ts| j||}||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 j|}W n" tttfk
r0   tdY nX |jdkrDtd|jdkrR|S |j }||krntd| |j	 }|dk r|| k rtd| ||ks|j
j r|j }||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 indexr      zIndex dimension must be <= 2r   zindex (%d) out of range)r   r<   )r   r,   r-   	TypeErrorMemoryErrorr   r   r#   maxminr   Zowndatar   )r&   idxZlengthr   Zmax_indxZmin_indxr   r   r   r9      s&    


zIndexMixin._asindicesc             C   sP   | j \}}t|}|| k s$||kr0td| |dk r@||7 }| j|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!   r8   r   r   r   )r&   r3   r:   r;   r   r   r   getrow   s    
zIndexMixin.getrowc             C   sP   | j \}}t|}|| k s$||kr0td| |dk r@||7 }| j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!   r8   r   r   r   )r&   r3   r:   r;   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)rD   )r&   r(   r)   r   r   r   r      s    zIndexMixin._get_intXarrayc             C   s
   t  d S )N)rD   )r&   r(   r)   r   r   r   r      s    zIndexMixin._get_intXslicec             C   s
   t  d S )N)rD   )r&   r(   r)   r   r   r   r      s    zIndexMixin._get_sliceXintc             C   s
   t  d S )N)rD   )r&   r(   r)   r   r   r   r      s    zIndexMixin._get_sliceXslicec             C   s
   t  d S )N)rD   )r&   r(   r)   r   r   r   r      s    zIndexMixin._get_sliceXarrayc             C   s
   t  d S )N)rD   )r&   r(   r)   r   r   r   r      s    zIndexMixin._get_arrayXintc             C   s
   t  d S )N)rD   )r&   r(   r)   r   r   r   r       s    zIndexMixin._get_arrayXslicec             C   s
   t  d S )N)rD   )r&   r(   r)   r   r   r   r"      s    zIndexMixin._get_columnXarrayc             C   s
   t  d S )N)rD   )r&   r(   r)   r   r   r   r%      s    zIndexMixin._get_arrayXarrayc             C   s
   t  d S )N)rD   )r&   r(   r)   r   r   r   r   r.      s    zIndexMixin._set_intXintc             C   s
   t  d S )N)rD   )r&   r(   r)   r   r   r   r   r2      s    zIndexMixin._set_arrayXarrayc             C   s4   t j|j | jd}t||\}}| j||| d S )N)r   )r   r,   Ztoarrayr   r   r2   )r&   r(   r)   r   r5   r   r   r   r1      s    z"IndexMixin._set_arrayXarray_sparseN)__name__
__module____qualname____doc__r*   r6   r   r9   rB   rC   r   r   r   r   r   r   r   r    r"   r%   r.   r2   r1   r   r   r   r   r      s(   +3r   c             C   s   ddl m}m} t| |tjfr>| jdkr>| jjdkr>| j	 S t
| } t| trt| dkrf| \}}qt| dkr| d td }}qtdn| td }}||s||rtdt|tjr|jjdkrt|}t|tjr|jjdkrt|}||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+   r<   r
   r   Nzinvalid number of indiceszoIndexing with sparse matrices is not supported except boolean indexing where matrix and index are equal shapes.)r0   rI   r+   r   r   Zndarrayr   r   Zkindnonzero_check_ellipsistuplelenr   r   _boolean_index_to_array)indexrI   r+   r(   r)   r   r   r   r7      s(    


r7   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|j| qW |t| }tdd| }| d| tdf|  t| S )z6Process indices with Ellipsis. Returns modified index.Nr   r<   r   )Ellipsisr   r   rL   	enumeraterM   appendr?   )rO   r4   vZfirst_ellipsistailZndZnslicer   r   r   rK     s0    
rK   c             C   s   | j dkrtd| j d S )Nr   zinvalid index shaper   )r   r   rJ   )rA   r   r   r   rN   E  s    
rN   )rH   Z
__future__r   r   r   Znumpyr   Zsputilsr   r8   ZlongZintegerr   	NameErrorr   objectr   r7   rK   rN   r   r   r   r   <module>   s    Z''