a
    ߙfbQ                  
   @   sP  d dl Z d dlZd dlZd dlmZmZ d dlmZ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mZmZmZmZ d dlmZ d dlmZmZm Z  d dl!m"Z" d dl#m$Z$ g d	Z%g d
Z&g dZ'eeeeeeeeeeg
Z(dde)de*dgZ+e,dZ-de-d< e,dZ.de.d< ej/0dZ1ej/0ddZ2G dd dZ3dS )    N)assert_almost_equalassert_allclose)convolveconvolve_fft)Gaussian1DKernelGaussian2DKernelBox1DKernelBox2DKernelTrapezoid1DKernelTrapezoidDisk2DKernelRickerWavelet1DKernelTophat2DKernelRickerWavelet2DKernelAiryDisk2DKernelRing2DKernelCustomKernelModel1DKernelModel2DKernelKernel1DKernel2D)KernelSizeError)Box2D
Gaussian1D
Gaussian2D)	HAS_SCIPY)AstropyUserWarning)         	   )            )centerZlinear_interpZ
oversampleZ	integrate         ?Q   (   )r'   r'   )r(   r(   =   c                   @   s.  e Zd ZdZejdejdedd Z	ejdejdedd Z
ejdeeeed	d
 Zejdeeeedd Zejdedd Zejdedd Zdd Zdd Zejdedd Zejdedd Zejde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"d0d1 Z#d2d3 Z$d4d5 Z%d6d7 Z&d8d9 Z'd:d; Z(d<d= Z)d>d? Z*d@dA Z+dBdC Z,ejdDeeee-dEdF Z.ejde/dGdH Z0dIdJ Z1dKdL Z2dMdN Z3dOdP Z4dQdR Z5dSdT Z6dUdV Z7dWdX Z8dYS )ZTestKernelsz:
    Test class for the built-in convolution kernels.
    znot HAS_SCIPYwidthc           	      C   s|   ddl m} t|}|  t|}|  tt|dd}tt|dd}|t|}|t|}t||dd t||dd dS )zL
        Test GaussianKernel against SciPy ndimage gaussian filter.
        r   )gaussian_filterfillboundary   ZdecimalN)	scipy.ndimager,   r   	normalizer   r   delta_pulse_1Ddelta_pulse_2Dr   )	selfr+   r,   Zgauss_kernel_1DZgauss_kernel_2D
astropy_1D
astropy_2Dscipy_1Dscipy_2D r;   Jlib/python3.9/site-packages/astropy/convolution/tests/test_kernel_class.pytest_scipy_filter_gaussian2   s    

z&TestKernels.test_scipy_filter_gaussianc           
      C   s  ddl m} t|}t|}tt|ddd}tt|ddd}tt	 }tt|ddd}W d   n1 sl0    Y  d|j
jd v sJ tt	 }tt|ddd}W d   n1 s0    Y  d|j
jd v sJ |t| }|t| }	t||d	d
 t||	d	d
 dS )z\
        Test RickerWavelet kernels against SciPy ndimage gaussian laplace filters.
        r   )gaussian_laplacer-   Fr/   Znormalize_kernelTNzsum is close to zeror   r1   )r2   r>   r   r   r   r4   r5   pytestraises	Exceptionvalueargsr   )
r6   r+   r>   Zricker_kernel_1DZricker_kernel_2Dr7   r8   excr9   r:   r;   r;   r<   "test_scipy_filter_gaussian_laplaceH   s    ..z.TestKernels.test_scipy_filter_gaussian_laplace)kernel_typer+   c                 C   s   |t krtstd |tks(||}n|||d }|jdkrptt|ddd}tt|ddd}t	||dd n.tt
|ddd}tt
|ddd}t	||dd d	S )
I
        Test smoothing of an image with a single positive pixel
        /Omitting AiryDisk2DKernel, which requires SciPy皙?r%   r-   Fr?   r0   r1   Nr   r   r@   skipr   	dimensionr   r4   r   r   r5   r6   rG   r+   kernelc1c2r;   r;   r<   test_delta_datag   s    


