o
    5ήcV                     @   sp  d dl Z d dlZd dlmZ d dl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 d dlmZ g d	Zd
ZdZg dZg dZg dZee edZddgZdd Zejjejde ejdddgdd Zd3ddZdd Z dd Z!d d! Z"ejd"e	j#d#fe	j$d$fgd%d& Z%d'd( Z&d)d* Z'ejd+e' d,d- Z(d4d/d0Z)G d1d2 d2Z*dS )5    N)assert_allclose)statsdifferential_evolution   )distcont)FitError)distdiscrete)    i'        ?g      ?)burrchi2
gausshypergenexpongengammakappa4ksonekstwomielkencfncx2pearson3powerlognorm
truncexpontukeylambdavonmiseslevy_stable	trapezoidtruncweibull_minstudentized_range).alpha	betaprimer   burr12cauchychir   crystalballdgammadweibullffatiguelifefisk
foldcauchy
genextremer   genhyperbolicgennorm	genpareto
halfcauchyinvgamma
invweibull	johnsonsukappa3r   r   levylevy_lr   
loglaplacelomaxr   nakagamir   nctr   paretor   	powernorm
skewcauchytr   triangr   r   r    )argusexponpow	exponweibr   r   genhalflogistichalfgennormgompertz	johnsonsbr   	kstwobignrecipinvgaussskewnormr   r   vonmises_line)MMMLEerlangr.   c                  c   s&    t D ]\} }| tvr| |fV  qd S N)r   skip_fit)distnamearg rS   A/tmp/pip-target-vg8gfxp4/lib/python/scipy/stats/tests/test_fit.pycases_test_cont_fitG   s   
rU   zdistname,argmethodrM   rL   c              	   C   s  | t | v r+z
ttjd  }W n ty   d}Y nw |r+d|  }|d7 }t| tt| }t	
|ddgg}t	t	|t t	|jd tgd}tD ]Z}t	jd	 t	jd
d |j|d|i}	|j|	|d}
W d    n1 sww   Y  |
| }t	t	|	 t tg|d< t	t	|
rtdt	t	||kr d S qOdt| }|dt|
 7 }|dt| 7 }td|j | )NSCIPY_XFAILTz$Fitting %s doesn't work reliably yetzH [Set environment variable SCIPY_XFAIL=1 to run this test nevertheless.]g              ?   r   i  ignore)allsize)rV   znan returned in fitzparameter: %s
zestimated: %s
zdiff     : %s
zfit not very good in %s
)failing_fitsintosenviron	Exceptionpytestxfailgetattrr   nphstackmaxvstackthresh_percentfullnumargs
thresh_min	fit_sizesrandomseederrstatervsfitabsmeananyisnanAssertionErrorr[   strname)rQ   rR   rV   rd   msgdistfntrueargdiffthresholdfit_sizerr   estdifftxtrS   rS   rT   test_cont_fitQ   sH   


r   c                 C   s4   t t| }||dd  }t|||d|  d d S )Nr]   z"poor mle fit of (loc, scale) in %s)atolerr_msg)re   r   rs   r   )rz   datadesiredr   dactualrS   rS   rT   _check_loc_scale_mle_fit   s
   

r   c                  C   s6   t g d} td| ddgd td| ddgd d S )N))\(?{Gz?r   r   Gz?r   r          @uniformr   gGz?MbP?expongp=
ף?)rf   arrayr   )r   rS   rS   rT   "test_non_default_loc_scale_mle_fit   s   r   c                  C   s.   g d} t jj| dd}t|ddgdd dS )zgh-6167)r   r   r   r   rY   rY   rY   rY   r   )flocrX   r   )r   N)r   r   rs   r   )r   phatrS   rS   rT   test_expon_fit   s   r   c               	   C   s   t t dt dg} d}tjt|d, tt t	j
|  W d    n1 s-w   Y  W d    d S W d    d S 1 sEw   Y  d S )N      z0Optimization converged to parameters that are...match)rf   concatenatezerosonesrc   raisesr   warnsRuntimeWarningr   betars   )r   messagerS   rS   rT   test_fit_error   s   Pr   zdist, params)      ?      @)
   g333333?rY   c                 C   s|   t jd}t| dr| j}n| j}| j|d|d}||g|R    }| ||}| 	||}t
