o
    oh
                     @   sF   d Z ddlmZ ddlmZ ddlmZ dddZd	d
 Zdd Z	dS )z)Numerical Methods for Holonomic Functions    sympify)DMFsubs)mpFRK4c              	      s   | j }|j |jj}| }|dkrt}nt}g |jD ]}|	|
  q fddt D }	| j}
t|
 k rBtd| j}||	||d |
 g}t|dd D ]\}}|||	|| ||d   qX|sud	d |D S t|S )
zk
    Numerical methods for numerical integration along a given set of
    points in the complex plane.
    Eulerc                    s   g | ]}|     qS  r   .0iadmfr   m/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/sympy/holonomic/numerical.py
<listcomp>   s    z_evalf.<locals>.<listcomp>zNot Enough Initial Conditionsr      Nc                 S   s   g | ]}t |d  qS )r   r   r	   r   r   r   r   )   s    )annihilatororderparentbase	get_field_euler_rk4
listofpolyappendnewto_listrangey0len	TypeErrorx0	enumerater   )funcpointsderivativesmethodannRKmethjredr   r"   solr   r   r   r   _evalf	   s*   
 r/   c                 C   s   t |tj}t |tj}dd |D }|| }|dd }	d}
t|D ]}|
t t| | |ddtj||  7 }
q'|	|
 g }t|D ]}||| ||	|    qJ|S )zs
    Euler's method for numerical integration.
    From x0 to x1 with initial values given at x0 as vector y0.
    c                 S      g | ]
}t |tjqS r   r   
_to_mpmathr   precr	   r   r   r   r   6       z_euler.<locals>.<listcomp>r   Nr   Tmpmr   r2   r   r3   r   r   r   )r-   r"   x1r   r   ABy_0hf_0f_0_nr   r.   r   r   r   r   .   s   ,
r   c              	      sB  t |tj}t |tj}dd |D || d}d}d}	d}
dd  t|D ]}|t t| | |ddtj|  7 }q- |  fddtd|D t|D ]#}|t t| | |d	  ddtj|  |  d	   7 }q\| fd
dtd|D t|D ]#}|	t t| | |d	  ddtj| |  d	   7 }	q|	 fddtd|D }t|D ]}|
t t| | | ddtj| |    7 }
q||
 g }t|D ]!}||  | d	|   d	|   ||   d   q|S )z1
    Runge-Kutta 4th order numerical method.
    c                 S   r0   r   r1   r	   r   r   r   r   M   r4   z_rk4.<locals>.<listcomp>r   r   NTr5   c                    $   g | ]}|  |  d   qS    r   r	   )r=   r<   r;   r   r   r   Z      $ rA   c                    r?   r@   r   r	   )f_1r<   r;   r   r   r   _   rB   c                    s    g | ]}|  |   qS r   r   r	   )f_2r<   r;   r   r   r   d   s        r7   )r-   r"   r8   r   r   r9   r:   r>   f_1_nf_2_nf_3_nr   f_3r.   r   )r=   rC   rD   r<   r;   r   r   F   s8   ,
D
D
<
@r   N)Fr   )
__doc__sympy.core.sympifyr   sympy.holonomic.holonomicr   mpmathr   r/   r   r   r   r   r   r   <module>   s    
%