
    tKg3                        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y)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       W/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/scipy/sparse/_index.py_broadcast_arraysr      sO     q!$DAq))AGG))AGG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y)
IndexMixinzS
    This class provides common dispatching and validation logic for indexing.
    c                >    ddl m} t        | |      rt        d      y)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#   s)     	)dG$%H  %r   c                "   | j                  |      \  }}t        |t              rt        |t              r| j                  ||      S t        |t              r"| j                          | j                  ||      S |j                  dk(  r"| j                          | j                  ||      S |j                  dk(  r| j                  ||      S t        d      t        |t              rt        |t              r"| j                          | j                  ||      S t        |t              r5|t	        d       k(  r||k(  r| j                         S | j                  ||      S |j                  dk(  r| j                  ||      S t        d      |j                  dk(  rTt        |t              r"| j                          | j                  ||      S t        |t              r| j                  ||      S t        |t              r| j                  ||      S t        |t              rt        d      |j                   d   dk(  rH|j                  dk(  s|j                   d   dk(  r'| j#                  |d d df   |j%                               S t'        ||      \  }}|j                   |j                   k7  rt        d      |j(                  dk(  r:| j+                  t-        j.                  |      j                   | j0                        S | j3                  ||      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   s   ))#.S c9%#y)((c22C'--/**344Q--/**344Q**344=>>U##y)--/**344C'%+%#*99;&,,S#66Q,,S#66=>>XX]#y)--/**344C',,S#66#y)**344C' !ABB1"A19J--c!A#h		DD %S#.S99		!FGG88q=>>"--"4":":$**>MM$$S#..r   c                   | j                  |      \  }}t        |t              rlt        |t              r\t        j                  || j
                        }|j                  dk7  rt        d      | j                  |||j                  d          y t        |t              r6t        j                  |j                  | j                  d          d d d f   }nt        j                  |      }t        |t              rNt        j                  |j                  | j                  d          d d d f   }|j                  dk(  r|d d d f   }nt        j                  |      }t!        ||      \  }}|j                  |j                  k7  rt#        d      ddlm}  ||      r|j                  dk(  r
|d    }|d    }|j                  d   dk(  xr |j                  d   dk7  }|j                  d   dk(  xr |j                  d   dk7  }	|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y |j)                  d	      }|j+                          | j-                  |||       y t        j                  || j
                        }|j/                         j                  |j/                         j                  k7  r t        j0                  ||j                        }|j                  dk(  ry |j3                  |j                        }| j5                  |||       y )
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   s   ))#.Sc9%*S)*D

1DJJ/Avv{ !IJJc3q	2c5!))S[[A78DAC--$Cc5!))S[[A78qACxx1}!T'l--$C c*177aggFGG#A;vv{dGdGGGAJ!O?
aMGGAJ!O?
aM"aggajAGGAJ&>"aggajAGGAJ&> !?@@wwqzQ!''!*/T"A((Aq1 

1DJJ/Ayy{  AIIK$5$55OOAqww/vv{		!''"A!!!Q*r   c                <   ddl m} t        ||t        j                  f      r`|j
                  dk(  rQ|j                  j                  dk(  r8|j                  | j                  k7  rt        d      |j                         \  }}nt        |      \  }}| j                  \  }}	 	 	 	 	 	 	 	 dd}t        |      r/t        |      }|| k  s||k\  rt        d|z        |dk  r@||z  }n:t        |      x} |||d	      }n"t        |t              s| j!                  ||      }t        |      r2t        |      }|| k  s||k\  rt        d
|z        |dk  r||z  }||fS t        |      x}	 ||	|d      }||fS t        |t              s| j!                  ||      }||fS )Nr   )_spbaser   r   z.boolean index shape does not match array shapec                n    t        |       |k7  rt        d| dt        |        d|       t        |       S )Nzboolean z index has incorrect length: z instead of )lenr(   _boolean_index_to_array)idx	axis_size	axis_names      r   _validate_bool_idxz8IndexMixin._validate_indices.<locals>._validate_bool_idx   sL    
 3x9$ yk)Fs3xj Q""+.  +3//r   zrow index (%d) out of ranger   r7   zcolumn index (%d) out of rangecolumn)rV   znpt.NDArray[np.bool_]rW   intrX   strreturnznpt.NDArray[np.int_])rD   rR   r   r   ndarrayr&   r    kindr/   r(   nonzero_unpack_indexr   r[   _compatible_boolean_indexr$   
