o
    Ö­j¶)  ã                   @   sŠ   d dl Zd dl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mZmZmZ ejdd�d	d
„ ƒZdd„ ZG dd„ dƒZdS )é    N)Úassert_allcloseÚassert_array_less)Ústats)Úsobol_indices)ÚBootstrapResult)ÚBootstrapSobolResultÚ
f_ishigamiÚ	sample_ABÚ
sample_A_BÚsession)Úscopec                  C   sð   d} d}d| d d  |t jd  d  |d t jd  d  }d|t jd  d  |d t jd  d	  }| d d }d
}d
}|d t jd  d d }d
}t  |||g¡| }	t  dd|g|d|g||dgg¡| }
|	|
jdd� }|	|fS )z_Reference values for Ishigami from Saltelli2007.

    Chapter 4, exercise 5 pages 179-182.
    g      @gš™™™™™¹?ç      à?é   é   é   é   é   é2   r   éá   g        é   ©Úaxis)ÚnpÚpiÚarrayÚsum)ÚaÚbÚvarÚv1Úv2Úv3Úv12Úv13Úv23Ús_firstÚs_secondÚs_total© r(   úh/var/www/html/CropPilot/venv/lib/python3.10/site-packages/scipy/stats/tests/test_sensitivity_analysis.pyÚishigami_ref_indices   s&   8,ýür*   c                 C   s   t | ƒ}||fS )zOutput of shape (2, n).©r   ©ÚxÚresr(   r(   r)   Úf_ishigami_vec*   s   r/   c                	   @   s²   e Zd Zejej dej d�gd Zdd„ Ze	j
je	j
 d¡e	j
jdee	jee	j
jd�gd	d
gd�dd„ ƒƒƒZdd„ Zdd„ Zdd„ Zdd„ Ze	j
 d¡dd„ ƒZdd„ ZdS )ÚTestSobolIndicesr   ©ÚlocÚscaleé   c                 C   s„   t  g d¢g d¢g d¢g¡}|d }t  g d¢g d¢g d¢gg d¢g d¢g d¢gg d¢g d¢g d¢gg¡}t||d�}t||ƒ d S )	N)r   r   é   é
   )r   r   r   é   )r4   é   é	   é   éd   )ée   éh   ék   én   )éf   éi   él   éo   )ég   éj   ém   ép   ©ÚAÚB)r   r   r	   r   )ÚselfrI   rJ   ÚrefÚABr(   r(   r)   Útest_sample_AB6   s0   þÿþþþúÿzTestSobolIndices.test_sample_ABz!Can't create large array for testÚfunc)ÚmarksÚscalarÚvector)Úidsc                 C   s€  t j d¡}t|d| j|d�}|jdkr$|d |d g|d |d gg}t|j|d dd� t|j|d dd� |j	d u s?J ‚|j
d	d
�}t|tƒsLJ ‚t|j	tƒsTJ ‚|j	jjjd dks`J ‚|j	jjd j|jjksnJ ‚|jjjj|jjkszJ ‚|jjjj|jjks†J ‚t|jjj|jƒ t|j|jjjƒ t|jjj|jƒ t|j|jjjƒ t|j
dd	d�tƒs¶J ‚t|j	tƒs¾J ‚d S )Nì	   ´;m~ç|W2’L—E é   ©rO   ÚnÚdistsÚrngr/   r   r   ç{®Gáz„?©Úatoléc   )Ún_resamplesr   gÍÌÌÌÌÌì?)Úconfidence_levelr^   )r   ÚrandomÚdefault_rngr   rX   Ú__name__r   Úfirst_orderÚtotal_orderÚ_bootstrap_resultÚ	bootstrapÚ
isinstancer   r   Úconfidence_intervalÚlowÚshaper   Úhigh)rK   r*   rO   rY   r.   Úbootstrap_resr(   r(   r)   Útest_ishigamiM   sV   ý
þÿ
ÿ
ÿÿÿÿÿþzTestSobolIndices.test_ishigamic           
      C   s8  t j d¡}d}tjt j dt j d�tjt j dt j d�tjt j dt j d�g}t|||d�\}}t||d�}t|ƒ 	dd¡t|ƒ 	dd¡t|ƒ 	d	¡d
œ}t
||||d�}	t|	j|d dd� t
|||d�}	t|	j|d dd� tt|ƒ 	dd¡|d ƒ tt|ƒ 	dd¡|d ƒ tt|ƒ 	d	¡|d ƒ d S )NrT   rU   r   r1   )rW   rX   rY   rH   r   éÿÿÿÿ)r4   r   rn   ©Úf_AÚf_BÚf_ABrV   r   rZ   r[   )rO   rW   rY   rp   rq   rr   )r   r`   ra   r   Úuniformr   r
   r	   r   Úreshaper   r   rc   )
rK   r*   rY   rW   rX   rI   rJ   rM   rO   r.   r(   r(   r)   Útest_func_dict‡   s4   ýýýþzTestSobolIndices.test_func_dictc              
      s˜   dd„ ‰ t j d¡}ttd| jˆ |d�}t|j|d dd� t|j|d	 dd� d
