o
    Ô­jGB  ã                   @   s  d Z ddlZddlmZ ddlmZmZ ddlm	Z	 ddl
mZmZmZmZmZmZmZmZmZmZmZmZ dd„ ZG d	d
„ d
ejƒZeZG dd„ deƒZG dd„ deeƒZeZG dd„ dƒZG dd„ deƒZG dd„ deƒZ G dd„ dƒZ!G dd„ dƒZ"dd„ Z#G dd„ dƒZ$dS )z½Tests suite for MaskedArray & subclassing.

:author: Pierre Gerard-Marchant
:contact: pierregm_at_uga_dot_edu
:version: $Id: test_subclassing.py 3473 2007-10-29 15:18:13Z jarrod.millman $

é    N)ÚNDArrayOperatorsMixin)Úassert_Úassert_raises)Úassert_equal)ÚarrayÚarangeÚmaskedÚMaskedArrayÚmasked_arrayÚlogÚaddÚhypotÚdivideÚasarrayÚ
asanyarrayÚnomaskc                 C   s   t | d t|ƒ… |ƒ d S ©N)r   Úlen)ÚaÚb© r   ú\/var/www/html/CropPilot/venv/lib/python3.10/site-packages/numpy/ma/tests/test_subclassing.pyÚassert_startswith   s   r   c                       s@   e Zd Zi fdd„Z‡ fdd„Z‡ fdd„Z‡ fdd„Z‡  ZS )	ÚSubArrayc                 C   s   t  |¡ | ¡}| ¡ |_|S r   )Únpr   ÚviewÚcopyÚinfo)ÚclsÚarrr   Úxr   r   r   Ú__new__   s   
zSubArray.__new__c                    s"   t ƒ  |¡ t|di ƒ ¡ | _d S ©Nr   )ÚsuperÚ__array_finalize__Úgetattrr   r   )ÚselfÚobj©Ú	__class__r   r   r$      s   zSubArray.__array_finalize__c                    ó(   t ƒ  |¡}|j dd¡d |jd< |S )NÚaddedr   é   )r#   Ú__add__r   Úget©r&   ÚotherÚresultr(   r   r   r-   $   ó   zSubArray.__add__c                    r*   )NÚiaddedr   r,   )r#   Ú__iadd__r   r.   r/   r(   r   r   r4   )   r2   zSubArray.__iadd__)Ú__name__Ú
__module__Ú__qualname__r!   r$   r-   r4   Ú__classcell__r   r   r(   r   r      s
    r   c                       s"   e Zd ZdZd‡ fdd„	Z‡  ZS )ÚSubMaskedArrayz<Pure subclass of MaskedArray, keeping some info on subclass.Nc                    s"   t ƒ j| fi |¤Ž}||jd< |S r"   )r#   r!   Ú_optinfo)r   r   Úkwargsr'   r(   r   r   r!   4   s   
zSubMaskedArray.__new__r   )r5   r6   r7   Ú__doc__r!   r8   r   r   r(   r   r9   2   s    r9   c                   @   s&   e Zd Zi efdd„Zedd„ ƒZdS )Ú	MSubArrayc                 C   s&   t ||ƒ}tj| ||d�}|j|_|S )N)ÚdataÚmask)r   r	   r!   r   )r   r>   r   r?   ÚsubarrÚ_datar   r   r   r!   <   s   
zMSubArray.__new__c                 C   s   |   t¡}d|_|S )NF)r   r	   Ú_sharedmask)r&   Ú_viewr   r   r   Ú_seriesB   s   
zMSubArray._seriesN)r5   r6   r7   r   r!   ÚpropertyrD   r   r   r   r   r=   :   s    r=   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚCSAIteratorzß
    Flat iterator object that uses its own setter/getter
    (works around ndarray.flat not propagating subclass setters/getters
    see https://github.com/numpy/numpy/issues/4564)
    roughly following MaskedIterator
    c                 C   s   || _ | tj¡j| _d S r   )Ú	_originalr   r   ÚndarrayÚflatÚ	_dataiter)r&   r   r   r   r   Ú__init__W   s   zCSAIterator.__init__c                 C   s   | S r   r   ©r&   r   r   r   Ú__iter__[   s   zCSAIterator.__iter__c                 C   s4   | j  |¡}t|tjƒs| ¡ }| t| jƒ¡}|S r   )	rJ   Ú__getitem__Ú
