
    M/Phz:              	       L
   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 Zd Zd Zd Z G d d          Z G d de          Z G d de          Z G d d          Z G d de          Z  G d de          Z! G d de          Z"d Z#d  Z$e%d!k    rtd"Z&d#Z' ej(        e'dz            )                    e'd$          Z*ej+        ,                    e'd          Z* ej-        g d%          Z. ej-        g d&          Z.e.Z/ ej0        e*e/          d'ej+        ,                    e'          z  z   Z1 ej0        ej2        3                    e*          e1          Z4 e5 ed%ee&e*                     e*6                    d          Z7 e5e*6                    d                      ed%ee*fd()          Z8 e5e8 ee8e7                      e5 ed%ee*fd()                      e5 ed%ee1e*fd()          d* ej0        e*j9        e*          z  z
              e5 e
j:        e.ed+e1e*f          d         d* ej0        e*j9        e*          z  z
             e* d*z  e1 ej0        e*g d%          z
  dddf         z  Z; ed%ee1e*fd()          Z< e
j        d%ee&e1e*f          Z= e5 ee<e;                      e5 ee=e;                     ej>        j?        @                                ZA ejB        eAjC        d,-          eA_C         ejD        eAjE        eAjC                  ZFg d.ZGeFjH        ZHeFjI        ZIeFjJ        ZK e5d/ eIeG                      e5d0 e
j        eGeHe&                      e5d1 e
j        eGeH                      e5d/ eKeG                      e5d0 e
j        eGeIe&                      e5d1 e
j        eGeI                      e
j        eGeH          ZL e5d1eL            e5 e eKeG          eL                     ej>        jM        @                                ZAeAjC        ZC ejB        eCd,-          ZC ejN        eAjE        eC          O                    d2d3          ZPej>        jQ        @                                ZR eSeRjE                  Z' ejB        eRjC        T                    eU          )                    e'd$          d,-          ZV ejW        eRjE        eV          ZXeXO                    d2d3          ZYdS dS )4zTesting 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                 T    t          j        | |z
                                            S N)npabsmax)xys     d/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/statsmodels/tools/tests/test_numdiff.pymaxabsr      s    6!A#;;??    c                 R    t          j        ||                               d          S Nr   )r   dotsum)betar   s     r   funr!   !   s     6!T??q!!!r   c                 <    t          j        ||           }||z
  dz  S N   )r   r   )r    r   r   xbs       r   fun1r&   $   s    	4BbD19r   c                 J    t          | ||                              d          S r   )r&   r   )r    r   r   s      r   fun2r(   )   s"    a"""r   c                       e Zd Zd Zd ZdS )CheckGradLoglikeMixinc                 Z   | j         D ]}| j                            |          }t          j        |                                | j        j                  }t          ||d           t          j        |                                | j        j                  }t          ||d           d S )N   decimal   )	paramsmodscorer   r   ravellogliker   r   )selftest_paramsscscfdsccss        r   
test_scorez CheckGradLoglikeMixin.test_score0   s    ; 	6 	6K,,B():):)<)<6:h6FH HDD!4444+K,=,=,?,?6:h6FH HDD"55555	6 	6r   c                 v   | j         D ]/}| j                            |          }t          j        || j        j                  }t          ||t                     t          ||d           t          j        || j        j        d          }t          ||d           t          j        || j        j        d          }t          ||d           t          j        |
                                | j        j                  }t          ||d	           t          j        |
                                | j        j                  }t          ||d           | j                            |          }t          j        || j        j        d
