U
    ;vf@                     @   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 )zTests 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   C/tmp/pip-unpacked-wheel-sdaoq5e2/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   Z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
 