U
    ZÊ¹jì=  ã                   @   s*  d dl 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mZ d dl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 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'm(Z( d dl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 d dl:m;Z;m<Z< d dl=m>Z> d dl?m@Z@mAZA d dlBmCZC edƒZDedƒZEedƒZFdd„ ZGdd„ ZHdd„ ZIdd „ ZJd!d"„ ZKd#d$„ ZLd%d&„ ZMdBd(d)„ZNd*d+„ ZOd,d-„ ZPd.d/„ ZQd0d1„ ZRd2d3„ ZSd4d5„ ZTd6d7„ ZUd8d9„ ZVd:d;„ ZWd<d=„ ZXe;d>d?„ ƒZYeCd@dA„ ƒZZdS )Cé    N)ÚpiÚRational)ÚPow)ÚS)ÚSymbol)ÚAbs)ÚexpÚlog)ÚcosÚsinÚsinc)ÚMatrixSymbol)ÚassumingÚQ)Úimport_module)Úccode)ÚMatrixSolve)Úlog2Úexp2Úexpm1Úlog1p)Ú	logaddexpÚ
logaddexp2)Úcosm1Úpowm1)ÚoptimizeÚ	cosm1_optÚlog2_optÚexp2_optÚ	expm1_optÚ	log1p_optÚ	powm1_optÚ
optims_c99Úcreate_expand_pow_optimizationÚ
matinv_optÚlogaddexp_optÚlogaddexp2_optÚoptims_numpyÚoptims_scipyÚ	sinc_optsÚFuncMinusOneOptim)ÚXFAILÚskip)Úlambdify)Úcompile_link_import_stringsÚhas_c)Ú	may_xfailÚcythonÚnumpyÚscipyc                  C   sÈ  t dƒ} dtd|  d ƒ tdƒ }t|tgƒ}|dtd|  d ƒ ksLt‚| t¡|ks^t‚dtd|  d ƒ dtdƒ  }t|tgƒ}|dtd|  d ƒ d ksªt‚| t¡|ks¼t‚t| ƒtdƒ }t|tgƒ}|t| ƒksèt‚| t¡|ksút‚t| ƒtdƒ t| d ƒ }t|tgƒ}|t| ƒtdƒt| d ƒ  k�sHt‚| t¡|k�s\t‚tdƒ}	t|	tgƒ}
|
|	k�s~t‚t| d ƒtdƒ }t|tgƒ}t|ƒd	k�s°t‚| t¡|k�sÄt‚d S )
NÚxé   é   é   é   é   é   é   zlog2(x + 3))r   r	   r   r   r   ÚAssertionErrorÚrewriteÚstr)r4   Úexpr1Úopt1Úexpr2Úopt2Úexpr3Úopt3Úexpr4Úopt4Úexpr5Úopt5Úexpr6Úopt6© rK   úa/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/codegen/tests/test_rewriting.pyÚtest_log2_opt    s0      &rM   c                  C   sj   t dƒ} dd|   }t|tgƒ}|dt| ƒ ks4t‚| t¡|ksFt‚dd|   }|t|tgƒksft‚d S )Nr4   r:   r8   r6   )r   r   r   r   r<   r=   r   )r4   r?   r@   rA   rK   rK   rL   Útest_exp2_opt@   s    rN   c                     s–  t dƒ‰ tˆ ƒd } t| tgƒ}tˆ ƒ| dks4t‚| t¡| ksFt‚dtˆ ƒ d }t|tgƒ}dtˆ ƒ |ksvt‚| t¡|ksˆt‚dtˆ ƒ d }t|tgƒ}dtˆ ƒ d |ks¼t‚| t¡|ksÎt‚tttdd�}|t||gƒksðt‚|t| |gƒk�st‚|t||gƒk�st‚dtˆ ƒ tˆ ƒ d }t|tgƒ}dtˆ ƒ tˆ ƒ |k�s^t‚| t¡|k�srt‚dtdˆ  ƒ d }	t|	tgƒ}
dtdˆ  ƒ |
k�s¬t‚|
 t¡|	k�sÀt‚dtˆ ƒ d tˆ ƒd  d }t|tgƒ}| 	¡ | 	¡ k�st‚‡ fd	d