d          \  }}t          ||d           t          ||d           t          j        || j        j        dd          \  }}t          ||d           t          ||d           t          j        || j        j        d          }t          ||d           1d S )Nr-      Tcentered&.>rtolFr   gvIh%<=ư>)return_gradr,   -C6?r   gh㈵>)r0   r1   hessianr   r   r2   r   DEC8r   r   r3   r   r4   approx_hess1approx_hess2approx_hess3)r5   r6   hehefdhescshecsgradgradcss           r   	test_hesszCheckGradLoglikeMixin.test_hess;   sO   ; "	5 "	5K!!+..B+KHHDD$7777  D!4444(dhn268 8 8DB40000(dhn279 9 9DD!4444,[->->-@-@8<H HEBE2222)+*;*;*=*=8<8HJ JDB40000 8>>+..D"/TX=M.2F F FLD&D!4444fa8888"/TX=M $$8 8 8LD&D!4444fa8888'TX5EtLLDD!44444E"	5 "	5r   N)__name__
__module____qualname__r:   rP    r   r   r*   r*   /   s2        	6 	6 	6#5 #5 #5 #5 #5r   r*   c                   *    e Zd Zed             Zd ZdS )TestGradMNLogitc                    t           j        j                                        }t	          j        |j                  |_        t	          j        |j                  |_        |j        }t          j        |d          }t          j	        |j        |          | _
        | j
                            d          }|j                            d          g| _        d S )NFprependr   )dispF)smdatasetsanes96loadr   asarrayexogendogadd_constantMNLogitr1   fitr0   r3   )clsdatara   ress       r   setup_classzTestGradMNLogit.setup_classb   s     {!&&((Jty))	Z
++
ytU333*TZ.. gkkqk!!j&&s++,


r   c                    | j         D ]e}| j                            |          }t          j        || j        j                  }t          ||t                     t          ||d           t          j        || j        j        d          }t          ||d           t          j        || j        j        dd          }t          ||d           t          j        || j        j                  }t          ||t                     t          j	        || j        j
                  }t          ||d	           t          j        || j        j
        d
          }t          ||d           gd S )Nr-   r<   Tr=   r   r?   Fr$   r   rD   r   )r0   r1   rE   r   r   r2   r   rF   r   r   r4   rI   )r5   r6   rJ   rK   rL   rM   s         r   rP   zTestGradMNLogit.test_hesst   sn   ; 	5 	5K!!+..B+KHHDD$7777
  D!4444(dhn268 8 8DD!4444(dhnd279 9 9DD!4444,[$(.IIEE48888)+tx7GHHDD!4444 'TX5EtLLDD!444447	5 	5r   N)rQ   rR   rS   classmethodri   rP   rT   r   r   rV   rV   a   s<        - - [-"5 5 5 5 5r   rV   c                   $    e Zd Zed             ZdS )TestGradLogitc                    t           j        j                                        }t          j        |j        d          |_        t          j        |j        |j                  | _        t          j
        g d          g| _        d S )NFrX   r,   g      ?gffffff?i)r\   r]   spectorr_   rc   ra   Logitrb   r1   r   arrayr0   )rf   rg   s     r   ri   zTestGradLogit.setup_class   sc    {"''))ODIu===	(4:ty11h//0


r   N)rQ   rR   rS   rk   ri   rT   r   r   rm   rm      s-        1 1 [1 1 1r   rm   c                   X    e Zd Zed             Zed             Zd Zd Zd Zd Z	d Z
dS )	CheckDerivativeMixinc                 6   d}t           j                            d           t           j                            |d          }t          j        g d          }t          j        g d          }|}t          j        ||          dt           j                            |          z  z   }t          j        t           j                            |          |          }|| _        || _	        t          j        g d          |g| _
        |                                  d S )N   i r   r,   r$   r         ?ry   ry   皙?)r   randomseedrandnrr   r   linalgpinvr   r   r0   init)rf   nobsr   xkr    r   xkolss          r   ri   z CheckDerivativeMixin.setup_class   s    
	vIOOD##XgggXjjj!!F1dOOc")//$"7"777ry~~a((++hzzz**E2





