
    xf2                         d Z ddlZddlmZ ddlmZ eej                  fZ	d Z
 G d d      Zd	 Zd
 Zd ZddZd Zd Zy)z*Indexing mixin for sparse matrix classes.
    N)warn   )	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       5/usr/lib/python3/dist-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                 2    | j                   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.
        zcWe have not yet implemented 1D sparse slices; please index using explicit indices, e.g. `x[:, [0]]`N)	_is_arrayNotImplementedError)selfs    r   _raise_on_1d_array_slicez#IndexMixin._raise_on_1d_array_slice   s#     >>%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_indices
isinstance	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__+   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   r0   
ValueError_set_intXintflatr"   arangeindicesr-   
atleast_1dr$   r   r&   _baser9   tocoosum_duplicates_set_arrayXarray_sparsesqueezebroadcast_toreshape_set_arrayXarray)
r   r4   r   r5   r6   ijr9   broadcast_rowbroadcast_cols
             r   __setitem__zIndexMixin.__setitem__]   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                    | j                   \  }}t        |      \  }}t        |      r/t        |      }|| k  s||k\  rt	        d|z        |dk  r(||z  }n"t        |t              s| j                  ||      }t        |      r2t        |      }|| k  s||k\  rt	        d|z        |dk  r||z  }||fS t        |t              s| j                  ||      }||fS )Nzrow index (%d) out of ranger   zcolumn index (%d) out of range)r-   _unpack_indexr   intr&   r   r"   
_asindices)r   r4   MNr5   r6   s         r   r   zIndexMixin._validate_indices   s    zz1 %SS>c(CaRx3!8 !>!DEEQwqC'//#q)CS>c(CaRx3!8 !AC!GHHQwq 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$   r0   maxminr	   owndatar(   )r   idxlengthr   emax_indxmin_indxs          r   rQ   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.
        rU   r   N)r-   rP   r&   r#   r"   r   rI   rR   rS   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.
        rU   r   N)r-   rP   r&   r'   r"   ra   s       r   _getcolzIndexMixin._getcol   sa     zz1Fr6Q!V6:;;q5FA""5;22r   c                     t               Nr   r   r5   r6   s      r   r!   zIndexMixin._get_intXint       !##r   c                     t               rf   rg   rh   s      r   r%   zIndexMixin._get_intXarray   ri   r   c                     t               rf   rg   rh   s      r   r#   zIndexMixin._get_intXslice   ri   r   c                     t               rf   rg   rh   s      r   r'   zIndexMixin._get_sliceXint   ri   r   c                     t               rf   rg   rh   s      r   r)   zIndexMixin._get_sliceXslice   ri   r   c                     t               rf   rg   rh   s      r   r*   zIndexMixin._get_sliceXarray   ri   r   c                     t               rf   rg   rh   s      r   r+   zIndexMixin._get_arrayXint   ri   r   c                     t               rf   rg   rh   s      r   r,   zIndexMixin._get_arrayXslice   ri   r   c                     t               rf   rg   rh   s      r   r.   zIndexMixin._get_columnXarray   ri   r   c                     t               rf   rg   rh   s      r   r3   zIndexMixin._get_arrayXarray   ri   r   c                     t               rf   rg   r   r5   r6   r   s       r   r<   zIndexMixin._set_intXint   ri   r   c                     t               rf   rg   rt   s       r   rH   zIndexMixin._set_arrayXarray   ri   r   c                     t        j                  |j                         | j                        }t	        ||      \  }}| j                  |||       y )Nr   )r   r:   toarrayr   r   rH   )r   r5   r6   r   _s        r   rD   z"IndexMixin._set_arrayXarray_sparse  s>    JJqyy{$**5 C(1c3*r   N)__name__
__module____qualname____doc__r   r7   rM   r   rQ   rb   rd   r!   r%   r#   r'   r)   r*   r+   r,   r.   r3   r<   rH   rD    r   r   r   r      sm    0/d2+h0<	3	3$$$$$$$$$$$$+r   r   c                    ddl m}m} t        | |t        j
                  f      r8| j                  dk(  r)| j                  j                  dk(  r| j                         S t        |       } t        | t              r>t        |       dk(  r| \  }}nt        |       dk(  r| d   t        d      }}njt        d      t        |       }|| t        d      }}nD|j                  dk  rt!        |      t        d      fS |j                  dk(  r|j                         S  |      s |      rt        d      t        |      }t        |      }|t!        |      }|t!        |      }||fS )	z Parse index. Always return a tuple of the form (row, col).
    Valid type for row/col is integer, slice, or array of integers.
    r   )_spbaser9   r   r   r   Nzinvalid number of indiceszoIndexing with sparse matrices is not supported except boolean indexing where matrix and index are equal shapes.)rA   r   r9   r   r   ndarrayr$   r   kindnonzero_check_ellipsistuplelenr"   r&   _compatible_boolean_index_boolean_index_to_array)indexr   r9   r5   r6   r[   bool_rowbool_cols           r   rO   rO     sH   
 )57BJJ/0JJ!O 0 0C 7}} E"E %u:?HCZ1_QxtC899'.;eDkCXX\*3/t<<XX];;= }  ! 	! )-H(-H%h/%h/8Or   c                    | 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        |       dk(  rt        d      t        d      fS t        |       dk(  rF|dk(  r1| d   t         u rt        d      t        d      fS t        d      | d   fS | d   t        d      fS g }| |dz   d D ]  }|t         us|j                  |        |t        |      z   }t        dd|z
        }| d| t        d      f|z  z   t        |      z   S c c}}w )z6Process indices with Ellipsis. Returns modified index.Nr   z?multi-Ellipsis indexing is deprecated will be removed in v1.13.r   )
stacklevelr   )
Ellipsisr"   r   r   	enumerater   r   DeprecationWarningappendrX   )r   rI   vellipsis_indicesfirst_ellipsistailndnslices           r   r   r   6  sz   dU4[))eU# '0&6Hda!x-HH
q NA	/%a(N 5zQdU4[))
5zQQQx8#dU4[11$Kq**a%+&& D>!#$% HKKN 
#d)	#BAF^F.!U4[N6$99E$KGG3 Is   EEc                 d    t        j                  |       } | j                  j                  dk(  r| S y)z8Returns a compatible array if elements are boolean.
    r   N)r   
asanyarrayr   r   r[   s    r   _maybe_bool_ndarrayr   [  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iterrV   r   bool_first_element_bool)r[   max_dimfirsts      r   r   r   d  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   r   r   s  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   r   r   }  s,    
xx!|.//88C=r   )r   )r|   numpyr   warningsr   _sputilsr   rP   integerr    r   r   rO   r   r   r   r   r   r}   r   r   <module>r      sT      "**	l+ l+^+\"HJ1r   