isinstancer   rH   Ú	__array__r   ÚtyperG   )r&   ÚindxÚoutr   r   r   rN   ^   s
   zCSAIterator.__getitem__c                 C   s   | j  |¡| j|< d S r   )rG   Ú_validate_inputrJ   )r&   ÚindexÚvaluer   r   r   Ú__setitem__e   s   zCSAIterator.__setitem__c                 C   s   t | jƒ ¡  t| jƒ¡S r   )ÚnextrJ   rP   r   rQ   rG   rL   r   r   r   Ú__next__h   s   zCSAIterator.__next__N)	r5   r6   r7   r<   rK   rM   rN   rW   rY   r   r   r   r   rF   P   s    rF   c                       sh   e Zd Zdd„ Zdd„ Zdd„ Z‡ fdd„Z‡ fd	d
„Zedd„ ƒZ	e	j
dd„ ƒZ	d‡ fdd„	Z‡  ZS )ÚComplicatedSubArrayc                 C   s   d|   t¡› d�S )Nz	myprefix z
 mypostfix)r   r   rL   r   r   r   Ú__str__n   s   zComplicatedSubArray.__str__c                 C   s   d| j j› d| › d�S )Nú<ú ú>)r)   r5   rL   r   r   r   Ú__repr__q   s   zComplicatedSubArray.__repr__c                 C   s   t |tƒs	tdƒ‚|S )Nz!Can only set to MySubArray values)rO   rZ   Ú
ValueError)r&   rV   r   r   r   rT   u   s   
z#ComplicatedSubArray._validate_inputc                    s   t ƒ  ||  |¡¡ d S r   )r#   rW   rT   ©r&   ÚitemrV   r(   r   r   rW   z   s   zComplicatedSubArray.__setitem__c                    s*   t ƒ  |¡}t|tjƒs| ¡  t¡}|S r   )r#   rN   rO   r   rH   rP   r   rZ   ra   r(   r   r   rN      s   zComplicatedSubArray.__getitem__c                 C   s   t | ƒS r   )rF   rL   r   r   r   rI   †   s   zComplicatedSubArray.flatc                 C   s   |   ¡ }||d d …< d S r   )Úravel)r&   rV   Úyr   r   r   rI   Š   s   Nc                    s@   t ƒ  ||¡}|d ur|d tju r|j dd¡d |jd< |S )Nr   Ú
multipliedr,   )r#   Ú__array_wrap__r   Úmultiplyr   r.   )r&   r'   Úcontextr(   r   r   rf   �   s   z"ComplicatedSubArray.__array_wrap__r   )r5   r6   r7   r[   r_   rT   rW   rN   rE   rI   Úsetterrf   r8   r   r   r(   r   rZ   l   s    

rZ   c                   @   s8   e Zd ZdZdZdZdd„ Zdd„ Zdd	„ Zd
d„ Z	dS )ÚWrappedArrayz 
    Wrapping a MaskedArray rather than subclassing to test that
    ufunc deferrals are commutative.
    See: https://github.com/numpy/numpy/issues/15200)
    ©Ú_arrayÚattrsé   c                 K   ó   || _ || _d S r   rk   )r&   r   rm   r   r   r   rK       ó   