|| t
|| d S )Nig:pdfd   r\   random_state)rf   ro   default_rnghasattrlogpdflogpmfrr   sumnnlf_penalized_nnlfr   )distparamsrnglogpxfxrefres1res2rS   rS   rT   test_nnlf_and_related_methods   s   

r   c                  c   s    h d} h d}h d}t tt D ]F}|| v st|ts.d}tj|tjj|ddV  q||v rBd}tj|tjj	|ddV  q||v rVd}tj|tjj
|ddV  q|V  qd S )	N>   rA   foldnormr   >.   r)   r?   r%   r+   ricer!   binomr9   rdistr#   r5   r   nbinomr<   arcsiner/   lognormrandintr   bradfordr(   rB   rF   invgaussr:   r   powerlawrJ   r"   r0   rG   r4   rH   r=   r,   r-   r3   r8   
wrapcauchyr&   r*   rE   weibull_maxweibull_minnorminvgaussrI   >   r   r;   r   r   r   r   r   r   r@   skellamzipfianr   r   	betabinomrC   	hypergeomr   	truncnormr   
loguniform
nhypergeom
reciprocalgeninvgaussr   r   r   r.   rD   r    nchypergeom_fishernchypergeom_walleniusztested separately)reason)marksztoo slow (>= 0.25s)ztoo slow (>= 1.0s))dictr	   r   
isinstancery   rc   parammarkskipslowxslow)skip_basic_fitslow_basic_fitxslow_basic_fitr   r   rS   rS   rT   cases_test_fit   s    

r   c                  c   s:    t t D ]\} }t| tr| dv rq| |fV  qd S )N>   r    )r   r   itemsr   ry   )rQ   shapesrS   rS   rT   cases_test_fitstart   s   r   zdistname, shapesc                 C   sr   t t| }tjd}|d}tjddd ||}W d    n1 s'w   Y  |j|d d  s7J d S )NiV r   rZ   )invaliddivider]   )re   r   rf   ro   r   rq   	_fitstart	_argcheck)rQ   r   r   r   r   guessrS   rS   rT   test_fitstart   s   

r   Hz>c                 C   s<   |  ||}|  ||}||k stjj||||d d S d S )N)rtolr   )r   rf   testingr   )r   r   params1params0r   r   nllf1nllf0rS   rS   rT   assert_nllf_less_or_close   s
   r   c                   @   s   e Zd ZejZdZej	eZ
ejjddde
dZddgZdddZd	Zd
ZeedZdd Zdd Zdd Zdd Z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"ejj#d'd( Z$d)S )*TestFitl   Va   r   r   r   r   r   r   r   npg?g{Gz?)r   r   c                 O   s   t |ddi|S )Nrp   r   r   )selfargskwdsrS   rS   rT   opt   s   zTestFit.optc                 C   sJ   d}t jt|d td| j| j W d    d S 1 sw   Y  d S )Nz `dist` must be an instance of...r   r   )rc   r   
ValueErrorr   rs   r   shape_bounds_ar   r   rS   rS   rT   test_dist_iv   s   "zTestFit.test_dist_ivc                 C   s,  d}t jt|d t| jg dg| j W d    n1 s w   Y  d}t jt|d t| jdddtjg| j W d    n1 sGw   Y  t jt|d t| jdddtj	g| j W d    n1 slw   Y  t jt|d t| jg d| j W d    d S 1 sw   Y  d S )	Nz'`data` must be exactly one-dimensional.r   )r   rY      z.All elements of `data` must be finite numbers.r   rY   r  )123)
rc   r   r   r   rs   r   r   rf   naninfr   rS   rS   rT   test_data_iv  s   "zTestFit.test_data_ivc                 C   sP  d}dddd}t jt|d t| j| j| W d    n1 s#w   Y  d}ddg}t jt|d t| j| j| W d    n1 sIw   Y  d	}dd
g}t jt|d t| j| j| W d    n1 sow   Y  ddg}t jt|d t| j| j| W d    n1 sw   Y  d}dg}t jt|d t| j| j| W d    n1 sw   Y  d}g d}t jt|d t| j| j| W d    n1 sw   Y  d}ddd}t jt|d t| j| j| W d    n	1 sw   Y  d}ddg}t jt|d t| j| j| W d    n	1 s-w   Y  d}ddg}t jt|d t| j| j| W d    n	1 sTw   Y  d}t jt|d t| j| j W d    n	1 svw   Y  t	j
 t	j
