
    'YHhz:              	       *
   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(  rzd"Z&d#Z' ejP                  e'dz        jS                  e'd$      Z*ejV                  jY                  e'd      Z* ejZ                  g d%      Z. ejZ                  g d&      Z.e.Z/ ej`                  e*e/      d'ejV                  jY                  e'      z  z   Z1 ej`                  ejd                  jg                  e*      e1      Z4 e5 ed%ee&e*             e*jm                  d      Z7 e5e*jm                  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j`                  e*jr                  e*      z  z
          e5 e
jt                  e.ed+e1e*f      d   d* ej`                  e*jr                  e*      z  z
         e* d*z  e1 ej`                  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~                  j                         ZA ej                  eAj                  d,-      eA_C         ej                  eAj                  eAj                        ZFg d.ZGeFj                  ZHeFj                  ZIeFj                  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|                  j                  j                         ZAeAj                  ZC ej                  eCd,-      ZC ej                  eAj                  eC      j                  d2d3      ZPej|                  j                  j                         ZR eSeRj                        Z' ej                  eRj                  j                  eU      jS                  e'd$      d,-      ZV ej                  eRj                  eV      ZXeXj                  d2d3      ZYyy)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                 N    t        j                  | |z
        j                         S N)npabsmax)xys     ]/var/www/html/planif/env/lib/python3.12/site-packages/statsmodels/tools/tests/test_numdiff.pymaxabsr      s    66!A#;??    c                 L    t        j                  ||       j                  d      S Nr   )r   dotsum)betar   s     r   funr!   !   s    66!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                 :    t        | ||      j                  d      S r   )r&   r   )r    r   r   s      r   fun2r(   )   s    a""r   c                       e Zd Zd Zd Zy)CheckGradLoglikeMixinc                 t   | j                   D ]  }| j                  j                  |      }t        j                  |j                         | j                  j                        }t        ||d       t        j                  |j                         | j                  j                        }t        ||d        y )N   decimal   )	paramsmodscorer   r   ravellogliker   r   )selftest_paramsscscfdsccss        r   
test_scorez CheckGradLoglikeMixin.test_score0   s    ;; 	6K,B(():):)<6:hh6F6FHDD!4++K,=,=,?6:hh6F6FHDD"5	6r   c                    | j                   D ]T  }| j                  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                  j
                        }t        ||d	       t        j                  |j                         | j                  j                        }t        ||d       | j                  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       W y )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;   s   ;; "	5K!!+.B++KHDD$7  D!4((dhhnn268DB40((dhhnn279DD!4,,[->->-@8<HEBE2))+*;*;*=8<8H8HJDB40 88>>+.D"//TXX=M=M.2FLD&D!4fa8"//TXX=M=M $$8LD&D!4fa8''TXX5E5EtLDD!4E"	5r   N)__name__
__module____qualname__r:   rP    r   r   r*   r*   /   s    	6#5r   r*   c                   "    e Zd Zed        Zd Zy)TestGradMNLogitc                    t         j                  j                  j                         }t	        j
                  |j                        |_        t	        j
                  |j                        |_        |j                  }t        j                  |d      }t        j                  |j                  |      | _
        | j                  j                  d      }|j                  j                  d      g| _        y )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     {{!!&&(JJtyy)	ZZ

+
yytU3**TZZ. ggkkqk!jj&&s+,
r   c                 8   | j                   D ]  }| j                  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        y )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   s/   ;; 	5K!!+.B++KHDD$7
  D!4((dhhnn268DD!4((dhhnnd279DD!4,,[$((..IEE48))+txx7G7GHDD!4 ''TXX5E5EtLDD!47	5r   N)rQ   rR   rS   classmethodri   rP   rT   r   r   rV   rV   a   s    - -"5r   rV   c                       e Zd Zed        Zy)TestGradLogitc                 8   t         j                  j                  j                         }t        j                  |j
                  d      |_        t        j                  |j                  |j
                        | _        t        j                  g d      g| _        y )NFrX   r,   g      ?gffffff?i)r\   r]   spectorr_   rc   ra   Logitrb   r1   r   arrayr0   )rf   rg   s     r   ri   zTestGradLogit.setup_class   s]    {{""'')OODIIu=	((4::tyy1hh/0
r   N)rQ   rR   rS   rk   ri   rT   r   r   rm   rm      s    1 1r   rm   c                   J    e Zd Zed        Zed        Zd Zd Zd Zd Z	d Z
y)	CheckDerivativeMixinc                 6   d}t         j                  j                  d       t         j                  j                  |d      }t        j                  g d      }t        j                  g d      }|}t        j
                  ||      dt         j                  j                  |      z  z   }t        j
                  t         j                  j                  |      |      }|| _        || _	        t        j                  g d      |g| _
        | j                          y )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IIOOD#XXgXXj!FF1dOc"))//$"777ryy~~a(+hhz*E2

