a
    p=ic7                     @   s   d Z ddl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ZG dd dZ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)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   p/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/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   r0   (   s    zSubArray.__iadd__)__name__
__module____qualname__r   r"   r*   r0   __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   3   s    
zSubMaskedArray.__new__)N)r1   r2   r3   __doc__r   r4   r   r   r&   r   r5   1   s   r5   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   _seriesA   s    
zMSubArray._seriesN)r1   r2   r3   r   r   propertyr=   r   r   r   r   r9   9   s   r9   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__V   s    zCSAIterator.__init__c                 C   s   | S r   r   r$   r   r   r   __iter__Z   s    zCSAIterator.__iter__c                 C   s4   | j |}t|tjs | }|t| j}|S r   )	rC   __getitem__
isinstancer   rA   	__array__r   typer@   )r$   Zindxoutr   r   r   rG   ]   s
    zCSAIterator.__getitem__c                 C   s   | j || j|< d S r   )r@   _validate_inputrC   )r$   indexvaluer   r   r   __setitem__d   s    zCSAIterator.__setitem__c                 C   s   t | j t| jS r   )nextrC   rI   r   rJ   r@   rE   r   r   r   __next__g   s    zCSAIterator.__next__N)	r1   r2   r3   r8   rD   rF   rG   rO   rQ   r   r   r   r   r?   O   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   rE   r   r   r   __str__m   s    zComplicatedSubArray.__str__c                 C   s   d| j j d|  dS )N< >)r'   r1   rE   r   r   r   __repr__p   s    zComplicatedSubArray.__repr__c                 C   s   t |tstd|S )Nz!Can only set to MySubArray values)rH   rR   
ValueError)r$   rN   r   r   r   rL   t   s    
z#ComplicatedSubArray._validate_inputc                    s   t  || | d S r   )r!   rO   rL   r$   itemrN   r&   r   r   rO   y   s    zComplicatedSubArray.__setitem__c                    s*   t  |}t|tjs&| t}|S r   )r!   rG   rH   r   rA   rI   r   rR   rY   r&   r   r   rG   ~   s    zComplicatedSubArray.__getitem__c                 C   s   t | S r   )r?   rE   r   r   r   rB      s    zComplicatedSubArray.flatc                 C   s   |   }||d d < d S r   )Zravel)r$   rN   yr   r   r   rB      s    Nc                    s@   t  ||}|d ur<|d tju 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)r1   r2   r3   rS   rW   rL   rO   rG   r>   rB   setterr\   r4   r   r   r&   r   rR   k   s   

rR   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)Zdtype)r   r)   r   r   r   r;   )r   r   	msubarrayr:   r$   r   mxr   r   r   setup   s    zTestSubclassing.setupc                 C   sT   t d}g d}t|}t||d}tt|t t|j| tt|jt d S )Nra   r   r   r)   r   r   rc   )	r   r   r   r	   r   rH   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   rH   r<   subarrayre   r   r   r   test_maskedarray_subclassing   s    
z,TestSubclassing.test_maskedarray_subclassingc                 C   s`   | j \}}tjdd6 ttt|t tt|t| W d    n1 sR0    Y  d S )Nignore)r   )r:   r   Zerrstater   rH   r
   rd   r   re   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   rH   r   rd   r   r<   rl   outerr   re   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 )Nrc   )	r:   r	   rI   r;   r   rH   r   rd   r   )r$   r   rf   Z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 )Nra   r   r)      rc   r(   r/   )r)   r   r   r   r)   )r   r   r   r   r)   namer   )r   r   )r   r   r	   rl   rd   r   rH   r   r9   r<   r   r   r   Z	_set_mask_maskr=   hasattr)r$   r   ZmyZymzrj   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 )
Nra   rh   c                 S   s   g | ]\}}||fqS r   r   ).0ijr   r   r   
<listcomp>       z=TestSubclassing.test_subclasspreservation.<locals>.<listcomp>rj   )r;   r   F)ZsubokT)r   r   zipr9   r	   r   rH   r   r   ru   r   r   r   )r$   r   ri   Zxinforj   rx   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 baseclassra   TFTFFrc   r)   r)   .rs   r   r   .N)r   r   rR   r	   r   rH   r:   r   rB   baser   rX   rO   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 )Nra   r   r   r)   r   )r   r   rR   r	   r   rH   r:   )r$   r   r   Zmxcsub_nomaskr   r   r   test_subclass_nomask_items*  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.ndarrayra   r   rc   r	   Zmasked_z(data=[--, 1, --, 3, 4]N)r   r   r	   r   reprr   r1   )r$   r   rf   rj   rx   r   r   r   test_subclass_repr5  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, setitemra   r   rc   z[-- 1 -- 3 4]r   z myprefix [-- 1 -- 3 4] mypostfixN)r   r   r   r	   r   strrR   r   rX   rO   macoreZmasked_print_option)r$   r   rj   rx   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)         rs   ra      )r:   )r   r)   r   r   rs   ra   r   )r5   r   subtractr   r6   )r$   Zarr1Zarr2Zdiff1Zdiff2r   r   r   $test_pure_subclass_info_preservationN  s    z4TestSubclassing.test_pure_subclass_info_preservationN)r1   r2   r3   rg   rk   rm   ro   rq   rr   ry   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   s   || _ || _d S r   )	magnitudeunits)r$   r:   r   r   r   r   rD   ]  s    zArrayNoInheritance.__init__c                 C   s   t | j|S r   )r#   r   )r$   attrr   r   r   __getattr__a  s    zArrayNoInheritance.__getattr__N)r1   r2   r3   r8   rD   r   r   r   r   r   r   [  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   )TFTrc   Zmeters)TFFT)r   F)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_inheritancee  s&    



r   )!r8   numpyr   Znumpy.testingr   r   Znumpy.ma.testutilsr   Znumpy.ma.corer   r   r   r   r	   r
   r   r   r   r   r   r   r   rA   r   rl   r5   r9   rd   r?   rR   r`   r   r   r   r   r   r   <module>   s    8+ F