zTestKernels.test_delta_datac                 C   s   |t krtstd |tks(||}n|||d }|jdkrptt|ddd}tt|ddd}t	||dd n.tt
|ddd}tt
|ddd}t	||dd d	S )
zA
        Test smoothing of an image made of random noise
        rI   rJ   r%   r-   Fr?   r0   r1   N)r   r   r@   rL   r   rM   r   random_data_1Dr   r   random_data_2DrN   r;   r;   r<   test_random_data|   s    


zTestKernels.test_random_datac                 C   s<   t ||g}tt|dd}tt|dd}t||dd dS )z
        Test smoothing of an image with a single positive pixel

        Instead of using kernel class, uses a simple, small kernel
        r-   r.   r0   r1   N)nponesr   r5   r   r   )r6   r+   rO   rQ   rP   r;   r;   r<   test_uniform_smallkernel   s    z$TestKernels.test_uniform_smallkernelc                 C   sL   t ||g|d  }t|}tt|dd}tt|dd}t||dd dS )rH   r    r-   r.   r0   r1   N)rV   rW   r	   r   r5   r   )r6   r+   Zkernel1Zkernel2rQ   rP   r;   r;   r<   test_smallkernel_vs_Box2DKernel   s
    z+TestKernels.test_smallkernel_vs_Box2DKernelc                 C   sr   t d}t d}t d}tjtdd t||}W d   n1 sF0    Y  tt|| jdk snJ dS zR
        Check if convolving two kernels with each other works correctly.
        r   r!   r   z*Both array and kernel are Kernel instancesmatchNg{Gz?)	r   r@   warnsr   r   rV   allabsarrayr6   Zgauss_1Zgauss_2Ztest_gauss_3Zgauss_3r;   r;   r<   test_convolve_1D_kernels   s    (z$TestKernels.test_convolve_1D_kernelsc                 C   sr   t d}t d}t d}tjtdd t||}W d   n1 sF0    Y  tt|| jdk snJ dS rZ   )	r   r@   r]   r   r   rV   r^   r_   r`   ra   r;   r;   r<   test_convolve_2D_kernels   s    (z$TestKernels.test_convolve_2D_kernelsnumberc                 C   s*   t d}|| }t|j|j| dd dS )N
        Check if multiplying a kernel with a scalar works correctly.
        r   r0   r1   N)r   r   r`   r6   rd   gaussZ	gauss_newr;   r;   r<   test_multiply_scalar   s    z TestKernels.test_multiply_scalarc                 C   s$   t d}|| }t|t u s J dS re   r   Nr   typerf   r;   r;   r<   test_multiply_scalar_type   s    z%TestKernels.test_multiply_scalar_typec                 C   s$   t d}|| }t|t u s J dS ri   rj   rf   r;   r;   r<   test_rmultiply_scalar_type   s    z&TestKernels.test_rmultiply_scalar_typec                 C   s>   t d}tt ||  W d   n1 s00    Y  dS )z9Test that multiplying two 1D kernels raises an exception.r   N)r   r@   rA   rB   r6   rg   r;   r;   r<   test_multiply_kernel1d   s    z"TestKernels.test_multiply_kernel1dc                 C   s>   t d}tt ||  W d   n1 s00    Y  dS )z9Test that multiplying two 2D kernels raises an exception.r   N)r   r@   rA   rB   rn   r;   r;   r<   test_multiply_kernel2d   s    z"TestKernels.test_multiply_kernel2dc                 C   s>   t t  tdtd  W d   n1 s00    Y  dS )za
        Test that multiplying a 1D kernel with a 2D kernel raises an
        exception.
        r   N)r@   rA   rB   r   r   r6   r;   r;   r<   test_multiply_kernel1d_kernel2d   s    z+TestKernels.test_multiply_kernel1d_kernel2dc                 C   s:   t t tdd  W d   n1 s,0    Y  dS )z:Test that adding a scalar to a kernel raises an exception.r   r%   N)r@   rA   rB   r   rq   r;   r;   r<   test_add_kernel_scalar   s    z"TestKernels.test_add_kernel_scalarc                 C   sV   d}t dtdtj |d   d|}t|dd}t|dd}t|j|jdd d	S )