„}t
||ƒ||ƒ ƒdk �s,t‚t dƒ}dtˆ ƒ d dt|ƒ  ddt|ƒ   }t|tgƒ}dtˆ ƒ t|ƒ |k�sŠt‚| t¡|  ¡ dk�s¦t‚dtˆ ƒ d d }t|tgƒ}tˆ ƒd tˆ ƒ }dtˆ ƒ tdˆ  ƒ }||  t¡ ¡ dk�st‚|||fk�s t‚| t¡|  ¡ dk�s<t‚t|ƒ}t|tgƒ}t|ƒ}t|ƒ}|||fk�srt‚| t¡| t¡  ¡ j�s’t‚d S )Nr4   r:   r   r6   r7   r8   F©Zopportunisticc                    s   |   ˆ d¡ ¡ S )Nr6   )ÚsubsÚevalf)Úe©r4   rK   rL   Úevo   s    ztest_expm1_opt.<locals>.evgVçž¯Ò<Úyéþÿÿÿé   )r   r   r   r   r   r<   r=   r*   r	   Z	count_opsÚabsÚfactorr   Úis_zero)r?   r@   rA   rB   rC   rD   Zexpm1_opt_non_opportunisticrE   rF   rG   rH   rI   rJ   rT   rU   Úexpr7Úopt7Úexpr8Úopt8Ztgt8aZtgt8bZexpr9Zopt9Ztgt9aZtgt9brK   rS   rL   Útest_expm1_optK   s`     ,r_   c                  C   sN   t td ¡ ƒ\} }t| ƒt|ƒ d }t|tgƒ}|t| ƒt|ƒ ksJt‚d S ©Núx yr8   )Úmapr   Úsplitr   r   r   r   r<   ©r4   rU   r?   r@   rK   rK   rL   Útest_expm1_two_exp_terms�   s    re   c                  C   s
  t dƒ} t| ƒd }t|tgƒ}t| ƒ| dks4t‚| t¡|ksFt‚dt| ƒ d }t|tgƒ}dt| ƒ |ksvt‚| t¡|ksˆt‚dt| ƒ d }t|tgƒ}dt| ƒ d |ks¼t‚| t¡|ksÎt‚tttdd�}|t||gƒksðt‚|t||gƒk�st‚|t||gƒk�st‚dt| ƒ t| ƒ d }t|tgƒ}	dt| ƒ t| ƒ |	k�s^t‚|	 t¡|k�srt‚dtd|  ƒ d }
t|
tgƒ}dtd|  ƒ |k�s¬t‚| t¡|
k�sÀt‚ddt| ƒ  }t|tgƒ}d	t| ƒ |k�sòt‚| t¡|k�st‚d S )
Nr4   r:   r   r6   r7   r8   FrO   rV   )	r   r
   r   r   r   r<   r=   r*   r	   )r4   r?   r@   rA   rB   rC   rD   Zcosm1_opt_non_opportunisticrE   rF   rG   rH   rI   rJ   rK   rK   rL   Útest_cosm1_opt”   s:    rf   c                  C   sN   t td ¡ ƒ\} }t| ƒt|ƒ d }t|tgƒ}|t| ƒt|ƒ ksJt‚d S r`   )rb   r   rc   r
   r   r   r   r<   rd   rK   rK   rL   Útest_cosm1_two_cos_termsº   s    rg   c                  C   sF   t dƒ} t| ƒt| ƒ d }t|ttgƒ}|t| ƒt| ƒ ksBt‚d S )Nr4   r8   )	r   r   r
   r   r   r   r   r   r<   )r4   r?   r@   rK   rK   rL   Útest_expm1_cosm1_mixedÁ   s    rh   ç    _ Bc                 C   sÊ   |   |¡ ¡ }t tj¡j}t|| ƒ|| k s4t‚tt	| 
