U
    Kvf¼:  ã                   @   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   úH/tmp/pip-unpacked-wheel-2v6byqio/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_paramsZ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__r0   rB   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ÚdatarO   Ú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&   r1   Tr2   r   r4   Fr    r   r7   r   )r)   r*   r8   r   r   r+   r   r9   r   r   r-   r<   )r.   r/   r=   r>   r?   r@   r   r   r   rB   t   s&    
ÿÿzTestGradMNLogit.test_hessN)rC   rD   rE   ÚclassmethodrW   rB   r   r   r   r   rF   a   s   
rF   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 )NFrG   r%   ç      Ð?çffffffö?éùÿÿÿ)rK   rL   ÚspectorrN   rQ   rO   ÚLogitrP   r*   r   Úarrayr)   )rT   rU   r   r   r   rW   ”   s    zTestGradLogit.setup_classN)rC   rD   rE   rX   rW   r   r   r   r   rY   “   s   rY   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)rT   Únobsr   Úxkr   r   Úxkolsr   r   r   rW   ¢   s    z CheckDerivativeMixin.setup_classc                 C   s   d S r   r   )rT   r   r   r   ri   µ   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 )Nr6   )ÚepsilonÚargsç       @r&   )r)   Úgradtruer   r   r   rn   r   ÚDEC6)r.   r/   Úgtruer   rm   Ú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)rm   rn   r3   r&   )r)   rp   r   r   r   rn   r   ÚDEC5)r.   r/   rr   r   rs   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)rn   r&   )r)   rp   r   r   r   rn   r   ÚDEC13)r.   r/   rr   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 rx   )
r)   Úhesstruer   r   r:   rn   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 rx   )r)   r{   r   r   r   rn   r   rq   )r.   r/   r}   r   r@   r   r   r   Útest_hess_fun1_csð   s    

z&CheckDerivativeMixin.test_hess_fun1_csN)rC   rD   rE   rX   rW   ri   rt   rw   rz   r~   r   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 )	ÚTestDerivativeFunc                    sJ   t t| ƒ ¡  t tj | j¡| j¡}t 	dddg¡|g| _
| jf| _d S ©Nrb   )Úsuperr€   rW   r   r   rg   rh   r   r   r_   r)   rn   ©rT   rl   ©Ú	__class__r   r   rW   û   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   rp     s    zTestDerivativeFun.gradtruec                 C   s
   t  d¡S )N)r
   r
   )r   Úzerosr‡   r   r   r   r{     s    zTestDerivativeFun.hesstrue©	rC   rD   rE   rX   rW   r   rp   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‹   rW   r   r   rg   rh   r   r   r_   r)   rn   rƒ   r„   r   r   rW     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   rp     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Ž   rW   r   r   rg   rh   r   r   r_   r)   rn   rƒ   r„   r   r   rW     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   rp   (  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%   rb   ro   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%   ru   r5   )r   r_   r   r   r   Zsqueezer	   r   )r‘   r’   Úpr   r   r   Útest_vectorized<  s       ÿÿ ÿr•   Ú__main__r6   ra   éÿÿÿÿr%   r    rb   rc   )r%   r    r
   g#B’¡œÇ;)Úhgü©ñÒMbP?FrG   rZ   r[   r\   rK   ÚfdÚcsZnewton)ÚmethodrI   )ZÚ__doc__Znumpyr   Znumpy.testingr   r   Zstatsmodels.apiÚapirK   Zstatsmodels.toolsr   Zstatsmodels.tools.numdiffr   r   r   r   r	   r|   ZDEC4rv   rq   r9   ry   ZDEC14r   r   r"   r#   r$   rF   rY   r`   r€   r‹   rŽ   r“   r•   rC   rm   rj   ZarangeZreshaper   rd   rf   r_   rk   r   r   r   rg   rh   rl   Úprintr   rp   rA   r   Zapprox_hessÚgtÚgÚgdrL   r]   rN   rU   rQ   rO   r^   rP   r*   r/   r-   r+   r8   ZhessZhesscsrM   rR   rS   Zres1ZrandhieZdatapÚlenÚviewÚfloatZexogpZPoissonZmodpÚrespr   r   r   r   Ú<module>   s–   22Y

*.,

ÿ