z>
        Check Model1DKernel against Gaussian1Dkernel
              @r&   r    r      x_sizer0   r1   N)r   rV   Zsqrtpir   r   r   r`   r6   Zstddevrg   Zmodel_gauss_kernelZgauss_kernelr;   r;   r<   test_model_1D_kernel   s    $
z TestKernels.test_model_1D_kernelc                 C   sT   d}t ddtj |d   dd||}t|dd}t|dd}t|j|jdd d	S )
z>
        Check Model2DKernel against Gaussian2Dkernel
        rt   r&   r    r   ru   rv   r0   r1   N)r   rV   rx   r   r   r   r`   ry   r;   r;   r<   test_model_2D_kernel  s    "
z TestKernels.test_model_2D_kernelc                 C   sP   t d}t|}|  td}tt|dd}tt|dd}t||dd dS )z9
        Check CustomKernel against Box1DKernel.
        r   r-   r.   r0   r1   N)rV   rW   r   r3   r   r   r4   r   r6   r`   customboxrQ   rP   r;   r;   r<   test_custom_1D_kernel  s    
z!TestKernels.test_custom_1D_kernelc                 C   sP   t d}t|}|  td}tt|dd}tt|dd}t||dd dS )z9
        Check CustomKernel against Box2DKernel.
        )r   r   r   r-   r.   r0   r1   N)rV   rW   r   r3   r	   r   r5   r   r|   r;   r;   r<   test_custom_2D_kernel  s    
z!TestKernels.test_custom_2D_kernelc                 C   s   t g d}|jdu sJ dS )9
        Check if CustomKernel works with lists.
        )r%   r%   r%   r%   r%   TNr   Zis_boolr6   r}   r;   r;   r<   test_custom_1D_kernel_list-  s    z&TestKernels.test_custom_1D_kernel_listc                 C   s,   t g dg dg dg}|jdu s(J dS )r   )r%   r%   r%   TNr   r   r;   r;   r<   test_custom_2D_kernel_list4  s
    z&TestKernels.test_custom_2D_kernel_listc                 C   sf   g d}t |}tjtdd |  W d   n1 s<0    Y  |jdksTJ |jdksbJ dS )]
        Check if CustomKernel works when the input array/list
        sums to zero.
        )r   r%   r    3kernel cannot be normalized because it sums to zeror[   N        r   r@   r]   r   r3   
truncation_kernel_sumr6   r`   r}   r;   r;   r<   test_custom_1D_kernel_zerosum=  s    &z)TestKernels.test_custom_1D_kernel_zerosumc                 C   st   g dg dg dg}t |}tjtdd |  W d   n1 sJ0    Y  |jdksbJ |jdkspJ dS )r   )r   r   r   )r   r!   r   r   r[   Nr   r   r   r;   r;   r<   test_custom_2D_kernel_zerosumM  s    &z)TestKernels.test_custom_2D_kernel_zerosumc                 C   s:   t t tg d W d   n1 s,0    Y  dS )zH
        Check if CustomKernel raises if the array size is odd.
        )r%   r%   r%   r%   N)r@   rA   r   r   rq   r;   r;   r<   test_custom_kernel_odd_error]  s    z(TestKernels.test_custom_kernel_odd_errorc                 C   s   t d}t d}t d}|| | }|| | }|| | }g d}t|j|dd t|j|dd t|j|dd t|jg ddd t|jg ddd t|jdgdd d	S )