t j	dt j	dt j	dt
t j	t j	f f‡ fdd„}ttd| j||d�}d S )Nc                 S   sZ   t j| |gdd�}|dt j|| d dd�  | }t j| | |  dd�| }|j|jfS )zaJansen for S and Sobol' for St.

            From Saltelli2010, table 2 formulations (c) and (e).)r   rn   r   r   r   rn   )r   r   ÚmeanÚT)rp   rq   rr   r   ÚsÚstr(   r(   r)   Újansen_sobol°   s   "z2TestSobolIndices.test_method.<locals>.jansen_sobolrT   rU   )rO   rW   rX   ÚmethodrY   r   rZ   r[   r   rp   rq   rr   Úreturnc                    s   ˆ | ||ƒS ©Nr(   ro   ©rz   r(   r)   Újansen_sobol_typedÆ   s   z8TestSobolIndices.test_method.<locals>.jansen_sobol_typedr   )r   r`   ra   r   r   rX   r   rc   rd   ÚndarrayÚtuple)rK   r*   rY   r.   r   Ú_r(   r~   r)   Útest_method¯   s2   üÿÿÿþ
üzTestSobolIndices.test_methodc                 C   sN   t j d¡}tdd„ d| j|d�}t|j|d dd� t|j|d	 dd� d S )
NrT   c                 S   s   t | ƒd S )Niè  r+   ©r-   r(   r(   r)   Ú<lambda>Õ   s    z5TestSobolIndices.test_normalization.<locals>.<lambda>rU   rV   r   rZ   r[   r   ©r   r`   ra   r   rX   r   rc   rd   ©rK   r*   rY   r.   r(   r(   r)   Útest_normalizationÒ   s   ýz#TestSobolIndices.test_normalizationc                 C   s~   dd„ }t j d¡}t|d| j|d�}|d g d¢|d g|d g d¢|d gg}t|j|d d	d
� t|j|d d	d
� d S )Nc                 S   s   t | ƒ}||d d |fS )zOutput of shape (3, n).r   r6   r+   r,   r(   r(   r)   Úf_ishigami_vec_constß   s   zETestSobolIndices.test_constant_function.<locals>.f_ishigami_vec_constrT   rU   rV   r   )r   r   r   r   rZ   r[   r†   )rK   r*   r‰   rY   r.   Úishigami_vec_indicesr(   r(   r)   Útest_constant_functionÝ   s   ýþz'TestSobolIndices.test_constant_functionc                 C   sJ   t j d¡}ttd| j|d�}t|j|d dd� t|j|d dd� d S )NrT   i   rV   r   g-Cëâ6?r[   r   )	r   r`   ra   r   r   rX   r   rc   rd   r‡   r(   r(   r)   Útest_more_convergedó   s   ýz$TestSobolIndices.test_more_convergedc                 C   s  d}t jt|d�� tdtdd� W d   ƒ n1 sw   Y  t jt|d�� tdtdd„ gd� W d   ƒ n1 s<w   Y  d}t jt|d�� td	tt ¡ gd� W d   ƒ n1 s_w   Y  t jt|d�� td
tt ¡ gd� W d   ƒ n1 s€w   Y  d}t jt|d�� tdtdd� W d   ƒ n1 s w   Y  d}t jt|d�� tdtdd„ d� W d   ƒ n1 sÂw   Y  d}t jt|d�� tdtd� W d   ƒ n1 sáw   Y  dd„ }d}t jt|d�� td|t ¡ gd� W d   ƒ n	1 �s	w   Y  d}t jt|d�� tdg g dœt ¡ gd� W d   ƒ n	1 �s0w   Y  t jt|d�� tdddgdgg d¢dœd� W d   ƒ n	1 �sWw   Y  t jt|d�� tdddgddgg d¢dœd� W d   ƒ d S 1 �s€w   Y  d S )Nz3Each distribution in `dists` must have method `ppf`)Úmatchr   rs   )rW   rO   rX   c                 S   ó   | S r}   r(   r„   r(   r(   r)   r…     ó    z.TestSobolIndices.test_raises.<locals>.<lambda>z The balance properties of Sobol'r5   gffffff@z'toto' is not a valid 'method'Útoto)rW   rO   r{   z!must have the following signaturec                 S   rŽ   r}   r(   r„   r(   r(   r)   r…     r�   z1'dists' must be defined when 'func' is a callable)rW   rO   c                 S   s   |   dd¡S )Nrn   r   )rt   r„   r(   r(   r)   Úfunc_wrong_shape_output  s   z=TestSobolIndices.test_raises.<locals>.func_wrong_shape_outputz!'func' output should have a shaper   zWhen 'func' is a dictionary)rp   rr   r   r4   )r   r8   r5   r   ro   r   )r   r8   r5   )ÚpytestÚraisesÚ
ValueErrorr   r   r   rs   )rK   Úmessager‘   r(   r(   r)   Útest_raisesÿ   sf   ÿÿÿÿÿÿÿÿÿÿÿþþþ$þzTestSobolIndices.test_raisesN)rb   Ú
__module__Ú__qualname__r   rs   r   r   rX   rN   r’   ÚmarkÚxslowÚxfail_on_32bitÚparametrizer   Úparamr/   Úslowrm   ru   rƒ   rˆ   r‹   rŒ   r–   r(   r(   r(   r)   r0   0   s*    ÿþ
ý3(#

r0   )Únumpyr   Únumpy.testingr   r   r’   Úscipyr   Úscipy.statsr   Úscipy.stats._resamplingr   Ú!scipy.stats._sensitivity_analysisr   r   r	   r
   Úfixturer*   r/   r0   r(   r(   r(   r)   Ú<module>   s    

