o
    Ö­jø?  ã                   @   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   úP/var/www/html/CropPilot/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ƒr®t|tƒr†|  ||¡}nÓt|t	ƒr’|  ||¡}nÇ|jdkrž|  ||¡}n»|jdkrª|  ||¡}n¯tdƒ‚t|t	ƒrêt|tƒr¿|  ||¡}nšt|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�r³t|ƒ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r†t ||j¡}|j	dkr‘|  ||¡ d S |\}	}
t|	tƒr¾t|
tƒr¾tj|| jd�}|j	dkr²t
dƒ‚|  |	|
|jd ¡ d S t|	tƒrÕtj|	 | jd ¡Ž d d …d f }	nt |	¡}	t|
tƒrþt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|ƒ�r‡d|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�r¡t ||j¡}|j	dk�r©d 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¡ q«t|tƒrÛˆ |¡ | j|
 }tt| |¡Ž ƒ}|	 |¡ |
d7 }
q«t	|ƒ�r| j|
 }| |  krð|k sùn 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�r¶t‡fdd„|D ƒŽ ‰ t‡ fdd„ˆ dd… D ƒƒ�r¬d dd„ ˆ D ƒ¡}d|› �}t|ƒ‚tˆ d jƒ|	 }	n t|ƒdk�rÖ|d }tˆ| jƒ}|	d|… | |	|d…  }	t|	ƒ }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   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 )z“Convert `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    
   