U
    Ãmœd¼:  ã                   @   s$  d Z ddlZddlmZmZ ddlmZ ddl	m
Z
 ddlmZmZmZmZmZ dZdZdZd	Zd
ZdZdZdd„ Zdd„ Zdd„ Zdd„ ZG dd„ dƒZG dd„ deƒZG dd„ deƒZG dd„ dƒZG dd„ deƒZ G dd „ d eƒZ!G d!d"„ d"eƒZ"d#d$„ Z#d%d&„ Z$e%d'kr d(Z&d)Z'e (e'd ¡ )e'd*¡Z*ej+ ,e'd¡Z*e -d+d,dg¡Z.e -d-d-d-g¡Z.e.Z/e 0e*e/¡d.ej+ ,e'¡  Z1e 0ej2 3e*¡e1¡Z4e5ed/ee&e*ƒƒ e* 6d¡Z7e5e* 6d¡ƒ ed/ee*fd0d1Z8e5e8ee8e7ƒƒ e5ed/ee*fd0d1ƒ e5ed/ee1e*fd0d1d,e 0e*j9e*¡  ƒ e5e
 :e.ed2e1e*f¡d d,e 0e*j9e*¡  ƒ e* d, e1e 0e*d+d,dg¡ dd…df  Z;ed/ee1e*fd0d1Z<e
 d/ee&e1e*f¡Z=e5ee<e;ƒƒ e5ee=e;ƒƒ ej>j? @¡ ZAejBeAjCd3d4eA_Ce DeAjEeAjC¡ZFd+d5d6d7gZGeFjHZHeFjIZIeFjJZKe5d8eIeGƒƒ e5d9e
 eGeHe&¡ƒ e5d:e
 eGeH¡ƒ e5d8eKeGƒƒ e5d9e
 eGeIe&¡ƒ e5d:e
 eGeI¡ƒ e
 eGeH¡ZLe5d:eLƒ e5eeKeGƒeLƒƒ ej>jM @¡ ZAeAjCZCejBeCd3d4ZCe NeAjEeC¡jOd;dd<ZPej>jQ @¡ ZReSeRjEƒZ'ejBeRjC TeU¡ )e'd*¡d3d4ZVe WeRjEeV¡ZXeXjOd;dd<ZYdS )=zàTesting numerical differentiation

Still some problems, with API (args tuple versus *args)
finite difference Hessian has some problems that I did not look at yet

Should Hessian also work per observation, if fun returns 2d

é    N)Úassert_allcloseÚassert_almost_equal)Únumdiff)Úapprox_fprimeÚapprox_fprime_csÚapprox_hess_csÚ_approx_fprime_scalarÚ_approx_fprime_cs_scalaré   é   é   é   é   é   é   c                 C   s   t  | | ¡ ¡ S ©N)ÚnpÚabsÚmax)ÚxÚy© r   ú]/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/statsmodels/tools/tests/test_numdiff.pyÚmaxabs   s    r   c                 C   s   t  || ¡ d¡S ©Nr   )r   ÚdotÚsum)Úbetar   r   r   r   Úfun!   s    r   c                 C   s   t  || ¡}|| d S ©Né   )r   r   )r   r   r   Úxbr   r   r   Úfun1$   s    r"   c                 C   s   t | ||ƒ d¡S r   )r"   r   )r   r   r   r   r   r   Úfun2)   s    r#   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚCheckGradLoglikeMixinc                 C   s`   | j D ]T}| j |¡}t | ¡ | jj¡}t||dd t | ¡ | jj¡}t||dd qd S )Né   ©Údecimalé   )	ÚparamsÚmodÚscorer   r   ÚravelÚlogliker   r   )ÚselfÚtest_paramsÚscZscfdZsccsr   r   r   Ú
test_score0   s    

ÿ
ÿz CheckGradLoglikeMixin.test_scorec                 C   sj  | j D ]\}| j |¡}t || jj¡}t||td t||dd tj|| jjdd}t	||dd tj|| jjdd}t||dd t | 
¡ | jj¡}t	||d	d t | 
¡ | jj¡}t	||dd | j |¡}tj|| jjd
dd\}}t||dd t||dd tj|| jjddd\}}t||dd t||dd t || jjd¡}t||dd qd S )Nr&   é   T©Úcenteredç•Ö&è.>©ZrtolFr   g‚vIhÂ%<=çíµ ÷Æ°>)Zreturn_gradr%   ç-Cëâ6?r
   gñhãˆµøä>)r)   r*   Úhessianr   r   r+   r   ÚDEC8r   r   r,   r   r-   Úapprox_hess1Úapprox_hess2Úapprox_hess3)r.   r/   ÚheÚhefdÚhescsÚhecsZgradÚgradcsr   r   r   Ú	test_hess;   sH    ÿÿ
ÿ
ÿ ÿ
 ÿ