_asindices)
r   r6   rR   r7   r8   MNrY   bool_rowbool_cols
             r   r!   zIndexMixin._validate_indices   s   "sWbjj12A#))..C"7yyDJJ& !QRR{{}HC$S)HCzz1
	0&
	0
	0 
	0 "	
	0 S>c(CaRx3!8 !>!DEEQwq3C88hE$Xq%8CC'//#q)CS>c(CaRx3!8 !AC!GHHQwq Cx 4C88hE$Xq(;C Cx C'//#q)CCxr   c                   	 t        j                  |      }|j                  dvrt        d      |j                  dk(  r|S |j                         }||k\  rt        d|z        |j                         }|dk  rN|| k  rt        d|z        ||u s|j                  j                  s|j                         }||dk  xx   |z  cc<   |S # t        t        t        f$ r}t        d      |d}~ww xY w)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   rV   lengthr   emax_indxmin_indxs          r   rc   zIndexMixin._asindices   s    
	5

3A 66=>>66Q;H 557v6ABB557a<6'! !:X!EFFCxqwwFFHa!eHH+ I{3 	5_-14	5s   C	 	C.C))C.c                    | j                   \  }}t        |      }|| k  s||k\  rt        d|z        |dk  r||z  }| j                  |t	        d            S )zGReturn a copy of row i of the matrix, as a (1 x n) row vector.
        ri   r   N)r/   r[   r(   r%   r$   r   rL   rd   re   s       r   _getrowzIndexMixin._getrow   sa     zz1Fr6Q!V6:;;q5FA""1eDk22r   c                    | j                   \  }}t        |      }|| k  s||k\  rt        d|z        |dk  r||z  }| j                  t	        d      |      S )zMReturn a copy of column i of the matrix, as a (m x 1) column vector.
        ri   r   N)r/   r[   r(   r)   r$   rt   s       r   _getcolzIndexMixin._getcol   sa     zz1Fr6Q!V6:;;q5FA""5;22r   c                    t               Nr   r   r7   r8   s      r   r#   zIndexMixin._get_intXint       !##r   c                    t               ry   rz   r{   s      r   r'   zIndexMixin._get_intXarray   r|   r   c                    t               ry   rz   r{   s      r   r%   zIndexMixin._get_intXslice  r|   r   c                    t               ry   rz   r{   s      r   r)   zIndexMixin._get_sliceXint  r|   r   c                    t               ry   rz   r{   s      r   r+   zIndexMixin._get_sliceXslice	  r|   r   c                    t               ry   rz   r{   s      r   r,   zIndexMixin._get_sliceXarray  r|   r   c                    t               ry   rz   r{   s      r   r-   zIndexMixin._get_arrayXint  r|   r   c                    t               ry   rz   r{   s      r   r.   zIndexMixin._get_arrayXslice  r|   r   c                    t               ry   rz   r{   s      r   r0   zIndexMixin._get_columnXarray  r|   r   c                    t               ry   rz   r{   s      r   r5   zIndexMixin._get_arrayXarray  r|   r   c                    t               ry   rz   r   r7   r8   r   s       r   r?   zIndexMixin._set_intXint  r|   r   c                    t               ry   rz   r   s       r   rK   zIndexMixin._set_arrayXarray  r|   r   c                    t        j                  |j                         | j                        }t	        ||      \  }}| j                  |||       y )Nr   )r   r=   toarrayr    r   rK   )r   r7   r8   r   _s        r   rG   z"IndexMixin._set_arrayXarray_sparse!  s>    JJqyy{$**5 C(1c3*r   N)__name__
__module____qualname____doc__r   r9   rP   r!   rc   ru   rw   r#   r'   r%   r)   r+   r,   r-   r.   r0   r5   r?   rK   rG    r   r   r   r      sn     0/d2+h.`<	3	3$$$$$$$$$$$$+r   r   c                   t        |       } t        | t              r>t        |       dk(  r| \  }}nt        |       dk(  r| d   t	        d      }}nat        d      t        |       }|| t	        d      }}n;|j                  dk  r|t	        d      fS |j                  dk(  r|j                         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   tuplerT   r$   r(   rb   r&   r`   rD   r<   )indexr7   r8   rV   r<   s        r   ra   ra   (  s     E"E %u:?HCZ1_QxtC899'.;eDkCXX\d##XX];;= }  ! 	! 8Or   c                h   | t         u rt        d      t        d      fS t        | t              s| S t	        |       D cg c]  \  }}|t         u s| }}}|s| S t        |      dkD  rt        d      |\  }t        ddt        |       z
        }| d| t        d      f|z  z   | |dz   d z   S c c}}w )z6Process indices with Ellipsis. Returns modified index.Nr   z0an index can only have a single ellipsis ('...')r      )Ellipsisr$   r   r   	enumeraterT   r(   rl   )r   rL   vellipsis_indices
num_slicess        r   r   r   N  s    dU4[))eU# '0&6H&6da!x-&6H
q KLL 
BAQCJ'J!9d~
22U1q56]BB Is   B.B.c                d    t        j                  |       } | j                  j                  dk(  r| S y)z8Returns a compatible array if elements are boolean.
    r   N)r   
asanyarrayr    r_   rV   s    r   _maybe_bool_ndarrayr   c  s*     --
C
yy~~
r   c                    |dk  ry	 t        t        |       d      }t        |t              ryt        ||dz
        S # t        $ r Y yw xY w)zQReturns True if first element of the incompatible
    array type is boolean.
    r   NT)nextiterrj   r   bool_first_element_bool)rV   max_dimfirsts      r   r   r   l  sW     {T#Y% %ugai00	  s   = 	A	A	c                H    t        | d      st        |       rt        |       S y)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   rb   rb   {  s$    
 sF237"3''r   c                f    | j                   dkD  rt        d      t        j                  |       d   S )Nr   zinvalid index shaper   )r&   r(   r   wherer   s    r   rU   rU     s,    
xx!|.//88C=r   )r]   zctuple[int | slice | npt.NDArray[np.bool_ | np.int_], int | slice | npt.NDArray[np.bool_ | np.int_]])r   )r   
__future__r   typingr   numpyr   _sputilsr   numpy.typingnptr[   integerr"   r   r   ra   r   r   r   rb   rU   r   r   r   <module>r      s\    "    "**	F+ F+R#LC*1r   