fdg}t jt|d t| j| j| W d    d S 1 sw   Y  d S )Nz1Bounds provided for the following unrecognized...r   r   r   r   r   r   r  r   z6Each element of a `bounds` sequence must be a tuple...)r   r   r  z6Each element of `bounds` must be a tuple specifying...)r   r   r   r   r   z7A `bounds` sequence must contain at least 2 elements...z;A `bounds` sequence may not contain more than 3 elements...)r   r   r   r   z.There are no values for `p` on the interval...)r   r   r   z.There are no values for `n` on the interval...)r   r   z6There are no integer values for `n` on the interval...)gffffff?g?z0The intersection of user-provided bounds for `n`)rc   r   r   r   rs   r   r   r   r   rf   r  )r   r   shape_boundsboundsrS   rS   rT   test_bounds_iv  sh   
$zTestFit.test_bounds_ivc                 C   sD  d}dddd}t jt|d tj| j| j| j|d W d    n1 s&w   Y  d}dd	d
}t jt	|d tj| j| j| j|d W d    n1 sPw   Y  ddg}t jt	|d tj| j| j| j|d W d    n1 sww   Y  ddgg}t jt	|d tj| j| j| j|d W d    n1 sw   Y  d}dg}t jt	|d tj| j| j| j|d W d    n1 sw   Y  d}g d}t jt	|d tj| j| j| j|d W d    n1 sw   Y  d}ddd
}t jt|d tj| j| j| j|d W d    n	1 sw   Y  d}g d}t jt|d tj| j| j| j|d W d    n	1 sEw   Y  d}ddd
}t jt|d tj| j| j| j|d W d    n	1 spw   Y  d}g d}t jt|d tj| j| j| j|d W d    d S 1 sw   Y  d S )Nz2Guesses provided for the following unrecognized...r   r      r
  r   )r   z+Each element of `guess` must be a scalar...hir   r)   rY   z-A `guess` sequence must contain at least 2...z1A `guess` sequence may not contain more than 3...)r   rY   r     z"Guess for parameter `n` rounded...g      @g      z$Guess for parameter `loc` rounded...)r   r   r   z"Guess for parameter `p` clipped...r   z$Guess for parameter `loc` clipped...)r   r   r   )
