
    biG                     t    d Z ddlZddlmZ ddlmZmZ eej                  fZ
d Z G d d      Zd	 Zd
 Zd Zy)z0Indexing mixin for sparse array/matrix classes.
    N   )	isintlike)sparrayissparsec                      t        j                  |  }t        ||       D ]*  \  }}|j                  j                  |j                  _        , |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zipflags	writeable)arraysr	   xas       N/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/scipy/sparse/_index.py_broadcast_arraysr   
   sL     **F3$f- .1GG--.    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 Zd Zy)
IndexMixinzS
    This class provides common dispatching and validation logic for indexing.
    c                 

   t        || j                  | j                        \  }}}}t        |      dkD  rt	        d| j                   d      t        |      dk(  r%|d   }t        |t        j                        r|j                  dk(  r|j                         }t        |t              r| j                  |      }n3t        |t              r| j                  |      }n| j                  |      }t        | t              s|S |j                  dk(  r`|dk7  r[t        |      dk(  r| j                  |g|| j                         S t        |      dk(  r | j                  |gg|| j                         S |j#                  |      S |\  }}t        |t              rt        |t              r| j%                  ||      }n`t        |t              r| j'                  ||      }n<|j(                  dk(  r| j+                  ||      }n|j(                  dk(  r| j+                  ||      }nt	        d      t        |t              rt        |t              r| j-                  ||      }nt        |t              r9|t        d       k(  r||k(  r| j/                         }n| j1                  ||      }nn|j(                  dk(  r| j3                  ||      }nKt	        d      t        |t              r| j5                  ||      }nt        |t              r| j7                  ||      }n|j(                  dk(  r[|j                  d   dk(  rI|j(                  dk(  s|j                  d   dk(  r(| j9                  |d d df   |j;                               }nt=        ||      \  }}|j                  |j                  k7  rt	        d	      |j>                  dk(  r;| j                  t        j@                  |      j                  | j                   
      }n| jC                  ||      }t        | t              sY|dk(  st        |      dk(  r|j(                  dk7  r|S t        |      dk(  rd|z   }||j                  k(  r|S |j#                  |      S |j                  |k7  rp| j                  dk(  rPt        |      dk7  rB|j                  dk(  r| jE                  |g|      S |jG                         j#                  |      S |j#                  |      S |S )N   z/Indexing that leads to >2D is not supported by z% format. Try converting to COO formatr   r    )shapedtypezindex results in >2 dimensions'number of row and column indices differr   )r   lilr   )$_validate_indicesr   formatlen
IndexError
isinstancer   ndarrayitem	INT_TYPES_get_intslice
_get_slice
_get_arrayr   	__class__r   reshape_get_intXint_get_intXslicendim_get_intXarray_get_sliceXintcopy_get_sliceXslice_get_sliceXarray_get_arrayXint_get_arrayXslice_get_columnXarrayravelr   size
atleast_2d_get_arrayXarray_coo_containertocoo)	selfkeyindex	new_shape_idxresrowcols	            r   __getitem__zIndexMixin.__getitem__   s8   !23

DKK!Py!Qy>AN $},QS T T u:?(C#rzz*99?((*C#y)mmC(C'ooc*ooc* dG,
yyB9?y>Q&>>3%y

>SSy>Q&>>C5'$**>UU;;y)) S c9%#y)''S1C'))#s3Q))#s3Q))#s3 !ABBU##y)))#s3C'%+%#*))+C//S9CQ++C5 !ABB#y)))#s3C'++C5((a-CIIaLA$5XX]ciila&7,,SAY		D -S#6S99		)$%NOO88q=..s);)A)A.TC//S9C $(B3y>Q#6388q=
9~" 9,	#syy03Lckk)6LL 99	!{{e#I!(;99?..ui.HHyy{**955;;y))
r   c                 
   t        || j                  | j                        \  }}}}t        |      dk(  r|d   }t	        |      r|j                         }n!t        j                  || j                        }t        |t              r:|j                  dk7  rt        d      | j                  ||j                  d          y t        |t              rt!        |j#                  | j                  d          }t        |      }|dk(  r2|j                  dk(  r#| j                  |d   |j                  d          y t        j$                  |j#                  | j                  d          }|j                  }	n|j'                         j                  }	|j'                         j                  |	k7  r t        j(                  ||j                        }|j                  dk7  r| j+                  ||       y |\  }
}t        |
t              rt        |t              rxt	        |      r|j                         }n!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   }|
j0                  dk(  r|
d d d f   }
nt        j.                  |      }t3        |
|      \  }}|j                  |j                  k7  rt5        d      t	        |      rd|j                  v ry |j0                  dk(  r
|d    }|d    }|j7                  d      j9                  |j:                  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=                          | j?                  |||       y t        j                  || j                        }|j'                         j                  |j'                         j                  k7  r t        j(                  ||j                        }|j                  dk(  ry |j9                  |j                        }| jA                  |||       y )
Nr   r   r   z&Trying to assign a sequence to an itemr   F)r1   Tzshape mismatch in assignment)!r   r   r   r    r   toarrayr   asarrayr   r"   r%   r8   
ValueError_set_intflatr'   rangeindicesarangesqueezebroadcast_to
_set_array_set_intXint
atleast_1dr.   r   r!   r<   r+   _shape_as_2dsum_duplicates_set_arrayXarray_sparse_set_arrayXarray)r=   r>   r   r?   r@   rA   rB   	idx_rangeN	idx_shaperD   rE   ijbroadcast_rowbroadcast_cols                   r   __setitem__zIndexMixin.__setitem__   s"   !23

