o
    gqB                     @   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   Y/var/www/html/api-tag/env/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!   propertyrE   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   )	rK   __getitem__
isinstancer   rI   	__array__r   typerH   )r&   indxoutr   r   r   rO   ^   s
   zCSAIterator.__getitem__c                 C   s   | j || j|< d S r   )rH   _validate_inputrK   )r&   indexvaluer   r   r   __setitem__e   s   zCSAIterator.__setitem__c                 C   s   t | j t| jS r   )nextrK   rQ   r   rR   rH   rM   r   r   r   __next__h   s   zCSAIterator.__next__N)	r5   r6   r7   r<   rL   rN   rO   rX   rZ   r   r   r   r   rG   P   s    rG   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   rM   r   r   r   __str__n   s   zComplicatedSubArray.__str__c                 C   s   d| j j d|  dS )N< >)r)   r5   rM   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)rP   r[   
ValueError)r&   rW   r   r   r   rU   u   s   
z#ComplicatedSubArray._validate_inputc                    s   t  || | d S r   )r#   rX   rU   r&   itemrW   r(   r   r   rX   z   s   zComplicatedSubArray.__setitem__c                    s*   t  |}t|tjs| t}|S r   )r#   rO   rP   r   rI   rQ   r   r[   rb   r(   r   r   rO      s   zComplicatedSubArray.__getitem__c                 C   s   t | S r   )rG   rM   r   r   r   rJ      s   zComplicatedSubArray.flatc                 C   s   |   }||d d < d S r   )ravel)r&   rW   yr   r   r   rJ      s   NFc                    sB   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'   contextreturn_scalarr(   r   r   rg      s   z"ComplicatedSubArray.__array_wrap__rB   )r5   r6   r7   r\   r`   rU   rX   rO   rF   rJ   setterrg   r8   r   r   r(   r   r[   l   s    

r[   c                   @   s:   e Zd ZdZdZdZdd Zdd Zd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   rm   )r&   r   ro   r   r   r   rL         
zWrappedArray.__init__c                 C   s   | j j d| j d| j dS )Nz(

z
))r)   r5   rn   ro   rM   r   r   r   r`      s   zWrappedArray.__repr__Nc                 C   s   t | jS r   )r   r   rn   )r&   dtyper   r   r   r   rQ         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   )rP   r)   rn   ).0argrM   r   r   
<listcomp>   s    z0WrappedArray.__array_ufunc__.<locals>.<listcomp>)r)   ro   NotImplemented)r&   ufuncmethodinputsr;   r   rM   r   __array_ufunc__   s   
zWrappedArray.__array_ufunc__)NN)
r5   r6   r7   r<   	__slots____array_priority__rL   r`   rQ   r~   r   r   r   r   rl      s    
rl   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)rt   )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   rP   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   rP   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   rP   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   rP   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
   rQ   r?   r   rP   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   rP   r	   r=   rA   r   r   r   	_set_mask_maskrE   hasattr)r&   r    myymzr   mxsubr   r   r   test_attributepropagation   s4   z)TestSubclassing.test_attributepropagationc                 C   s  t d}g d}tt||}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   r   )r?   r   F)subokT)r   r   listzipr=   r
   r   rP   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   r[   r
   r   rP   r>   r   rJ   baser   ra   rX   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   r[   r
   r   rP   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   strr[   r   ra   rX   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   rq   r   )	magnitudeunits)r&   r>   r   r   r   r   rL   z  rr   zArrayNoInheritance.__init__c                 C   s   t | j|S r   )r%   r   )r&   attrr   r   r   __getattr__~  ru   zArrayNoInheritance.__getattr__N)r5   r6   r7   r<   rL   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
   rl   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   rP   r   rl   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   rP   r   r   rl   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
   rl   )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   rI   r   r   r9   r=   r   rG   r[   rl   r   r   r   r   r   r   r   r   <module>   s(   8+ F
 