o
    `^h	                     @   s  d dl Z d dlZd dlmZ d dlmZmZmZ d dlm	Z	m
Z
mZmZ d dlZd dlmZ d dlmZ ddlmZ d dlmZ ejjZeejd	ed
ddgdgZdZdddddddZG dd dZejdeddejdeG dd dZedddejded dG dd  d Z edddG d!d" d"Z!G d#d$ d$Z"G d%d& d&Z#G d'd( d(Z$G d)d* d*Z%G d+d, d,Z&dS )-    N)suppress_warnings)xp_assert_equalxp_assert_closeassert_array_almost_equal)is_cupyis_jax_asarrayarray_namespace)raises   )types)array_api_compatibleskip_xp_backendsTcupy	jax.numpy)cpu_only
exceptions-q=reflect	symmetricwrapedgeconstant)mirrorr   grid-mirror	grid-wrapnearestgrid-constantc                   @   s  e Zd Zedddejddg dfdg dfd	g d
fdg dfdg dfdg dfdg dfgdd Zedddejddg dfdg dfd	g dfdg dfdg dfdg dfdg dfgdd Zejdg dejde	dd d! Z
d"S )#TestBoundariesr   &CuPy does not have geometric_transformreasonzmode, expected_valuer   )      ?      @      @   r%   r%   r%   r   )r"   r#   r$   r"   r#   r$   r"   r   )r"   r#   r$   r#   r"   r#   r$   r   )r"   r#   r$   r$   r#   r"   r"   r   )r"   r#   r$   r%   r$   r#   r"   r   )r"   r#   r$   r&   r&   r&   r   )r"   r#   r$   r"   r&   r&   r&   c              	   C   s<   dd }| g d}ttj||d|ddd| | d S )Nc                 S   s   | d d fS )Nr         ? xr(   r(   d/home/air/shanriGPT/back/venv/lib/python3.10/site-packages/scipy/ndimage/tests/test_interpolation.pyshift1      z-TestBoundaries.test_boundaries.<locals>.shift)r               @r&   )   r   )cvalmodeoutput_shapeorderasarrayr   ndimagegeometric_transformselfr3   expected_valuexpr,   datar(   r(   r+   test_boundaries%   s   zTestBoundaries.test_boundaries)r   r   r.   r/   )r/   r   r.   r/   )r%   r   r.   r/   )r.   r   r.   r/   )r&   r   r.   r/   c                 C   s:   dd }| g d}ttj||d|dd| | d S )Nc                 S      | d d fS )Nr   g?r(   r)   r(   r(   r+   r,   F   r-   z.TestBoundaries.test_boundaries2.<locals>.shiftr   r.   r/   r%   r&   r%   )r2   r3   r4   r6   r:   r(   r(   r+   test_boundaries2:   s   zTestBoundaries.test_boundaries2r3   )r   r   r   r   r   r   r5      c                 C   s   t |r|dvs|dkrtd tjddtjd}||}|tjddd	d
}t|j	}t
j|||df ||d}d}	t|}
|tj||	|
d}||	| |df }t
j||||d}|dkrhdnd}t||d|d dS )z$Tests based on examples from gh-2640)r   r   r   r   r   r   z-Jax does not support grid- modes or order > 1ir1   dtypei   i  )num.r5   r3       r3   r   gh㈵>r   Hz>rtolatolN)r   pytestxfailnparangefloat64r7   linspacer	   newaxisr8   map_coordinatesndimage_to_numpy_modegetpadr   )r;   r3   r5   r=   np_datar>   r*   rV   ynpadpad_modepaddedcoordsexpectedrO   r(   r(   r+   test_boundary_spline_accuracyO   s    



z,TestBoundaries.test_boundary_spline_accuracyN)__name__
__module____qualname__r   rP   markparametrizer?   rC   rangerb   r(   r(   r(   r+   r   #   s<    



















r   r5   r.   rD   rF   c                   @   s@   e Zd Zdd Zdd Zeddddd	 Zd
d Zdd ZdS )
TestSplinec                 C   sB   t ||}|jg |d}tj||d}||jd|jdksJ d S )NrE   r5   r   getattronesr8   spline_filterr7   rF   r;   rF   r5   r=   r>   outr(   r(   r+   test_spline01p   s   
zTestSpline.test_spline01c                 C   s>   t ||}|jdg|d}tj||d}t||dg d S )Nr   rE   rj   )rl   r7   r8   rn   r   ro   r(   r(   r+   test_spline02v   s   
zTestSpline.test_spline02Tzoutput=dtype is numpy-specificnp_onlyr!   c                 C   sD   t ||}|jg |d}tj|||d}||jd|jdks J d S )NrE   outputr   rk   ro   r(   r(   r+   test_spline03|   s   
zTestSpline.test_spline03c                 C   s>   t ||}|jdg|d}t||}t||g d d S )Nr%   rE   r   r   r   r   )rl   rm   r8   rn   r   r7   ro   r(   r(   r+   test_spline04   s   
zTestSpline.test_spline04c                 C   sZ   t ||}|jddg|d}tj||d}|g dg dg dg dg}t|| d S )Nr%   rE   rj   rx   )rl   rm   r8   rn   r7   r   )r;   rF   r5   r=   r>   rp   ra   r(   r(   r+   test_spline05   s   

zTestSpline.test_spline05N)	rc   rd   re   rq   rr   r   rw   ry   rz   r(   r(   r(   r+   ri   l   s    

ri   r   r    c                   @   s   e Zd Zdd Zdd Zdd Zdd Zej	d	d
dg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&d' Zd(d) Zd*d+ Zd,d- Zd.S )/TestGeometricTransformc                 C   sD   | dg}dd }tj|||j|d}t||j dg|jd d S )Nr   c                 S      | S Nr(   r)   r(   r(   r+   mapping      zBTestGeometricTransform.test_geometric_transform01.<locals>.mappingrj   rE   r7   r8   r9   shaper   rF   r;   r5   r=   r>   r~   rp   r(   r(   r+   test_geometric_transform01   s   z1TestGeometricTransform.test_geometric_transform01c                 C   F   | dg}dd }tj|||j|d}t||jg d|jd d S )Nr%   c                 S   r|   r}   r(   r)   r(   r(   r+   r~      r   zBTestGeometricTransform.test_geometric_transform02.<locals>.mappingrj   rx   rE   rm   r8   r9   r   r   r7   rF   r   r(   r(   r+   test_geometric_transform02      z1TestGeometricTransform.test_geometric_transform02c                 C   r   )Nr%   c                 S   r@   Nr   r   r(   r)   r(   r(   r+   r~      r-   zBTestGeometricTransform.test_geometric_transform03.<locals>.mappingrj   r   r   r   r   rE   r   r   r(   r(   r+   test_geometric_transform03   r   z1TestGeometricTransform.test_geometric_transform03c                 C   sH   | g d}dd }tj|||j|d}t||j g d|jd d S )Nr%   r   r/   r.   c                 S   r@   r   r(   r)   r(   r(   r+   r~      r-   zBTestGeometricTransform.test_geometric_transform04.<locals>.mappingrj   r   r%   r   r/   rE   r   r   r(   r(   r+   test_geometric_transform04   s   z1TestGeometricTransform.test_geometric_transform04rF   rT   
complex128c           	      C   s   t ||}|jg dg dg dg|d}|jg dg dg dg|d}t|j}||jdr<|d| 8 }|d| 8 }dd }tj|||j|d}t|| d S )	Nrx   rE   r   complex floating              ?c                 S      | d | d d fS r   r(   r)   r(   r(   r+   r~         zBTestGeometricTransform.test_geometric_transform05.<locals>.mappingrj   )	rl   r7   r	   isdtyperF   r8   r9   r   r   )	r;   r5   rF   r=   r>   ra   r   r~   rp   r(   r(   r+   test_geometric_transform05   s,   



z1TestGeometricTransform.test_geometric_transform05c                 C   h   | g dg dg dg}dd }tj|||j|d}|j g dg dg d	g|jd
}t|| d S )Nr   r1   rD         r/   r   r/   rD   c                 S   r   r   r(   r)   r(   r(   r+   r~      r   zBTestGeometricTransform.test_geometric_transform06.<locals>.mappingrj   r   r   r1   rD   r   r   r/   r   r/   rE   r7   r8   r9   r   rF   r   r;   r5   r=   r>   r~   rp   ra   r(   r(   r+   test_geometric_transform06      

z1TestGeometricTransform.test_geometric_transform06c                 C   sh   | g dg dg dg}dd }tj|||j|d}|j g dg dg dg|jd}t|| d S )	Nr   r   r   c                 S   s   | d d | d fS r   r(   r)   r(   r(   r+   r~      r   zBTestGeometricTransform.test_geometric_transform07.<locals>.mappingrj   r   r   r   r   rE   r   r   r(   r(   r+   test_geometric_transform07   r   z1TestGeometricTransform.test_geometric_transform07c                 C   r   )Nr   r   r   c                 S      | d d | d d fS r   r(   r)   r(   r(   r+   r~         zBTestGeometricTransform.test_geometric_transform08.<locals>.mappingrj   r   r   r   rE   r   r   r(   r(   r+   test_geometric_transform08   r   z1TestGeometricTransform.test_geometric_transform08c                 C   s   | g dg dg dg}dd }|dkrtj||d}n|}tj|||j|dd	}|j g d
g dg dg|jd}t|| d S )Nr   r   r   c                 S   r   r   r(   r)   r(   r(   r+   r~     r   zBTestGeometricTransform.test_geometric_transform10.<locals>.mappingr   rj   Fr5   	prefilterr   r   r   rE   )r7   r8   rn   r9   r   rF   r   )r;   r5   r=   r>   r~   filteredrp   ra   r(   r(   r+   test_geometric_transform10  s$   

z1TestGeometricTransform.test_geometric_transform10c                 C   sL   |j dg|jd}dd }tj||dg|d}t||jg d|jd d S )Nr.   rE   c                 S   s   | d d fS Nr   r.   r(   r)   r(   r(   r+   r~     r-   zBTestGeometricTransform.test_geometric_transform13.<locals>.mappingr%   rj   rx   )rm   rT   r8   r9   r   r7   rF   r   r(   r(   r+   test_geometric_transform13  s   z1TestGeometricTransform.test_geometric_transform13c                 C   sH   | g d}dd }tj||dg|d}t||j g d|jd d S )Nr   r   r.   rD   r/   r1   r%   r%   c                 S   s   d| d  fS )Nr.   r   r(   r)   r(   r(   r+   r~   "  r-   zBTestGeometricTransform.test_geometric_transform14.<locals>.mappingr%   rj   rA   rE   )r7   r8   r9   r   rF   r   r(   r(   r+   test_geometric_transform14  s   z1TestGeometricTransform.test_geometric_transform14c                 C   s@   g d}dd }t j||dg|d}t|d d d g d d S )NrA   c                 S   s   | d d fS r   r(   r)   r(   r(   r+   r~   +  r-   zBTestGeometricTransform.test_geometric_transform15.<locals>.mappingr   rj   r.   r8   r9   r   r   r(   r(   r+   test_geometric_transform15(  s   z1TestGeometricTransform.test_geometric_transform15c                 C   sP   g dg dg dg}dd }t j||d|d}t|dd	gd
dgddgg d S )NrA   r   rD   r1   r   g      "@
         c                 S   s   | d | d d fS Nr   r   r.   r(   r)   r(   r(   r+   r~   6  r   zBTestGeometricTransform.test_geometric_transform16.<locals>.mappingr/   r.   rj   r   r/   r   r1   	   r   r   r   r(   r(   r+   test_geometric_transform161  s   
 z1TestGeometricTransform.test_geometric_transform16c                 C   sD   g dg dg dg}dd }t j||d|d}t|g dg d S )NrA   r   r   r   r   r   c                 S   s   | d d | d fS Nr   r.   r   r(   r)   r(   r(   r+   r~   B  r   zBTestGeometricTransform.test_geometric_transform17.<locals>.mappingr   r%   rj   r   r   r(   r(   r+   test_geometric_transform17=     
z1TestGeometricTransform.test_geometric_transform17c                 C   sD   g dg dg dg}dd }t j||d|d}t|dd	gg d S )
NrA   r   r   c                 S      | d d | d d fS r   r(   r)   r(   r(   r+   r~   N  r   zBTestGeometricTransform.test_geometric_transform18.<locals>.mappingr   r.   rj   r   r/   r   r   r(   r(   r+   test_geometric_transform18I  r   z1TestGeometricTransform.test_geometric_transform18c                 C   sL   g dg dg dg}dd }t j||d|d}t|dd d d	f | d S )
NrA   r   r   c                 S   s   | d | d d fS r   r(   r)   r(   r(   r+   r~   Z  r   zBTestGeometricTransform.test_geometric_transform19.<locals>.mappingr/   r   rj   .r.   r   r   r(   r(   r+   test_geometric_transform19U     
z1TestGeometricTransform.test_geometric_transform19c                 C   sL   g dg dg dg}dd }t j||d|d}t|d d dd	f | d S )
NrA   r   r   c                 S   s   | d d | d fS r   r(   r)   r(   r(   r+   r~   f  r   zBTestGeometricTransform.test_geometric_transform20.<locals>.mappingrD   r%   rj   r.   .r   r   r(   r(   r+   test_geometric_transform20a  r   z1TestGeometricTransform.test_geometric_transform20c                 C   sR   g dg dg dg}dd }t j||d|d}t|d d dd d df | d S )	NrA   r   r   c                 S      | d d | d d fS r   r(   r)   r(   r(   r+   r~   r  r   zBTestGeometricTransform.test_geometric_transform21.<locals>.mappingrD   r   rj   r.   r   r   r(   r(   r+   test_geometric_transform21m  s   
"z1TestGeometricTransform.test_geometric_transform21c                 C   sd   |j g dg dg dg|jd}dd }dd }tj||d	|d
}tj||d|d
}t|| d S )NrA   r   r   rE   c                 S   r   r   r(   r)   r(   r(   r+   mapping1~  r   zCTestGeometricTransform.test_geometric_transform22.<locals>.mapping1c                 S   r   r   r(   r)   r(   r(   r+   mapping2  r   zCTestGeometricTransform.test_geometric_transform22.<locals>.mapping2r   rj   r/   r%   )r7   rT   r8   r9   r   )r;   r5   r=   r>   r   r   rp   r(   r(   r+   test_geometric_transform22y  s   
z1TestGeometricTransform.test_geometric_transform22c                 C   sN   g dg dg dg}dd }t j||d|d}|tj}t|dd	g d S )
NrA   r   r   c                 S   s   d| d d fS )Nr   r   r.   r(   r)   r(   r(   r+   r~        zBTestGeometricTransform.test_geometric_transform23.<locals>.mappingr.   rj   r   r1   )r8   r9   astyperR   int32r   r   r(   r(   r+   test_geometric_transform23  s   z1TestGeometricTransform.test_geometric_transform23c                 C   sJ   g dg dg dg}dd }t j||d|ddd	id
}t|ddg d S )NrA   r   r   c                 S   s   || d | fS )Nr   r(   )r*   abr(   r(   r+   r~     r   zBTestGeometricTransform.test_geometric_transform24.<locals>.mappingr   )r   r   r.   )r5   extra_argumentsextra_keywordsr   r1   r   r   r(   r(   r+   test_geometric_transform24  s   
z1TestGeometricTransform.test_geometric_transform24N)rc   rd   re   r   r   r   r   rP   rf   rg   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r(   r(   r(   r+   r{      s.    




			r{   c                   @   sh   e Zd Zdd Zejdg dejdeddd Ze	d	d
ddd Z
e	d	dddd ZdS )TestGeometricTransformExtrac                 C   sV   |j g dg dg|jd}dd }| g dg dg}ttj||dd	d
| d S )Nr   r.   r/   r%   r   rD   rE   c                 S   s   | d d | d d fS )Nr   r'   r   r(   r)   r(   r(   r+   r~     r   zZTestGeometricTransformExtra.test_geometric_transform_grid_constant_order1.<locals>.mappingg      ?g      ?      ?r   g      @r0   r   r   r3   r5   )r7   rT   r   r8   r9   )r;   r=   r*   r~   expected_resultr(   r(   r+   -test_geometric_transform_grid_constant_order1  s   


zITestGeometricTransformExtra.test_geometric_transform_grid_constant_order1r3   r   r   r   r   r   r5   rD   c                 C   s   dd }t jdtddd}d}t|}t j|||d}||}||}tt	|| g|j
 }	tj||||d|	 }
ttj||||d|
d	d
 d S )Nc                 S   s   | d d | d d fS )Nr   皙?r   gffffff@r(   r)   r(   r(   r+   r~     r   zOTestGeometricTransformExtra.test_geometric_transform_vs_padded.<locals>.mapping   rE   r      rK   r   rL   rN   )rR   rS   floatreshaperX   rY   rZ   r7   tupleslicendimr8   r9   r   )r;   r5   r3   r=   r~   r*   r]   r^   x_paddedcenter_slicer   r(   r(   r+   "test_geometric_transform_vs_padded  s(   




z>TestGeometricTransformExtra.test_geometric_transform_vs_paddedTzendianness is numpy-specificrs   c                 C   sz   t dg}dd }|j|j t |t ||j fD ]}tj|||j|d}|d u r2|n|}t	|dg q d S )Nr   c                 S   r|   r}   r(   r)   r(   r(   r+   r~     r   zfTestGeometricTransformExtra.test_geometric_transform_endianness_with_output_parameter.<locals>.mappingru   )
rR   r7   rF   newbyteorder
empty_liker   r8   r9   r   r   )r;   r=   r>   r~   rp   returnedresultr(   r(   r+   9test_geometric_transform_endianness_with_output_parameter  s   zUTestGeometricTransformExtra.test_geometric_transform_endianness_with_output_parameter!string `output` is numpy-specificc                 C   sH   | dg}dd }tj||dd}|jtdu sJ t|dg d S )Nr   c                 S   r|   r}   r(   r)   r(   r(   r+   r~     r   zXTestGeometricTransformExtra.test_geometric_transform_with_string_output.<locals>.mappingfru   )r7   r8   r9   rF   rR   r   )r;   r=   r>   r~   rp   r(   r(   r+   +test_geometric_transform_with_string_output  s
   zGTestGeometricTransformExtra.test_geometric_transform_with_string_outputN)rc   rd   re   r   rP   rf   rg   rh   r   r   r   r   r(   r(   r(   r+   r     s    


r   c                   @   s   e Zd Zejdeddejdejej	gdd Z
ejdedddd Zed	d
ddd Zedddd Zeddddd Zejjdejv pWedjdk dddd ZdS )TestMapCoordinatesr5   r   rD   rF   c           	      C   s   t |r|dkrtd |g dg dg dg}|g dg dg dg}t|j}||jd	r@|d
|  }|d
|  }t|j	}|d8 }||}t
j|||d}t|| d S )Nr   'jax map_coordinates requires order <= 1r   r   r   r   r   r   r   r   rj   )r   rP   rQ   r7   r	   r   rF   rR   indicesr   r8   rW   r   )	r;   r5   rF   r=   r>   ra   r   idxrp   r(   r(   r+   test_map_coordinates01  s&   




z)TestMapCoordinates.test_map_coordinates01c                 C   s   t |r|dkrtd |dkrtd |g dg dg dg}t|jtj}|d8 }||}tj	|d|d}tj
|||d}t|| d S )	Nr   r   zoutput differs. jax bug?r   r   r   r'   rj   )r   rP   rQ   r7   rR   r   r   rT   r8   r,   rW   r   )r;   r5   r=   r>   r   out1out2r(   r(   r+   test_map_coordinates02  s   



z)TestMapCoordinates.test_map_coordinates02r   z`order` is required in jaxr    c              	   C   s  t g dg dg dgd|d}t|jd }||}t||}|g dg dg d	g}t|| t|t|d
 t|d d ddf jd }||}t|d d ddf |}t||g dg dg t|t|d d ddf d
 t|d d d d df jd }||}t|d d d d df |}t||ddgddgddgg t|t|d d d d df d
 d S )Nr   r   r   F)r5   r=   r   r   r   r   r   r   r.   .r   r%   r1   )	r   rR   r   r   r7   r8   rW   r   r,   )r;   r=   r>   r   rp   ra   r(   r(   r+   test_map_coordinates03  s6   



 "
"(z)TestMapCoordinates.test_map_coordinates03T)rt   c                 C   s   t ddgddgg}t ddgddgg}t |j}|d8 }|j|j t |t ||j fD ]}tj	|||d}|d u rF|n|}t
|| q6d S )Nr   r.   r1   rD   r   ru   )rR   r7   r   r   rF   r   r   r   r8   rW   r   )r;   r=   r>   ra   r   rp   r   r   r(   r(   r+   5test_map_coordinates_endianness_with_output_parameter:  s   zHTestMapCoordinates.test_map_coordinates_endianness_with_output_parameterr   rs   c                 C   s`   | dgg}t|j}| |}tj||dd}|jtdu s$J t|| dgg d S Nr   r   ru   )r7   rR   r   r   r8   rW   rF   r   )r;   r=   r>   r   rp   r(   r(   r+   'test_map_coordinates_with_string_outputN  s   
z:TestMapCoordinates.test_map_coordinates_with_string_outputwin32r   z2do not run on 32 bit or windows (no sparse memory)c              
   C   s   z7d}t j|d t jd||}d||d d |d d f< tj||||d g|d ggdd W d S  tyI } zt	d	|d }~ww )