zWrappedArray.__init__c                 C   s   | j j› d| j› d| j› d�S )Nz(
Ú
z
))r)   r5   rl   rm   rL   r   r   r   r_   ¤   s   zWrappedArray.__repr__c                 C   s   t  | j¡S r   )r   r   rl   rL   r   r   r   rP   §   ó   zWrappedArray.__array__c                    s<   |dkr‡ fdd„|D ƒ}ˆ j ||i |¤Žfi ˆ j¤ŽS tS )NÚ__call__c                    s"   g | ]}t |ˆ jƒr|jn|‘qS r   )rO   r)   rl   )Ú.0ÚargrL   r   r   Ú
<listcomp>¬   s    ÿz0WrappedArray.__array_ufunc__.<locals>.<listcomp>)r)   rm   ÚNotImplemented)r&   ÚufuncÚmethodÚinputsr;   r   rL   r   Ú__array_ufunc__ª   s   
ÿzWrappedArray.__array_ufunc__N)
r5   r6   r7   r<   Ú	__slots__Ú__array_priority__rK   r_   rP   r{   r   r   r   r   rj   —   s    rj   c                   @   st   e 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S )ÚTestSubclassingc                 C   s,   t jddd�}t|g d¢d�}||f| _d S )Né   Úfloat)Údtype)r   r,   r   r   r   ©r?   )r   r   Ú	msubarrayr>   ©r&   r    Úmxr   r   r   Úsetup_method¶   s   zTestSubclassing.setup_methodc                 C   sT   t  d¡}g d¢}t|ƒ}t||d�}tt|tƒƒ t|j|ƒ tt|jtƒƒ d S )Nr   ©r   r   r,   r   r   r‚   )	r   r   r   r
   r   rO   r	   r   rA   )r&   r    ÚmÚxsubÚxmsubr   r   r   Útest_data_subclassing»   s   
z%TestSubclassing.test_data_subclassingc                 C   s   | j \}}tt|jtƒƒ d S r   )r>   r   rO   rA   Úsubarrayr„   r   r   r   Útest_maskedarray_subclassingÅ   s   
z,TestSubclassing.test_maskedarray_subclassingc                 C   sb   | j \}}tjdd�� ttt|ƒtƒƒ tt|ƒt |¡ƒ W d   ƒ d S 1 s*w   Y  d S ©NÚignore)r   )r>   r   Úerrstater   rO   r   rƒ   r   r„   r   r   r   Útest_masked_unary_operationsÊ   s
   