zCheckGradLoglikeMixin.test_hessN)Ú__name__Ú
__module__Ú__qualname__r1   rC   r   r   r   r   r$   /   s   r$   c                   @   s    e Zd Zedd„ ƒZdd„ ZdS )ÚTestGradMNLogitc                 C   sn   t jj ¡ }t |j¡|_t |j¡|_|j}t j|dd}t  	|j|¡| _
| j
jdd}|j d¡g| _d S )NF©Úprependr   )ÚdispÚF)ÚsmÚdatasetsÚanes96Úloadr   ZasarrayÚexogÚendogÚadd_constantÚMNLogitr*   Úfitr)   r,   )ÚclsÚdatarP   Úresr   r   r   Úsetup_classb   s    zTestGradMNLogit.setup_classc                 C   sê   | j D ]Þ}| j |¡}t || jj¡}t||td t||dd tj|| jjdd}t||dd tj|| jjddd}t||dd t || jj¡}t||td t 	|| jj
¡}t||d	d t || jj
d
¡}t||dd qd S )Nr&   r2   Tr3   r   r5   Fr    r   r8   r   )r)   r*   r9   r   r   r+   r   r:   r   r   r-   r=   )r.   r/   r>   r?   r@   rA   r   r   r   rC   t   s&    
ÿÿzTestGradMNLogit.test_hessN)rD   rE   rF   ÚclassmethodrX   rC   r   r   r   r   rG   a   s   
rG   c                   @   s   e Zd Zedd„ ƒZdS )ÚTestGradLogitc                 C   sJ   t jj ¡ }t j|jdd|_t  |j|j¡| _t	 
ddddg¡g| _d S )NFrH   r%   ç      Ð?çffffffö?éùÿÿÿ)rL   rM   ÚspectorrO   rR   rP   ÚLogitrQ   r*   r   Úarrayr)   )rU   rV   r   r   r   rX   ”   s    zTestGradLogit.setup_classN)rD   rE   rF   rY   rX   r   r   r   r   rZ   “   s   rZ   c                   @   sL   e Zd Zedd„ ƒZedd„ ƒZdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dS )ÚCheckDerivativeMixinc                 C   s    d}t j d¡ t j |d¡}t  dddg¡}t  dddg¡}|}t  ||¡dt j |¡  }t  t j |¡|¡}|| _|| _	t  dddg¡|g| _
|  ¡  d S )NéÈ   iÝ r
   r%   r    ç      ð?çš™™™™™¹?)r   ÚrandomÚseedÚrandnr`   r   ÚlinalgÚpinvr   r   r)   Úinit)rU   Únobsr   Úxkr   r   Úxkolsr   r   r   rX   ¢   s    z CheckDerivativeMixin.setup_classc                 C   s   d S r   r   )rU   r   r   r   rj   µ   s    zCheckDerivativeMixin.initc                 C   sj   | j D ]^}|  |¡}|  ¡ }d}tj|||| jd}|tj||| | jd7 }|d }t||td qd S )Nr7   )ÚepsilonÚargsç       @r&   )r)   Úgradtruer   r   r   ro   r   ÚDEC6)r.   r/   Úgtruer   rn   Úgfdr   r   r   Útest_grad_fun1_fd¹   s    


ÿÿz&CheckDerivativeMixin.test_grad_fun1_fdc                 C   sF   | j D ]:}|  |¡}|  ¡ }tj||d| jdd}t||td qd S )Nç:Œ0âŽyE>T)rn   ro   r4   r&   )r)   rq   r   r   r   ro   r   ÚDEC5)r.   r/   rs   r   rt   r   r   r   Útest_grad_fun1_fdcÆ   s    


 ÿz'CheckDerivativeMixin.test_grad_fun1_fdcc                 C   sB   | j D ]6}|  |¡}|  ¡ }tj||| jd}t||td qd S ©N)ro   r&   )r)   rq   r   r   r   ro   r   ÚDEC13)r.   r/   rs   r   Zgcsr   r   r   Útest_grad_fun1_csÑ   s
    

z&CheckDerivativeMixin.test_grad_fun1_csc                 C   sŠ   | j D ]~}|  |¡}|d k	r|  ¡ }tj||| jd}t||td tj||| jd}t||td tj	||| jd}t||td qd S ry   )
r)   Úhesstruer   r   r;   ro   r   ÚDEC3r<   r=   )r.   r/   Úhetruer   r?   r   r   r   Útest_hess_fun1_fdÚ   s     

þþþz&CheckDerivativeMixin.test_hess_fun1_fdc                 C   sJ   | j D ]>}|  |¡}|d k	r|  ¡ }tj||| jd}t||td qd S ry   )r)   r|   r   r   r   ro   r   rr   )r.   r/   r~   r   rA   r   r   r   Útest_hess_fun1_csð   s    

z&CheckDerivativeMixin.test_hess_fun1_csN)rD   rE   rF   rY   rX   rj   ru   rx   r{   r   r€   r   r   r   r   ra   ¡   s   

	ra   c                       s8   e Zd Ze‡ fdd„ƒZdd„ Zdd„ Zdd„ Z‡  ZS )	ÚTestDerivativeFunc                    sJ   t t| ƒ ¡  t tj | j¡| j¡}t 	dddg¡|g| _
| jf| _d S ©Nrc   )Úsuperr   rX   r   r   rh   ri   r   r   r`   r)   ro   ©rU   rm   ©Ú	__class__r   r   rX   û   s    zTestDerivativeFun.setup_classc                 C   s   t S r   )r   ©r.   r   r   r   r     s    zTestDerivativeFun.func                 C   s   | j  d¡S r   )r   r   ©r.   r)   r   r   r   rq     s    zTestDerivativeFun.gradtruec                 C   s
   t  d¡S )N)r
   r
   )r   Zzerosrˆ   r   r   r   r|     s    zTestDerivativeFun.hesstrue©	rD   rE   rF   rY   rX   r   rq   r|   Ú__classcell__r   r   r…   r   r   ú   s
   r   c                       s8   e Zd Ze‡ fdd„ƒZdd„ Zdd„ Zdd„ Z‡  ZS )	ÚTestDerivativeFun2c                    sN   t t| ƒ ¡  t tj | j¡| j¡}t 	dddg¡|g| _