Ni0u  r.   rE   r   r/   r"   r   rj   zNot enough memory available)
rR   emptyfloat32r   r8   rW   r7   MemoryErrorrP   skip)r;   r=   nr   er(   r(   r+   test_map_coordinates_large_dataW  s   "z2TestMapCoordinates.test_map_coordinates_large_dataN)rc   rd   re   rP   rf   rg   rh   rR   rT   r   r   r   r   r   r   r  skipifsysplatformintpitemsizer	  r(   r(   r(   r+   r     s     





r   c                   @   s  e Zd Zejdedddd Zejdedddd Zejdedddd	 Z	ejdeddd
d Z
ejdeddejdddgdd Zejdedddd Zejdedddd Zejdedddd Zejdedddd Zejdedddd Zejdedddd Zejdedddd Zejdedddd  Zejdeddd!d" Zejdeddd#d$ Zejdeddd%d& Zejdeddd'd( Zejdeddd)d* Zejdeddd+d, Zejdeddd-d. Zejdeddd/d0 Zejdeddd1d2 Zejdeddd3d4 Zejdeddd5d6 Zejdeddd7d8 Zejdeddd9d: Z d;d< Z!e"d=d>d?d@dA Z#e"d=d>d?dBdC Z$e"d=dDd?dEdF Z%e"d=dGd?dHdI Z&ejdJg dKejdedddLdM Z'ejdedddNdO Z(dPS )QTestAffineTransformr5   r   rD   c                 C   s<   | dg}tj|| dgg|d}t|| dg d S )Nr   rj   r7   r8   affine_transformr   r;   r5   r=   r>   rp   r(   r(   r+   test_affine_transform01k  s   z+TestAffineTransform.test_affine_transform01c                 C   s>   | dg}tj||dgg|d}t||g d d S )Nr%   r   rj   rx   rm   r8   r  r7   r   r  r(   r(   r+   test_affine_transform02q  s   z+TestAffineTransform.test_affine_transform02c                 C   s@   | dg}tj||dggd|d}t||g d d S )Nr%   r   r&   rj   r   r  r  r(   r(   r+   test_affine_transform03w  s   z+TestAffineTransform.test_affine_transform03c                 C   sB   | g d}tj|| dggd|d}t|| g d d S )Nr   r   r&   rj   r   r  r  r(   r(   r+   test_affine_transform04}  s   z+TestAffineTransform.test_affine_transform04rF   rT   r   c                 C   s   t ||}|jg dg dg dg|d}|jg dg dg dg|d}t|j}||jdr<|d| 8 }|d| 8 }tj||ddgddggddg|d	}t|| d S )
Nrx   rE   r   r   r   r   r   r&   rj   )rl   r7   r	   r   rF   r8   r  r   r;   r5   rF   r=   r>   ra   r   rp   r(   r(   r+   test_affine_transform05  s*   



z+TestAffineTransform.test_affine_transform05c                 C   sj   | g dg dg dg}tj|| ddgddggddg|d}t|| g dg d	g d
g d S )Nr   r   r   r   r   r&   rj   r   r   r   r  r  r(   r(   r+   test_affine_transform06     
z+TestAffineTransform.test_affine_transform06c                 C   sj   | g dg dg dg}tj|| ddgddggddg|d}t|| g dg dg dg d S )	Nr   r   r   r   r   r&   rj   r   r  r  r(   r(   r+   test_affine_transform07  r  z+TestAffineTransform.test_affine_transform07c                 C   sj   | g dg dg dg}tj|| ddgddggddg|d}t|| g dg d	g d
g d S )Nr   r   r   r   r   r&   rj   r   r   r   r  r  r(   r(   r+   test_affine_transform08  r  z+TestAffineTransform.test_affine_transform08c                 C   s   | g dg dg dg}|dkrtj||d}n|}tj|| ddgddggddg|dd	}t|| g d
g dg dg d S )Nr   r   r   r   rj   r   r&   Fr   r   r   r   )r7   r8   rn   r  r   r;   r5   r=   r>   r   rp   r(   r(   r+   test_affine_transform09  s   
z+TestAffineTransform.test_affine_transform09c                 C   sF   |j dg|jd}tj||dggd|d}t||g d d S )Nr.   rE   r'   rB   )r4   r5   r   r   r   r   )rm   rT   r8   r  r7   r   r  r(   r(   r+   test_affine_transform10  s
   z+TestAffineTransform.test_affine_transform10c                 C   sD   | g d}tj|| dggdd|d}t|| g d d S )Nr   r.   r   rB   rj   rA   r  r  r(   r(   r+   test_affine_transform11  s   z+TestAffineTransform.test_affine_transform11c                 C   sN   | g d}tj|| dggdd|d}t|d d d | g d d S )NrA   r'   r   r   rj   r.   r  r  r(   r(   r+   test_affine_transform12  s   "z+TestAffineTransform.test_affine_transform12c                 C   sl   g dg dg dg}| |}tj|| ddgddggdd|d}t|| dd	gd
