
    _Mh?                     f    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S )
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       S/var/www/html/test/jupyter/venv/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 Zd Zd Zd ZdS )
IndexMixinzS
    This class provides common dispatching and validation logic for indexing.
    c                 
   |                      |          \  }}t          |          dk    rL|d         }t          |t          j                  r|j        dk    r|                                }t          |t                    r|                     |          }n@t          |t                    r| 
                    |          }n|                     |          }t          | t                    s|S |j        dk    ri|dk    rct          |          dk    r|                     |g|| j                  S t          |          dk    r|                     |gg|| j                  S |                    |          S |\  }}t          |t                    rt          |t                    r|                     ||          }nt          |t                    r|                     ||          }np|j        dk    r|                     ||          }nM|j        dk    r|                     ||          }n*t)          d          t          |t                    rt          |t                    r|                     ||          }nt          |t                    rG|t          d           k    r||k    r|                                 }n|                     ||          }n}|j        dk    r|                     ||          }nZt)          d          t          |t                    r|                     ||          }nt          |t                    r|                     ||          }n|j        dk    r`|j        d         dk    rO|j        dk    s|j        d         dk    r3|                     |d d df         |                                          }nt;          ||          \  }}|j        |j        k    rt)          d          |j        dk    r4|                     t          j        |          j        | j                  }n|                      ||          }t          | t                    s`|dk    st          |          dk    r|j        dk    r|S t          |          dk    rd	|z   }||j        k    r|n|                    |          S |j        |k    r}| j!        d
k    r]t          |          dk    rJ|j        dk    r| "                    |g|          S |#                                                    |          S |                    |          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6y u::??(C#rz** %9??((**C#y)) +mmC((C'' +ooc**ooc** dG,, 
yB9??y>>Q&&>>3%y
>SSSy>>Q&&>>C5'$*>UUU;;y))) S c9%% )	:#y)) 	C''S11C'' C))#s33Q))#s33Q))#s33 !ABBBU## 	:#y)) 
C))#s33C'' C%++%%#**))++CC//S99CCQ++C55 !ABBB#y)) :))#s33C'' :++C55(a--CIaLA$5$5X]]cila&7&7,,SAY		DD -S#66S9	))$%NOOO8q==..s););)A.TTCC//S99C $(( 	MB3y>>Q#6#638q==
9~~"" 9,	#sy0033ckk)6L6LL 9	!!{e##I!(;(;9??..ui.HHHyy{{**9555;;y)))
r   c                 
   |                      |          \  }}t          |          dk    r|d         }t          |          r|                                }nt	          j        || j                  }t          |t                    r=|j	        dk    rt          d          |                     ||j        d                    d S t          |t                    rt          |                    | j        d                    }t          |          }|dk    r4|j	        dk    r)|                     |d         |j        d                    d S t	          j        |                    | j        d                    }|j        }n|                                j        }|                                j        |k    rt	          j        ||j                  }|j	        dk    r|                     ||           d S |\  }	}
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        |
          }
t1          |	|
          \  }}|j        |j        k    rt3          d          t          |          rd|j        v rd S |j        dk    r|d          }|d          }|                    d                              |j        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	          |                                 |                     |||           d S t	          j        || j                  }|                                j        |                                j        k    rt	          j        ||j                  }|j	        dk    rd S |                    |j                  }|                     |||           d S )
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{{ 4IIKKJq
333#y)) 6Q;;$%MNNNc16!9---#u%% 0 "3;;tz!}#=#=>		NN66afkkMM)A,q	:::FiTZ]!;!;<I		KKMM/	yy{{ I--OAsy11v{{Q'''F 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A;; 	+AG||v{{dGdGU##++AN+FFAGAJ!O?
aMGAJ!O?
aM" AagajAGAJ&>&>" '?&'gajAGAJ&>&> !?@@@((Aq11111 
1DJ///Ayy{{ AIIKK$555OAqw//v{{		!'""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          |}"||                    |           :t	          |t                    st          |          r|                    |           |dz  }yt          || j                  x} |                    |           ||j        z  }t          |          rt          d          |                    t          j        |                     |dz  }| j        |z
  t          d          gz  }|r0||                    |           n|d|         |z   ||d         z   }g }	d}
