o
    Ni                     @   sj   d dl Z d dlZddlmZ ddlmZ G dd de jdZG dd	 d	ee jdZG d
d de jdZ	dS )    N   )
find_event)_handle_unused_kwargsc                   @   s>   e Zd Zdd Zdd Zejdd Zedd Z	d	d
 Z
dS )AdaptiveStepsizeODESolverc                 K   s"   t | | ~|| _|| _|| _d S N)r   y0dtypenorm)selfr   r   r	   unused_kwargs r   M/home/ubuntu/.local/lib/python3.10/site-packages/torchdiffeq/_impl/solvers.py__init__   s
   

z"AdaptiveStepsizeODESolver.__init__c                 C      d S r   r   )r
   tr   r   r   _before_integrate   s   z+AdaptiveStepsizeODESolver._before_integratec                 C      t r   NotImplementedError)r
   next_tr   r   r   _advance      z"AdaptiveStepsizeODESolver._advancec                 C   s   t  S r   )setclsr   r   r   valid_callbacks      z)AdaptiveStepsizeODESolver.valid_callbacksc                 C   st   t jt|g| jjR | jj| jjd}| j|d< || j}| | t	dt|D ]}| 
|| ||< q,|S )Nr   devicer   r   )torchemptylenr   shaper   r   tor   ranger   )r
   r   solutionir   r   r   	integrate   s   *

z#AdaptiveStepsizeODESolver.integrateN)__name__
__module____qualname__r   r   abcabstractmethodr   classmethodr   r'   r   r   r   r   r      s    	

r   )	metaclassc                   @   s"   e Zd Zejdd Zdd ZdS )AdaptiveStepsizeEventODESolverc                 C   r   r   r   )r
   event_fnr   r   r   _advance_until_event(   r   z3AdaptiveStepsizeEventODESolver._advance_until_eventc                 C   sL   | | jj| j}| |d | |\}}tj| j|gdd}||fS )Nr   dim)	r#   r   r   r   r   reshaper1   r   stack)r
   t0r0   
event_timey1r%   r   r   r   integrate_until_event,   s
   z4AdaptiveStepsizeEventODESolver.integrate_until_eventN)r(   r)   r*   r+   r,   r1   r:   r   r   r   r   r/   &   s    
r/   c                   @   sf   e Zd ZU eed< dddZedd Zed	d
 Z	e
jdd Zdd Zdd Zdd Zdd ZdS )FixedGridODESolverorderNlinearFc                 K   s   | d| _| dd  | dd  t| | ~|| _|| _|j| _|j| _|| _|| _|| _	|d u rC|d u r>dd | _
d S || _
d S |d u rO| || _
d S td)Natolrtolr	   c                 S   s   |S r   r   )fr   r   r   r   r   <lambda>H   s    z-FixedGridODESolver.__init__.<locals>.<lambda>z@step_size and grid_constructor are mutually exclusive arguments.)popr>   r   funcr   r   r   	step_sizeinterpperturbgrid_constructor _grid_constructor_from_step_size
ValueError)r
   rC   r   rD   rG   rE   rF   r   r   r   r   r   7   s&   

zFixedGridODESolver.__init__c                 C   s   dhS )Ncallback_stepr   r   r   r   r   r   Q   r   z"FixedGridODESolver.valid_callbacksc                    s    fdd}|S )Nc                    sX   |d }|d }t ||   d  }t jd||j|jd  | }|d |d< |S )Nr   r2   r   r   )r   ceilitemaranger   r   )rC   r   r   
start_timeend_timeniterst_inferrD   r   r   _grid_constructorW   s   zNFixedGridODESolver._grid_constructor_from_step_size.<locals>._grid_constructorr   )rD   rS   r   rR   r   rH   U   s   	z3FixedGridODESolver._grid_constructor_from_step_sizec                 C   r   r   r   )r
   rC   r7   dtt1r   r   r   r   
_step_funcb   r   zFixedGridODESolver._step_funcc                 C   s|  |  | j| j|}|d |d kr|d |d ksJ tjt|g| jjR | jj| jjd}| j|d< d}| j}t	|d d |dd  D ]t\}}|| }| j
||| | | j||||\}	}
||	 }|t|k r||| kr| jdkr| |||||| ||< n#| jdkr| ||}| |||
||||| ||< ntd| j |d7 }|t|k r||| kss|}qG|S )Nr   r2   r   r   r=   cubicUnknown interpolation method )rG   rC   r   r   r    r!   r"   r   r   ziprJ   rV   rE   _linear_interp_cubic_hermite_interprI   )r
   r   	time_gridr%   jr   r7   rU   rT   dyf0r9   f1r   r   r   r'   f   s,   $*
"

 	zFixedGridODESolver.integratec                    sN  j d us	J dj jj }t|}d}d}	 |d7 }| j|\} | t|}||krjdkrXfdd}	n jd	krp fd
d}	nt	dj t
|	||tj\}
n||krtd| dq$tjjgdd}|
|fS )Nz_Event handling for fixed step solvers currently requires `step_size` to be provided in options.i N  r   Tr   r=   c                    s     | S r   )rZ   r   )r
   r7   rU   r   r9   r   r   rA      s    z:FixedGridODESolver.integrate_until_event.<locals>.<lambda>rW   c              	      s     | S r   )r[   ra   r_   r`   r
   r7   rU   r   r9   r   r   rA      s    rX   z%Reached maximum number of iterations .r3   )rD   type_asr   absr   signrV   rC   rE   rI   r   floatr>   RuntimeErrorr6   )r
   r7   r0   rT   sign0max_itrsitrr^   sign1	interp_fnr8   r%   r   rb   r   r:      s8   


z(FixedGridODESolver.integrate_until_eventc                 C   s   || ||  }dd|  d|  d|  }	|d|  d|  }
|| dd|   }|| |d  }|| }|	| |
| |  ||  || |  S )Nr         r   )r
   r7   r   r_   rU   r9   r`   r   hh00h10h01h11rT   r   r   r   r[      s   (z(FixedGridODESolver._cubic_hermite_interpc                 C   s8   ||kr|S ||kr|S || ||  }||||   S r   r   )r
   r7   rU   r   r9   r   sloper   r   r   rZ      s   z!FixedGridODESolver._linear_interp)NNr=   F)r(   r)   r*   int__annotations__r   r-   r   staticmethodrH   r+   r,   rV   r'   r:   r[   rZ   r   r   r   r   r;   4   s   
 



$	r;   )
r+   r   event_handlingr   miscr   ABCMetar   r/   r;   r   r   r   r   <module>   s    