dgddgg d S )NrA   r   r   r   r   r.   r   rj   r/   r   r1   r   r   r  r  r(   r(   r+   test_affine_transform13  s   
&z+TestAffineTransform.test_affine_transform13c                 C   s`   g dg dg dg}| |}tj|| ddgddggdd|d}t|| g dg d S )	NrA   r   r   r.   r   r   r   rj   r  r  r(   r(   r+   test_affine_transform14     
z+TestAffineTransform.test_affine_transform14c                 C   s`   g dg dg dg}| |}tj|| ddgddggdd|d}t|| dd	gg d S )
NrA   r   r   r.   r   r   rj   r   r/   r  r  r(   r(   r+   test_affine_transform15  r'  z+TestAffineTransform.test_affine_transform15c                 C   sb   g dg dg dg}| |}tj|| ddgddggdd|d	}t|d
d d df | d S )NrA   r   r   r           r   r'   r   rj   .r.   r  r  r(   r(   r+   test_affine_transform16     
z+TestAffineTransform.test_affine_transform16c                 C   sb   g dg dg dg}| |}tj|| ddgddggdd|d}t|d d d	d
f | d S )NrA   r   r   r'   r   r   r   rj   r.   .r  r  r(   r(   r+   test_affine_transform17  r+  z+TestAffineTransform.test_affine_transform17c                 C   sd   | g dg dg dg}tj|| ddgddggdd|d}t|d d dd d df | d S )	NrA   r   r   r'   r   r   rj   r.   r  r  r(   r(   r+   test_affine_transform18  s   
"z+TestAffineTransform.test_affine_transform18c                 C   s|   |j g dg dg dg|jd}tj|| ddgddggdd|d}tj|| d	dgdd	ggdd
|d}t|| d S )NrA   r   r   rE   r'   r   r   rj          @r   )r7   rT   r8   r  r   r  r(   r(   r+   test_affine_transform19  s   
z+TestAffineTransform.test_affine_transform19c                 C   sl   t |r	td g dg dg dg}||}tj||dgdggdd|d}t||d	d
g d S )N(https://github.com/cupy/cupy/issues/8394rA   r   r   r   r.   r   rj   r   r/   r   rP   rQ   r7   r8   r  r   r  r(   r(   r+   test_affine_transform20     

z+TestAffineTransform.test_affine_transform20c                 C   sl   t |r	td g dg dg dg}||}tj||dgdggdd|d}t||d	d
g d S )Nr0  rA   r   r   r.   r   r   rj   r   r   r1  r  r(   r(   r+   test_affine_transform21,  r3  z+TestAffineTransform.test_affine_transform21c                 C   sF   | g d}tj|| dggdgd|d}t|| g d d S )Nr   r.   r&   )r/   rj   r   r   r.   r  r  r(   r(   r+   test_affine_transform229  s
   z+TestAffineTransform.test_affine_transform22c                 C   sP   | g d}tj|| dggdgd|d}t|d d d | g d d S )Nr   r'   r&   r#  rj   r.   r   r  r  r(   r(   r+   test_affine_transform23A  s
   "z+TestAffineTransform.test_affine_transform23c                 C      | g d}t }|td tj|| dgd|d}W d    n1 s(w   Y  tj|| dggd|d}t|| d S )Nr   @The behavior of affine_transform with a 1-D array .* has changedr.   r&   rj   r7   r   filterUserWarningr8   r  r   r;   r5   r=   r>   supr   r   r(   r(   r+   test_affine_transform24I     z+TestAffineTransform.test_affine_transform24c                 C   r8  )Nr   r9  r'   r&   rj   r:  r=  r(   r(   r+   test_affine_transform25U  r@  z+TestAffineTransform.test_affine_transform25c              	   C   s
  | g dg dg dg}|dkrtj||d}n|}|d}|d }t||j}|||fdd}||| g d	gfd
