U
    ¸mœdº@  ã                   @   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   úX/home/sam/Atlas/atlas_env/lib/python3.8/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)ÚclsZ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                    s(   t ƒ  |¡}|j dd¡d |jd< |S )NÚaddedr   é   )r"   Ú__add__r   Úget©r%   ÚotherÚresultr'   r   r   r+   $   s    zSubArray.__add__c                    s(   t ƒ  |¡}|j dd¡d |jd< |S )NÚiaddedr   r*   )r"   Ú__iadd__r   r,   r-   r'   r   r   r1   )   s    zSubArray.__iadd__)Ú__name__Ú
__module__Ú__qualname__r    r#   r+   r1   Ú__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|Ž}||jd< |S r!   )r"   r    Ú_optinfo)r   r   Úkwargsr&   r'   r   r   r    4   s    
zSubMaskedArray.__new__)N)r2   r3   r4   Ú__doc__r    r5   r   r   r'   r   r6   2   s   r6   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<   ZsubarrÚ_datar   r   r   r    <   s    
zMSubArray.__new__c                 C   s   |   t¡}d|_|S )NF)r   r	   Z_sharedmask)r%   Z_viewr   r   r   Ú_seriesB   s    
zMSubArray._seriesN)r2   r3   r4   r   r    Úpropertyr>   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   )	rD   Ú__getitem__Ú
isinstancer   rB   Ú	__array__r   ÚtyperA   )r%   ZindxÚoutr   r   r   rH   ^   s
    zCSAIterator.__getitem__c                 C   s   | j  |¡| j|< d S r   )rA   Ú_validate_inputrD   )r%   ÚindexÚvaluer   r   r   Ú__setitem__e   s    zCSAIterator.__setitem__c                 C   s   t | jƒ ¡  t| jƒ¡S r   )ÚnextrD   rJ   r   rK   rA   rF   r   r   r   Ú__next__h   s    zCSAIterator.__next__N)	r2   r3   r4   r9   rE   rG   rH   rP   rR   r   r   r   r   r@   P   s   r@   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   rF   r   r   r   Ú__str__n   s    zComplicatedSubArray.__str__c                 C   s   d| j j› d| › d�S )Nú<ú ú>)r(   r2   rF   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)rI   rS   Ú
ValueError)r%   rO   r   r   r   rM   u   s    
z#ComplicatedSubArray._validate_inputc                    s   t ƒ  ||  |¡¡ d S r   )r"   rP   rM   ©r%   ÚitemrO   r'   r   r   rP   z   s    zComplicatedSubArray.__setitem__c                    s*   t ƒ  |¡}t|tjƒs&| ¡  t¡}|S r   )r"   rH   rI   r   rB   rJ   r   rS   rZ   r'   r   r   rH      s    zComplicatedSubArray.__getitem__c                 C   s   t | ƒS r   )r@   rF   r   r   r   rC   †   s    zComplicatedSubArray.flatc                 C   s   |   ¡ }||d d …< d S r   )Zravel)r%   rO   Úyr   r   r   rC   Š   s    Nc                    s@   t ƒ  ||¡}|d k	r<|d tjkr<|j dd¡d |jd< |S )Nr   Z
multipliedr*   )r"   Ú__array_wrap__r   Úmultiplyr   r,   )r%   r&   Úcontextr'   r   r   r]   �   s    z"ComplicatedSubArray.__array_wrap__)N)r2   r3   r4   rT   rX   rM   rP   rH   r?   rC   Úsetterr]   r5   r   r   r'   r   rS   l   s   

