
    9=e2                         d Z ddlZddlmZ ddlmZ eej        fZ	d Z
 G d d          Zd	 Zd
 Zd ZddZd Zd ZdS )z*Indexing mixin for sparse matrix classes.
    N)warn   )	isintlikec                     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.
    )npbroadcast_arraysflags	writeable)abxys       3lib/python3.11/site-packages/scipy/sparse/_index.py_broadcast_arraysr   
   sA     q!$$DAq)AG)AGa4K    c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )
IndexMixinzS
    This class provides common dispatching and validation logic for indexing.
    c                 2    | j         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.
        zcWe have not yet implemented 1D sparse slices; please index using explicit indices, e.g. `x[:, [0]]`N)	_is_arrayNotImplementedError)selfs    r   _raise_on_1d_array_slicez#IndexMixin._raise_on_1d_array_slice   s0     > 	%H  	 	r   c                    |                      |          \  }}t          |t                    rt          |t                    r|                     ||          S t          |t                    r*|                                  |                     ||          S |j        dk    r*|                                  |                     ||          S |j        dk    r|                     ||          S t          d          t          |t                    rt          |t                    r*|                                  | 
                    ||          S t          |t                    rC|t	          d           k    r||k    r|                                 S |                     ||          S |j        dk    r|                     ||          S t          d          |j        dk    rkt          |t                    r*|                                  |                     ||          S t          |t                    r|                     ||          S nt          |t                    r|                     ||          S t          |t                    rt          d          |j        d         dk    rN|j        dk    s|j        d         dk    r2|                     |d d df         |                                          S t'          ||          \  }}|j        |j        k    rt          d          |j        dk    r3|                     t-          j        |          j        | j                  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cols       r   __getitem__zIndexMixin.__getitem__+   sL   ))#..S c9%% $	E#y)) 	5((c222C'' 5--///**3444Q--///**3444Q**3444=>>>U## 	E#y)) 7--///**3444C'' 7%++%%#**99;;&,,S#666Q,,S#666=>>>X]]#y)) 7--///**3444C'' 7,,S#6667 #y)) E**3444C'' E !ABBB1""A19J9J--c!!!A#h		DDD %S#..S9	!!FGGG8q==>>"-"4"4":$*>MMM$$S#...r   c                    |                      |          \  }}t          |t                    rnt          |t                    rYt          j        || j                  }|j        dk    rt          d          |                     |||j	        d                    d S t          |t                    r7t          j        |                    | j        d                    d d d f         }nt          j        |          }t          |t                    rNt          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    o|j        d         dk    }|j        d         dk    o|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 |                    d	          }|                                 |                     |||           d S t          j        || j                  }|                                j        |                                j        k    rt          j        ||j                  }|j        dk    rd 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   r0   
ValueError_set_intXintflatr"   arangeindicesr-   
atleast_1dr$   r   r&   _baser9   tocoosum_duplicates_set_arrayXarray_sparsesqueezebroadcast_toreshape_set_arrayXarray)
r   r4   r   r5   r6   ijr9   broadcast_rowbroadcast_cols
             r   __setitem__zIndexMixin.__setitem__]   s1   ))#..Sc9%% 	*S)*D*D 	
1DJ///Av{{ !IJJJc3q	222Fc5!! 	%)S[[A778DACC-$$Cc5!! 	%)S[[A778qqqACx1}}!!!T'l-$$C c**17agFGGG######8A;; 	+v{{dGdGGAJ!O?
aMGAJ!O?
aM" AagajAGAJ&>&>" '?&'gajAGAJ&>&> !?@@@wqzQ!'!*//T""A((Aq11111 
1DJ///Ayy{{ AIIKK$555OAqw//v{{		!'""A!!!Q*****r   c                    | j         \  }}t          |          \  }}t          |          r:t          |          }|| k     s||k    rt	          d|z            |dk     r||z  }n+t          |t                    s|                     ||          }t          |          r:t          |          }|| k     s||k    rt	          d|z            |dk     r||z  }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   r4   MNr5   r6   s         r   r   zIndexMixin._validate_indices   s   z1 %%SS>> 	*c((CaRxx3!88 !>!DEEEQwwqC'' 	*//#q))CS>> 	*c((CaRxx3!88 !AC!GHHHQwwqC'' 	*//#q))CCxr   c                    	 t          j        |          }n/# t          t          t          f$ r}t          d          |d}~ww xY w|j        dvrt          d          |j        dk    r|S |                                }||k    rt          d|z            |	                                }|dk     rQ|| k     rt          d|z            ||u s|j
        j        s|                                }||dk     xx         |z  cc<   |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   r:   r;   	TypeErrorMemoryErrorr&   r$   r0   maxminr	   owndatar(   )r   idxlengthr   emax_indxmin_indxs          r   rQ   zIndexMixin._asindices   s   
	5