g g }t          |          D ]\  }}||	                    d           t	          |t                    rf                    |           | j        |
         }t!          t#          |                    |                     }|	                    |           |
dz  }
t          |          rf| j        |
         }| |cxk    r|k     sn t          d| d          t'          |dk     r||z   n|          }                    |           |
dz  }
|j        j        dk    r|}|
|j        z   }| j        |
|         }|j        |k    rt          d	| d
| d|j                                       |                                           |                    t#          |
|                     |}
| j        |
         }|                     ||          }                    |           |                    |
           |
dz  }
|
| j        k    rt          d| j         d|
 d          t!          |          dk    rt1          fd|D              t3          fddd         D                       r3d                    d D                       }d| }t          |          t7          d         j                  |	z   }	nMt!          |          dk    r:|d         }t7          |         j                  }|	d|         |z   |	|d         z   }	t!          |	          x}dk    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   | ]}|         V  d S Nr   ).0r\   r?   s     r   	<genexpr>z/IndexMixin._validate_indices.<locals>.<genexpr>)  s'      ,M,M!U1X,M,M,M,M,M,Mr   c              3   D   K   | ]}d          j         |j         k    V  dS )r   Nr   )re   ix
idx_arrayss     r   rf   z/IndexMixin._validate_indices.<locals>.<genexpr>*  s1      LLr:a=&"(2LLLLLLr    c              3   >   K   | ]}t          |j                  V  d S rd   )strr   )re   rh   s     r   rf   z/IndexMixin._validate_indices.<locals>.<genexpr>+  s*      !E!EB#bh--!E!E!E!E!E!Er   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   s    (??$KK>DI-tz99#u%% 	%C		nn 	! 	!FAsh($%OPPP		  %%%%C'' !9S>> !  %%%q 1#tyAAA"N  $$$rw&# ! () ) )
   C111q 	K/E$KK=@ 	Y   ....%jyj1L@9YZZCXX	 	
	** !	  !	 FAs{  ####C''  S!!![,s{{2 788	  +++a

3  K
+cA$%Bs%B%B%BCCCS1WW#''#66S!!!a

3&&%/ K
8(;<	8y(($UaUUIUU28UU   RZZ\\***$$U:x%@%@AAA%

K
+ooc1--S!!!$$Z000a

	!!W	WW*WWW   }!!*,M,M,M,M},M,M,MNJLLLLZ^LLLLL &!E!E*!E!E!EEE8/58 8 oo%Z]011I=II1$$%a(IU9-344I!*9*-	9Iijj<QQI	NN"Da''Q$QQQRRRU||U9----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   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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.
        r   r   N)r   rt   r.   r+   r%   r=   r\   MrZ   s       r   _getrowzIndexMixin._getrowW  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.
        r   r   N)r   rt   r.   r/   r%   r   s       r   _getcolzIndexMixin._getcolb  so     z1FFr66Q!VV6:;;;q55FA""5;;2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                  }t	          ||          \  }}|                     |||           d S )Nr   )r   rH   rG   r   r   rW   )r=   rC   rD   r   rX   s        r   rV   z"IndexMixin._set_arrayXarray_sparse  sQ    Jqyy{{$*55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+ V+ V+pc. c. c.J  <	3 	3 	3	3 	3 	3$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $+ + + + +r   r   c                 b   t          | d          s	 t          t          |           d          }t          |          D ]6}t	          |t
                    r n t          t          |          d          }7dS n# t          $ r Y dS w xY wt          j        |           } | j	        j
        dk    r| S dS )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 !		d3ii&&B<((  b$'' E$r((D))t   	 	 	44	 mC  
y~
4s   A#A8 8
BB)r   numpyr   _sputilsr   _baser   r   rt   integerr#   r   r   rq   r   r   r   <module>r      s               $ $ $ $ $ $ $ $"*	  K+ K+ K+ K+ K+ K+ K+ K+\    r   