o
    ˜šÍhGB  ã                   @   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   ú`/home/www/facesmatcher.com/frenv/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)Ú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                    ó(   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   r3   )   r1   zSubArray.__iadd__)Ú__name__Ú
__module__Ú__qualname__r    r#   r,   r3   Ú__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   )r4   r5   r6   Ú__doc__r    r7   r   r   r'   r   r8   2   s    r8   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)r4   r5   r6   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   )	rF   Ú__getitem__Ú
isinstancer   rD   Ú	__array__r   ÚtyperC   )r%   ZindxÚoutr   r   r   rJ   ^   s
   zCSAIterator.__getitem__c                 C   s   | j  |¡| j|< d S r   )rC   Ú_validate_inputrF   )r%   ÚindexÚvaluer   r   r   Ú__setitem__e   s   zCSAIterator.__setitem__c                 C   s   t | jƒ ¡  t| jƒ¡S r   )ÚnextrF   rL   r   rM   rC   rH   r   r   r   Ú__next__h   s   zCSAIterator.__next__N)	r4   r5   r6   r;   rG   rI   rJ   rR   rT   r   r   r   r   rB   P   s    rB   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   rH   r   r   r   Ú__str__n   s   zComplicatedSubArray.__str__c                 C   s   d| j j› d| › d�S )Nú<ú ú>)r(   r4   rH   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)rK   rU   Ú
ValueError)r%   rQ   r   r   r   rO   u   s   
z#ComplicatedSubArray._validate_inputc                    s   t ƒ  ||  |¡¡ d S r   )r"   rR   rO   ©r%   ÚitemrQ   r'   r   r   rR   z   s   zComplicatedSubArray.__setitem__c                    s*   t ƒ  |¡}t|tjƒs| ¡  t¡}|S r   )r"   rJ   rK   r   rD   rL   r   rU   r\   r'   r   r   rJ      s   zComplicatedSubArray.__getitem__c                 C   s   t | ƒS r   )rB   rH   r   r   r   rE   †   s   zComplicatedSubArray.flatc                 C   s   |   ¡ }||d d …< d S r   )Zravel)r%   rQ   Úyr   r   r   rE   Š   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__r   )r4   r5   r6   rV   rZ   rO   rR   rJ   rA   rE   Úsetterr_   r7   r   r   r'   r   rU   l   s    

rU   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   rd   )r%   r   rf   r   r   r   rG       ó   
zWrappedArray.__init__c                 C   s   | j j› d| j› d| j› d�S )Nz(
Ú
z
))r(   r4   re   rf   rH   r   r   r   rZ   ¤   s   zWrappedArray.__repr__c                 C   s   t  | j¡S r   )r   r   re   rH   r   r   r   rL   §   ó   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   )rK   r(   re   )Ú.0ÚargrH   r   r   Ú
<listcomp>¬   s    ÿz0WrappedArray.__array_ufunc__.<locals>.<listcomp>)r(   rf   ÚNotImplemented)r%   ZufuncÚmethodZinputsr:   r   rH   r   Ú__array_ufunc__ª   s   
ÿzWrappedArray.__array_ufunc__N)
r4   r5   r6   r;   Ú	__slots__Z__array_priority__rG   rZ   rL   rr   r   r   r   r   rc   —   s    rc   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_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 )Nru   ©r   r   r+   r   r   rw   )	r   r   r   r
   r   rK   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   rK   r?   Úsubarrayry   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   rK   r   rx   r   ry   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   rK   r   rx   r   r?   r€   Úouterr   ry   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 )Nrw   )	r=   r
   rL   r>   r   rK   r   rx   r   )r%   r   rz   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 )Nru   r   r+   é   rw   r*   r2   )r+   r   r   r   r+   )r   r   r   r   r+   Únamer   )r   r   )r   r   r
   r€   rx   r   rK   r	   r<   r?   r   r   r   Z	_set_maskÚ_maskr@   Úhasattr)r%   r   ZmyZ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 )
Nru   r|   c                 S   s   g | ]\}}||f‘qS r   r   )rm   ÚiÚjr   r   r   ro     s    z=TestSubclassing.test_subclasspreservation.<locals>.<listcomp>r~   )r>   r   F)ZsubokT)r   r   Úzipr<   r
   r   rK   r	   r   r‹   r   r   r   )r%   r   r}   Z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 baseclassru   ©TFTFFrw   r+   ©r+   .r‰   r   ©r   .N)r   r   rU   r
   r   rK   r=   r   rE   Úbaser   r[   rR   Ú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 )Nru   r•   r–   r+   r   )r   r   rU   r
   r   rK   r=   )r%   r   r™   Z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.ndarrayru   r”   rw   r
   Zmasked_z(data=[--, 1, --, 3, 4]N)r   r   r
   r   Úreprr   r4   )r%   r   rz   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, setitemru   r”   rw   z[-- 1 -- 3 4]r   z myprefix [-- 1 -- 3 4] mypostfixN)r   r   r   r
   r   ÚstrrU   r   r[   rR   ÚmaÚcoreZ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‰   ru   é   )r=   )r   r+   r¤   r¥   r‰   ru   r   )r8   r   Úsubtractr   r9   )r%   Zarr1Zarr2Zdiff1Zdiff2r   r   r   Ú$test_pure_subclass_info_preservationk  s   z4TestSubclassing.test_pure_subclass_info_preservationN)r4   r5   r6   r{   r   r�   r…   r‡   rˆ   r�   r“   r›   rœ   rž   r¢   r¨   r   r   r   r   rt   ³   s    
!%rt   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   rh   r   )Ú	magnitudeÚunits)r%   r=   r«   r   r   r   rG   z  ri   zArrayNoInheritance.__init__c                 C   s   t | j|ƒS r   )r$   rª   )r%   Úattrr   r   r   Ú__getattr__~  rk   zArrayNoInheritance.__getattr__N)r4   r5   r6   r;   rG   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¥   )TFTrw   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_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¥   ru   ©FTFrw   )r   r    r
   rc   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   rK   r   rc   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   rK   r   r   rc   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 )NZnot_a_real_attrr+   r°   r±   rw   Znot_an_attrr¤   )r   r   ÚAttributeErrorÚ__setattr__r   r    r
   rc   )r%   Zmixinr}   r³   r   r   r   Útest_mixins_have_slotsÅ  s
   z(TestClassWrapping.test_mixins_have_slotsN)r4   r5   r6   r{   r…   r‡   r¸   r   r   r   r   r¯   ¢  s
    r¯   )%r;   Ú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   rD   r   r€   r8   r<   rx   rB   rU   rc   rt   r©   r®   r¯   r   r   r   r   Ú<module>   s(   8+ F
 