"þz,TestSubclassing.test_masked_unary_operationsc                 C   sž   | j \}}ttt||ƒtƒƒ ttt||ƒtƒƒ tt||ƒ|| ƒ ttt||ƒjtƒƒ ttt ||¡tƒƒ ttt	||ƒtƒƒ ttt	||ƒtƒƒ d S r   )
r>   r   rO   r   rƒ   r   rA   rŒ   Úouterr   r„   r   r   r   Útest_masked_binary_operationsÑ   s   
z-TestSubclassing.test_masked_binary_operationsc                 C   s`   | j \}}t|j  ¡ |jd�}ttt||ƒtƒƒ ttt||ƒtƒƒ tt||ƒt||ƒƒ d S )Nr‚   )	r>   r
   rP   r?   r   rO   r   rƒ   r   )r&   r    r…   Úxmxr   r   r   Útest_masked_binary_operations2Þ   s
   
z.TestSubclassing.test_masked_binary_operations2c                 C   sz  t tdƒdgdgd  d�}tt|ƒƒ}t|ƒ}|d }tt|tƒƒ tt|tƒ ƒ tt|j	t
ƒƒ t|j	ji ƒ |d }tt|tƒƒ tt|tƒƒ tt|j	t
ƒƒ t|j	jd dkƒ |d7 }tt|tƒƒ tt|tƒƒ tt|j	t
ƒƒ t|j	jd dkƒ | g d¢¡ t|jg d¢ƒ |j g d	¢¡ t|jg d	¢ƒ t|d
did�}t|ƒ}tt|dƒƒ t|j|jƒ d S )Nr   r   r,   é   r‚   r+   r3   )r,   r   r   r   r,   )r   r   r   r   r,   Únamer    )r   r   )r   r   r
   rŒ   rƒ   r   rO   r	   r=   rA   r   r   r   Ú	_set_maskÚ_maskrD   Úhasattr)r&   r    ÚmyÚymÚzr‰   Úmxsubr   r   r   Útest_attributepropagationæ   s4   z)TestSubclassing.test_attributepropagationc                 C   s
  t  d¡}g d¢}dd„ t||ƒD ƒ}t||d|id�}t|dd�}tt|tƒ ƒ tt|tƒƒ t|j	|ƒ t
|ƒ}tt|tƒ ƒ tt|tƒƒ t|j	|ƒ t|d	d�}tt|tƒƒ t|j|jƒ t|j	|j	ƒ t|ƒ}tt|tƒƒ t|j|jƒ t|j	|ƒ d S )
Nr   r‡   c                 S   s   g | ]\}}||f‘qS r   r   )rt   ÚiÚjr   r   r   rv     s    z=TestSubclassing.test_subclasspreservation.<locals>.<listcomp>r‰   )r?   r   F)ÚsubokT)r   r   Úzipr=   r
   r   rO   r	   r   r™   r   r   r   )r&   r    rˆ   Úxinfor‰   rž   r   r   r   Útest_subclasspreservation  s(   
z)TestSubclassing.test_subclasspreservationc                 C   sÄ  t  d¡}t|ƒ}t|g d¢d�}tt|d tƒƒ tt|d tƒƒ tt|dd… tƒƒ tt|d tƒƒ tt|d jtƒƒ t|d tu ƒ tt|d jtƒƒ tt|dd… jtƒƒ tt|jd jtƒƒ t|jd tu ƒ tt|jdd… j	tƒƒ t
t|jd|d ƒ t
t|jd|d ƒ t
t|jtddƒ|dd… ƒ |d |d< |dd… |dd…< t
t|jjd|d ƒ t
t|jjtddƒ|dd… ƒ |d |jd< |dd… |jdd…< d	S )
z,test that getter and setter go via baseclassr   ©TFTFFr‚   r,   ©r,   .r–   r   ©r   .N)r   r   rZ   r
   r   rO   r>   r   rI   Úbaser   r`   rW   Úslice)r&   r    ÚxcsubÚmxcsubr   r   r   Útest_subclass_items"  s.   
 z#TestSubclassing.test_subclass_itemsc                 C   sj   t  d¡}t|ƒ}t|ƒ}tt|d jtƒƒ tt|d jtƒƒ tt|d tƒƒ tt|d tƒƒ d S )Nr   r§   r¨   r,   r   )r   r   rZ   r
   r   rO   r>   )r&   r    r«   Úmxcsub_nomaskr   r   r   Útest_subclass_nomask_itemsG  s   
z*TestSubclassing.test_subclass_nomask_itemsc                 C   s\   t  d¡}t|g d¢d�}tt|ƒdƒ t|ƒ}t|g d¢d�}tt|ƒdtj› d�ƒ dS )zOtest that repr uses the name of the subclass
        and 'array' for np.ndarrayr   r¦   r‚   r
   Úmasked_z(data=[--, 1, --, 3, 4]N)r   r   r
   r   Úreprr   r5   )r&   r    r…   r‰   rž   r   r   r   Útest_subclass_reprR  s   