3AAI{3 	5 	5 	5_--14	5 6=>>>6Q;;H 5577v6ABBB5577a<<6'!! !:X!EFFFCxxqwxFFHHa!eHHHHHHs    A>Ac                     | j         \  }}t          |          }|| k     s||k    rt          d|z            |dk     r||z  }|                     |t	          d                    S )zGReturn a copy of row i of the matrix, as a (1 x n) row vector.
        rU   r   N)r-   rP   r&   r#   r"   r   rI   rR   rS   s       r   _getrowzIndexMixin._getrow   so     z1FFr66Q!VV6:;;;q55FA""1eDkk222r   c                     | j         \  }}t          |          }|| k     s||k    rt          d|z            |dk     r||z  }|                     t	          d          |          S )zMReturn a copy of column i of the matrix, as a (m x 1) column vector.
        rU   r   N)r-   rP   r&   r'   r"   ra   s       r   _getcolzIndexMixin._getcol   so     z1FFr66Q!VV6:;;;q55FA""5;;222r   c                     t                      Nr   r   r5   r6   s      r   r!   zIndexMixin._get_intXint       !###r   c                     t                      rf   rg   rh   s      r   r%   zIndexMixin._get_intXarray   ri   r   c                     t                      rf   rg   rh   s      r   r#   zIndexMixin._get_intXslice   ri   r   c                     t                      rf   rg   rh   s      r   r'   zIndexMixin._get_sliceXint   ri   r   c                     t                      rf   rg   rh   s      r   r)   zIndexMixin._get_sliceXslice   ri   r   c                     t                      rf   rg   rh   s      r   r*   zIndexMixin._get_sliceXarray   ri   r   c                     t                      rf   rg   rh   s      r   r+   zIndexMixin._get_arrayXint   ri   r   c                     t                      rf   rg   rh   s      r   r,   zIndexMixin._get_arrayXslice   ri   r   c                     t                      rf   rg   rh   s      r   r.   zIndexMixin._get_columnXarray   ri   r   c                     t                      rf   rg   rh   s      r   r3   zIndexMixin._get_arrayXarray   ri   r   c                     t                      rf   rg   r   r5   r6   r   s       r   r<   zIndexMixin._set_intXint   ri   r   c                     t                      rf   rg   rt   s       r   rH   zIndexMixin._set_arrayXarray   ri   r   c                     t          j        |                                | j                  }t	          ||          \  }}|                     |||           d S )Nr   )r   r:   toarrayr   r   rH   )r   r5   r6   r   _s        r   rD   z"IndexMixin._set_arrayXarray_sparse  sQ    Jqyy{{$*555 C((1c3*****r   N)__name__
__module____qualname____doc__r   r7   rM   r   rQ   rb   rd   r!   r%   r#   r'   r)   r*   r+   r,   r.   r3   r<   rH   rD    r   r   r   r      sL          0/ 0/ 0/d2+ 2+ 2+h  0  <	3 	3 	3	3 	3 	3$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $+ + + + +r   r   c                 >   ddl m}m} t          | |t          j        f          r/| j        dk    r$| j        j        dk    r| 	                                S t          |           } t          | t                    rSt          |           dk    r| \  }}nt          |           dk    r| d         t          d          }}nzt          d          t          |           }|| t          d          }}nH|j        dk     rt!          |          t          d          fS |j        dk    r|	                                S  ||          s ||          rt          d          t          |          }t          |          }|t!          |          }|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   )_spbaser9   r   r   r   Nzinvalid number of indiceszoIndexing with sparse matrices is not supported except boolean indexing where matrix and index are equal shapes.)rA   r   r9   r   r   ndarrayr$   r   kindnonzero_check_ellipsistuplelenr"   r&   _compatible_boolean_index_boolean_index_to_array)indexr   r9   r5   r6   r[   bool_rowbool_cols           r   rO   rO     s   
 )(((((((57BJ/00 J!OO 0C 7 7}} E""E % !u::??HCZZ1__QxtCC8999'..;eDkkCCX\\*3//t<<X]];;== x}} ! !  ! ! 	! )--H(--H%h//%h//8Or   c                 l   | t           u rt          d          t          d          fS t          | t                    s| S d t	          |           D             }|s| S t          |          dk    rt          dt          d           |d         }t          |           dk    rt          d          t          d          fS t          |           dk    ra|dk    rD| d         t           u rt          d          t          d          fS t          d          | d         fS | d         t          d          fS g }| |dz   d         D ] }|t           ur|                    |           !|t          |          z   }t          dd|z
            }| d|         t          d          f|z  z   t          |          z   S )z6Process indices with Ellipsis. Returns modified index.Nc                 *    g | ]\  }}|t           u |S r}   )Ellipsis).0rI   vs      r   
<listcomp>z#_check_ellipsis.<locals>.<listcomp>?  s!    HHHda!x-----r   r   z?multi-Ellipsis indexing is deprecated will be removed in v1.13.r   )
stacklevelr   )
r   r"   r   r   	enumerater   r   DeprecationWarningappendrX   )r   ellipsis_indicesfirst_ellipsistailr   ndnslices          r   r   r   6  s   dU4[[))eU##  IHi&6&6HHH 
q  NA	/ 	/ 	/ 	/%a(N 5zzQdU4[[))
5zzQQQx8##dU4[[11$KKq**a%++&& D>!#$$%  HKKNNN	#d))	#BAF^^F.!U4[[N6$99E$KKGGr   c                 R    t          j        |           } | j        j        dk    r| S dS )z8Returns a compatible array if elements are boolean.
    r   N)r   
asanyarrayr   r   r[   s    r   _maybe_bool_ndarrayr   [  s,     -

C
y~
4r   r   c                     |dk     rdS 	 t          t          |           d          }n# t          $ r Y dS w xY wt          |t                    rdS t          ||dz
            S )zQReturns True if first element of the incompatible
    array type is boolean.
    r   NT)nextiterrV   r   bool_first_element_bool)r[   max_dimfirsts      r   r   r   d  s{     {{tT#YY%%   tt% tugai000s   ( 
66c                 b    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)hasattrr   r   r   s    r   r   r   s  s9    
 sF (2377 ("3'''4r   c                 j    | j         dk    rt          d          t          j        |           d         S )Nr   zinvalid index shaper   )r$   r&   r   wherer   s    r   r   r   }  s/    
x!||.///8C==r   )r   )r|   numpyr   warningsr   _sputilsr   rP   integerr    r   r   rO   r   r   r   r   r   r}   r   r   <module>r      s                    "*	  l+ l+ l+ l+ l+ l+ l+ l+^+ + +\"H "H "HJ  1 1 1 1      r   