rS   c                   @   s4   e 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)
    é   c                 K   s   || _ || _d S r   )Ú_arrayÚattrs)r%   r   rd   r   r   r   rE   Ÿ   s    zWrappedArray.__init__c                 C   s   | j j› d| j› d| j› d�S )Nz(
Ú
z
))r(   r2   rc   rd   rF   r   r   r   rX   £   s    zWrappedArray.__repr__c                 C   s   t  | j¡S r   )r   r   rc   rF   r   r   r   rJ   ¦   s    zWrappedArray.__array__c                    s8   |dkr0‡ fdd„|D ƒ}ˆ j |||Žfˆ jŽS tS d S )NÚ__call__c                    s"   g | ]}t |ˆ jƒr|jn|‘qS r   )rI   r(   rc   )Ú.0ÚargrF   r   r   Ú
<listcomp>«   s   ÿz0WrappedArray.__array_ufunc__.<locals>.<listcomp>)r(   rd   ÚNotImplemented)r%   ZufuncÚmethodÚinputsr8   r   rF   r   Ú__array_ufunc__©   s    
ÿzWrappedArray.__array_ufunc__N)	r2   r3   r4   r9   Z__array_priority__rE   rX   rJ   rm   r   r   r   r   ra   —   s   ra   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   s2   t jddd�}t|dddddgd�}||f| _d S )Né   Úfloat)Zdtyper   r*   ©r<   )r   r   Ú	msubarrayr;   ©r%   r   Úmxr   r   r   Úsetup_methodµ   s    zTestSubclassing.setup_methodc                 C   sZ   t  d¡}dddddg}t|ƒ}t||d�}tt|tƒƒ t|j|ƒ tt|jtƒƒ d S )Nro   r   r*   rq   )	r   r   r   r
   r   rI   r	   r   r=   )r%   r   ÚmÚxsubZxmsubr   r   r   Útest_data_subclassingº   s    
z%TestSubclassing.test_data_subclassingc                 C   s   | j \}}tt|jtƒƒ d S r   )r;   r   rI   r=   Úsubarrayrs   r   r   r   Útest_maskedarray_subclassingÄ   s    
z,TestSubclassing.test_maskedarray_subclassingc              	   C   sL   | j \}}tjdd��, ttt|ƒtƒƒ tt|ƒt |¡ƒ W 5 Q R X d S ©NÚignore)r   )r;   r   Úerrstater   rI   r   rr   r   rs   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   rI   r   rr   r   r=   ry   Úouterr   rs   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 )Nrq   )	r;   r
   rJ   r<   r   rI   r   rr   r   )r%   r   rt   Zxmxr   r   r   Útest_masked_binary_operations2Ý   s
    
z.TestSubclassing.test_masked_binary_operations2c                 C   s’  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ƒ | dddddg¡ t|jdddddgƒ |j dddddg¡ t|jdddddgƒ t|dd	id
�}t|ƒ}tt|dƒƒ t|j|jƒ d S )Nro   r   r*   é   rq   r)   r0   Únamer   )r   r   )r   r   r
   ry   rr   r   rI   r	   r:   r=   r   r   r   Z	_set_maskÚ_maskr>   Úhasattr)r%   r   ZmyZymÚzrw   Úmxsubr   r   r   Útest_attributepropagationå   s4    z)TestSubclassing.test_attributepropagationc                 C   s  t  d¡}dddddg}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 )Nro   r   r*   c                 S   s   g | ]\}}||f‘qS r   r   )rg   ÚiÚjr   r   r   ri   
  s     z=TestSubclassing.test_subclasspreservation.<locals>.<listcomp>rw   )r<   r   F)ZsubokT)r   r   Úzipr:   r
   r   rI   r	   r   r„   r   r   r   )r%   r   rv   Zxinforw   r‡   r   r   r   Útest_subclasspreservation  s(    
z)TestSubclassing.test_subclasspreservationc                 C   sÊ  t  d¡}t|ƒ}t|dddddg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kƒ tt|d	 jtƒƒ tt|dd… jtƒƒ tt|jd jtƒƒ t|jd tkƒ 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 baseclassro   TFrq   r*   ©r*   .r‚   r   ©r   .N)r   r   rS   r
   r   rI   r;   r   rC   Úbaser   rY   rP   Ú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 )Nro   r�   rŽ   r*   r   )r   r   rS   r
   r   rI   r;   )r%   r   r‘   Zmxcsub_nomaskr   r   r   Útest_subclass_nomask_itemsF  s    