ÿz"TestSubclassing.test_subclass_reprc                 C   sp   t  d¡}t|ƒ}t|g d¢d�}tt|ƒdƒ t|ƒ}tt|j	dt j
jjƒ t|g d¢d�}tt|ƒdƒ dS )z7test str with subclass that has overridden str, setitemr   r¦   r‚   z[-- 1 -- 3 4]r   z myprefix [-- 1 -- 3 4] mypostfixN)r   r   r   r
   r   ÚstrrZ   r   r`   rW   ÚmaÚcoreÚmasked_print_option)r&   r    r‰   rž   r«   r¬   r   r   r   Útest_subclass_str]  s   

ÿz!TestSubclassing.test_subclass_strc                 C   sv   t dg d¢d�}t g d¢d�}t ||¡}td|jv ƒ t|jd dkƒ || }td|jv ƒ t|jd dkƒ d S )NÚtest)r,   é   é   r–   r   é   )r>   )r   r,   r¹   rº   r–   r   r   )r9   r   Úsubtractr   r:   )r&   Úarr1Úarr2Údiff1Údiff2r   r   r   Ú$test_pure_subclass_info_preservationk  s   z4TestSubclassing.test_pure_subclass_info_preservationN)r5   r6   r7   r†   r‹   r�   r‘   r“   r•   rŸ   r¥   r­   r¯   r²   r·   rÁ   r   r   r   r   r~   ³   s    
!%r~   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚArrayNoInheritancez6Quantity-like class that does not inherit from ndarrayc                 C   ro   r   )Ú	magnitudeÚunits)r&   r>   rÄ   r   r   r   rK   z  rp   zArrayNoInheritance.__init__c                 C   s   t | j|ƒS r   )r%   rÃ   )r&   Úattrr   r   r   Ú__getattr__~  rr   zArrayNoInheritance.__getattr__N)r5   r6   r7   r<   rK   rÆ   r   r   r   r   rÂ   x  s    rÂ   c                  C   s  t jjg d¢g d¢d�} t| dƒ}t j |¡}t| j|jƒ t| j|jƒ g d¢| _t| j|jƒ t|jƒ t jj|dd�}t| j|jƒ t| j|jƒ g d¢| _tg d¢|jƒ t|j ƒ t jj|dd	�}t| j|jƒ t| jg d¢ƒ t|j ƒ t|j ƒ d S )
N)r,   r¹   rº   )TFTr‚   Úmeters)TFFT)r   F)Ú	keep_mask)	r   r´   r   rÂ   r   r>   r?   r   Ú
sharedmask)Údata_maskedÚdata_masked_unitsÚ	new_arrayr   r   r   Útest_array_no_inheritance‚  s&   



rÍ   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestClassWrappingc                 C   s.   t jjg d¢g d¢d�}t|ƒ}||f| _d S )N©r,   rº   r   ©FTFr‚   )r   r´   r
   rj   r>   ©r&   rˆ   Úwmr   r   r   r†   ¥  s   zTestClassWrapping.setup_methodc                 C   sP   | j \}}tjdd�� ttt |¡tƒƒ W d   ƒ d S 1 s!w   Y  d S rŽ   )r>   r   r�   r   rO   r   rj   rÑ   r   r   r   r‘   ª  s   
"ÿz.TestClassWrapping.test_masked_unary_operationsc                 C   s4  | j \}}ttt ||¡tƒƒ ttt ||¡tƒƒ ttt ||¡tƒƒ tt ||¡|| ƒ ttt ||¡tƒƒ ttt ||¡tƒƒ ttt ||¡tƒƒ ttt ||¡tƒƒ tt ||¡| t ||¡| ƒ t 	||g¡}ttt ||¡tƒƒ ttt ||¡tƒƒ tt ||¡t ||¡ƒ d S r   )
r>   r   rO   r   r   rj   r   r   r   Ústack)r&   rˆ   rÒ   Úm2r   r   r   r“   °  s   
"z/TestClassWrapping.test_masked_binary_operationsc                 C   sJ   t ƒ }tt|jddƒ tjjg d¢g d¢d�}t|ƒ}tt|jddƒ d S )NÚnot_a_real_attrr,   rÏ   rÐ   r‚   Únot_an_attrr¹   )r   r   ÚAttributeErrorÚ__setattr__r   r´   r
   rj   )r&   Úmixinrˆ   rÒ   r   r   r   Útest_mixins_have_slotsÅ  s
   z(TestClassWrapping.test_mixins_have_slotsN)r5   r6   r7   r†   r‘   r“   rÚ   r   r   r   r   rÎ   ¢  s
    rÎ   )%r<   Únumpyr   Únumpy.lib.mixinsr   Únumpy.testingr   r   Únumpy.ma.testutilsr   Únumpy.ma.corer   r   r   r	   r
   r   r   r   r   r   r   r   r   rH   r   rŒ   r9   r=   rƒ   rF   rZ   rj   r~   rÂ   rÍ   rÎ   r   r   r   r   Ú<module>   s(   8+ F
 