o
    Ni/                     @   s  d dl Z d dlZd dlZd dlZddlmZ ddlmZmZ ddlm	Z	 ddl
mZ g dgdd	gg d
g dg dg dg dg dg dg dg dg dg dg dg dg dg dg dg dg dgZg dgddgg dg dg dg dg d g d!g d"g d#g d$g d%g d&g d'g d(g d)g d*g d+g d,g d-gZg d.Zd/d0 eeeD Zd1d0 eeeD Zd2Zd3Zd2Zd4d5 ZG d6d7 d7eZG d8d9 d9eZdS ):    N   )FixedGridODESolver)_compute_error_ratio
_linf_norm)Perturb)rk4_alt_step_func      )   i   )7   i%   i)im  i*i8
  i   )i  ii&  i~i=  i%)iA i,i
 iic6 iJ  )iA iWkiR! iWi  iiW iAp)	i_ i*mi2ܰibi`;9iАiNPilS )
iiiipii iP}ii`iK>i?8)ilZ l   F| l{y* l   NI+; l U0k: l   2dc) lh0e l   C=Ht i|ϧ)l   ; lh l   i@39 lUNQ"~ l   @f7 lj] l   2eM l,z l   Q6 lONv l   x iV)l   ^/lZ~_ l   d l~~<u l   n7A lU|A# l    im" l<ho l   C-#4 l>r` l   sCOH l66S!   f)$)l   k,dlE	  l   NIq'~" lry
) l   7SYZQ l'Yx l   R l<@w l   evtj	4O l+W OL' l   pdO/ lLK l   j4XFlnc)l   -K"8v l$ l   9?]]p l@J=NwJl   U 'lPB	r_l   Xv^l `^.l   c:- l-}yul   tk>>lU/R}i l   )5 l(=    ?#<)l   -c&
 lggb7= l   I:<lyBtel   JS3lMVKOl   *%l%FKsQl   cZivlUnajll   [2!lk5CDl   =2u!r lE-Ov}6 l   /XBS) l?Rt:)l   ?t#mln._, l   5| l>6~/1< l   \fA'o, l[k2Y l   nA!|aA lv# l    6CfAT l,=+gc l   31?W l:JkWV+ l   [ wc lxRNd l    !'+Shzl5d;I   MKE )l   ?68_,l,h/ l   Tnz
 l${>*c., l   0(#]z l,`-Kkl   4m&N4hl|z?|gl   v!(A="lN5CAdl   {0Z6Gl:{ql   H+U(w lO =}G* l   H*>+ l9xw l   SEliYlM)l   1jYWD!lOc	*l   N[v3\~1,lvA"- l   CTyB7 lmv[&:$	 l   N(c4R lh#XDpN l   FRl:d l vnb l   EF%5 l\J-u l   ,Q!yazw	 lhR\7#ur l   |WJj% l	Mu)l   q}D2Ol, !;d    QPhv
 )l   1jMT[vWl>W7gl   c.XUy/~flxc 7Q, l   9M{]/I
 lqZd!}K5 l   l|q_LJ#4 l<RK;T l   u75}%#p lFJ{AXx{ l   5__Aco lR
i]QXS l   -Fot473 ly1fhPW l   |%}ZS!
 lF]<;* l   i^4apn`lQ*>Jl   AkYgCl%=N )r      r
   )	      r   )r   i  ij   i)i  i  ii  iS   )r   iX  iJi  ii  i)i  iI" i;$i ii  ii_  )	r   i)D iNi`U i`3ib0 i2Li* i_{)
i i0 ixTi- iEi% i-ix) ii  )r   i4'iiV3Vi2yRi YeiN:ih!ii̩)if)i4isQiO Gl   JnH lH l   QqP l2iO l   vf iUv(i2i:iV )r   l   Z)@@l<l   ~qa}0lW||{Ol   7i{cl 7IYT_l   <J(UEl)1!%l   Am"l$l   1> l` )l   ncl   E \lNK/7l   rjn{l"3^ l   nK9 llRfW l   <qg# lea;= l   +-\4]lrAg!l   4(@lO]Al   ^d )r   l   8 l9!Kv l   @	 lU[AKW l   P,{x l+=;1 l    `_mH lcgR0 l   #D_r l9GJ#* l   ay` l0i4U3l   >El?tW{ )l   ?Rt:l   	{~ lIZXH l   yPji&5 l
[% l   wey@ l
e%xX l   KZ)|a lcZ@/'T l   {rm{9 l[0 l   k_s1j l}>Gt l   S
VLjl/8l   ?t[ )r   l   nJ{&l_^Gl   >`~*Y)l${Aral   gufT7 lnqk l   vcS49uO l z>G l   p\G l>^u! l   :$y4Ol#kXEhl   |,e:lpJAsl   QVi26 lgK )l   Ml   >M]7lThH;W? l   $Mubl0(|]y l   Dt}h| l4Mg'=D l   $.Dy[ lv	u.RP;	 l   v1'W. l[
1V l   28O{: lH;AI4J l   Wc GlhRo*l   qW%lSA]#fi l   M{}l )r   l   W\HE@Q lj l   &s&ePlSf\Ml   ]s Ql~IJ~l   hU	+{+lFJU>n3l    H&iF3lMMCiD/)l   l5k$"l,!fl#8wl   hb=[s%ll7{!ml   Y63 lqalAZ l   ,Xbv=jA lt)l   %=N l   6BdytR lc(fIl   bK7rl9G</_l   q[2g,ll|-@Q'Ul   <$\g lu[>W)-0 l   FzW]5B> luLV0~* l   R:IE^~l-x)Y{Ll   C|N-&l|B*8,)l   F\(+li6 l   ilHQd. l!A2ns l   {xB)Nr            i  i  i@  i i _7 i n i i 9l    0]	l    `;l    @`f,rl     LYd l     ~hjl     PTl     qt;(, l     ciwPX c                    .   g | ]\} t j fd d|D t jdqS )c                       g | ]}|  qS  r"   ).0bdivisorr"   Q/home/ubuntu/.local/lib/python3.10/site-packages/torchdiffeq/_impl/fixed_adams.py
<listcomp>       <listcomp>.<listcomp>dtypetorchtensorfloat64)r#   	bashforthr"   r%   r'   r(          "r(   c                    r    )c                    r!   r"   r"   )r#   mr%   r"   r'   r(      r)   r*   r+   r-   )r#   moultonr"   r%   r'   r(      r2      r   c                 C   s   t dd t| |D S )Nc                 s   s    | ]	\}}|| V  qd S Nr"   )r#   xiyir"   r"   r'   	<genexpr>   s    z_dot_product.<locals>.<genexpr>)sumzip)xyr"   r"   r'   _dot_product   s   r>   c                       sD   e Zd ZdZdddeef fdd	Zdd Zd	d
 Zdd Z	  Z
S )AdamsBashforthMoultonr5   gMbP?g-C6?Tc           	         s   t t| j| f||d| |tksJ dt|tk r'tdt tj	| j
 jd| _tj	| j
 jd| _|| _|| _t|| _tj| jd d| _d | _ fddtD | _ fd	dtD | _d S )
N)rtolatolzmax_order must be at most {}z6max_order is below {}, so the solver reduces to `rk4`.)r,   devicer   )maxlenc                       g | ]}|  jqS r"   torB   r#   r<   y0r"   r'   r(          z2AdamsBashforthMoulton.__init__.<locals>.<listcomp>c                    rD   r"   rE   rG   rH   r"   r'   r(      rJ   )superr?   __init__
_MAX_ORDERformat
_MIN_ORDERwarningswarnr.   	as_tensorr,   rB   r@   rA   implicit	max_itersint	max_ordercollectionsdequeprev_fprev_t_BASHFORTH_DIVISORr1   _MOULTON_DIVISORr4   )	selffuncrI   r@   rA   rS   rT   rV   kwargs	__class__rH   r'   rL      s    
zAdamsBashforthMoulton.__init__c                 C   s.   | j d u s
| j |kr| j| || _ d S d S r6   )rZ   rY   
appendleft)r]   tfr"   r"   r'   _update_history   s   
z%AdamsBashforthMoulton._update_historyc                 C   s(   t t|| | j| j||t}|dk S )z7Checks that each element is within the error tolerance.r   )r   r.   absr@   rA   r   )r]   rI   y1error_ratior"   r"   r'   _has_converged   s    z$AdamsBashforthMoulton._has_convergedc              	   C   sP  |||| j r	tjntjd}| || tt| j| jd }|t	d k r6t
|||||| jd | j d|fS | j| }t|| | j|}	| jr| j|d  }
|t|
dd  | j| }d}t| jD ]+}|	}||||	 | j rutjntjd}||
d  | || }	| ||	}|r nqf|std | j  | || |	|fS )N)perturbr   r   )f0rj   FzAFunctional iteration did not converge. Solution may be incorrect.)rj   r   NEXTNONEre   minlenrY   rV   rO   r   r1   r>   type_asrS   r4   rangerT   PREVri   rP   rQ   pop)r]   r^   t0dtt1rI   rk   orderbashforth_coeffsdymoulton_coeffsdelta	converged_dy_oldrd   r"   r"   r'   
_step_func   s0   "
 

z AdamsBashforthMoulton._step_func)__name__
__module____qualname__rw   
_MAX_ITERSrM   rL   re   ri   r   __classcell__r"   r"   r`   r'   r?      s    r?   c                       s   e Zd Z fddZ  ZS )AdamsBashforthc                    s"   t t| j||fddi| d S )NrS   F)rK   r   rL   )r]   r^   rI   r_   r`   r"   r'   rL      s   "zAdamsBashforth.__init__)r   r   r   rL   r   r"   r"   r`   r'   r      s    r   )rW   sysr.   rP   solversr   miscr   r   r   	rk_commonr   _BASHFORTH_COEFFICIENTS_MOULTON_COEFFICIENTS_DIVISORr;   r[   r\   rO   rM   r   r>   r?   r   r"   r"   r"   r'   <module>   s    EB>