DKK!Py!Q u:?(C{IIKJJq

3#y)66Q;$%MNNc166!9-#u% "3;;tzz!}#=>		N6affkMM)A,q	:iiTZZ]!;<II	KKM//	yy{  I-OOAsyy1vv{Q' Sc9%*S)*D{IIKJJq

3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;AGG|vv{dGdGU#++ANN+FAGGAJ!O?
aMGGAJ!O?
aM"aggajAGGAJ&>"aggajAGGAJ&> !?@@((Aq1 

1DJJ/Ayy{  AIIK$5$55OOAqww/vv{		!''"A!!!Q*r   c                     | j                   \  }}t        |      }|| k  s||k\  rt        d| d      |dk  r||z  }| j                  |t	        d            S )zGReturn a copy of row i of the matrix, as a (1 x n) row vector.
        index () out of ranger   N)r   intr!   r-   r'   r=   r\   MrZ   s       r   _getrowzIndexMixin._getrow   sd     zz1Fr6Q!Vwqc899q5FA""1eDk22r   c                     | j                   \  }}t        |      }|| k  s||k\  rt        d| d      |dk  r||z  }| j                  t	        d      |      S )zMReturn a copy of column i of the matrix, as a (m x 1) column vector.
        rb   rc   r   N)r   rd   r!   r0   r'   re   s       r   _getcolzIndexMixin._getcol   sd     zz1Fr6Q!Vwqc899q5FA""5;22r   c                     t               NNotImplementedErrorr=   rB   s     r   r&   zIndexMixin._get_int       !##r   c                     t               rk   rl   rn   s     r   r(   zIndexMixin._get_slice   ro   r   c                     t               rk   rl   rn   s     r   r)   zIndexMixin._get_array   ro   r   c                     t               rk   rl   r=   rD   rE   s      r   r,   zIndexMixin._get_intXint   ro   r   c                     t               rk   rl   rs   s      r   r/   zIndexMixin._get_intXarray   ro   r   c                     t               rk   rl   rs   s      r   r-   zIndexMixin._get_intXslice   ro   r   c                     t               rk   rl   rs   s      r   r0   zIndexMixin._get_sliceXint  ro   r   c                     t               rk   rl   rs   s      r   r2   zIndexMixin._get_sliceXslice  ro   r   c                     t               rk   rl   rs   s      r   r3   zIndexMixin._get_sliceXarray  ro   r   c                     t               rk   rl   rs   s      r   r4   zIndexMixin._get_arrayXint  ro   r   c                     t               rk   rl   rs   s      r   r5   zIndexMixin._get_arrayXslice  ro   r   c                     t               rk   rl   rs   s      r   r6   zIndexMixin._get_columnXarray  ro   r   c                     t               rk   rl   rs   s      r   r:   zIndexMixin._get_arrayXarray  ro   r   c                     t               rk   rl   r=   rB   r   s      r   rK   zIndexMixin._set_int  ro   r   c                     t               rk   rl   r~   s      r   rR   zIndexMixin._set_array  ro   r   c                     t               rk   rl   r=   rD   rE   r   s       r   rS   zIndexMixin._set_intXint  ro   r   c                     t               rk   rl   r   s       r   rX   zIndexMixin._set_arrayXarray   ro   r   c                     t        j                  |j                         | j                        }t	        ||      \  }}| j                  |||       y )Nr   )r   rI   rH   r   r   rX   )r=   rD   rE   r   rA   s        r   rW   z"IndexMixin._set_arrayXarray_sparse#  s>    JJqyy{$**5 C(1c3*r   N)__name__
__module____qualname____doc__rF   r`   rg   ri   r&   r(   r)   r,   r/   r-   r0   r2   r3   r4   r5   r6   r:   rK   rR   rS   rX   rW   r   r   r   r   r      sy    `DY+v	3	3$$$$$$$$$$$$$$$$$+r   r   c           	      H	   t        |      }| t        u rt        d      f|z  |g g fS t        | t              s| g} d}g }d}t        |       D ]  \  }}|t        u r|t        d      |}||j                  |       2t        |t              st        |      r|j                  |       |dz  }dt        ||      x}	!|j                  |	       ||	j                  z  }t        |      rt        d      |j                  t        j                  |             |dz  } ||kD  rt        d|  d| d| d	      ||z
  t        d      gz  }
|
r"||j                  |
       n|d| |