z*TestSubclassing.test_subclass_nomask_itemsc                 C   sh   t  d¡}t|dddddgd�}tt|ƒdƒ t|ƒ}t|dddddgd�}tt|ƒdtj› d�ƒ dS )	zOtest that repr uses the name of the subclass
        and 'array' for np.ndarrayro   TFrq   r
   Zmasked_z(data=[--, 1, --, 3, 4]N)r   r   r
   r   Úreprr   r2   )r%   r   rt   rw   r‡   r   r   r   Útest_subclass_reprQ  s    
ÿz"TestSubclassing.test_subclass_reprc                 C   s|   t  d¡}t|ƒ}t|dddddgd�}tt|ƒdƒ t|ƒ}tt|j	dt j
jjƒ t|dddddgd�}tt|ƒdƒ dS )	z7test str with subclass that has overridden str, setitemro   TFrq   z[-- 1 -- 3 4]r   z myprefix [-- 1 -- 3 4] mypostfixN)r   r   r   r
   r   ÚstrrS   r   rY   rP   ÚmaÚcoreZmasked_print_option)r%   r   rw   r‡   r‘   r’   r   r   r   Útest_subclass_str\  s    

ÿz!TestSubclassing.test_subclass_strc                 C   s†   t dddddddgd�}t d	dddddgd�}t ||¡}td
|jkƒ t|jd
 dkƒ || }td
|jkƒ t|jd
 dkƒ d S )NÚtestr*   é   é   r‚   ro   é   )r;   r   r   )r6   r   Úsubtractr   r7   )r%   Zarr1Zarr2Zdiff1Zdiff2r   r   r   Ú$test_pure_subclass_info_preservationj  s    z4TestSubclassing.test_pure_subclass_info_preservationN)r2   r3   r4   ru   rx   rz   r~   r€   r�   rˆ   rŒ   r“   r”   r–   rš   r    r   r   r   r   rn   ²   s   
!%rn   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   s   || _ || _d S r   )Ú	magnitudeÚunits)r%   r;   r£   r   r   r   rE   y  s    zArrayNoInheritance.__init__c                 C   s   t | j|ƒS r   )r$   r¢   )r%   Úattrr   r   r   Ú__getattr__}  s    zArrayNoInheritance.__getattr__N)r2   r3   r4   r9   rE   r¥   r   r   r   r   r¡   w  s   r¡   c                  C   s  t jjdddgdddgd�} t| dƒ}t j |¡}t| j|jƒ t| j|jƒ dddg| _t| j|jƒ t|jƒ t jj|dd�}t| j|jƒ t| j|jƒ dddg| _tdddg|jƒ t|j ƒ t jj|dd	�}t| j|jƒ t| jdddgƒ t|j ƒ t|j ƒ d S )
Nr*   rœ   r�   TFrq   Zmeters)r   )Z	keep_mask)	r   r˜   r   r¡   r   r;   r<   r   Z
sharedmask)Zdata_maskedZdata_masked_unitsZ	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S )ÚTestClassWrappingc                 C   s2   t jjdddgdddgd�}t|ƒ}||f| _d S )Nr*   r�   ro   FTrq   )r   r˜   r
   ra   r;   ©r%   rv   Úwmr   r   r   ru   ¤  s    zTestClassWrapping.setup_methodc              	   C   s:   | j \}}tjdd�� ttt |¡tƒƒ W 5 Q R X d S r{   )r;   r   r}   r   rI   r   ra   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   rI   r   r   ra   r   r   r   Ústack)r%   rv   r©   Úm2r   r   r   r€   ¯  s    
"z/TestClassWrapping.test_masked_binary_operationsN)r2   r3   r4   ru   r~   r€   r   r   r   r   r§   ¡  s   r§   )%r9   Únumpyr   Znumpy.lib.mixinsr   Znumpy.testingr   r   Znumpy.ma.testutilsr   Znumpy.ma.corer   r   r   r	   r
   r   r   r   r   r   r   r   r   rB   r   ry   r6   r:   rr   r@   rS   ra   rn   r¡   r¦   r§   r   r   r   r   Ú<module>   s&   8+ F
 