r   c                     d S r   rT   )rf   s    r   r   zCheckDerivativeMixin.init   s    r   c                 $   | j         D ]}|                     |          }|                                 }d}t          j        |||| j                  }|t          j        ||| | j                  z  }|dz  }t          ||t                     d S )NrB   )epsilonargs       @r-   )r0   gradtruer!   r   r   r   r   DEC6)r5   r6   gtruer!   r   gfds         r   test_grad_fun1_fdz&CheckDerivativeMixin.test_grad_fun1_fd   s    ; 
	: 
	:KMM+..E((**CG'S'.2i9 9 9C7(cG8/3y: : : :C2ICsD99999
	: 
	:r   c                     | j         D ]`}|                     |          }|                                 }t          j        ||d| j        d          }t          ||t                     ad S )N:0yE>T)r   r   r>   r-   )r0   r   r!   r   r   r   r   DEC5)r5   r6   r   r!   r   s        r   test_grad_fun1_fdcz'CheckDerivativeMixin.test_grad_fun1_fdc   s|    ; 	: 	:KMM+..E((**C 'S$.2i$H H HCsD99999	: 	:r   c                     | j         D ]^}|                     |          }|                                 }t          j        ||| j                  }t          ||t                     _d S N)r   r-   )r0   r   r!   r   r   r   r   DEC13)r5   r6   r   r!   gcss        r   test_grad_fun1_csz&CheckDerivativeMixin.test_grad_fun1_cs   sl    ; 	; 	;KMM+..E((**C*;$)LLLCsE:::::	; 	;r   c                    | j         D ]}|                     |          }||                                 }t          j        ||| j                  }t          ||t                     t          j        ||| j                  }t          ||t                     t          j	        ||| j                  }t          ||t                     d S r   )
r0   hesstruer!   r   rG   r   r   DEC3rH   rI   )r5   r6   hetruer!   rK   s        r   test_hess_fun1_fdz&CheckDerivativeMixin.test_hess_fun1_fd   s    ; 	@ 	@K]];//F!hhjj+K26)= = = $FD$???? +K26)= = = $FD$????+K26)= = = $FD$????'	@ 	@r   c                     | j         D ]`}|                     |          }|G|                                 }t          j        ||| j                  }t          ||t                     ad S r   )r0   r   r!   r   r   r   r   r   )r5   r6   r   r!   rM   s        r   test_hess_fun1_csz&CheckDerivativeMixin.test_hess_fun1_cs   st    ; 	@ 	@K]];//F!hhjj-k3TYOOO#FD$????	@ 	@r   N)rQ   rR   rS   rk   ri   r   r   r   r   r   r   rT   r   r   rt   rt      s          [$   [: : :	: 	: 	:; ; ;@ @ @,@ @ @ @ @r   rt   c                   @     e Zd Ze fd            Zd Zd Zd Z xZS )TestDerivativeFunc                    t                                                       t          j        t          j                            | j                  | j                  }t          j        g d          |g| _	        | j        f| _
        d S Nrx   superri   r   r   r~   r   r   r   rr   r0   r   rf   r   	__class__s     r   ri   zTestDerivativeFun.setup_class   se    ry~~ce,,ce44hzzz**E2
E8r   c                     t           S r   )r!   r5   s    r   r!   zTestDerivativeFun.fun  s    
r   c                 6    | j                             d          S r   )r   r   r5   r0   s     r   r   zTestDerivativeFun.gradtrue  s    vzz!}}r   c                 *    t          j        d          S )N)r   r   )r   zerosr   s     r   r   zTestDerivativeFun.hesstrue  s    xr   	rQ   rR   rS   rk   ri   r!   r   r   __classcell__r   s   @r   r   r      so            [          r   r   c                   @     e Zd Ze fd            Zd Zd Zd Z xZS )TestDerivativeFun2c                     t                                                       t          j        t          j                            | j                  | j                  }t          j        g d          |g| _	        | j        | j        f| _
        d S r   r   r   s     r   ri   zTestDerivativeFun2.setup_class  i    ry~~ce,,ce44hzzz**E2