z   ||d z   }g }d}g g }g }g }t        |      D ]  \  }}|,|j                  t        |             |j                  d       5t        |t              rMj                  |       ||   }t        t        |j!                  |             }|j                  |       |dz  }t        |      r_||   }| |cxk  r|k  sn t        d
| d      t#        |dk  r||z   n|      }j                  |       |j                  |       |dz  }|j$                  j&                  dk(  r||j                  z   }||| }|j(                  |k7  rt        d| d| d|j(                         j                  |j+                                |j                  t        ||             |j                  t        ||             |}||   }t-        |||      }j                  |       |j                  |       |j                  |       |dz  } t        |      dkD  rt/        fd|D         t1        fddd D              r(dj3                  d D              }d| }t        |      t5        |      D ]
  \  }}||<    d   j(                  }t        |      |d   |d   z
  dz   k7  rt7        |      |z   }nY|d   }|d| t7        |      z   ||d z   }n<t        |      dk(  r.|d      j(                  }|d   }|d| t7        |      z   ||d z   }t	              t	        |      ||fS )a  Returns four sequences: (index, requested shape, arrays, nones)

    index : tuple of validated idx objects. bool arrays->nonzero(),
            arrays broadcast, ints and slices as they are, Nones removed
    requested shape : the shape of the indexed space, including Nones
    arr_pos : position within index of all arrays or ints (for array fancy indexing)
    none_pos : insert positions to put newaxis coords in indexed space.
    Nr   z(an index can only have a single ellipsisr   zoIndexing with sparse matrices is not supported except boolean indexing where matrix and index are equal shapes.z<Too many indices for array or tuple index out of range. Key z needs zD. Array is Drb   rc   bzbool index z has shape z instead of c              3   (   K   | ]	  }|     y wrk   r   ).0r\   r?   s     r   	<genexpr>z$_validate_indices.<locals>.<genexpr>  s     (Iaq(Is   c              3   V   K   | ]   }d    j                   |j                   k7   " yw)r   Nr   )r   ix
idx_arrayss     r   r   z$_validate_indices.<locals>.<genexpr>  s$     H2z!}""bhh.Hs   &) c              3   F   K   | ]  }t        |j                          y wrk   )strr   )r   r   s     r   r   z$_validate_indices.<locals>.<genexpr>  s     Ac"((mAs   !zLshape mismatch: indexing arrays could not be broadcast together with shapes )r    Ellipsisr'   r"   tuple	enumerater!   appendr   _compatible_boolean_indexr.   r   r   rI   extendrM   rN   rd   r   kindr   nonzero
_asindicesr   anyjoinr
   list)r>   
self_shapeself_format	self_ndim	ellps_pos	index_1stprelim_ndimr\   rB   r   ellip_slicesr[   
index_ndimarray_indicesnone_positionsarr_int_posMs	len_slicerZ   tmp_ndim	mid_shapeshapesmsgarr	arr_shapearr_posr   r?   s                             @@r   r   r   *  s    JI
hd~	):r2==c5!e IIKC. 3(?$ !KLLI[S!U#y~S!1K-c9==bJR 277"Kc]$% %
 RZZ_-1K-. Y%w{m<	{!E
 	
 +d}<L\*!*9-<y?TTI IJEMNKI& $3;!!#i.1QU#LLJ'BE3;;r?34IY'!OJs^:&AB#MM 73%~!>??qcAgc2CLLz*!OJYY^^s"!CHH,H":h7IyyI% !!K	{,syykR  LL'  z8!<=uZ:;!J:&AS![1CLLz*  ,!OJI$J =A&(I=(IJ
HABHHXXAjAAF++1(4CS/!-4 	FAsE!H	qM''	 {B+a. @1 DEY)3I!!nG!(7+d9o=	'(@SSI	]	q	 -*+11	a.hw'$y/9Igh<OO	<y);FFr   c                    	 t        j                  |       }|dk7  r&|j                  dvrt        d|j                         |dk(  r|S |j                  dk(  r|S |j                         }||k\  rt        d| d	      |j                         }|dk  rO|| k  rt        d| d	      || 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coo)r   r   z$Index dimension must be 1 or 2. Got r   r   rb   rc   )r   rI   rJ   	TypeErrorMemoryErrorr!   r.   r8   maxminr   owndatar1   )rB   lengthr   r   emax_indxmin_indxs          r   r   r     s   
1ZZ_ 277&0?yIJJ 		ww!|	 vvxH678*N;<<vvxH!|vgwxj?@@9BHH,,B
26
f
I3 	;/ 1)q01s   C$ $D	8DD	c                 8   t        | d      sd	 t        t        |       d      }t        |      D ])  }t	        |t
              r nt        t        |      d      }+ y	 t        j                  |       } | j                  j                  dk(  r| S y# t        $ r Y yw xY w)zICheck for boolean array or array-like. peek before asarray for array-liker.   Nr   )hasattrnextiterrM   r"   boolr   r   
asanyarrayr   r   )rB   desired_ndimr   rA   s       r   r   r     s     3		d3i&B<( b$'$r(D)
   mmC 
yy~~
  		s   AB 	BB)r   numpyr   _sputilsr   _baser   r   rd   integerr%   r   r   r   r   r   r   r   r   <module>r      sF      $"**	N+ N+bHGV Fr   