o
    i?                     @   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.
    )npZbroadcast_arraysflagsZ	writeable)abxy r   M/home/kim/smarthome/.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   Zlilr   )$_validate_indiceslen
isinstancer   Z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_columnXarrayZravelr   sizeZ
atleast_2d_get_arrayXarrayformatZ_coo_containertocoo)selfkeyindexZ	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   r-   
ValueError_set_intZflatr   rangeindicesr   ZarangeZsqueezeZbroadcast_to
_set_array_set_intXintZ
atleast_1dr#   r   r%   r0   r    Z_shape_as_2dZsum_duplicates_set_arrayXarray_sparse_set_arrayXarray)r1   r2   r
   r3   _r4   Z	idx_rangeN	idx_shaper6   r7   ijZbroadcast_rowZ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   ).0rF   )r3   r   r   	<genexpr>)  s    z/IndexMixin._validate_indices.<locals>.<genexpr>c                 3   s     | ]} d  j |j kV  qdS )r   Nr   rK   ix)
idx_arraysr   r   rL   *  s     c                 s   s    | ]}t |jV  qd S rJ   )strr   rM   r   r   r   rL   +  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   r:   extend_shaper   r=   r>   intr   kindZnonzero
_asindicesr   anyjoinlist)r1   r2   Z	ellps_posZ	index_1stZprelim_ndimrF   r4   rN   Zellip_slicesrE   Z
index_ndimZarray_indicesZMsZ	len_slicerD   Ztmp_ndimZ	mid_shapeZshapesmsgZ	arr_indexZ	arr_shaper#   r   )rO   r3   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   r:   r;   	TypeErrorMemoryErrorr%   r#   r-   maxminr   Zowndatar'   )r1   r4   lengthr
   eZmax_indxZmin_indxr   r   r   r[   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   rY   r%   r"   r   r1   rF   MrD   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   rY   r%   r&   r   rg   r   r   r   _getcolb  rj   zIndexMixin._getcolc                 C      t  rJ   NotImplementedErrorr1   r4   r   r   r   r   m     zIndexMixin._get_intc                 C   rl   rJ   rm   ro   r   r   r   r   p  rp   zIndexMixin._get_slicec                 C   rl   rJ   rm   ro   r   r   r   r   s  rp   zIndexMixin._get_arrayc                 C   rl   rJ   rm   r1   r6   r7   r   r   r   r!   v  rp   zIndexMixin._get_intXintc                 C   rl   rJ   rm   rq   r   r   r   r$   y  rp   zIndexMixin._get_intXarrayc                 C   rl   rJ   rm   rq   r   r   r   r"   |  rp   zIndexMixin._get_intXslicec                 C   rl   rJ   rm   rq   r   r   r   r&     rp   zIndexMixin._get_sliceXintc                 C   rl   rJ   rm   rq   r   r   r   r(     rp   zIndexMixin._get_sliceXslicec                 C   rl   rJ   rm   rq   r   r   r   r)     rp   zIndexMixin._get_sliceXarrayc                 C   rl   rJ   rm   rq   r   r   r   r*     rp   zIndexMixin._get_arrayXintc                 C   rl   rJ   rm   rq   r   r   r   r+     rp   zIndexMixin._get_arrayXslicec                 C   rl   rJ   rm   rq   r   r   r   r,     rp   zIndexMixin._get_columnXarrayc                 C   rl   rJ   rm   rq   r   r   r   r.     rp   zIndexMixin._get_arrayXarrayc                 C   rl   rJ   rm   r1   r4   r
   r   r   r   r<     rp   zIndexMixin._set_intc                 C   rl   rJ   rm   rr   r   r   r   r?     rp   zIndexMixin._set_arrayc                 C   rl   rJ   rm   r1   r6   r7   r
   r   r   r   r@     rp   zIndexMixin._set_intXintc                 C   rl   rJ   rm   rs   r   r   r   rB     rp   zIndexMixin._set_arrayXarrayc                 C   s4   t j| | jd}t||\}}| ||| d S )Nr   )r   r:   r9   r   r   rB   )r1   r6   r7   r
   rC   r   r   r   rA     s   z"IndexMixin._set_arrayXarray_sparseN)__name__
__module____qualname____doc__r8   rH   r   r[   ri   rk   r   r   r   r!   r$   r"   r&   r(   r)   r*   r+   r,   r.   r<   r?   r@   rB   rA   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iterr=   r   boolra   r   Z
asanyarrayr   rZ   )r4   Zdesired_ndimrN   rC   r   r   r   rV     s    


rV   )rw   numpyr   Z_sputilsr   Z_baser   r   rY   integerr   r   r   rV   r   r   r   r   <module>   s    
   