U
    e»{j¬  ã                   @   sÂ  d dl Z d dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
mZmZmZmZ d dlmZmZ d dlmZ d dlmZ dd	d
gZee	egZee
egZej dee  ee¡ƒ¡dd„ ƒZ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j"e dd�ejj#dd„ ƒƒZ$ejj"e dd�dd„ ƒZ%ejj"e dd�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 )/é    N)Úassert_allclose)Údiscretize_model)ÚBox1DÚBox2DÚ
Gaussian1DÚ
Gaussian2DÚRickerWavelet1DÚRickerWavelet2D)Ú	models_1DÚ	models_2D)Úcreate_model)Ú	HAS_SCIPYÚcenterZlinear_interpÚ
oversample)Úmodel_classÚmodec                 C   s`   | t kr|dkrt d¡ t|  }t| |ƒ}t|t|  d |d�}t| ¡ t|  d dd� dS )	úK
    Test if the sum of all pixels corresponds nearly to the integral.
    r   ú)Non integrating mode. Skip integral test.Úx_lim©r   Úintegralç-Cëâ6?©ZatolN)r   ÚpytestÚskipr
   r   r   r   Úsum©r   r   Ú
parametersÚmodelÚvalues© r    úh/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/convolution/tests/test_discretize.pyÚtest_pixel_sum_1D   s    

r"   r   c                 C   s@   t dddƒ}t dd¡}||ƒ}t|d| d�}t||dd	� d
S )zt
    Discretize Gaussian with different modes and check
    if result is at least similar to Gaussian1D.eval().
    é   r   é   éœÿÿÿée   )r%   r&   r   çü©ñÒMbP?r   N)r   ÚnpÚaranger   r   )r   r   Úxr   Údisc_valuesr    r    r!   Útest_gaussian_eval_1D+   s
    r,   c                 C   sj   | t kr|dkrt d¡ t|  }t| |ƒ}t|t|  d t|  d |d�}t| ¡ t|  d dd� d	S )
r   r   r   r   Úy_limr   r   r   r   N©r   r   r   r   r   r   r   r   r   r    r    r!   Útest_pixel_sum_2D8   s    



ür/   c                 C   sv   | t kr|dkrt d¡ t|  }t| |ƒ}t|| t|  d t|  d |d�}dt|  d  }t| ¡ |dd	� d
S )z_
    Test if the sum of all pixels of a compound model corresponds nearly to the integral.
    r   r   r   r-   r   é   r   r   r   Nr.   )r   r   r   r   r   Zmodel_integralr    r    r!   Útest_pixel_sum_compound_2DN   s    



ür1   c                 C   sd   t dddddƒ}t dd¡}t dd¡}t ||¡\}}|||ƒ}t|dd| d�}t||dd� d	S )
zs
    Discretize Gaussian with different modes and check
    if result is at least similar to Gaussian2D.eval()
    ç{®Gáz„?r   r#   éþÿÿÿé   ©r3   r4   r   r   N©r   r(   r)   Zmeshgridr   r   )r   r   r*   Úyr   r+   r    r    r!   Útest_gaussian_eval_2Df   s    
r8   zRequires scipy)Úreasonc                  C   sŒ   t dddddƒt dddddƒt dddddƒg} t dd¡}t dd¡}t ||¡\}}| D ],}|||ƒ}t|dddd	�}t||dd
� qZdS )z1
    Discretize Gaussian with integrate mode
    r2   r   r0   r#   r3   r4   r5   Ú	integrater   r   Nr6   )Z
model_listr*   r7   r   r   r+   r    r    r!   Ú$test_gaussian_eval_2D_integrate_modex   s    ý
r;   c                  C   sB   t dddƒ} t| dddd�}t| ¡ t dtj ¡d d	d
� dS )zN
    Test subpixel accuracy of the integrate mode with gaussian 1D model.
    r#   r   çš™™™™™¹?©éÿÿÿÿr0   r:   éd   ©r   Úfactorr0   çñhãˆµøä>r   N)r   r   r   r   r(   ÚsqrtÚpi)Zgauss_1Dr   r    r    r!   Útest_subpixel_gauss_1D�   s    rE   c                  C   sB   t dddddƒ} t| ddddd�}t| ¡ dtj d	 d
d� dS )zN
    Test subpixel accuracy of the integrate mode with gaussian 2D model.
    r#   r   r<   r=   r:   r?   r@   r0   r2   rB   r   N)r   r   r   r   r(   rD   )Úgauss_2Dr   r    r    r!   Útest_subpixel_gauss_2D™   s    rG   c                  C   s,   dd„ } t | dƒ}t|t dd¡d ƒ dS )z7
    Test discretize when a 1d function is passed.
    c                 S   s   | d S ©Nr0   r    ©r*   r    r    r!   Úf¨   s    z&test_discretize_callable_1d.<locals>.f©éûÿÿÿé   rL   rM   r0   N)r   r   r(   r)   )rJ   r7   r    r    r!   Útest_discretize_callable_1d£   s    
rN   c                  C   sD   dd„ } t | ddƒ}t d¡d \}}|d |d  }t||ƒ dS )z7
    Test discretize when a 2d function is passed.
    c                 S   s   | d |d  S rH   r    ©r*   r7   r    r    r!   rJ   ´   s    z&test_discretize_callable_2d.<locals>.frK   )é   rP   é   r0   N)r   r(   Úindicesr   )rJ   Úactualr7   r*   Zdesiredr    r    r!   Útest_discretize_callable_2d¯   s
    rT   c                	   C   s,   t jtdd�� ttdƒdƒ W 5 Q R X dS )z
    Test type exception.
    zModel must be callable\.©Úmatchr   ©iöÿÿÿrP   N)r   ÚraisesÚ	TypeErrorr   Úfloatr    r    r    r!   Útest_type_exception½   s    r[   c               	   C   s2   dd„ } t jtdd�� t| ddƒ W 5 Q R X dS )z&
    Test dimension exception 1d.
    c                 S   s   | d S rH   r    rI   r    r    r!   rJ   Ê   s    z test_dim_exception_1d.<locals>.fz*y range specified, but model is only 1-d\.rU   rW   N©r   rX   Ú
ValueErrorr   ©rJ   r    r    r!   Útest_dim_exception_1dÅ   s    r_   c               	   C   s0   dd„ } t jtdd�� t| dƒ W 5 Q R X dS )z&
    Test dimension exception 2d.
    c                 S   s   | d |d  S rH   r    rO   r    r    r!   rJ   Ö   s    z test_dim_exception_2d.<locals>.fz'y range not specified, but model is 2-drU   rW   Nr\   r^   r    r    r!   Útest_dim_exception_2dÑ   s    r`   c               	   C   s0   dd„ } t jtdd�� t| dƒ W 5 Q R X d S )Nc                 S   s   | d |d  S rH   r    rO   r    r    r!   rJ   Þ   s    z'test_float_x_range_exception.<locals>.fzVThe difference between the upper and lower limit of 'x_range' must be a whole number\.rU   ©g/Ý$$Àgö(\�Âu&@r\   r^   r    r    r!   Útest_float_x_range_exceptionÝ   s    ýrb   c               	   C   s2   dd„ } t jtdd�� t| ddƒ W 5 Q R X d S )Nc                 S   s   | d |d  S rH   r    rO   r    r    r!   rJ   ì   s    z'test_float_y_range_exception.<locals>.fzVThe difference between the upper and lower limit of 'y_range' must be a whole number\.rU   rW   ra   r\   r^   r    r    r!   Útest_float_y_range_exceptionë   s    ýrc   c                  C   s°   t dddddd�} t| ddgd	d
