U
    ZÊ¹j¯  ã                   @   s8  d dl Z d dlmZmZmZmZ d dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZmZmZmZ d dlmZmZ d dlmZ d d	lmZ d d
lmZ d d
lmZ d dlmZ d dl m!Z! d dl"m#Z#m$Z$m%Z% d dl&m'Z' d dl(m)Z)m*Z* edƒZ+edƒZ,dd„ Z-e'dd„ ƒZ.e'dd„ ƒZ/dd„ Z0e'dd„ ƒZ1dd„ Z2dS )é    N)ÚlogÚMinÚMaxÚsqrt)ÚFloat)ÚSymbolÚsymbols)Úcos)Ú
AssignmentÚRaiseÚRuntimeError_ÚQuotedString)Únewtons_methodÚnewtons_method_function)Úexpm1)Úbind_C)Úrender_as_module)Úimport_module)Úccode)Úcompile_link_import_stringsÚhas_cÚhas_fortran)Ú	may_xfail)ÚskipÚraisesÚcythonÚ	wurlitzerc                  C   sP   t dƒ\} }}t| ƒ| d  }t|| ||ƒ}| t|| | | ¡ ƒ¡sLt‚d S )Nz	x dx atolé   )r   r	   r   Úhasr
   ÚdiffÚAssertionError)ÚxZdxÚatolÚexprÚalgo© r%   úb/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/codegen/tests/test_algorithms.pyÚtest_newtons_method   s    r'   c               	   C   sª   t ddd�} t| ƒ| d  }t|| ƒ}ts2tdƒ tƒ s@tdƒ ddi}t ¡ �P}td	d
t	|ƒ fdd 
d¡d fg||d�\}}t| d¡d ƒdk sœt‚W 5 Q R X d S )Nr!   T©Úrealr   úcython not installed.úNo C compiler found.ÚstdÚc99znewton.cú%#include <math.h>
#include <stdio.h>
ú_newton.pyxú#cython: language_level={}
Ú3zIcdef extern double newton(double)
def py_newton(x):
    return newton(x)
)Ú	build_dirÚcompile_kwargsç      à?çßºv™ö±ë?çê-�™—q=)r   r	   r   r   r   r   ÚtempfileÚTemporaryDirectoryr   r   ÚformatÚabsÚ	py_newtonr    )r!   r#   ÚfuncÚ
compile_kwÚfolderÚmodÚinfor%   r%   r&   Ú#test_newtons_method_function__ccode   s*    

ÿ
ÿý ù
rA   c               	   C   s°   t ddd�} t| ƒ| d  }t|| tdd�gd�}ts>tdƒ tƒ sLtd	ƒ t|gd
ƒ}t 	¡ �F}t
d|fdd d¡d fg|d�\}}t| d¡d ƒdk s¢t‚W 5 Q R X d S )Nr!   Tr(   r   Znewton)Úname)Úattrsr*   zNo Fortran compiler found.Z
mod_newtonz
newton.f90r/   r0   r1   zRcdef extern double newton(double*)
def py_newton(double x):
    return newton(&x)
)r2   r4   r5   r6   )r   r	   r   r   r   r   r   Úf_moduler7   r8   r   r9   r:   r;   r    )r!   r#   r<   Zf_modr>   r?   r@   r%   r%   r&   Ú#test_newtons_method_function__fcode4   s$    

