
    g?                     h    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y)
z0Indexing mixin for sparse array/matrix classes.
    N   )	isintlike)sparrayissparsec                     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       F/var/www/html/venv/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d Zd Zd Zd Zy)
IndexMixinzS
    This class provides common dispatching and validation logic for indexing.
    c                 	   | j                  |      \  }}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| j/                  ||      }nn|j$                  dk(  r| j1                  ||      }nKt)        d      t        |t              r| j3                  ||      }nt        |t              r| j5                  ||      }n|j$                  dk(  r[|j
                  d   dk(  rI|j$                  dk(  s|j
                  d   dk(  r(| j7                  |d d df   |j9                               }nt;        ||      \  }}|j
                  |j
                  k7  rt)        d      |j<                  dk(  r;| j                  t        j>                  |      j
                  | j                        }n| jA                  ||      }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| jB                  d
k(  rPt        |      dk7  rB|j
                  dk(  r| jE                  |g|      S |jG                         j                  |      S |j                  |      S |S )Nr   r    )shapedtype   zindex results in >2 dimensions'number of row and column indices differr   )r   lilr   )$_validate_indiceslen
isinstancer   ndarrayr   item	INT_TYPES_get_intslice
_get_slice
_get_arrayr   	__class__r   reshape_get_intXint_get_intXslicendim_get_intXarray
IndexError_get_sliceXintcopy_get_sliceXslice_get_sliceXarray_get_arrayXint_get_arrayXslice_get_columnXarrayravelr   size
atleast_2d_get_arrayXarrayformat_coo_containertocoo)selfkeyindex	new_shapeidxresrowcols           r   __getitem__zIndexMixin.__getitem__   s   11#6y 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                 ^
   | 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              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,                  |
      }
t1        |	|
      \  }}|j                   |j                   k7  rt3        d      t        |      rd|j                   v ry |j.                  dk(  r
|d    }|d    }|j5                  d      j7                  |j8                  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 |j7                  |j                         }| j?                  |||       y )
Nr   r   r   z&Trying to assign a sequence to an itemr   F)r0   Tzshape mismatch in assignment) r   r   r   toarrayr   asarrayr   r    r#   r7   
ValueError_set_intflatr%   rangeindicesr   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?   _rA   	idx_rangeN	idx_shaperC   rD   ijbroadcast_rowbroadcast_cols                  r   __setitem__zIndexMixin.__setitem__|   s   ))#.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

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;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           	         |t         u r%t        d      f| j                  z  | j                  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        || j                        x}!|j                  |       ||j                  z  }t        |      rt        d      |j                  t        j                  |             |dz  } | j                  |z
  t        d      gz  }|r"||j                  |       n|d| |z   ||d z   }g }	d}
g g }t        |      D ]  \  }}||	j                  d       t	        |t              rWj                  |       | j                  |
   }t!        t#        |j%                  |             }|	j                  |       |
dz  }
t        |      rX| j                  |
   }| |cxk  r|k  sn t        d| d      t'        |dk  r||z   n|      }j                  |       |
dz  }
|j(                  j*                  dk(  r|}|
|j                  z   }| j                  |
| }|j                  |k7  rt        d	| d
| d|j                         j                  |j-                                |j                  t#        |
|             |}
| j                  |
   }| j/                  ||      }j                  |       |j                  |
       |
dz  }
 |
| j                  kD  rt        d| j                   d|
 d      t!        |      dkD  rlt1        fd|D         t3        fddd D              r(dj5                  d D              }d| }t        |      t7        d   j                        |	z   }	n9t!        |      dk(  r+|d   }t7        |   j                        }|	d| |z   |	|d z   }	t!        |	      x}dkD  rt        d| d      t              t        |	      fS )z8Returns two tuples: (index tuple, requested shape tuple)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index (z) out of ranger   zbool index z has shape z instead of zinvalid index ndim. Array is zD. Index needs Dc              3   (   K   | ]	  }|     y wNr   ).0r\   r?   s     r   	<genexpr>z/IndexMixin._validate_indices.<locals>.<genexpr>)  s     ,M!U1X,Ms   c              3   V   K   | ]   }d    j                   |j                   k7   " yw)r   Nr   )re   ix