r   c                      y r   rT   )rf   s    r   r   zCheckDerivativeMixin.init   s    r   c                 .   | j                   D ]  }| j                  |      }| j                         }d}t        j                  |||| j
                        }|t        j                  ||| | j
                        z  }|dz  }t        ||t                y )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'.2ii9C7((cG8/3yy: :C2ICsD9
	:r   c                     | j                   D ]Y  }| j                  |      }| j                         }t        j                  ||d| j
                  d      }t        ||t               [ y )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$.2ii$HCsD9	:r   c                     | j                   D ]W  }| j                  |      }| j                         }t        j                  ||| j
                        }t        ||t               Y y 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   sR    ;; 	;KMM+.E((*C**;$))LCsE:	;r   c                    | j                   D ]  }| j                  |      }|| j                         }t        j                  ||| j
                        }t        ||t               t        j                  ||| j
                        }t        ||t               t        j                  ||| j
                        }t        ||t                y 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!hhj++K26))= $FD$? ++K26))= $FD$?++K26))= $FD$?'	@r   c                     | j                   D ]Z  }| j                  |      }|| j                         }t        j                  ||| j
                        }t        ||t               \ y 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   sZ    ;; 	@K]];/F!hhj--k3TYYO#FD$?	@r   N)rQ   rR   rS   rk   ri   r   r   r   r   r   r   rT   r   r   rt   rt      sC     $  :	:;@,@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                        | j                        }t        j                  g d      |g| _	        | j                  f| _
        y Nrx   superri   r   r   r~   r   r   r   rr   r0   r   rf   r   	__class__s     r   ri   zTestDerivativeFun.setup_class   sU    ryy~~cee,cee4hhz*E2
EE8r   c                     t         S r   )r!   r5   s    r   r!   zTestDerivativeFun.fun  s    
r   c                 8    | j                   j                  d      S r   )r   r   r5   r0   s     r   r   zTestDerivativeFun.gradtrue  s    vvzz!}r   c                 ,    t        j                  d      S )N)r   r   )r   zerosr   s     r   r   zTestDerivativeFun.hesstrue  s    xxr   	rQ   rR   rS   rk   ri   r!   r   r   __classcell__r   s   @r   r   r      s$     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                        | j                        }t        j                  g d      |g| _	        | j                  | j                  f| _
        y r   r   r   s     r   ri   zTestDerivativeFun2.setup_class  [    ryy~~cee,cee4hhz*E2
EE355>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  j	                  d      S )Nr$   r   )r   r   r   r   r   r5   r0   r   r   s       r   r   zTestDerivativeFun2.gradtrue  sH    vvtvv11aq&))1T62277::r   c                 `    | j                   }dt        j                  |j                  |      z  S r#   )r   r   r   T)r5   r0   r   s      r   r   zTestDerivativeFun2.hesstrue  s$    FFQr   r   r   s   @r   r   r   
  s$    " ";
 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                        | j                        }t        j                  g d      |g| _	        | j                  | j                  f| _
        y 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                     | 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=    vvtvv11aq&))1T6223r   c                      y r   r   r   s       r   r   zTestDerivativeFun1.hesstrue+  s    r   r   r   s   @r   r   r     s$    " "44r   r   c                  B   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      |       |       y )	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     hhAA  !GM"((Aq6"2A6@M"((B8"4a8'BM"((E5>":A>Hr   c                     d } t        j                  ddg      }t        j                  ddgg      j                  }t        t	        ||       |d d d f   d       t        t	        |j                         |       |d       t        t        ||       |d d d f   d       t        t        |j                         |       |d       t        t        |j                  |       j                         |d       y )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   <  s     hh1vG
1a&A)!Q/D1AM)!))+q9$(,Q2GAtG4D,QYY[!<$( $QSS!,446d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 /5d05+ 05d1) 1V@ V@r,   -  (4- 4&IL, zGD		$q&!!$r*A
		QA	'	B	*	BDq$#biiood333ABFF299>>!$Q'E	-GA
./uuQxH	!%%(OgsQDG<F	&&*+	.#tw
78	.$1
9!FBFF133N:J
JK	
'

bdQqE
21
5&"&&a.8H
HI"Q$&"&&G$$af-
-B$19A			wtGQqE	:B	&B-	&R.;;##%D		59DI
"((4::tyy
)C!KkkGIIE;;D
 
$k"#	$%%%k''BC	$(((W=>	$[!"	$%%%k%@A	$(((e<=#W##K9F	$	&k"F
+,;;""$D99D2??4/D2::djj$'++8!+DDKK$$&Eu{{DBOOEJJOOE2::4C$)+E2::ekk5)D888!8,DA r   