gddd�}t |¡}t | ¡ |j¡}t| ddgd	d
gddd�}t| ddgd	d
gdd�}|jdksˆt‚t|ddd� |dks¢t‚t||ƒ d S )Ng      ð?g      @g     @_@g      è?r4   )Z	amplitudeZx_meanZy_meanZx_stddevZy_stddevr   é
   r?   é‡   r   )Úx_rangeÚy_ranger   rA   r#   r   )rf   rg   r   )é#   rd   gD‹lçû©í?r'   r   )é   rQ   )	r   r   r(   ÚmaxZunravel_indexZargmaxÚshapeÚAssertionErrorr   )rF   r   ZvmaxZvmax_yxZvalues_osf1Zvalues_centerr    r    r!   Útest_discretize_oversampleù   sB        ÿ    ÿ
    ÿ   ÿrm   )/Ú	itertoolsÚnumpyr(   r   Znumpy.testingr   Zastropy.convolution.utilsr   Z"astropy.modeling.functional_modelsr   r   r   r   r   r	   Z%astropy.modeling.tests.example_modelsr
   r   Z"astropy.modeling.tests.test_modelsr   Z"astropy.utils.compat.optional_depsr   ÚmodesZtest_models_1DZtest_models_2DÚmarkZparametrizeÚlistÚproductr"   r,   r/   r1   r8   ZskipifZslowr;   rE   rG   rN   rT   r[   r_   r`   rb   rc   rm   r    r    r    r!   Ú<module>   sZ    


 ÿ

 ÿ
 ÿ


	
	