ó
áp7]c           @  sê  d  Z  d d l m Z d d l Z d d l m Z m Z d d l j	 Z
 d d l m Z d d l m Z m Z m Z d Z d Z d	 Z d
 Z d Z d Z d Z d „  Z d „  Z d „  Z d „  Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ  d e  f d „  ƒ  YZ! d e  f d „  ƒ  YZ" d e  f d „  ƒ  YZ# d  „  Z$ e% d! k ræd" Z& d# Z' e j( e' d ƒ j) e' d ƒ Z* e j+ j, e' d ƒ Z* e j- d$ d% d g ƒ Z. e j- d& d& d& g ƒ Z. e. Z/ e j0 e* e/ ƒ d' e j+ j, e' ƒ Z1 e j0 e j2 j3 e* ƒ e1 ƒ Z4 e5 e d7 e e& e* ƒ ƒ e* j6 d( ƒ Z7 e5 e* j6 d( ƒ ƒ e d8 e e* f d) d* ƒZ8 e5 e8 e e8 e7 ƒ ƒ e5 e d9 e e* f d) d* ƒƒ e5 e d: e e1 e* f d) d* ƒd% e j0 e* j9 e* ƒ ƒ e5 e j: e. e d+ e1 e* f ƒ d( d% e j0 e* j9 e* ƒ ƒ e* d% e1 e j0 e* d$ d% d g ƒ d d … d f Z< e d; e e1 e* f d) d* ƒZ= e j d< e e& e1 e* f ƒ Z> e5 e e= e< ƒ ƒ e5 e e> e< ƒ ƒ e
 j? j@ jA d, eB ƒ ZC e
 jD eC jE d- eB ƒeC _E e
 jF eC jG eC jE ƒ ZH d$ d. d/ d0 g ZI eH jJ ZJ eH jK ZK eH jL ZM e5 d1 eK eI ƒ ƒ e5 d2 e j eI eJ e& ƒ ƒ e5 d3 e j eI eJ ƒ ƒ e5 d1 eM eI ƒ ƒ e5 d2 e j eI eK e& ƒ ƒ e5 d3 e j eI eK ƒ ƒ e j eI eJ ƒ ZN e5 d3 eN ƒ e5 e eM eI ƒ eN ƒ ƒ e
 j? jO jA d, eB ƒ ZC eC jE ZE e
 jD eE d- eB ƒZE e
 jP eC jG eE ƒ jQ d4 d5 d6 d( ƒ ZR e
 j? jS jA d, eB ƒ ZT eU eT jG ƒ Z' e
 jD eT jE jV eW ƒ j) e' d ƒ d- eB ƒZX e
 jY eT jG eX ƒ ZZ eZ jQ d4 d5 d6 d( ƒ Z[ n  d S(=   sß   Testing numerical differentiation

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

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

iÿÿÿÿ(   t   print_functionN(   t   assert_almost_equalt   assert_allclose(   t   numdiff(   t   approx_fprimet   approx_fprime_cst   approx_hess_csi   i   i   i   i   i   i   c         C  s   t  j |  | ƒ j ƒ  S(   N(   t   npt   abst   max(   t   xt   y(    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyt   maxabs   s    c         C  s   t  j | |  ƒ j d ƒ S(   Ni    (   R   t   dott   sum(   t   betaR
   (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyt   fun   s    c         C  s   t  j | |  ƒ } | | d S(   Ni   (   R   R   (   R   R   R
   t   xb(    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyt   fun1   s    c         C  s   t  |  | | ƒ j d ƒ S(   Ni    (   R   R   (   R   R   R
   (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyt   fun2$   s    t   CheckGradLoglikeMixinc           B  s   e  Z d  „  Z d „  Z RS(   c         C  sŒ   x… |  j  D]z } |  j j | ƒ } t j | j ƒ  |  j j ƒ } t | | d d ƒt j | j ƒ  |  j j ƒ } t | | d d ƒq
 Wd  S(   Nt   decimali   i   (	   t   paramst   modt   scoreR   R   t   ravelt   loglikeR   R   (   t   selft   test_paramst   sct   scfdt   sccs(    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyt
   test_score+   s    c         C  s  xÿ|  j  D]ô} |  j j | ƒ } t j | |  j j ƒ } t | | d t ƒt | | d d ƒt j | |  j j d t	 ƒ} t
 | | d d ƒt j | |  j j d t ƒ} t | | d d ƒt j | j ƒ  |  j j ƒ } t
 | | d d ƒt j | j ƒ  |  j j ƒ } t
 | | d d ƒ|  j j | ƒ } t j | |  j j d d	 t	 ƒ\ } } t | | d d
 ƒt | | d d
 ƒt j | |  j j d d	 t	 ƒ\ } } t | | d d ƒt | | d d
 ƒt j | |  j j d ƒ } t | | d d ƒq
 Wd  S(   NR   i   t   centeredt   rtolg•Ö&è.>i   g‚vIhÂ%<=gíµ ÷Æ°>t   return_gradi   g-Cëâ6?i   gñhãˆµøä>(   R   R   t   hessianR   R   R   R   t   DEC8R   t   TrueR   t   FalseR   R   R   t   approx_hess1t   approx_hess2t   approx_hess3(   R   R   t   het   hefdt   hescst   hecst   gradt   gradcs(    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyt	   test_hess6   s8    		(   t   __name__t
   __module__R    R1   (    (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyR   *   s   	t   TestGradMNLogitc           B  s    e  Z e d  „  ƒ Z d „  Z RS(   c         C  s   t  j j j d t ƒ } | j } t  j | d t ƒ} t  j | j | ƒ |  _	 |  j	 j
 d d ƒ } | j j d ƒ g |  _ d  S(   Nt	   as_pandast   prependt   dispi    t   F(   t   smt   datasetst   anes96t   loadR'   t   exogt   add_constantt   MNLogitt   endogR   t   fitR   R   (   t   clst   dataR=   t   res(    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyt   setup_class]   s    	c         C  sQ  xJ|  j  D]?} |  j j | ƒ } t j | |  j j ƒ } t | | d t ƒt | | d d ƒt j | |  j j d t	 ƒ} t | | d d ƒt j | |  j j d d t
 ƒ} t | | d d ƒt j | |  j j ƒ } t | | d t ƒt j | |  j j ƒ } t | | d d ƒt j | |  j j d ƒ } t | | d d	 ƒq
 Wd  S(
   NR   i   R!   i   g•Ö&è.>i   i   g-Cëâ6?i    (   R   R   R$   R   R   R   R   R%   R   R&   R'   R   R   R*   (   R   R   R+   R,   R-   R.   (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyR1   m   s"    		(   R2   R3   t   classmethodRE   R1   (    (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyR4   \   s   t   TestGradLogitc           B  s   e  Z e d  „  ƒ Z RS(   c         C  ss   t  j j j d t ƒ } t  j | j d t ƒ| _ t  j | j | j ƒ |  _	 t
 j d d d d g ƒ g |  _ d  S(   NR5   R6   i   g      Ð?gffffffö?iùÿÿÿ(   R9   R:   t   spectorR<   R'   R>   R=   t   LogitR@   R   R   t   arrayR   (   RB   RC   (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyRE      s    (   R2   R3   RF   RE   (    (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyRG   Œ   s   t   CheckDerivativeMixinc           B  sS   e  Z e d  „  ƒ Z e d „  ƒ Z d „  Z d „  Z d „  Z d „  Z d „  Z	 RS(   c         C  sæ   d } t  j j d ƒ t  j j | d ƒ } t  j d d d g ƒ } t  j d d d g ƒ } | } t  j | | ƒ d t  j j | ƒ } t  j t  j j | ƒ | ƒ } | |  _ | |  _	 t  j d d d g ƒ | g |  _
 |  j ƒ  d  S(   NiÈ   iÝ i   i   i   g      ð?gš™™™™™¹?(   R   t   randomt   seedt   randnRJ   R   t   linalgt   pinvR
   R   R   t   init(   RB   t   nobsR
   t   xkR   R   t   xkols(    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyRE   ›   s    &		!c         C  s   d  S(   N(    (   RB   (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyRQ   ®   s    c      	   C  s   x– |  j  D]‹ } |  j | ƒ } |  j ƒ  } d } t j | | d | d |  j ƒ} | t j | | d | d |  j ƒ7} | d :} t | | d t ƒq
 Wd  S(   Ngíµ ÷Æ°>t   epsilont   argsg       @R   (   R   t   gradtrueR   R   R   RV   R   t   DEC6(   R   R   t   gtrueR   RU   t   gfd(    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyt   test_grad_fun1_fd²   s    
c      
   C  sm   xf |  j  D][ } |  j | ƒ } |  j ƒ  } t j | | d d d |  j d t ƒ} t | | d t ƒq
 Wd  S(   NRU   g:Œ0âŽyE>RV   R!   R   (	   R   RW   R   R   R   RV   R&   R   t   DEC5(   R   R   RY   R   RZ   (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyt   test_grad_fun1_fdc¿   s    c         C  sa   xZ |  j  D]O } |  j | ƒ } |  j ƒ  } t j | | d |  j ƒ} t | | d t ƒq
 Wd  S(   NRV   R   (   R   RW   R   R   R   RV   R   t   DEC13(   R   R   RY   R   t   gcs(    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyt   test_grad_fun1_csÊ   s
    c         C  sÌ   xÅ |  j  D]º } |  j | ƒ } | d  k	 r
 |  j ƒ  } t j | | d |  j ƒ} t | | d t ƒt j	 | | d |  j ƒ} t | | d t ƒt j
 | | d |  j ƒ} t | | d t ƒq
 q
 Wd  S(   NRV   R   (   R   t   hesstruet   NoneR   R   R(   RV   R   t   DEC3R)   R*   (   R   R   t   hetrueR   R,   (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyt   test_hess_fun1_fdÓ   s    c         C  sp   xi |  j  D]^ } |  j | ƒ } | d  k	 r
 |  j ƒ  } t j | | d |  j ƒ} t | | d t ƒq
 q
 Wd  S(   NRV   R   (	   R   Ra   Rb   R   R   R   RV   R   RX   (   R   R   Rd   R   R.   (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyt   test_hess_fun1_csé   s    (
   R2   R3   RF   RE   RQ   R[   R]   R`   Re   Rf   (    (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyRK   š   s   					t   TestDerivativeFunc           B  s2   e  Z e d  „  ƒ Z d „  Z d „  Z d „  Z RS(   c         C  sk   t  t |  ƒ j ƒ  t j t j j |  j ƒ |  j ƒ } t j	 d d d g ƒ | g |  _
 |  j f |  _ d  S(   Ng      ð?(   t   superRg   RE   R   R   RO   RP   R
   R   RJ   R   RV   (   RB   RT   (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyRE   ô   s    $!c         C  s   t  S(   N(   R   (   R   (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyR   û   s    c         C  s   |  j  j d ƒ S(   Ni    (   R
   R   (   R   R   (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyRW   ý   s    c         C  s   t  j d ƒ S(   Ni   (   i   i   (   R   t   zeros(   R   R   (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyRa   ÿ   s    (   R2   R3   RF   RE   R   RW   Ra   (    (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyRg   ó   s   		t   TestDerivativeFun2c           B  s2   e  Z e d  „  ƒ Z d „  Z d „  Z d „  Z RS(   c         C  sq   t  t |  ƒ j ƒ  t j t j j |  j ƒ |  j ƒ } t j	 d d d g ƒ | g |  _
 |  j |  j f |  _ d  S(   Ng      ð?(   Rh   Rj   RE   R   R   RO   RP   R
   R   RJ   R   RV   (   RB   RT   (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyRE     s    $!c         C  s   t  S(   N(   R   (   R   (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyR     s    c         C  sI   |  j  |  j } } | d | t j | | ƒ d  d  … d  f j d ƒ S(   Ni   i    (   R   R
   R   R   Rb   R   (   R   R   R   R
   (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyRW     s    c         C  s    |  j  } d t j | j | ƒ S(   Ni   (   R
   R   R   t   T(   R   R   R
   (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyRa     s    	(   R2   R3   RF   RE   R   RW   Ra   (    (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyRj     s   		t   TestDerivativeFun1c           B  s2   e  Z e d  „  ƒ Z d „  Z d „  Z d „  Z RS(   c         C  sq   t  t |  ƒ j ƒ  t j t j j |  j ƒ |  j ƒ } t j	 d d d g ƒ | g |  _
 |  j |  j f |  _ d  S(   Ng      ð?(   Rh   Rl   RE   R   R   RO   RP   R
   R   RJ   R   RV   (   RB   RT   (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyRE     s    $!c         C  s   t  S(   N(   R   (   R   (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyR     s    c         C  s@   |  j  |  j } } | d | t j | | ƒ d  d  … d  f S(   Ni   (   R   R
   R   R   Rb   (   R   R   R   R
   (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyRW   !  s    c         C  sD   d  S|  j |  j } } | d | t j | | ƒ d  d  … d  f S(   Ni   (   Rb   R   R
   R   R   (   R   R   R   R
   (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyRa   $  s    (   R2   R3   RF   RE   R   RW   Ra   (    (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyRl     s   		c          C  s   d „  }  t  j d d g d d g g ƒ } t t t  j d d g ƒ |  ƒ | ƒ t t t  j d d g ƒ |  ƒ | ƒ t t t  j d d	 g ƒ |  ƒ | ƒ d  S(
   Nc         S  s   d |  S(   Ni   (    (   R
   (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyt   f+  s    i   i    i   g      ð?g       @y                y      ð?        y       @        (   R   RJ   R   R   (   Rm   t   desired(    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyt   test_dtypes*  s    	%%t   __main__gíµ ÷Æ°>iÈ   i   i   g      ð?gš™™™™™¹?i    t   hg#B’¡œÇ;gü©ñÒMbP?R5   R6   g      Ð?gffffffö?iùÿÿÿR9   t   fdt   cst   methodt   newtonR7   (   i   i   i   (   i   i   i   (   i   i   i   (   i   i   i   (   i   i   i   (   i   i   i   (\   t   __doc__t
   __future__R    t   numpyR   t   numpy.testingR   R   t   statsmodels.apit   apiR9   t   statsmodels.toolsR   t   statsmodels.tools.numdiffR   R   R   Rc   t   DEC4R\   RX   R%   R^   t   DEC14R   R   R   R   t   objectR   R4   RG   RK   Rg   Rj   Rl   Ro   R2   RU   RR   t   aranget   reshapeR
   RL   RN   RJ   RS   R   R   R   RO   RP   RT   t   printR   RW   R0   Rk   t   approx_hessRb   t   gtt   gt   gdR:   RH   R<   R'   RC   R>   R=   RI   R@   R   R   R   R   R$   t   hesst   hesscsR;   R?   RA   t   res1t   randhiet   datapt   lent   viewt   floatt   exogpt   Poissont   modpt   resp(    (    (    sC   lib/python2.7/site-packages/statsmodels/tools/tests/test_numdiff.pyt   <module>   s”   				20Y	&9=8				'$	