o
    Th?                     @   sT   d Z ddlZddlmZ ddlmZmZ eej	fZ
dd ZG dd	 d	Zd
d ZdS )z0Indexing mixin for sparse array/matrix classes.
    N   )	isintlike)sparrayissparsec                 C   s0   t | |\}}| 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y r   S/home/air/segue/gpt/backup/venv/lib/python3.10/site-packages/scipy/sparse/_index.py_broadcast_arrays
   s   	r   c                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2S )3
IndexMixinzS
    This class provides common dispatching and validation logic for indexing.
    c                 C   st  |  |\}}t|dkrq|d }t|tjr |jdkr | }t|tr+| |}nt|t	r6| 
|}n| |}t| tsB|S |jdkrl|dkrlt|dkr[| j|g|| jdS t|dkrl| j|gg|| jdS ||S |\}}t|trt|tr| ||}nt|t	r| ||}n|jdkr| ||}n|jdkr| ||}ntdt|t	rt|tr| ||}nt|t	r|t	d kr||kr|  }n| ||}n|jdkr| ||}nstdt|tr| ||}nct|t	r| ||}nV|jdkr.|jd dkr.|jdks|jd dkr.| |d d df | }n+t||\}}|j|jkr@td|jdkrS| jt|j| jd}n|  ||}t| ts|dksqt|dkrs|jdkrs|S t|dkr~d	| }||jkr|S ||S |j|kr| j!d
krt|dkr|jdkr| j"|g|dS |# |S ||S |S )Nr   r   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colr   r   r   __getitem__   s   
















$
zIndexMixin.__getitem__c                 C   sp  |  |\}}t|dkr|d }t|r| }ntj|| jd}t|tr;|j	dkr0t
d| ||jd  d S t|trst|| jd  }t|}|dkrd|j	dkrd| |d |jd  d S tj|| jd  }|j}n| j}| j|krt||j}|j	dkr| || d S |\}	}
t|	trt|
trtj|| jd}|j	dkrt
d| |	|
|jd  d S t|	trtj|	| jd  d d d f }	nt|	}	t|
trtj|
| jd  d d d f }
|	jdkr|	d d d f }	nt|
}
t|	|
\}}|j|jkrtdt|rd|jv r"d S |jdkr0|d  }|d  }|jddj|jdd}|jd dkoJ|jd dk}|jd dkoY|jd dk}|sh|jd |jd krv|sz|jd |jd kszt
d	|  | ||| d S tj|| jd}| j| jkrt||j}|j	dkrd S ||j}| ||| d S )
Nr   r   r   z&Trying to assign a sequence to an itemr   F)r+   Tzshape mismatch in assignment) r   r   r   toarrayr   asarrayr   r   r   r2   
ValueError_set_intflatr    rangeindicesr   arangesqueezebroadcast_to
_set_array_set_intXint
atleast_1dr'   r   r)   r7   r$   _shape_as_2dsum_duplicates_set_arrayXarray_sparse_set_arrayXarray)r8   r9   r   r:   _r<   	idx_rangeN	idx_shaper>   r?   ijbroadcast_rowbroadcast_colr   r   r   __setitem__|   s   







$

"


zIndexMixin.__setitem__c                    s  |t u rtdf| j | jfS t|ts|g}d}g }d}t|D ]Y\}}|t u r4|dur1td|}q!|du r>|| q!t|tsGt	|rQ|| |d7 }q!t
|| j }durf|| ||j7 }q!t|rntd|t| |d7 }q!| j| tdg }|r|du r|| n|d| | ||d  }g }	d}
g g }t|D ]\}}|du r|	d qt|trۈ| | j|
 }tt|| }|	| |
d7 }
qt	|r| j|
 }| |  kr|k sn td| dt|dk r|| n|}| |
d7 }
q|jjdkrK|}|
|j }| j|
| }|j|kr9td	| d
| d|j |  |t|
| |}
q| j|
 }| ||}| ||
 |
d7 }
q|
| jkrwtd| j d|
 dt|dkrtfdd|D   t fdd dd D rddd  D }d| }t|t d j|	 }	n t|dkr|d }t| j}|	d| | |	|d  }	t|	 }dkrt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   s    | ]} | V  qd S Nr   ).0rV   )r:   r   r   	<genexpr>)  s    z/IndexMixin._validate_indices.<locals>.<genexpr>c                 3   s     | ]} d  j |j kV  qdS )r   Nr   r]   ix)