d}	dd ||dD }
tj|||
|dd}tj|||dd}tj||	|dd}|||fD ]}t	|| g dg dg dg qod S )Nr   r   r   r   rj   r.   r.   r   axis)r)  r   r   r   c                 S   s   g | ]}t |qS r(   )r   ).0r*   r(   r(   r+   
<listcomp>r  s    z?TestAffineTransform.test_affine_transform26.<locals>.<listcomp>)r&   Fr   r   r   r   )
r7   r8   rn   eyerm   r	   concatr   r  r   )r;   r5   r=   r>   r   tform_originaloffset_originalrH  tform_h1tform_h2offsr   r   out3rp   r(   r(   r+   test_affine_transform26a  s:   




z+TestAffineTransform.test_affine_transform26c                 C   s   t |r	td |g dg dg dg}t|j}||d|d fdd}|||g d	gfd
d}tt	t
j|| d S )NzCuPy does not raiser   r   r   r.   rB  r   rC  )      @r.   r   r   )r   rP   rQ   r7   r	   rH  rG  rm   assert_raises
ValueErrorr8   r  )r;   r=   r>   rH  rK  rL  r(   r(   r+   test_affine_transform27  s   


z+TestAffineTransform.test_affine_transform27Tzbyteorder is numpy-specificrs   c              	   C   s   | d}|||||j |j|j fD ]@}t }|td |ddg}t	j
|||d}W d    n1 s@w   Y  |d u rK|n|}t||ddgddgg qd S )N)r.   r.   r9  r   ru   )rm   r   r   rF   r   r   r;  r<  r7   r8   r  r   )r;   r=   r>   rp   r>  matrixr   r   r(   r(   r+   9test_affine_transform_1d_endianness_with_output_parameter  s   
zMTestAffineTransform.test_affine_transform_1d_endianness_with_output_parameterc                 C   s~   t dg}|j|j t |t ||j fD ] }tj|t dgg|d}|d u r1|n|}t|t dg qd S )Nr   ru   )	rR   r7   rF   r   r   r   r8   r  r   )r;   r=   r>   rp   r   r   r(   r(   r+   >test_affine_transform_multi_d_endianness_with_output_parameter  s   zRTestAffineTransform.test_affine_transform_multi_d_endianness_with_output_parameterz+`out` of a different size is numpy-specificc                 C   s   |j d|jd}|d}tj||dgg|d t|d d | tt	 tj|dgg|dd W d    d S 1 s?w   Y  d S )Nr   rE   )   r   ru   )r   )rv   r4   )
rS   rT   rm   r8   r  r7   r   rP   r
   RuntimeErrorr;   r=   r>   rp   r(   r(   r+   "test_affine_transform_output_shape  s   
"z6TestAffineTransform.test_affine_transform_output_shaper   c                 C   sP   | dg}tj|| dggdd}|jtdu sJ t|| dg d S r   )r7   r8   r  rF   rR   r   rY  r(   r(   r+   (test_affine_transform_with_string_output  s   z<TestAffineTransform.test_affine_transform_with_string_outputr,   )r   r   r   r   )r&   r   )r/   )r.   r1   c                 C   s   t ddgddgg}t d}t d|d dd df< t ||d d df< t j||dd}||}||}||}ttj||d|d	| d S )
Nr   r   r.   r/   r.   r/   r]  rC  r   r   )rR   r7   zerosrG  rollr   r8   r  )r;   r,   r5   r=   r*   affinera   r(   r(   r+   )test_affine_transform_shift_via_grid_wrap  s   




z=TestAffineTransform.test_affine_transform_shift_via_grid_wrapc                 C   s   t g dg dg}|d d dd d df  }||}||}t ddg}t d|d dd df< t |j|d d df< ||}ttj||d|d| d S )Nr5  r/   r%   r   r&   r.   r/   r   r   )	rR   r7   copyr`  rG  r   r   r8   r  )r;   r5   r=   r*   ra   rb  r(   r(   r+   #test_affine_transform_shift_reflect  s   



z7TestAffineTransform.test_affine_transform_shift_reflectN))rc   rd   re   rP   rf   rg   rh   r  r  r  r  r  r  r  r  r  r!  r"  r$  r%  r&  r(  r*  r,  r-  r/  r2  r4  r6  r7  r?  rA  rO  rS  r   rU  rV  rZ  r[  rc  rf  r(   r(   r(   r+   r  i  s    














	
	
	
	
	
















r  c                   @   s4  e Zd Zejdedddd Zejdedddd Zejdedddd	 Z	ejdeddd
d Z
ejdeddejdddgdd Zejdeddejdddgejdddgdd Zejdedddd Zejdedddd Zejdedddd Zejdedddd Zejdg dejdeddd d! Zejdg dejdeddd"d# Zd$d% Zejdeddd&d' Zejdeddejd(d)d*gd+d, Zejdg d-ejdedd.d/ Zd0S )1	TestShiftr5   r   rD   c                 C   s4   | dg}tj|dg|d}t|| dg d S )Nr   rj   r   r7   r8   r,   r   r  r(   r(   r+   test_shift01  s   zTestShift.test_shift01c                 C   s6   | dg}tj|dg|d}t||g d d S )Nr%   r   rj   r   rm   r8   r,   r   r7   r  r(   r(   r+   test_shift02  s   zTestShift.test_shift02c                 C   s4   | dg}tj|d|d}t||g d d S )Nr%   r&   rj   r   rj  r  r(   r(   r+   test_shift03  s   zTestShift.test_shift03c                 C   s6   | g d}tj|d|d}t|| g d d S )Nr   r   rj   r   rh  r  r(   r(   r+   test_shift04  s   zTestShift.test_shift04rF   rT   r   c                 C   s   t ||}|jg dg dg dg|d}|jg dg dg dg|d}t|j}||jdr<|d| 8 }|d| 8 }tj|ddg|d}t|| d S )	Nrx   rE   r   r   r   r   r   rj   )rl   r7   r	   r   rF   r8   r,   r   r  r(   r(   r+   test_shift05  s&   



zTestShift.test_shift05r3   r   r   c           
      C   s   t jg dg dg dg|d}t jg dg dg dg|d}t|j}||jdr7|d| 8 }|d| 8 }d}||d d df< ||}||}tj|ddg|||d	}	t|	| d S )
Nrx   rE   r   r   r   rP  r   r   )r5   r3   r2   )rR   r7   r	   r   rF   r8   r,   r   )
r;   r5   r3   rF   r=   r>   ra   r   r2   rp   r(   r(   r+   test_shift_with_nonzero_cval  s,   




z&TestShift.test_shift_with_nonzero_cvalc                 C   sV   | g dg dg dg}tj|ddg|d}t|| g dg dg d	g d S )
Nr   r   r   r   r   rj   r   r   r   rh  r  r(   r(   r+   test_shift060     
zTestShift.test_shift06c                 C   sV   | g dg dg dg}tj|ddg|d}t|| g dg dg dg d S )Nr   r   r   r   r   rj   r   rh  r  r(   r(   r+   test_shift07:  rq  zTestShift.test_shift07c                 C   sV   | g dg dg dg}tj|ddg|d}t|| g dg dg dg d S )	Nr   r   r   r   rj   r   r   r   rh  r  r(   r(   r+   test_shift08D  rq  zTestShift.test_shift08c                 C   st   | g dg dg dg}|dkrtj||d}n|}tj|ddg|dd}t|| g dg d	g d
g d S )Nr   r   r   r   rj   Fr   r   r   r   )r7   r8   rn   r,   r   r  r(   r(   r+   test_shift09N  s   
zTestShift.test_shift09r,   r\  c                 C   sV   t ddgddgg}t j||dd}||}||}ttj||d|d| d S )	Nr   r   r.   r/   r]  rC  r   r   )rR   r7   ra  r   r8   r,   )r;   r,   r5   r=   r*   ra   r(   r(   r+   test_shift_grid_wrap\  s   


zTestShift.test_shift_grid_wrapc                 C   s<   | |dd}ttj||d|dtj||d|d d S )N   )r   r%   r   r   r   )r   rS   r   r8   r,   )r;   r,   r5   r=   r*   r(   r(   r+   test_shift_grid_constant1m  s
   z#TestShift.test_shift_grid_constant1c                 C   sN   |j g dg dg|jd}| g dg dg}ttj|dddd	| d S )
Nr   r   rE   r   r   )r'   r'   r   r   r   )r7   rT   r   r8   r,   )r;   r=   r*   r   r(   r(   r+   test_shift_grid_constant_order1x  s   

z)TestShift.test_shift_grid_constant_order1c                 C   sd   t g dg dg}|d d dd d df  }||}||}ttj||jd|d| d S )Nr5  rd  r&   r   r   )rR   r7   re  r   r8   r,   r   )r;   r5   r=   r*   ra   r(   r(   r+   test_shift_reflect  s   


zTestShift.test_shift_reflectr   FTc                 C   sr   | d}td||d}ttj||d d fi |d |d  ttj|| d d fi |d |d  d S )NrW  r   )r3   r5   r   r.   r   r   r&   )rS   dictr   r8   r,   )r;   r5   r   r=   r*   kwargsr(   r(   r+   test_shift_nearest_boundary  s   
$&z%TestShift.test_shift_nearest_boundaryr   c                 C   s   t jdtddd}d}d}t|}|t j|||d}||}	tt	|| g|	j
 }
tj||||d|
 }ttj|	|||d|dd	 d S )
Nr   rE   r   )r   gffffffrJ   rK   r   rL   r   )rR   rS   r   r   rX   rY   r7   rZ   r   r   r   r8   r,   r   )r;   r5   r3   r=   x_npr,   r]   r^   r   r*   r   r   r(   r(   r+   test_shift_vs_padded  s"   


zTestShift.test_shift_vs_paddedN)rc   rd   re   rP   rf   rg   rh   ri  rk  rl  rm  rn  ro  rp  rr  rs  rt  ru  rw  rx  ry  r|  r~  r(   r(   r(   r+   rg    sV    




	
	
	


rg  c                   @   s&  e Zd Zejdedddd Zdd Zdd	 Z	ejdeddejd
ddgdd Z
dd Zdd Zdd Zejdg dejdg ddd Zejdddgejdg dejdg ddd  Zejdd!d"gejjd#d$ Zed%d&d'd(d) Zd*d+ Zd,S )-TestZoomr5   r   rD   c                 C   s   dddgfD ]d}| |jd|jdd}tj|||d}|jdks#J ||dd d f dks2J ||dd d f d	t ksCJ ||dd d f d
t ksTJ ||dt ks_J ||dt ksjJ qd S )Nr.      rE   )r   r   rj   )r   r   r&   r   rv  r   r   )r   rS   rT   r8   zoomr   alleps)r;   r5   r=   zarrr(   r(   r+   
test_zoom1  s   ""zTestZoom.test_zoom1c                 C   s4   | |dd}tt|dd}t|| d S )Nr   r   r.   r'   )r   rS   r8   r  r   )r;   r=   r  rp   r(   r(   r+   
test_zoom2  s   zTestZoom.test_zoom2c                 C   s^   | ddgg}t|d}t|d}t|| ddgddgg t|| g dg d S )Nr   r.   rB  r   )r   r   r.   r.   )r7   r8   r  r   )r;   r=   r  r   r   r(   r(   r+   
test_zoom3  s
   zTestZoom.test_zoom3rF   rT   r   c                 C   s   t ||}|jg dg dg dg|d}t|j}||jdr&|d| 8 }t }|td tj	||ddgd	d
|d}W d    n1 sIw   Y  t
|d d dd d df | d S )NrA   r   r   rE   r   r   r9  r'   r   r   rj   r.   )rl   r7   r	   r   rF   r   r;  r<  r8   r  r   )r;   r5   rF   r=   r>   r   r>  rp   r(   r(   r+   test_zoom_affine01  s&   


"zTestZoom.test_zoom_affine01c                 C   s&   d}t j|||fd| dd d S )Nr         ?r   rK   )r8   r  r`  )r;   r=   dimr(   r(   r+   test_zoom_infinity  s   "zTestZoom.test_zoom_infinityc                 C   s6   | d}d}tj||dd}| d}t|| d S )N)r   r   r   )r  r.  r.  r1   )r2   )r   r   r   )r`  r8   r  r   )r;   r=   r  r  rp   refr(   r(   r+   test_zoom_zoomfactor_one  s
   

z!TestZoom.test_zoom_zoomfactor_onec                 C   s,   | d}d}t||}|jdksJ d S )N)r/   r   r  )gUUUUUU?gE]t?g(\?)r%   rG      )r`  r8   r  r   )r;   r=   r  r  rp   r(   r(   r+   test_zoom_output_shape_roundoff  s   
z(TestZoom.test_zoom_output_shape_roundoffr  )r   )r/   r   )r   r.   )r   r   r3   )r   r   r   r   r   r   r   r   c                 C   s^   t jddgddggt jd}t |t |}||}||}ttj||d|d| d S )Nr   r   r.   r/   rE   rI   )rR   r7   rT   kronrm   r   r8   r  )r;   r  r3   r=   r}  ra   r*   r(   r(   r+   test_zoom_by_int_order0  s   
	

z TestZoom.test_zoom_by_int_order0r   r_  )r%   r%   )r   r   r   r   r   c              
   C   sV   t jt |td|}||}ttj||d|dd|t 	|t 
| d S )NrE   r   T)r5   r3   	grid_mode)rR   rS   prodr   r   r7   r   r8   r  r  rm   )r;   r   r  r3   r=   r}  r*   r(   r(   r+   test_zoom_grid_by_int_order0  s   
z%TestZoom.test_zoom_grid_by_int_order0r   r   c                 C   s`   | |jd|jdd}tjtdd tj|d|ddf W d    d S 1 s)w   Y  d S )	Nr   rE   )r/   r/   zIt is recommended to use mode)matchr.   T)r3   r  )r   rS   rT   rP   warnsr<  r8   r  )r;   r3   r=   r*   r(   r(   r+   test_zoom_grid_mode_warnings  s   "z%TestZoom.test_zoom_grid_mode_warningsTz!inplace output= is numpy-specificrs   c                 C   s,   | |dd}tj|d|dd dS )zTicket #643r   r   r.   r   ru   N)r   rS   r8   r  r`  )r;   r=   r*   r(   r(   r+   test_zoom_output_shape%  s   zTestZoom.test_zoom_output_shapec                 C   s:   | d}d}t|t|}t||}t|| d S )Ng      $@r.   )rS   r8   r  rR   arrayr   )r;   r=   r   factoractualra   r(   r(   r+   test_zoom_0d_array+  s
   
zTestZoom.test_zoom_0d_arrayN)rc   rd   re   rP   rf   rg   rh   r  r  r  r  r  r  r  r  r  thread_unsafer  r   r  r  r(   r(   r(   r+   r    s0    
	

r  c                   @   s  e Zd Zejdedddd Zejdedddd Zejdeddejdd	d
gdd Z	ejdedddd Z
ejdedddd Zejdedddd Zejdedddd Zejdedddd Zdd Zdd Zdd ZdS )
TestRotater5   r   rD   c                 C   s@   |j g dg dg dg|jd}tj|d|d}t|| d S )Nr   r   r   r   r   rE   r   rj   r7   rT   r8   rotater   r  r(   r(   r+   test_rotate016  s   
zTestRotate.test_rotate01c                 C   sh   |j g dg dg dg|jd}|j g dg dg dg dg|jd}tj|d|d}t|| d S )Nr   )r   r   r   r   rE   r   r   r   r   r   r   Z   rj   r  r;   r5   r=   r>   ra   rp   r(   r(   r+   test_rotate02>  s   

zTestRotate.test_rotate02rF   rT   r   c                 C   s   t ||}|jg dg dg dg|d}|jg dg dg dg dg dg|d}t|j}||jdrB|d| 8 }|d| 8 }tj|d|d	}t|| d S )
Nr   r   r   r   r   r   r   r   r   r   rE   r  r  r   r   r  rj   )rl   r7   r	   r   rF   r8   r  r   r  r(   r(   r+   test_rotate03J  s*   



zTestRotate.test_rotate03c                 C   sd   |j g dg dg dg|jd}|j g dg dg dg|jd}tj|dd|d}t|| d S )Nr  r  rE   r   r   r   r   r   r  F)r   r5   r  r  r(   r(   r+   test_rotate04]  s   

zTestRotate.test_rotate04c                 C   s   t d}tdD ]}t jg dg dg dg dgt jd|d d d d |f< q	||}|jg dg dg dg|jd}tj|d|d	}tdD ]}t|d d d d |f | qKd S )
N)r%   r/   r/   r/   r  r  rE   r   r  r  rj   rR   r  rh   r7   rT   r8   r  r   r;   r5   r=   r>   ira   rp   r(   r(   r+   test_rotate05h  s(   



zTestRotate.test_rotate05c                 C   s   t d}tdD ]}t jg dg dg dgt jd|d d d d |f< q	||}|jg dg dg dg dg|jd}tj|d|d	}tdD ]}t|d d d d |f | qKd S )
N)r/   r%   r/   r/   r   r  rE   r  r  r  rj   r  r  r(   r(   r+   test_rotate06x  s(   



zTestRotate.test_rotate06c                 C   s   |j g dg dg dggd |jd}t|j}||d}|j g dg dg dg dg dggd |jd}||d}tj|dd	|d
}t|| d S )Nr  r  r.   rE   r.   r   r   r  r  r  r]  )axesr5   r7   rT   r	   permute_dimsr8   r  r   r;   r5   r=   r>   r  ra   rp   r(   r(   r+   test_rotate07  s.   




zTestRotate.test_rotate07c                 C   s   |j g dg dg dggd |jd}t|j}||d}|j g dg dg dggd |jd}t|j}||d}tj|ddd	|d
}t|| d S )Nr  r  r.   rE   r  r  r  r]  F)r  r   r5   r  r  r(   r(   r+   test_rotate08  s,   





zTestRotate.test_rotate08c                 C   sj   |j g dg dg dgd |jd}tt tj|dd|jfd W d    d S 1 s.w   Y  d S )Nr  r  r.   rE   r  r   )r  )r7   rT   rQ  rR  r8   r  r   )r;   r=   r>   r(   r(   r+   test_rotate09  s   

"zTestRotate.test_rotate09c              	   C   s   | |jd|jdd}|jg dg dg dg dg dgg dg dg d	g d
g dgg dg dg dg dg dgg|jd}tj|ddd}t||ddd d S )N-   rE   )r/   r   r/   )r)  r)  r)  )g|S2@g|S2@g>)!@)g9HD%@g9HD'@g9HD)@)gc~@gc~@gzLb @)g[ic6*@g[ic6,@g[ic6.@)g      5@g      6@g      7@)gRK<@gRK=@gRK>@)g,PA@g,PgB@g,PB@)gݠ'?@grn@@grnГ@@)gGA@gG9B@gGB@r   F)angler   gư>g>rM   )r   rS   rT   r7   r8   r  r   )r;   r=   r>   ra   rp   r(   r(   r+   test_rotate10  s0   
zTestRotate.test_rotate10c                 C   sF   t |r	td t|dd}tt|dd}t|| d S )Nz(https://github.com/cupy/cupy/issues/8400r   )r   r      iL)	r   rP   rQ   rR   tilerS   r8   r  r   )r;   r=   r   r   r(   r(   r+   test_rotate_exact_180  s
   
z TestRotate.test_rotate_exact_180N)rc   rd   re   rP   rf   rg   rh   r  r  r  r  r  r  r  r  r  r  r  r(   r(   r(   r+   r  4  s*    







r  )'r  numpyrR   numpy.testingr   scipy._lib._array_apir   r   r   r   r   r   r	   rP   r
   rQ  scipy.ndimager8    r   scipy.conftestr   rf   r   usefixtures
pytestmarkr  rX   r   rg   rh   ri   r{   r   r   r  rg  r  r  r(   r(   r(   r+   <module>   sT    
I
&  
Mw    J~