
    = j$                         S SK r S SKrS SKrS SKJr  S SKJr  S rS r	S r
S r   SS jrS	 r\R                  R                  S
S9S 5       rS rS rS r\R                  R                  SS9S 5       rS rg)    N)assert_allclose)odec                 B   U R                   u  pSn[        U* S-   S5       H1  n[        R                  " X5      R	                  5       (       d  M.  U* n  O   Sn[        US-
  SS5       H2  n[        R                  " X5      R	                  5       (       d  M.  Un  X54$    X54$ )z7Returns ml and mu, the lower and upper band sizes of a.r      )shaperangenpdiagany)anrowsncolsmlkmus         ~/root/GenerationalWealth/GenerationalWealth/venv/lib/python3.13/site-packages/scipy/integrate/tests/test_banded_ode_solvers.py_band_countr      s    77LE	
BE6!8Q771=B   
B57Ar"771=B6M	 # 6M    c                 $    UR                  U5      $ )zLinear system dy/dt = a * y)dottyr   s      r   _linear_funcr      s    558Or   c                     U$ )zJacobian of a * y is a. r   s      r   _linear_jacr      s    Hr   c           	         [        U5      u  p4[        USS5       Vs/ s H0  n[        R                  S/U-  [        R                  " X%5      4   PM2     nnUR                  [        R                  " U5      5        [        SU* S-
  S5       H@  nUR                  [        R                  [        R                  " X%5      S/U* -  4   5        MB     U$ s  snf )zBanded Jacobian.r   r   r   )r   r	   r
   r_r   append)r   r   r   r   r   r   bjacs          r   _linear_banded_jacr#   "   s    ^FB38Q3CD3CaBEE1#'2771=()3CDDKK
2s1ub!BEE"''!-!345 "K	 Es   7Cc	           
      |   U(       a  [        U 5      u  pOSn	Sn
U(       a1  U(       a  [        [        [        5      nO$[        [        [        5      nO[        [        5      nUc   [
        R                  " U 5      (       a  SnOSnUR                  UUUXSSS9  SnUR                  X5        UR                  U 5        UR                  U 5        U/nUR                  5       /nUR                  5       (       a  UR                  U:  a  UR                  UR                  U-   5        UR                  UR                  5        UR                  UR                   R                  5       5        UR                  5       (       a  UR                  U:  a  M  [
        R"                  " U5      n[
        R"                  " U5      nX4$ )av  Use scipy.integrate.ode to solve a linear system of ODEs.

a : square ndarray
    Matrix of the linear system to be solved.
y0 : ndarray
    Initial condition
tend : float
    Stop time.
dt : float
    Step size of the output.
solver : str
    If not None, this must be "vode", "lsoda" or "zvode".
method : str
    Either "bdf" or "adams".
use_jac : bool
    Determines if the jacobian function is passed to ode().
with_jacobian : bool
    Passed to ode.set_integrator().
banded : bool
    Determines whether a banded or full jacobian is used.
    If `banded` is True, `lband` and `uband` are determined by the
    values in `a`.
Nzvodevode&.>绽|=)with_jacobianmethodlbandubandrtolatolr   )r   r   r   r#   r   r
   iscomplexobjset_integratorset_initial_valueset_f_paramsset_jac_paramscopy
successfulr   	integrater!   r   array)r   y0tenddtsolverr*   use_jacr)   bandedr+   r,   rt0r   r   s                  r   _solve_linear_sysr@   ,   sS   4 "1~uL"45AL+.A~??1FFV#0" U	   
BNN1Q	A	A
,,..QSS4Z	ACC"H		 ,,..QSS4Z
 	A
A4Kr   c                    [         R                  R                  U 5      u  p4[         R                  R                  XA5      nU[         R                  " X2R                  SS5      -  5      -  nUR                  UR                  5      nU$ )z
Analytical solution to the linear differential equations dy/dt = a*y.

The solution is only valid if `a` is diagonalizable.

Returns a 2-D array with shape (len(t), len(y0)).
r   r   )r
   linalgeigsolveexpreshaper   T)r   r8   r   lamvcesols           r   _analytical_solutionrM   q   sa     YY]]1FC
		A	BFF32q))**A
%%*CJr   z"vode integrator is not thread-safe)reasonc            
      .  ^^^^ [         R                  " SSS5      n [         R                  " / SQ/ SQ/ SQ/ SQ/ SQ/5      n[         R                  " U5      n[         R                  " U5      n[         R                  " U5      nXX4/m/ mT HI  n[         R
                  " S	UR                  S   S	-   5      n[        XVU 5      nTR                  X`U45        MK     UU4S
 jn[        [        T5      5       H<  n	SS/SS/SS/SS/SS//n
[        R                  " U
6  H  u  ppnU" XXX5        M     M>     USU-  -
  n[         R                  " [         R                  " U5      5      nUU/m/ mT HL  n[         R
                  " S	UR                  S   S	-   5      S-   n[        XVU 5      nTR                  X`U45        MN     UU4S jn[        [        T5      5       H9  n	SS/SS/SS/SS//n
[        R                  " U
6  H  u  ppU" U	SXX5        M     M;     g )Nr         ?   )g333333皙?        rS   rS   )g?g      g?rS   rS   )rR   rR   gٿrR   rS   )rS   g333333?ggg333333ӿ)rS   rS   rR   rR   gffffffr   c                    > TU    nTU    u  pxn	[        XgUS   US   US   -
  UUUUUS9	u  p[        X5        [        X5        g Nr   r   r   )r9   r:   r;   r*   r<   r)   r=   r@   r   )idxr;   methr<   with_jacr=   r   r8   t_exacty_exactr   r   real_matricesreal_solutionss               r   
check_real+test_banded_ode_solvers.<locals>.check_real   sb    #-c2W &-bk$+AJ$;(.(,)0/7(.0 	##r   r&   lsodabdfadamsFTy              ?y              ?c                    > TU    nTU    u  pxn	[        XgUS   US   US   -
  UUUUUS9	u  p[        X5        [        X5        g rU   rV   )rW   r;   rX   r<   rY   r=   r   r8   rZ   r[   r   r   complex_matricescomplex_solutionss               r   check_complex.test_banded_ode_solvers.<locals>.check_complex   sb    S!05W &-bk$+AJ$;(.(,)0/7(.0 	##r   r%   )r
   linspacer7   triutrilaranger   rM   r!   r	   len	itertoolsproductr   )rZ   a_reala_real_uppera_real_lowera_real_diagr   r8   r[   r^   rW   pr;   rX   r<   rY   r=   	a_complexa_complex_diagrf   rd   re   r\   r]   s                      @@@@r   test_banded_ode_solversrv      s    kk!S!$G
 XX11131	3 4F 776?L 776?L '','K<EMNYYq!''!*q.)&qg6rG45 
$ S'(gWT]T]T]	
 8A7H7H!7L3F'VsD8D 8M ) &I WWRWWY/0N!>2YYq!''!*q.)B.&qg6  "w!78 
$ S)*+WT]T]T] 09/@/@!/D+D8#wxH 0E ,r   c                     [         R                  " US   SUS   -  SUS   -  US   -  -   SUS   -  SUS   -  US   -  -
  SUS   S-  -  -
  SUS   S-  -  US	   /5      $ )
Nr   {Gzr        @      {Gz?g    8|A   r
   r7   r   r   s     r   stiff_fr      s    88	!!sQqTzAaD((qtcAaDj1Q4''#!a-7adAg	!  r   c           
          [         R                  " / SQSSSUS   -  SUS   -  S/SSSUS   -  S	US   -  -
  SUS   -  S/SSS	US   -  SS// S
Q/5      $ )N)r   r   r   r   r   r   rx   ry   r{   rz   r|            8A)r   r   r   r   r   r~   r   s     r   	stiff_jacr      s}    88>	
Es1Q4x#ad(A>	
T4!A$;1Q4/adA>	
U1Q4ZA>>  r   c           
          [         R                  " SSSSUS   -  S/SSSUS   -  SUS   -  S/SSSUS   -  SUS   -  -
  SS/SS	SUS   -  SS//5      $ )
Nr   ry   rz   r{   r   r   rx   r   r|   r~   r   s     r   banded_stiff_jacr      s    88	
a#ad(A6	
s1Q4xadA6	
E4!9U1Q4Z'A6	
TU1Q4ZA6	  r   z#lsoda integrator is not thread-safec                  t    [        SSS9u  pS H&  n[        US5      u  p4[        X05        [        XASS9  M(     g )NTF)r<   r=   )TFgH׊>)r-   )_solve_robertson_lsodar   )tfullyfullr<   r   r   s        r   test_banded_lsodar      s>     *$uELE %gt4! 	t, !r   c                     U (       a  U(       a  [         nO	[        nOS nU(       a  SnSnOS nS n[        [        U5      nUR	                  SX4SSS9  SnSnSn[
        R                  " / S	Q5      n	UR                  X5        U/n
U	R                  5       /nUR                  5       (       a  UR                  U:  a  UR                  UR                  U-   5        U
R                  UR                  5        UR                  UR                  R                  5       5        UR                  5       (       a  UR                  U:  a  M  UR                  R                  S
   S:  d   e[
        R                  " U
5      n
[
        R                  " U5      nX4$ )Nr   rz   r`   r'   r(   )r+   r,   r-   r.   r   
   )rP   rP   rS   rS   rP      )r   r   r   r   r0   r
   r7   r1   r4   r5   r   r6   r!   r   _integratoriwork)r<   r=   jacr+   r,   r>   r?   r:   r9   r8   r   r   s               r   r   r   
  s>   "CCGSAW U   
B	
BD	+	,B	A	A
,,..QSS4Z	ACC"H		 ,,..QSS4Z ==r"Q&&&
A
A4Kr   )r   rR   Nra   TFF)rm   pytestnumpyr
   numpy.testingr   scipy.integrater   r   r   r   r#   r@   rM   markthread_unsaferv   r   r   r   r   r   r   r   r   <module>r      s       )  

 ),9=27BJ "FG^I H^IF "GH	- I	-)r   