¡ ƒ|f|pJi Ž}ttt| ¡ ƒƒ}	t||	Ž | ƒ}
|
t|| ƒk s„t‚tt	| 
¡ ƒ| f|pši Ž}t||	Ž | ƒ}|t|| | ƒksÆt‚dS )zU poorness=1e10 signifies that `expr` loses precision of at least ten decimal digits. N)rP   rQ   r2   ZfinfoZfloat64ÚepsrX   r<   r-   ÚlistÚkeysÚtuplerb   ÚfloatÚvalues)ÚexprÚoptZval_subsZ
approx_refÚlambdify_kwÚpoornessZnum_refrj   Úf1Z
args_floatZnum_err1Úf2Znum_err2rK   rK   rL   Ú_check_num_lambdifyÈ   s    rv   c                  C   s@  t dƒ} dt| ƒ d }t|tgƒ}|t| ƒ t| ƒ ks>t‚trdt||| tdƒd idddid� d	t| ƒ d	 }t|t	ƒ}|d
t| ƒ t| ƒ ksšt‚trÀt||| tdƒd idddid� t
td|  ƒ t
 }t|tgƒ}|t
 td|  ƒ td|  ƒ k�st‚t�r<t||| tdƒd d itdt
 ƒddid� d S )Nr4   r:   é
   iâÿÿÿg&¦¬ª¶i3Úmodulesr3   )rr   r8   rV   g&¦¬ª¶y3r6   )r   r
   r   r   r   r<   r3   rv   r   r(   r   rn   )r4   r?   r@   rA   rB   rC   rD   rK   rK   rL   Útest_cosm1_apartÖ   s     "
"(ry   c            
      C   sê   t tdƒ } \}}|| d }t|tgƒ}|t||ƒks<t‚| D ]}| |¡| |¡ks@t‚q@trætt t	tj
j
 d¡d d… ƒƒdkræ|td ¡ Ž |ti}d}t||||dd	id
d� |t|td ¡ Ž i}d}	t||||	dd	idd� d S )NZxyr:   Ú.r6   )r:   rw   r   gÂ    ð?g<îåÝV=rx   r3   l    hí] )rr   rs   g»½×Ùß|Û=gh˜ùRwß=i Êš;)rb   r   r   r!   r   r<   Údiffr3   rm   ÚintÚversionrc   r   Úas_integer_ratior   rv   )
Úargsr4   rU   r?   r@   ÚargZsubs1_aZ
ref1_f64_aZsubs1_bZ
ref1_f64_brK   rK   rL   Ú
test_powm1ì   s    (r�   c            	      C   s  t dƒ} t| d ƒ}t|tgƒ}t| ƒ| dks4t‚| t¡|ksFt‚td|  d ƒ}t|tgƒ}t| ƒtdƒ |kszt‚| t¡|  ¡ dks”t‚td|  d ƒ}t|tgƒ}td|  ƒ| dksÈt‚| t¡|ksÚt‚t| d ƒ}t|tgƒ}t|ƒdk�st‚d S )Nr4   r:   r   r6   r8   z
log(x + 3))	r   r	   r   r    r   r<   r=   Úsimplifyr>   )	r4   r?   r@   rA   rB   rC   rD   rE   rF   rK   rK   rL   Útest_log1p_optþ   s     rƒ   c                  C   s(  t dƒ} d|  t| ƒtdƒ  t| d ƒ t| ƒ d }t|tƒ ¡ }|t| ƒt| ƒ t| ƒ t	| ƒ ksnt
‚| t¡ t¡ t¡|ksŒt
‚t| ƒtdƒ t| d ƒ }t|tƒ}|t| ƒt| ƒ ksÊt
‚| t¡|ksÜt
‚t| ƒtdƒ td|  d ƒ }t|tƒ}|t| ƒtdƒ t| ƒ  }|dk�s0t
‚| t¡|  ¡ dk�sLt
‚d|  dtd|  d ƒ d	tdƒ   d
t| ƒ  d
 td|  d ƒ }t|tƒ ¡ }	|	t| ƒdtd|  d ƒ d	  d
t	| ƒ  tdƒ t| ƒ  }
|
dk�sðt
‚|	 t¡ t¡ t¡|  ¡ dk�st
‚dtd|  ƒ d }t|tƒ}|dt	d|  ƒ  }|dk�sXt
‚| t¡|k�slt
‚td|  ƒd }t|tƒ}|t	d|  ƒd |fk�s¤t
‚td|  d ƒ}t|tƒ}|tdƒt| ƒ  }|dk�sàt
‚| t¡|  ¡ dk�süt
‚td|  d ƒ}t|tƒ}||k�s$t
‚d S )Nr4   r8   r:   r;   r   r6   r7   r5   r9   é   )r   r	   r   r   r"   r‚   r   r   r   r   r<   r=   r   )r4   r?   r@   rA   rB   rC   rD   Zdelta3rE   rF   Zdelta4rG   rH   Zdelta5rI   rJ   r[   r\   Zdelta7r]   r^   rK   rK   rL   Útest_optims_c99  sF    0(
 