idx_arraysr   r   r^   *  s     c                 s   s    | ]}t |jV  qd S r\   )strr   r_   r   r   r   r^   +  s    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   rB   extend_shaper   rF   rG   intr   kindnonzero
_asindicesr   anyjoinlist)r8   r9   	ellps_pos	index_1stprelim_ndimrV   r<   r`   ellip_slicesrU   
index_ndimarray_indicesMs	len_slicerT   tmp_ndim	mid_shapeshapesmsg	arr_index	arr_shaper'   r   )ra   r:   r   r      s   


















 zIndexMixin._validate_indicesc              
   C   s   zt |}W n tttfy } ztd|d}~ww |jdvr%td|jdkr,|S | }||kr:td| |	 }|dk rc|| k rMtd| ||u sU|j
jsY| }||dk   |7  < |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   rB   rC   	TypeErrorMemoryErrorr)   r'   r2   maxminr   owndatar+   )r8   r<   lengthr   emax_indxmin_indxr   r   r   rn   9  s*   



zIndexMixin._asindicesc                 C   sP   | j \}}t|}|| k s||krtd| |dk r ||7 }| |tdS )zGReturn a copy of row i of the matrix, as a (1 x n) row vector.
        r   r   N)r   rk   r)   r&   r    r8   rV   MrT   r   r   r   _getrowW     
zIndexMixin._getrowc                 C   sP   | j \}}t|}|| k s||krtd| |dk r ||7 }| td|S )zMReturn a copy of column i of the matrix, as a (m x 1) column vector.
        r   r   N)r   rk   r)   r*   r    r   r   r   r   _getcolb  r   zIndexMixin._getcolc                 C      t  r\   NotImplementedErrorr8   r<   r   r   r   r   m     zIndexMixin._get_intc                 C   r   r\   r   r   r   r   r   r!   p  r   zIndexMixin._get_slicec                 C   r   r\   r   r   r   r   r   r"   s  r   zIndexMixin._get_arrayc                 C   r   r\   r   r8   r>   r?   r   r   r   r%   v  r   zIndexMixin._get_intXintc                 C   r   r\   r   r   r   r   r   r(   y  r   zIndexMixin._get_intXarrayc                 C   r   r\   r   r   r   r   r   r&   |  r   zIndexMixin._get_intXslicec                 C   r   r\   r   r   r   r   r   r*     r   zIndexMixin._get_sliceXintc                 C   r   r\   r   r   r   r   r   r,     r   zIndexMixin._get_sliceXslicec                 C   r   r\   r   r   r   r   r   r-     r   zIndexMixin._get_sliceXarrayc                 C   r   r\   r   r   r   r   r   r.     r   zIndexMixin._get_arrayXintc                 C   r   r\   r   r   r   r   r   r/     r   zIndexMixin._get_arrayXslicec                 C   r   r\   r   r   r   r   r   r0     r   zIndexMixin._get_columnXarrayc                 C   r   r\   r   r   r   r   r   r4     r   zIndexMixin._get_arrayXarrayc                 C   r   r\   r   r8   r<   r   r   r   r   rD     r   zIndexMixin._set_intc                 C   r   r\   r   r   r   r   r   rK     r   zIndexMixin._set_arrayc                 C   r   r\   r   r8   r>   r?   r   r   r   r   rL     r   zIndexMixin._set_intXintc                 C   r   r\   r   r   r   r   r   rQ     r   zIndexMixin._set_arrayXarrayc                 C   s4   t j| | jd}t||\}}| ||| d S )Nr   )r   rB   rA   r   r   rQ   )r8   r>   r?   r   rR   r   r   r   rP     s   z"IndexMixin._set_arrayXarray_sparseN)__name__
__module____qualname____doc__r@   rZ   r   rn   r   r   r   r!   r"   r%   r(   r&   r*   r,   r-   r.   r/   r0   r4   rD   rK   rL   rQ   rP   r   r   r   r   r      s4    _Xer   c                 C   s   t | ds6z!tt| d}t|D ]}t|tr ntt|d}qW dS W n
 ty0   Y dS w t| } | j	j
dkr>| S dS )zICheck for boolean array or array-like. peek before asarray for array-liker'   Nr   )hasattrnextiterrF   r   boolr   r   
asanyarrayr   rl   )r<   desired_ndimr`   rR   r   r   r   rh     s    


rh   )r   numpyr   _sputilsr   _baser   r   rk   integerr   r   r   rh   r   r   r   r   <module>   s    
   