:
        Check if adding of two 1D kernels works.
        r   r   r%   )rJ   ?g?r   rJ   r0   r1   )rJ   rJ   rJ   rJ   rJ   )UUUUUU?r   r   N)r   r   r`   )r6   box_1box_2Zbox_3	box_sum_1	box_sum_2Z	box_sum_3refr;   r;   r<   test_add_1D_kernelsd  s    zTestKernels.test_add_1D_kernelsc                 C   s   t d}t d}|| }|| }g dg dg dg}g dg dg dg}t|jdggdd t|j|dd t|j|dd t|j|dd dS )r   r   r%   )qq?r   r   )r   grq?r   r0   r1   N)r	   r   r`   )r6   r   r   r   r   r   Zref_1r;   r;   r<   test_add_2D_kernelsx  s     zTestKernels.test_add_2D_kernelsc                 C   s    t ddd}|jjdksJ dS )>
        Check if even size for GaussianKernel works.
        r   
   rv   N)r   r`   sizern   r;   r;   r<   test_Gaussian1DKernel_even_size  s    z+TestKernels.test_Gaussian1DKernel_even_sizec                 C   s"   t dddd}|jjdksJ dS )r   r   r   rw   y_size)r   r   N)r   r`   shapern   r;   r;   r<   test_Gaussian2DKernel_even_size  s    z+TestKernels.test_Gaussian2DKernel_even_sizec                 C   sF   t dddddd}g dg dg dg d	g d