H@(



r…   c                  C   sN  dd„ } t dƒ}| |d ƒdks$t‚| |d |d  ƒdks@t‚| |d |d  ƒd	ks\t‚| t|ƒd ƒd
kstt‚| |d ƒdksˆt‚| |d ƒdksœt‚| |d  ƒdks²t‚| |d |d  ƒdksÎt‚t ddd�}| || |d  ƒdksöt‚t ddd�}| tt|d ƒƒƒdk�s t‚dd„ }||d t|ƒd  ƒdk�sJt‚d S )Nc                 S   s   t t| tdƒgƒƒS )NrW   ©r   r   r#   rS   rK   rK   rL   Ú<lambda>C  s   ÿz5test_create_expand_pow_optimization.<locals>.<lambda>r4   rW   zx*x*x*xr8   zx*x + x*x*x*xr7   zpow(x, 5) + x*x*x*xzpow(sin(x), 4)éüÿÿÿz1.0/(x*x*x*x)éûÿÿÿz
pow(x, -5)z
-(x*x*x*x)z-(x*x) + x*x*x*xÚiT©Úintegerzpow(x, i) - (x*x)rU   )Úrealzexp(y*y*y*y)c                 S   s   t t| tddd„ d�gƒƒS )NrW   c                 S   s   | j S ©N)Zis_Function)ÚbrK   rK   rL   r‡   V  ó    zGtest_create_expand_pow_optimization.<locals>.<lambda>.<locals>.<lambda>)Zbase_reqr†   rS   rK   rK   rL   r‡   U  s    ÿr6   z pow(x, 3) + sin(x)*sin(x)*sin(x))r   r<   r   r   r   )Úccr4   rŠ   rU   Zcc2rK   rK   rL   Ú#test_create_expand_pow_optimizationB  s     r’   c               	   C   sŽ   t ddd�} td| | ƒ}td| dƒ}tt |¡ƒ�R t|d | tgƒt||ƒksVt‚t|d | | tgƒt||ƒ| ks€t‚W 5 Q R X d S )NÚnTr‹   ÚAr4   r:   éÿÿÿÿ)	r   r   r   r   Zfullrankr   r$   r   r<   )r“   r”   r4   rK   rK   rL   Útest_matsolveZ  s    "r–   c                  C   st   t td ¡ ƒ\} }tt| ƒt|ƒ ƒ}t|tgƒ}t| |ƒ| dksHt‚t|| ƒ| dks^t‚| 	t¡|kspt‚d S )Nra   r   )
rb   r   rc   r	   r   r   r%   r   r<   r=   rd   rK   rK   rL   Útest_logaddexp_optd  s    r—   c                  C   s|   t td ¡ ƒ\} }td|  d|  ƒtdƒ }t|tgƒ}t| |ƒ| dksPt‚t|| ƒ| dksft‚| t¡|ksxt‚d S )Nra   r8   r   )	rb   r   rc   r	   r   r&   r   r<   r=   rd   rK   rK   rL   Útest_logaddexp2_optm  s    r˜   c                  C   s  dd„ } t dƒ}| t|ƒ| t|ƒtd| ƒd|  td| ƒtd| ƒ| dtd| ƒ |t|ƒ |t|ƒ iƒ t dƒ}| t|| ƒ||  t|| ƒ|t|| ƒ | t|| ƒtt|ƒƒt|ƒ tt|ƒƒtdt|ƒ ƒt|ƒ dtdt|ƒ ƒ t|ƒ| t|ƒ| iƒ d S )Nc                 S   s(   |   ¡ D ]\}}t|tƒ|kst‚qd S rŽ   )Úitemsr   r)   r<   ©ÚdÚkÚvrK   rK   rL   Úcheckw  s    ztest_sinc_opts.<locals>.checkr4   r8   r6   rU   )r   r   r   ©rž   r4   rU   rK   rK   rL   Útest_sinc_optsv  s2    
  
 
 