idx_arrayss     r   rf   z/IndexMixin._validate_indices.<locals>.<genexpr>*  s$     Lr:a=&&"((2Ls   &) c              3   F   K   | ]  }t        |j                          y wrd   )strr   )re   rh   s     r   rf   z/IndexMixin._validate_indices.<locals>.<genexpr>+  s     !EB#bhh-!Es   !zLshape mismatch: indexing arrays could not be broadcast together with shapes r   z*Only 1D or 2D arrays allowed. Index makes )Ellipsisr%   r,   r   r    tuple	enumerater.   appendr   _compatible_boolean_indexr   r   rH   extend_shaper   rL   rM   intr   kindnonzero
_asindicesr   anyjoinlist)r=   r>   	ellps_pos	index_1stprelim_ndimr\   rA   rh   ellip_slicesr[   
index_ndimarray_indicesMs	len_slicerZ   tmp_ndim	mid_shapeshapesmsg	arr_index	arr_shaper,   ri   r?   s                         @@r   r   zIndexMixin._validate_indices   sq    (?$K>DII-tzz99#u%%C		n 	!FAsh($%OPP	  %C'9S>  %q 1#tyyAA"N  $rww&# () )
   C1q +	!, 		K/E$K=@   .%jy1L@9YZCXX	 	
	* !	 FAs{  #C'S![[,s{{2 78	  +a
3KK
+cA$wse>%BCCS1W#'#6S!a
3&%/ KK
8<	88y($%aSI;l288*U  RZZ\*$$U:x%@A%
KK
+ooc1-S!$$Z0a
C!	 D 		!/		{/*UVW  }!*,M},MNJLZ^LL!E*!EE//5h8 o%Z]001I=I1$%a(IU9-334I!*9-	9Iij<QQI	N"Da'I$qQRRU|U9---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   rH   rI   	TypeErrorMemoryErrorr.   r,   r7   maxminr
   owndatar0   )r=   rA   lengthr   emax_indxmin_indxs          r   rw   zIndexMixin._asindices9  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.
        r   r   N)r   rt   r.   r+   r%   r=   r\   MrZ   s       r   _getrowzIndexMixin._getrowW  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.
        r   r   N)r   rt   r.   r/   r%   r   s       r   _getcolzIndexMixin._getcolb  sa     zz1Fr6Q!V6:;;q5FA""5;22r   c                     t               rd   NotImplementedErrorr=   rA   s     r   r$   zIndexMixin._get_intm      !##r   c                     t               rd   r   r   s     r   r&   zIndexMixin._get_slicep  r   r   c                     t               rd   r   r   s     r   r'   zIndexMixin._get_arrays  r   r   c                     t               rd   r   r=   rC   rD   s      r   r*   zIndexMixin._get_intXintv  r   r   c                     t               rd   r   r   s      r   r-   zIndexMixin._get_intXarrayy  r   r   c                     t               rd   r   r   s      r   r+   zIndexMixin._get_intXslice|  r   r   c                     t               rd   r   r   s      r   r/   zIndexMixin._get_sliceXint  r   r   c                     t               rd   r   r   s      r   r1   zIndexMixin._get_sliceXslice  r   r   c                     t               rd   r   r   s      r   r2   zIndexMixin._get_sliceXarray  r   r   c                     t               rd   r   r   s      r   r3   zIndexMixin._get_arrayXint  r   r   c                     t               rd   r   r   s      r   r4   zIndexMixin._get_arrayXslice  r   r   c                     t               rd   r   r   s      r   r5   zIndexMixin._get_columnXarray  r   r   c                     t               rd   r   r   s      r   r9   zIndexMixin._get_arrayXarray  r   r   c                     t               rd   r   r=   rA   r   s      r   rJ   zIndexMixin._set_int  r   r   c                     t               rd   r   r   s      r   rQ   zIndexMixin._set_array  r   r   c                     t               rd   r   r=   rC   rD   r   s       r   rR   zIndexMixin._set_intXint  r   r   c                     t               rd   r   r   s       r   rW   zIndexMixin._set_arrayXarray  r   r   c                     t        j                  |j                         | j                        }t	        ||      \  }}| j                  |||       y )Nr   )r   rH   rG   r   r   rW   )r=   rC   rD   r   rX   s        r   rV   z"IndexMixin._set_arrayXarray_sparse  s>    JJqyy{$**5 C(1c3*r   N)__name__
__module____qualname____doc__rE   r`   r   rw   r   r   r$   r&   r'   r*   r-   r+   r/   r1   r2   r3   r4   r5   r9   rJ   rQ   rR   rW   rV   r   r   r   r   r      s    ]~V+pc.J<	3	3$$$$$$$$$$$$$$$$$+r   r   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iterrL   r    boolr   r   
asanyarrayr   ru   )rA   desired_ndimrh   rX   s       r   rq   rq     s     3		d3i&B<( b$'$r(D)
   mmC 
yy~~
  		s   AB 	BB)r   numpyr   _sputilsr   _baser   r   rt   integerr#   r   r   rq   r   r   r   <module>r      s8      $"**	K+ K+\r   