g}t||dd d S )Nr   g      ?g-DT!?r   )Zx_stddevZy_stddevZthetarw   r   )ë8?6I=? ԑǔ??m҆&{x?)r   ʣ<o:4?~x+?r   r   )r   r   gn?r   r   )r   r   r   r   r   )r   r   r   r   r   gMbP?)Zrtol)r   r   )r6   rg   Zansr;   r;   r<   test_Gaussian2DKernel_rotated  s    z)TestKernels.test_Gaussian2DKernel_rotatedc                 C   s.   t g d}|jdd |j dks*J dS )z:
        Check if normalize works with peak mode.
        )r%   r    r   r    r%   Zpeakmoder%   N)r   r3   r`   maxr   r;   r;   r<   test_normalize_peak  s    zTestKernels.test_normalize_peakc                 C   s^   t d}|jdksJ t|jts&J |jddgks8J |  t|jddd |j	sZJ dS )z9
        Check if kernel attributes are correct.
        r   r   r    r&   r0   r1   N)
r	   r   
isinstanceZmodelr   r$   r3   r   r   Z	separable)r6   r~   r;   r;   r<   test_check_kernel_attributes  s    z(TestKernels.test_check_kernel_attributes)rG   r   c                 C   s   |t krtstd |tks(|d}n
|dd}|jdkrltt|ddd}tt|ddd}t	||dd	 n.tt
|ddd}tt
|ddd}t	||dd	 d
S )z
        Check if the different modes result in kernels that work with convolve.
        Use only small kernel width, to make the test pass quickly.
        rI   r   g433333?r%   r-   Fr?   r0   r1   NrK   )r6   rG   r   rO   rP   rQ   r;   r;   r<   test_discretize_modes  s    



z!TestKernels.test_discretize_modesc                 C   sh   t |}|jd d dksJ |j dks0J t|}tdd |jD sRJ |j dksdJ dS )zC
        Check if BoxKernel work properly with even sizes.
        r   r    r&   c                 S   s   g | ]}|d  dkqS )r    r   r;   ).0_r;   r;   r<   
<listcomp>      z:TestKernels.test_box_kernels_even_size.<locals>.<listcomp>N)r   r   r`   sumr	   rV   r^   )r6   r+   Z	kernel_1DZ	kernel_2Dr;   r;   r<   test_box_kernels_even_size  s    z&TestKernels.test_box_kernels_even_sizec                 C   sN   t td}|  t|j}|  t||j |  t||j dS )zU
        Test that repeated normalizations do not change the kernel [#3747].
        r   N)r   rV   rW   r3   copyr`   r   )r6   rO   datar;   r;   r<   test_kernel_normalization  s    z%TestKernels.test_kernel_normalizationc                 C   sH   t t* ttd}|jdd W d   n1 s:0    Y  dS )zB
        Test that an error is raised if mode is invalid.
        r   Zinvalidr   N)r@   rA   
ValueErrorr   rV   rW   r3   )r6   rO   r;   r;   r<   test_kernel_normalization_mode  s    z*TestKernels.test_kernel_normalization_modec                 C   s:   t t tddd W d   n1 s,0    Y  dS )zd
        Test that an error is raised if ``Kernel1D`` ``x_size`` is not
        an integer.
        r   333333?rv   N)r@   rA   	TypeErrorr   rq   r;   r;   r<   test_kernel1d_int_size  s    z"TestKernels.test_kernel1d_int_sizec                 C   s:   t t tddd W d   n1 s,0    Y  dS )zd
        Test that an error is raised if ``Kernel2D`` ``x_size`` is not
        an integer.
        r   r   rv   Nr@   rA   r   r   rq   r;   r;   r<   test_kernel2d_int_xsize  s    z#TestKernels.test_kernel2d_int_xsizec                 C   s<   t t tdddd W d   n1 s.0    Y  dS )zd
        Test that an error is raised if ``Kernel2D`` ``y_size`` is not
        an integer.
        r   r   r   r   Nr   rq   r;   r;   r<   test_kernel2d_int_ysize  s    z#TestKernels.test_kernel2d_int_ysizec                 C   s4   t t t  W d   n1 s&0    Y  dS )zn
        Test that an error is raised if an array or model is not
        specified for ``Kernel1D``.
        N)r@   rA   r   r   rq   r;   r;   r<   test_kernel1d_initialization  s    z(TestKernels.test_kernel1d_initializationc                 C   s4   t t t  W d   n1 s&0    Y  dS )zn
        Test that an error is raised if an array or model is not
        specified for ``Kernel2D``.
        N)r@   rA   r   r   rq   r;   r;   r<   test_kernel2d_initialization  s    z(TestKernels.test_kernel2d_initializationc                 C   s   t ddg}tjtdd td|d td|d td|d td|d t	d|d t
d|d td|d ttddd|d ttddddd|d tdd	|d td|d td|d td|d W d
   n1 s0    Y  d
S )z2
        Regression test for issue #10439
        r   z.* allowed .*r[   r    )r`   r%   r   r   r"   N)rV   rW   r@   rA   r   r   r   r	   r   r   r   r   r   r   r   r   r   r   r
   )r6   xr;   r;   r<   test_array_keyword_not_allowed%  s    z*TestKernels.test_array_keyword_not_allowedN)9__name__
__module____qualname____doc__r@   ZmarkZskipifZparametrize
WIDTHS_ODDr=   rF   list	itertoolsproductKERNEL_TYPESrR   rU   rX   rY   rb   rc   NUMSrh   rl   rm   ro   rp   rr   rs   rz   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   MODESr   WIDTHS_EVENr   r   r   r   r   r   r   r   r   r;   r;   r;   r<   r*   -   sn   








	

r*   )4r   r@   ZnumpyrV   Znumpy.testingr   r   Zastropy.convolution.convolver   r   Zastropy.convolution.kernelsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   Zastropy.convolution.utilsr   Zastropy.modeling.modelsr   r   r   Z"astropy.utils.compat.optional_depsr   Zastropy.utils.exceptionsr   r   r   r   r   Zfloat32Zfloat64r   Zzerosr4   r5   ZrandomZrandrS   rT   r*   r;   r;   r;   r<   <module>   s4   H