ü 
 
 
 
 
ûr    c                  C   sŒ   dd„ } t dƒ}| td| ƒd|  td| ƒ d td| ƒtd| ƒ t|d ƒtdƒ t|d d ƒ t|d ƒt|d ƒ iƒ d S )Nc                 S   s(   |   ¡ D ]\}}t|tƒ|kst‚qd S rŽ   ©r™   r   r'   r<   rš   rK   rK   rL   rž   Ž  s    z test_optims_numpy.<locals>.checkr4   r8   r:   r6   )r   r   r   r   r   r	   r   r   )rž   r4   rK   rK   rL   Útest_optims_numpy�  s    " " þr¢   c                  C   s¢   dd„ } t td ¡ ƒ\}}| t|| ƒt|| ƒ t|| d ƒ tdƒ| |  t|| ƒt|| ƒ t|| ƒ t|t|ƒ | ƒd t	|t|ƒ ƒiƒ d S )Nc                 S   s(   |   ¡ D ]\}}t|tƒ|kst‚qd S rŽ   r¡   rš   rK   rK   rL   rž   ›  s    z%test_optims_numpy_TODO.<locals>.checkra   r:   r8   )
rb   r   rc   r	   r   r   r   r   r   r   rŸ   rK   rK   rL   Útest_optims_numpy_TODO™  s    6 " þr£   c               	   C   sx  t stdƒ tƒ stdƒ tdƒ} ddtdƒ  ddtdƒ   d	d
tdƒ   ddtdƒ   tdƒ t }dt| ƒ | }tdƒd }| | |¡ d¡}t	dt| ƒ | t
gƒ}d}dt| |¡ƒt| |¡ƒdœ }d}t ¡ �ˆ}	td|fd|fg|	ddid�\}
}t|
 d¡| ƒ}t|
 d¡| ƒ}d|  k �rFdk �sLn t‚d|  k �rddk �sjn t‚W 5 Q R X d S ) Nzcython not installed.zNo C compiler found.r4   r8   é:   éu   r6   éa   r7   rW   é'   r5   é\   é   rw   iõÿÿÿé   é   z�
#include <math.h>

double func_unchanged(double x) {
    return %(unchanged)s;
}
double func_rewritten(double x) {
    return %(rewritten)s;
}
)Ú	unchangedÚ	rewrittenzÓ
#cython: language_level=3
cdef extern double func_unchanged(double)
cdef extern double func_rewritten(double)
def py_unchanged(x):
    return func_unchanged(x)
def py_rewritten(x):
    return func_rewritten(x)
zfunc.cz	_func.pyxZstdZc99)Ú	build_dirÚcompile_kwargsg•dyáý¥=g<ò6šÎS:gÙ}ÚõÐò¾:g¬Ò¶OÉƒý;g¼‰Ø—²Òœ<)r1   r,   r/   r   r   r   r   rP   r“   r   r   r   ÚtempfileÚTemporaryDirectoryr.   rX   Zpy_rewrittenZpy_unchangedr<   )r4   Z	about_twor¬   ZxvalÚrefr­   ZNUMBER_OF_DIGITSZfunc_cZfunc_pyxÚfolderÚmodÚinfoZerr_rewrittenZerr_unchangedrK   rK   rL   Ú"test_compiled_ccode_with_rewriting¦  s6    L	ÿ÷	
 þ
r¶   )Nri   )[r°   Zsympy.core.numbersr   r   Zsympy.core.powerr   Zsympy.core.singletonr   Zsympy.core.symbolr   Z$sympy.functions.elementary.complexesr   Z&sympy.functions.elementary.exponentialr   r	   Z(sympy.functions.elementary.trigonometricr
   r   r   Z"sympy.matrices.expressions.matexprr   Zsympy.assumptionsr   r   Zsympy.externalr   Zsympy.printing.codeprinterr   Zsympy.codegen.matrix_nodesr   Zsympy.codegen.cfunctionsr   r   r   r   Zsympy.codegen.numpy_nodesr   r   Zsympy.codegen.scipy_nodesr   r   Zsympy.codegen.rewritingr   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   Zsympy.testing.pytestr+   r,   Zsympy.utilitiesr-   Zsympy.utilities._compilationr.   r/   Z!sympy.utilities._compilation.utilr0   r1   r2   r3   rM   rN   r_   re   rf   rg   rh   rv   ry   r�   rƒ   r…   r’   r–   r—   r˜   r    r¢   r£   r¶   rK   rK   rK   rL   Ú<module>   sZ   H B&
.
		