rc   r   r   r   rs   r   r   shape_bounds_dr   r   )r   r   r   rS   rS   rT   test_guess_ivD  s`   



$zTestFit.test_guess_iv	dist_namec                 C   s  d}t tt }tj| j}tt|}t	|| }tj
t|d dftjd}|dt|  |d ddf< |dt|  |d ddf< d|d< d|d	< |j|d  }|j|d	  }	t|| ||	g }
t|d
dr|
d d	 }
t||
d	< |j|
||d}|d d	 }t|ddr|j|
||d}t }|td tj|||| jd}W d    n1 sw   Y  t|||j|
fi | j d S )Nr   rY   )dtypeg      $@r]   r   r   r	  pmfFr   r   zoverflow encountered	optimizer)r   r   r	   rf   ro   r   rp   re   r   r   emptylenfloat64signr   listfloorrr   nptsuppress_warningsfilterr   rs   r   r   r   tols)r   r  N	dist_datar   r   r   r  locscaler   r   supresrS   rS   rT   test_basic_fits  s2   

zTestFit.test_basic_fitc                 C   l   d}t j| j}tj}d}|j|||d}dddd}tj|||| jd}t	|||j
|fi | j d S )Nr
   )rX   r         @r   g?r   )r%   r%  r&  r  )rf   ro   r   rp   r   rA   rr   rs   r   r   r   r"  r   r#  r   r   r   r   r  r(  rS   rS   rT   
test_argus     zTestFit.test_argusc                 C   r*  )Nr
   )g);?r   r+  r   r,  )cr%  r&  r  )rf   ro   r   rp   r   r   rr   rs   r   r   r   r"  r-  rS   rS   rT   test_foldnorm  r/  zTestFit.test_foldnormc                 C   sj   d}t j| j}tj}d}|j|||d}dgd }tj|||| jd}t	|||j
|fi | j d S )Nr
   )r   r   g      ?r   r+  r   r,  r   r  )rf   ro   r   rp   r   r   rr   rs   r   r   r   r"  r-  rS   rS   rT   test_truncweibull_min  s   
zTestFit.test_truncweibull_minc           
      C   s   d}t j| j}tj}d\}}}|j|||||d}dt ddgi}tj|||| j	d}	t
|	j|||ffi | j tj}d\}}|j||||d}tj||| j	d}	t
|	j||ffi | j d S )	Nr
   r   ?r   r%  r\   r   r   r      r  )gY.?r   )rf   ro   r   rp   r   r   rr   r   rs   r   r   r   r"  	bernoulli)
r   r#  r   r   r   r   r%  r   r  r(  rS   rS   rT   test_missing_shape_bounds  s   
z!TestFit.test_missing_shape_boundsc                 C   s  d}t j| j}tj}d\}}|j|||d}d}d|i}tj|||| jd}	t	|	j
||ffi | j d\}}|j|||d}d}
d	|
i}tj|||| jd}	t	|	j
||ffi | j tj}d
\}}|j||||d}||
d}tj|||| jd}	t	|	j
||ffi | j d S )Nr   )      ?r   r5  )r   r   r%  r  )r   r   )r&  r\   r   r&  r9  r   r%  r&  r\   r   r%  r&  )rf   ro   r   rp   r   normrr   rs   r   r   r   r"  )r   r#  r   r   r%  r&  r   
loc_boundsr  r(  scale_boundsrS   rS   rT   test_fit_only_loc_scale  s*   
zTestFit.test_fit_only_loc_scalec                 C   s   d}t j| j}tj}d\}}|j||||d}t||}t|j	dfi | j
 ||f||fd}t|||}t|j	||ffi | j
 tj}d\}	}
}|j|	|
|||d}dd	d
}tj|||| jd}t|j	|	|
|ffi | j
 d S )Nr   r:  r;  r   r<  r3  r5  )r   r6  )r4  r4  r   r  )rf   ro   r   rp   r   r=  rr   rs   r   r   r"  r   r   )r   r#  r   r   r%  r&  r   r(  r  r   r   r  rS   rS   rT   test_everything_fixed  s    

 zTestFit.test_everything_fixedc           	      C   sz   d}t j| j}tj}d}|j|||d}| dksJ g d}t|||}d}|j	
|s4J |jdu s;J d S )Nr   )r   r   r   r   ))r      r   )r   r   z3Optimization converged to parameter values that areF)rf   ro   r   rp   r   r   rr   minrs   r   
startswithsuccess)	r   r#  r   r   r   r   r  r(  r   rS   rS   rT   test_failure  s   zTestFit.test_failurec                 C   s   d}t j| j}tj}d}g d}|j|||d}tj|||| jd}t j	|j
|fi | jr3J tj||||| jd}t|j
|fi | j d S )Ni  )r6        r   ))rY      )gffffff?F   )g333333?x   r	  r   r  )r   r  )rf   ro   r   rp   r   r   rr   rs   r   allcloser   r"  r   )r   r#  r   r   r   r  r   r(  rS   rS   rT   
test_guess  s   zTestFit.test_guessN)%__name__
__module____qualname__r   r   r   rp   rf   ro   r   r   rr   r   r   r  r   r   r"  r   r  r  r  r  rc   r   parametrizer   r)  r.  r1  r2  r8  r@  rA  rF  r   rM  rS   rS   rS   rT   r      s4    

3/
r   rO   )r   r   )+r`   numpyrf   numpy.testingr   r  r   rc   scipyr   scipy.optimizer   test_continuous_basicr   !scipy.stats._distn_infrastructurer   scipy.stats._distr_paramsr	   rn   rj   rm   mle_failing_fitsmm_failing_fitsmm_slow_fitsr^   rP   rU   r   r   rQ  r   r   r   r   r   r=  r   r   r   r   r   r   r   rS   rS   rS   rT   <module>   sR    

.
&