ÿþú
rE   c                  C   s`   t ddd�} t| ƒ| d  }t|| ƒ}t|ƒ}i }t|||ƒ td|ƒ}t|d ƒdk s\t‚d S )Nr!   Tr(   r   znewton(0.5)r5   r6   )r   r	   r   Ú	py_moduleÚexecÚevalr:   r    )r!   r#   r<   Úpy_modÚ	namespaceÚresr%   r%   r&   Ú$test_newtons_method_function__pycodeK   s    

rL   c               
      sD  t dƒ } \‰}}}|t|ˆ ƒ |ˆd   ‰ tt‡ ‡fdd„ƒ t}tˆ ˆ| |d�}tƒ sftdƒ tsrtdƒ dd	i}t	 
¡ �¸}td
dt|ƒ fdd d¡d fg||d�\}}	|rÜt ¡ �\}
}| d¡}W 5 Q R X n
| d¡}t|d ƒdk sút‚|�stdƒ |
 ¡ | ¡  }
}|dk�s(t‚|
dk�s6t‚W 5 Q R X d S )Nzx A k pr   c                      s
   t ˆ ˆƒS ©N)r   r%   ©r#   r!   r%   r&   Ú<lambda>Z   ó    z@test_newtons_method_function__ccode_parameters.<locals>.<lambda>)Údebugr+   r*   r,   r-   znewton_par.cr.   z_newton_par.pyxr0   r1   zycdef extern double newton(double, double, double, double)
def py_newton(x, A=1, k=1, p=1):
    return newton(x, A, k, p)
)r3   r2   r4   r5   r6   zAC-level output only tested when package 'wurlitzer' is available.Ú zïx=         0.5
x=      1.1121 d_x=     0.61214
x=     0.90967 d_x=    -0.20247
x=     0.86726 d_x=   -0.042409
x=     0.86548 d_x=  -0.0017867
x=     0.86547 d_x= -3.1022e-06
x=     0.86547 d_x= -9.3421e-12
x=     0.86547 d_x=  3.6902e-17
)r   r	   r   Ú
ValueErrorr   r   r   r   r   r7   r8   r   r   r9   Zpipesr;   r:   r    Úread)ÚargsÚAÚkÚpZuse_wurlitzerr<   r=   r>   r?   r@   ÚoutÚerrÚresultr%   rN   r&   Ú.test_newtons_method_function__ccode_parametersV   s@    
ÿ
ÿý ù
	
r\   c                     sÊ  t dddd�\‰} ‰}}tdddd�}|| d }ˆ|  | }t| ƒtttˆƒt| ƒ | ƒ ƒ }|t|ƒ }dd„ ‰ d	‡ ‡‡fd
d„id	dd„ id	dd„ idœ}|| f‰dD �]}	| ˆˆ||fdd|	|ddˆˆftttdƒƒƒdœ	‰‡‡fdd„| ¡ D ƒ}
dd„ |
 ¡ D ƒ}i }i }| ¡ D ]4\}}i  }||< t|||ƒ ||› d� ||< �q"t	dƒ}ddddœ}d}| ¡ D ]J\}}
|
|ddddƒ}|||  }|	�rª|d 9 }t
|| ƒ|k �sxt‚�qxq°d S )!Nza b c N_geo N_totT)r)   ÚnonnegativeÚi)Úintegerr]   é   c                 S   s   t t| |ƒ|ƒS rM   )r   r   )Úlowr#   Úhighr%   r%   r&   Ú_clamp�   s    z:test_newtons_method_function__rtol_cse_nan.<locals>._clampZdelta_fnc                    s8   ˆ t ˆ| ƒ| d |  |  |¡ t ˆ| ƒ| d ƒS )Ng®Gáz®ï?)r   r   ©Úer!   )rc   ÚaÚcr%   r&   rO   ”   s   ýz<test_newtons_method_function__rtol_cse_nan.<locals>.<lambda>c                 S   s4   d| |   |¡  d|   |¡d  | |   |d¡   S )Néþÿÿÿé   ©r   rd   r%   r%   r&   rO   ™   rP   c                 S   s<   |  |   |¡ d| |   |¡ |   |d¡ d |   |¡   S )Nr`   ri   rj   rd   r%   r%   r&   rO   š   rP   )Zclamped_newtonZhalleyZ
halley_alt)FTé<   g0Žä.ÿ++g¼‰Ø—²Ò¬<zencountered NaN.)	ÚparamsZitermaxrQ   ZcseÚcounterr"   ZrtolZboundsZ
handle_nanc              	      s2   i | ]*\}}|t ˆ d |› d�itˆf|Ž—Ž“qS )Ú	func_nameÚ_b)r   Údict)Ú.0rW   Úkw)rU   Úkwargsr%   r&   Ú
<dictcomp>£   s      z>test_newtons_method_function__rtol_cse_nan.<locals>.<dictcomp>c                 S   s   i | ]\}}|t |ƒ“qS r%   )rF   )rq   rW   Úvr%   r%   r&   rt   ¤   s      ro   z"13.2261515064168768938151923226496gMgâñžµ<g      @g{®Gáz„?g      Y@é2   éd   ri   )r   r   r   r   r   r   r   ÚitemsrG   r   r:   r    )ÚbZN_geoZN_totr^   ZN_ariZ	delta_ariZln_delta_geoZeqb_logZmeth_kwZuse_cser<   rI   rJ   Zroot_find_brW   ru   ÚnsÚrefZreftolÚguessÚmethr[   Úreqr%   )rc   rf   rU   rg   rs   r&   Ú*test_newtons_method_function__rtol_cse_nanˆ   sP    &

ù	
      ýr   )3r7   Zsympyr   r   r   r   Zsympy.core.numbersr   Zsympy.core.symbolr   r   Z(sympy.functions.elementary.trigonometricr	   Zsympy.codegen.astr
   r   r   r   Zsympy.codegen.algorithmsr   r   Zsympy.codegen.cfunctionsr   Zsympy.codegen.fnodesr   Zsympy.codegen.futilsr   rD   Zsympy.codegen.pyutilsrF   Zsympy.externalr   Zsympy.printing.codeprinterr   Zsympy.utilities._compilationr   r   r   Z!sympy.utilities._compilation.utilr   Zsympy.testing.pytestr   r   r   r   r'   rA   rE   rL   r\   r   r%   r%   r%   r&   Ú<module>   s4   


1