E35>r   c                     t           S r   )r(   r   s    r   r!   zTestDerivativeFun2.fun      r   c                     | j         | j        }}| dz  |t          j        ||          z
  d d d f         z                      d          S )Nr$   r   )r   r   r   r   r   r5   r0   r   r   s       r   r   zTestDerivativeFun2.gradtrue  sL    vtv11aq&)))111T62277:::r   c                 J    | j         }dt          j        |j        |          z  S r#   )r   r   r   T)r5   r0   r   s      r   r   zTestDerivativeFun2.hesstrue  s     FQr   r   r   s   @r   r   r   
  so        " " " " ["  ; ; ;
             r   r   c                   @     e Zd Ze fd            Zd Zd Zd Z xZS )TestDerivativeFun1c                     t                                                       t          j        t          j                            | j                  | j                  }t          j        g d          |g| _	        | j        | j        f| _
        d S r   r   r   s     r   ri   zTestDerivativeFun1.setup_class  r   r   c                     t           S r   )r&   r   s    r   r!   zTestDerivativeFun1.fun&  r   r   c                 p    | j         | j        }}| dz  |t          j        ||          z
  d d d f         z  S r#   r   r   r   r   r   s       r   r   zTestDerivativeFun1.gradtrue(  s>    vtv11aq&)))111T6223r   c                     d S r   r   r   s       r   r   zTestDerivativeFun1.hesstrue+  s    tr   r   r   s   @r   r   r     so        " " " " ["  4 4 44 4 4 4 4 4 4r   r   c                  l   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                     d| z  S r#   rT   r   s    r   fztest_dtypes.<locals>.f2      s
r   r$   r   r,   ry   r   y      ?        y       @        )r   rr   r   r   )r   desireds     r   test_dtypesr   1  s       hAA  ! !GM"(Aq6"2"2A66@@@M"(B8"4"4a88'BBBM"(E5>":":A>>HHHHHr   c                  N   d } t          j        ddg          }t          j        ddgg          j        }t          t	          ||           |d d d f         d           t          t	          |                                |           |d           t          t          ||           |d d d f         d           t          t          |                                |           |d           t          t          |j        |                                           |d           d S )Nc                     d| z  S r#   rT   r   s    r   r   ztest_vectorized.<locals>.f=  r   r   r$   r,   r   r@   )r   rr   r   r   r	   squeezer
   r   )r   r   ps      r   test_vectorizedr   <  s9      h1vG
1a&A)!Q//D1AMMMM)!))++q99$( ( ( (,Q22GAAAtG4D   ,QYY[[!<<$( ( ( ( $QS!,,4466dKKKKKKr   __main__rB   rv   rw   rx   rz   g#B;)hr$   gMbP?FrX   ro   r\   fdcsnewton)methodrZ   )Z__doc__numpyr   numpy.testingr   r   statsmodels.apiapir\   statsmodels.toolsr   statsmodels.tools.numdiffr   r   r   r	   r
   r   DEC4r   r   rF   r   DEC14r   r!   r&   r(   r*   rV   rm   rt   r   r   r   r   r   rQ   r   r   arangereshaper   r{   r}   rr   r   r    r   r   r~   r   r   printr   r   rO   r   approx_hessgtggdr]   rp   r_   rg   rc   ra   rq   rb   r1   r6   r4   r2   rE   hesshesscsr^   rd   re   res1randhiedataplenviewfloatexogpPoissonmodpresprT   r   r   <module>r      s\        > > > > > > > >       % % % % % %              	

  " " "  
# # #/5 /5 /5 /5 /5 /5 /5 /5d05 05 05 05 05+ 05 05 05d1 1 1 1 1) 1 1 1V@ V@ V@ V@ V@ V@ V@ V@r    ,             -      (4 4 4 4 4- 4 4 4&I I IL L L, zGD	$q&!!$r**A
	QA	'''		B	***		BDq$#biood3333ABF29>>!$$Q''E	E--GA
.
.///uuQxxH	E!%%((OOOgsQDG<<<F	E&&&**+++	E..#tw
7
7
7888	E..$1
9
9
9!FBF13NN:J
JKKK	E
'
bdQqE
2
21
5&"&a..8H
HIII"Q$&"&GGG$$$aaaf-
-B$1999A		wtGQqE	:	:B	E&&B--	E&&R..;##%%D	5999DI
"(4:ty
)
)C!//KkGIE;D
 
E$k""###	E$%%k''BBCCC	E$((W==>>>	E$[!!"""	E$%%k%@@AAA	E$((e<<===#W#K99F	E$	E&&k""F
+
+,,,;""$$D9D2?4///D2:dj$''++8!+DDDK$$&&E3u{DBOEJOOE22::4CC$)+ + +E2:ek5))D888!8,,DDDA r   