| j| jf| _d S r‚   )rƒ   r‹   rX   r   r   rh   ri   r   r   r`   r)   ro   r„   r…   r   r   rX     s    zTestDerivativeFun2.setup_classc                 C   s   t S r   )r#   r‡   r   r   r   r     s    zTestDerivativeFun2.func                 C   s:   | j | j }}| d |t ||¡ d d …d f   d¡S )Nr    r   )r   r   r   r   r   ©r.   r)   r   r   r   r   r   rq     s    zTestDerivativeFun2.gradtruec                 C   s   | j }dt |j|¡ S r   )r   r   r   ÚT)r.   r)   r   r   r   r   r|     s    zTestDerivativeFun2.hesstruer‰   r   r   r…   r   r‹   
  s
   r‹   c                       s8   e Zd Ze‡ fdd„ƒZdd„ Zdd„ Zdd„ Z‡  ZS )	ÚTestDerivativeFun1c                    sN   t t| ƒ ¡  t tj | j¡| j¡}t 	dddg¡|g| _
| j| jf| _d S r‚   )rƒ   rŽ   rX   r   r   rh   ri   r   r   r`   r)   ro   r„   r…   r   r   rX     s    zTestDerivativeFun1.setup_classc                 C   s   t S r   )r"   r‡   r   r   r   r   &  s    zTestDerivativeFun1.func                 C   s4   | j | j }}| d |t ||¡ d d …d f  S r   ©r   r   r   r   rŒ   r   r   r   rq   (  s    zTestDerivativeFun1.gradtruec                 C   s   d S r   r   rŒ   r   r   r   r|   +  s     zTestDerivativeFun1.hesstruer‰   r   r   r…   r   rŽ     s
   rŽ   c                  C   sp   dd„ } t  ddgddgg¡}ttt  ddg¡| ƒ|ƒ ttt  ddg¡| ƒ|ƒ ttt  dd	g¡| ƒ|ƒ d S )
Nc                 S   s   d|  S r   r   ©r   r   r   r   Úf2  s    ztest_dtypes.<locals>.fr    r   r%   rc   rp   y      ð?        y       @        )r   r`   r   r   )r‘   Údesiredr   r   r   Útest_dtypes1  s    
ÿr“   c                  C   s¶   dd„ } t  ddg¡}t  ddgg¡j}tt|| ƒ|d d …d f dd tt| ¡ | ƒ|dd tt|| ƒ|d d …d f dd tt| ¡ | ƒ|dd tt|j| ƒ ¡ |dd d S )Nc                 S   s   d|  S r   r   r   r   r   r   r‘   =  s    ztest_vectorized.<locals>.fr    r%   rv   r6   )r   r`   r   r   r   Zsqueezer	   r   )r‘   r’   Úpr   r   r   Útest_vectorized<  s       ÿÿ ÿr•   Ú__main__r7   rb   éÿÿÿÿr%   r    rc   rd   )r%   r    r
   g#B’¡œÇ;)Úhgü©ñÒMbP?FrH   r[   r\   r]   rL   ÚfdÚcsZnewton)ÚmethodrJ   )ZÚ__doc__Únumpyr   Znumpy.testingr   r   Zstatsmodels.apiÚapirL   Zstatsmodels.toolsr   Zstatsmodels.tools.numdiffr   r   r   r   r	   r}   ZDEC4rw   rr   r:   rz   ZDEC14r   r   r"   r#   r$   rG   rZ   ra   r   r‹   rŽ   r“   r•   rD   rn   rk   ZarangeZreshaper   re   rg   r`   rl   r   r   r   rh   ri   rm   Úprintr   rq   rB   r   Zapprox_hessÚgtÚgÚgdrM   r^   rO   rV   rR   rP   r_   rQ   r*   r/   r-   r+   r9   ZhessZhesscsrN   rS   rT   Zres1ZrandhieZdatapÚlenÚviewÚfloatZexogpZPoissonZmodpÚrespr   r   r   r   Ú<module>   s–   22Y

*.,

ÿ