a
    CCCf3                     @  s   d Z ddlmZ ddlmZ ddlZddlmZ er@ddl	mZ
 eejfZdd ZG d	d
 d
ZddddZdd Zdd ZdddZdd Zdd ZdS )z0Indexing mixin for sparse array/matrix classes.
    )annotations)TYPE_CHECKINGN   )	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   O/var/www/html/django/DPS/env/lib/python3.9/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"   ddl m} t| |rtddS )zWe 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.
        r   )sparrayzcWe have not yet implemented 1D sparse slices; please index using explicit indices, e.g. `x[:, [0]]`N)Zscipy.sparser   
isinstanceNotImplementedError)selfr   r   r   r   _raise_on_1d_array_slice#   s
    
z#IndexMixin._raise_on_1d_array_slicec                 C  s  |  |\}}t|trt|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rt	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_indicesr   	INT_TYPES_get_intXintslicer   _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)r   keyrowcolr   r   r   __getitem__3   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
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 )
Nr   r   z&Trying to assign a sequence to an itemr   r   issparsezshape mismatch in assignmentT)r"   )r   r   r   r   asarrayr   r)   
ValueError_set_intXintZflatr   Zarangeindicesr'   Z
atleast_1dr   r   r    _baser1   ZtocooZsum_duplicates_set_arrayXarray_sparseZsqueezeZbroadcast_toZreshape_set_arrayXarray)
r   r,   r
   r-   r.   ijr1   Zbroadcast_rowZbroadcast_colr   r   r   __setitem__e   sV    

$

"


 zIndexMixin.__setitem__c           
      C  sz  ddl m} t||tjfrT|jdkrT|jjdkrT|j| jkrFt	d|
 \}}nt|\}}| j\}}dddd	d
dd}t|rt|}|| k s||krt	d| |dk r||7 }n4t| }d ur|||d}nt|ts| ||}t|r:t|}|| k s||kr&t	d| |dk rr||7 }n8t| }	d urZ||	|d}nt|tsr| ||}||fS )Nr   )_spbaser   r	   z.boolean index shape does not match array shapeznpt.NDArray[np.bool_]intstrznpt.NDArray[np.int_])idx	axis_size	axis_namereturnc                 S  s2   t | |kr*td| dt |  d| t| S )Nzboolean z index has incorrect length: z instead of )lenr    _boolean_index_to_array)r?   r@   rA   r   r   r   _validate_bool_idx   s    z8IndexMixin._validate_indices.<locals>._validate_bool_idxzrow index (%d) out of ranger   r-   zcolumn index (%d) out of rangecolumn)r6   r<   r   r   Zndarrayr   r   kindr'   r    nonzero_unpack_indexr   r=   _compatible_boolean_indexr   
_asindices)
r   r,   r<   r-   r.   MNrE   Zbool_rowZbool_colr   r   r   r      sB    






zIndexMixin._validate_indicesc              
   C  s   zt |}W n4 tttfyB } ztd|W Y d}~n
d}~0 0 |jdvrVtd|jdkrd|S | }||krtd| |	 }|dk r|| k rtd| ||u 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   r   zIndex dimension must be 1 or 2r   index (%d) out of range)r   r2   r3   	TypeErrorMemoryErrorr    r   r)   maxminr   Zowndatar"   )r   r?   lengthr
   eZmax_indxZmin_indxr   r   r   rK      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.
        rN   r   N)r'   r=   r    r   r   r   r9   rL   rM   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.
        rN   r   N)r'   r=   r    r!   r   rU   r   r   r   _getcol   s    
zIndexMixin._getcolc                 C  s
   t  d S Nr   r   r-   r.   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-   r.   r
   r   r   r   r4     s    zIndexMixin._set_intXintc                 C  s
   t  d S rX   rY   r[   r   r   r   r8     s    zIndexMixin._set_arrayXarrayc                 C  s4   t j| | jd}t||\}}| ||| d S )Nr   )r   r2   Ztoarrayr   r   r8   )r   r-   r.   r
   _r   r   r   r7   !  s    z"IndexMixin._set_arrayXarray_sparseN)__name__
__module____qualname____doc__r   r/   r;   r   rK   rV   rW   r   r   r   r!   r#   r$   r%   r&   r(   r+   r4   r8   r7   r   r   r   r   r      s*   240r   zctuple[int | slice | npt.NDArray[np.bool_ | np.int_], int | slice | npt.NDArray[np.bool_ | np.int_]])rB   c                 C  s   t | } t| trRt| dkr(| \}}qt| dkrH| d td }}qtdnHt| }|du rr| td }}n(|jdk r|tdfS |jdkr| S ddl	m
} ||s||rtd||fS )z Parse index. Always return a tuple of the form (row, col).
    Valid type for row/col is integer, slice, array of bool, or array of integers.
    r   r   r   Nzinvalid number of indicesr0   zoIndexing with sparse matrices is not supported except boolean indexing where matrix and index are equal shapes.)_check_ellipsisr   tuplerC   r   r    rJ   r   rH   r6   r1   )indexr-   r.   r?   r1   r   r   r   rI   (  s(    




rI   c                 C  s   | t u rtdtdfS t| ts&| S dd t| D }|s@| S t|dkrTtd|\}tddt|  }| d| tdf|  | |d d  S )z6Process indices with Ellipsis. Returns modified index.Nc                 S  s   g | ]\}}|t u r|qS r   )Ellipsis).0r9   vr   r   r   
<listcomp>W      z#_check_ellipsis.<locals>.<listcomp>r   z0an index can only have a single ellipsis ('...')r      )rd   r   r   rb   	enumeraterC   r    rQ   )rc   Zellipsis_indicesr9   Z
num_slicesr   r   r   ra   N  s    
ra   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   rG   r?   r   r   r   _maybe_bool_ndarrayc  s    
rl   r   c                 C  sP   |dk rdS zt t| d}W n ty2   Y dS 0 t|trBdS t||d S )zQReturns True if first element of the incompatible
    array type is boolean.
    r   NT)nextiterrO   r   bool_first_element_bool)r?   Zmax_dimfirstr   r   r   rp   l  s    
rp   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)hasattrrp   rl   rk   r   r   r   rJ   {  s    rJ   c                 C  s    | j dkrtdt| d S )Nr   zinvalid index shaper   )r   r    r   whererk   r   r   r   rD     s    
rD   )r   )r`   
__future__r   typingr   numpyr   Z_sputilsr   Znumpy.typingZnptr=   integerr   r   r   rI   ra   rl   rp   rJ   rD   r   r   r   r   <module>   s"   
  &	

