
    Ug3                        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 Z G d d	          ZddZd Zd ZddZd Zd ZdS )z0Indexing mixin for sparse array/matrix classes.
    )annotations)TYPE_CHECKINGN   )	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       R/var/www/surfInsights/venv3-11/lib/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                P    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)scipy.sparser   
isinstanceNotImplementedError)selfr   s     r   _raise_on_1d_array_slicez#IndexMixin._raise_on_1d_array_slice#   sJ     	)(((((dG$$ 	%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_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_columnXarrayravelr   size	__class__r   
atleast_2dr    _get_arrayXarray)r   keyrowcols       r   __getitem__zIndexMixin.__getitem__3   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    r2   
ValueError_set_intXintflatr$   arangeindicesr/   
atleast_1dr&   r   r(   _baser<   tocoosum_duplicates_set_arrayXarray_sparsesqueezebroadcast_toreshape_set_arrayXarray)
r   r6   r   r7   r8   ijr<   broadcast_rowbroadcast_cols
             r   __setitem__zIndexMixin.__setitem__e   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                ~   ddl m} t          ||t          j        f          rR|j        dk    rG|j        j        dk    r7|j        | j        k    rt          d          |
                                \  }}nt          |          \  }}| j        \  }}dd}t          |          r:t          |          }|| k     s||k    rt          d|z            |dk     r||z  }nJt          |          x} |||d          }n+t          |t                    s|                     ||          }t          |          r:t          |          }|| k     s||k    rt          d|z            |dk     r||z  }nJt          |          x}	 ||	|d          }n+t          |t                    s|                     ||          }||fS )Nr   )_spbaser   r   z.boolean index shape does not match array shapeidxnpt.NDArray[np.bool_]	axis_sizeint	axis_namestrreturnnpt.NDArray[np.int_]c                    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)rS   rU   rW   s      r   _validate_bool_idxz8IndexMixin._validate_indices.<locals>._validate_bool_idx   sg    
 3xx9$$ .y . .s3xx . ."+. .   +3///r   zrow index (%d) out of ranger   r7   zcolumn index (%d) out of rangecolumn)rS   rT   rU   rV   rW   rX   rY   rZ   )rD   rR   r   r   ndarrayr&   r    kindr/   r(   nonzero_unpack_indexr   rV   _compatible_boolean_indexr$   
_asindices)
r   r6   rR   r7   r8   MNr^   bool_rowbool_cols
             r   r!   zIndexMixin._validate_indices   s   """"""sWbj122 	*A#).C"7"7yDJ&& !QRRR{{}}HC$S))HCz1
	0 
	0 
	0 
	0 S>> 		*c((CaRxx3!88 !>!DEEEQwwq3C888hE$$Xq%88CCC'' 	*//#q))CS>> 		*c((CaRxx3!88 !AC!GHHHQwwq3C888hE$$Xq(;;CC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&   r2   maxminr
   owndatar*   )r   rS   lengthr   emax_indxmin_indxs          r   re   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.
        rk   r   N)r/   rV   r(   r%   r$   r   rL   rf   rg   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.
        rk   r   N)r/   rV   r(   r)   r$   rv   s       r   _getcolzIndexMixin._getcol   so     z1FFr66Q!VV6:;;;q55FA""5;;222r   c                    t                      Nr   r   r7   r8   s      r   r#   zIndexMixin._get_intXint       !###r   c                    t                      r{   r|   r}   s      r   r'   zIndexMixin._get_intXarray   r~   r   c                    t                      r{   r|   r}   s      r   r%   zIndexMixin._get_intXslice  r~   r   c                    t                      r{   r|   r}   s      r   r)   zIndexMixin._get_sliceXint  r~   r   c                    t                      r{   r|   r}   s      r   r+   zIndexMixin._get_sliceXslice	  r~   r   c                    t                      r{   r|   r}   s      r   r,   zIndexMixin._get_sliceXarray  r~   r   c                    t                      r{   r|   r}   s      r   r-   zIndexMixin._get_arrayXint  r~   r   c                    t                      r{   r|   r}   s      r   r.   zIndexMixin._get_arrayXslice  r~   r   c                    t                      r{   r|   r}   s      r   r0   zIndexMixin._get_columnXarray  r~   r   c                    t                      r{   r|   r}   s      r   r5   zIndexMixin._get_arrayXarray  r~   r   c                    t                      r{   r|   r   r7   r8   r   s       r   r?   zIndexMixin._set_intXint  r~   r   c                    t                      r{   r|   r   s       r   rK   zIndexMixin._set_arrayXarray  r~   r   c                    t          j        |                                | j                  }t	          ||          \  }}|                     |||           d S )Nr   )r   r=   toarrayr    r   rK   )r   r7   r8   r   _s        r   rG   z"IndexMixin._set_arrayXarray_sparse!  sQ    Jqyy{{$*555 C((1c3*****r   N)__name__
__module____qualname____doc__r   r9   rP   r!   re   rw   ry   r#   r'   r%   r)   r+   r,   r-   r.   r0   r5   r?   rK   rG    r   r   r   r      sM           0/ 0/ 0/d2+ 2+ 2+h. . .`  <	3 	3 	3	3 	3 	3$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $+ + + + +r   r   rY   ctuple[int | slice | npt.NDArray[np.bool_ | np.int_], int | slice | npt.NDArray[np.bool_ | np.int_]]c                
   t          |           } t          | t                    rSt          |           dk    r| \  }}nt          |           dk    r| d         t	          d          }}nmt          d          t          |           }|| t	          d          }}n;|j        dk     r|t	          d          fS |j        dk    r|                                S ddl	m
}  ||          s ||          rt          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 indicesr;   zoIndexing with sparse matrices is not supported except boolean indexing where matrix and index are equal shapes.)_check_ellipsisr   tupler\   r$   r(   rd   r&   rb   rD   r<   )indexr7   r8   rS   r<   s        r   rc   rc   (  s    E""E % !u::??HCZZ1__QxtCC8999'..;eDkkCCX\\d##X]];;== x}} ! !  ! ! 	! 8Or   c                   | 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          |           z
            }| d|         t          d          f|z  z   | |dz   d         z   S )z6Process indices with Ellipsis. Returns modified index.Nc                *    g | ]\  }}|t           u |S r   )Ellipsis).0rL   vs      r   
<listcomp>z#_check_ellipsis.<locals>.<listcomp>W  s!    HHHda!x-----r   r   z0an index can only have a single ellipsis ('...')r      )r   r$   r   r   	enumerater\   r(   rn   )r   ellipsis_indicesrL   
num_slicess       r   r   r   N  s    dU4[[))eU##  IHi&6&6HHH 
q  KLLL 
BAQCJJ''J!9d~
22U1q566]BBr   c                R    t          j        |           } | j        j        dk    r| S dS )z8Returns a compatible array if elements are boolean.
    r   N)r   
asanyarrayr    ra   rS   s    r   _maybe_bool_ndarrayr   c  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iterrl   r   bool_first_element_bool)rS   max_dimfirsts      r   r   r   l  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   rd   rd   {  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   )rY   r   )r   )r   
__future__r   typingr   numpyr   _sputilsr   numpy.typingnptrV   integerr"   r   r   rc   r   r   r   rd   r]   r   r   r   <module>r      s)    " " " " " "                       "*	  F+ F+ F+ F+ F+ F+ F+ F+R# # # #LC C C*  1 1 1 1      r   