U
    ZÊ¹j#0  ã                   @   s.  d dl mZ d dlmZmZmZmZmZ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Zedƒ\ZZZd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zedd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Z dd„ Z!dd „ Z"d!d"„ Z#ed#d$„ ƒZ$d%d&„ Z%d'd(„ Z&d)d*„ Z'd+d,„ Z(d-d.„ Z)d/d0„ Z*d1d2„ Z+dS )3é    )ÚStringIO)ÚSÚsymbolsÚpiÚCatalanÚ
EulerGammaÚFunction)ÚEquality)Ú	Piecewise)ÚRustCodeGenÚcodegenÚmake_routine)ÚXFAILNzx,y,zc                  C   s8   t ƒ } tƒ }| jg |dddd� | ¡ }|dks4t‚d S )NÚfileF©ÚheaderÚemptyÚ )r   r   Údump_rsÚgetvalueÚAssertionError)Úcode_genÚoutputÚsource© r   úf/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/utilities/tests/test_codegen_rust.pyÚtest_empty_rust_code   s
    r   c                  C   sN   dt t t f} t| dddd�\}|d dks2t‚|d }d}||ksJt‚d S )	NÚtestÚRustFr   r   útest.rsé   zNfn test(x: f64, y: f64, z: f64) -> f64 {
    let out1 = z*(x + y);
    out1
}
©ÚxÚyÚzr   r   ©Ú	name_exprÚresultr   Úexpectedr   r   r   Útest_simple_rust_code   s    ÿr)   c                  C   sn   dt t t f} t| dddd�\}|d dks2t‚|d }d	tj }| d
¡ ¡ }dd|i }||ksjt‚d S )Nr   r   TFr   r   r   r    úCode generated with SymPy %séL   zæ/*
 *%(version_line)s
 *
 *              See http://www.sympy.org/ for more information.
 *
 *                       This file is part of 'project'
 */
fn test(x: f64, y: f64, z: f64) -> f64 {
    let out1 = z*(x + y);
    out1
}
Úversion_line)	r"   r#   r$   r   r   ÚsympyÚ__version__ÚcenterÚrstrip©r&   r'   r   Úversion_strr,   r(   r   r   r   Útest_simple_code_with_header$   s    
ôr3   c                  C   sD   t ttt ƒ} d| f}t|dddd�\}|d }d}||ks@t‚d S )Nr   r   Fr   r    z<fn test(x: f64, y: f64) -> f64 {
    let z = x + y;
    z
}
)r	   r$   r"   r#   r   r   ©Úexprr&   r'   r   r(   r   r   r   Útest_simple_code_nameout;   s    ÿr6   c                  C   sD   dt t f} t| dddd�\}|d }dt d¡ }||ks@t‚d S )Nr   r   Fr   r    z\fn test() -> f64 {
    const Catalan: f64 = %s;
    let out1 = PI.powf(Catalan);
    out1
}
é   )r   r   r   Úevalfr   r%   r   r   r   Útest_numbersymbolI   s    úr9   c                  C   sT   dt t tgf} t| ddddd�\}|d }dt d¡t d¡f }||ksPt‚d S )	Nr   r   FT©r   r   Úinliner    z§fn test() -> (f64, f64) {
    const Catalan: f64 = %s;
    const EulerGamma: f64 = %s;
    let out1 = PI.powf(Catalan);
    let out2 = EulerGamma);
    (out1, out2)
}
r7   )r   r   r   r   r8   r   r%   r   r   r   Útest_numbersymbol_inlineW   s     ÿø	r<   c                  C   s\   t t } td| tt tgdd�}tƒ }tƒ }|j|g|dddd� | ¡ }d}||ksXt‚d S )Nr   Úrust)Úargument_sequenceÚlanguageFr   zJfn test(z: f64, x: f64, y: f64) -> f64 {
    let out1 = x + y;
    out1
}
)	r"   r#   r   r$   r   r   r   r   r   )r5   Zroutiner   r   r   r(   r   r   r   Útest_argument_orderj   s    ÿr@   c                  C   sR   t t t } t t t }d| |gf}t|dddd�\}|d }d}||ksNt‚d S )Nr   r   Fr   r    zwfn test(x: f64, y: f64, z: f64) -> (f64, f64) {
    let out1 = z*(x + y);
    let out2 = z*(x - y);
    (out1, out2)
}
r!   )Úexpr1Úexpr2r&   r'   r   r(   r   r   r   Útest_multiple_results_rustz   s    ÿrC   c            
      C   s|   t dƒ\} }}t|tt t ƒ}t| tt t ƒ}t|dt ƒ}d|||gf}t|dddd�\}|d }d}	||	ksxt‚d S )	NúA,B,Cé   r   r   Fr   r    z„fn test(x: f64, y: f64, z: f64) -> (f64, f64, f64) {
    let C = z*(x + y);
    let A = z*(x - y);
    let B = 2*x;
    (C, A, B)
}
©r   r	   r"   r#   r$   r   r   ©
ÚAÚBÚCrA   rB   Zexpr3r&   r'   r   r(   r   r   r   Útest_results_named_unordered‹   s    ÿrK   c            
      C   sš   t dƒ\} }}t|tt t ƒ}t| tt t ƒ}t|dt ƒ}d|||gf}t|dddtttfd�}|d d dkszt‚|d d	 }d
}	||	ks–t‚d S )NrD   rE   r   r   F©r   r   r>   r   r   r    z„fn test(x: f64, z: f64, y: f64) -> (f64, f64, f64) {
    let C = z*(x + y);
    let A = z*(x - y);
    let B = 2*x;
    (C, A, B)
}
rF   rG   r   r   r   Útest_results_named_orderedŸ   s    
ÿÿrM   c                  C   s¨   ddl m} m}m} d|tƒ| tƒ |tƒ d  ¡ | | | | | | | | tt t ƒƒƒƒƒƒƒƒgf}t|dddd�}|d d dksˆt	‚|d d	 }d
}||ks¤t	‚d S )Nr   )ÚcosÚsinÚtanZtestlongé   r   Fr   ztestlong.rsr    a›  fn testlong(x: f64, y: f64, z: f64) -> (f64, f64) {
    let out1 = x.sin().powi(3) + 3*x.sin().powi(2)*y.cos() + 3*x.sin().powi(2)*z.tan() + 3*x.sin()*y.cos().powi(2) + 6*x.sin()*y.cos()*z.tan() + 3*x.sin()*z.tan().powi(2) + y.cos().powi(3) + 3*y.cos().powi(2)*z.tan() + 3*y.cos()*z.tan().powi(2) + z.tan().powi(3);
    let out2 = (x + y + z).cos().cos().cos().cos().cos().cos().cos().cos();
    (out1, out2)
}
)
Ú(sympy.functions.elementary.trigonometricrN   rO   rP   r"   r#   r$   Úexpandr   r   )rN   rO   rP   r&   r'   r   r(   r   r   r   Útest_complicated_rs_codegen´   s    *ÿÿÿrT   c               	   C   sŠ   ddl m} m} tdƒ}d| dt ƒtt|tƒƒ| tƒt||dt ƒƒgf}t|dddd�\}|d d	ksnt‚|d
 }d}||ks†t‚d S )Nr   )rN   rO   ÚaÚfoorE   r   Fr   úfoo.rsr    z¤fn foo(x: f64) -> (f64, f64, f64, f64) {
    let out1 = (2*x).cos();
    let y = x.sin();
    let out3 = x.cos();
    let a = (2*x).sin();
    (out1, y, out3, a)
}
)	rR   rN   rO   r   r"   r	   r#   r   r   )rN   rO   rU   r&   r'   r   r(   r   r   r   Útest_output_arg_mixed_unorderedÌ   s    4ÿ	rX   c                  C   sj   t dtdk ftd tdkft d tdkfddd�} d| f}t|d	ddd
�\}|d }d}||ksft‚d S )Nr   éÿÿÿÿrE   r    ©r    TF)ÚevaluateÚpwtestr   r   z¼fn pwtest(x: f64) -> f64 {
    let out1 = if (x < -1) {
        0
    } else if (x <= 1) {
        x.powi(2)
    } else if (x > 1) {
        2 - x
    } else {
        1
    };
    out1
}
©r
   r"   r   r   ©Úpwr&   r'   r   r(   r   r   r   Útest_piecewise_à   s    4ÿr`   c                  C   sh   t dtdk ftd tdkft d tdkfdƒ} d| f}t|dddd	d
�\}|d }d}||ksdt‚d S )Nr   rY   rE   r    rZ   r\   r   FTr:   z�fn pwtest(x: f64) -> f64 {
    let out1 = if (x < -1) { 0 } else if (x <= 1) { x.powi(2) } else if (x > 1) { -x + 2 } else { 1 };
    out1
}
r]   r^   r   r   r   Útest_piecewise_inlineö   s    0
ÿÿra   c                  C   sl   ddt  dt gfdtd dt gfg} t| dddd�}|d	 d	 d
ksLt‚|d	 d }d}||ksht‚d S )NrV   rE   rQ   Úbaré   r   Fr   r   rW   r    zÂfn foo(x: f64, y: f64) -> (f64, f64) {
    let out1 = 2*x;
    let out2 = 3*y;
    (out1, out2)
}
fn bar(y: f64) -> (f64, f64) {
    let out1 = y.powi(2);
    let out2 = 4*y;
    (out1, out2)
}
©r"   r#   r   r   r%   r   r   r   Útest_multifcns_per_file  s    (ÿre   c                  C   sŒ   ddt  dt gfdtd dt gfg} t| dddd	�}|d
 d
 dksLt‚|d
 d }dtj }| d¡ ¡ }dd|i }||ksˆt‚d S )NrV   rE   rQ   rb   rc   r   TFr   r   rW   r    r*   r+   aZ  /*
 *%(version_line)s
 *
 *              See http://www.sympy.org/ for more information.
 *
 *                       This file is part of 'project'
 */
fn foo(x: f64, y: f64) -> (f64, f64) {
    let out1 = 2*x;
    let out2 = 3*y;
    (out1, out2)
}
fn bar(y: f64) -> (f64, f64) {
    let out1 = y.powi(2);
    let out2 = 4*y;
    (out1, out2)
}
r,   )r"   r#   r   r   r-   r.   r/   r0   r1   r   r   r   Ú test_multifcns_per_file_w_header  s    (
îrf   c                  C   sP   ddt  dt gfdtd dt gfg} t| ddddd	�\}|d
 dksLt‚d S )NrV   rE   rQ   rb   rc   r   ZbazF)Úprefixr   r   r   zbaz.rsrd   )r&   r'   r   r   r   Útest_filename_match_prefix9  s
    (
ÿrh   c                  C   sD   t ttd ƒ} d| f}t|dddd�\}|d }d}||ks@t‚d S )NrE   Zmysqrr   Fr   r    z9fn mysqr(x: f64) -> f64 {
    let x = x.powi(2);
    x
}
)r	   r"   r   r   r4   r   r   r   Útest_InOutArgument@  s    ÿri   c                  C   s’   t ttd t ƒ} d| f}t|dddttfd�\}|d }d}||ksJt‚t ttd t ƒ} d| f}t|dddd�\}|d }d}||ksŽt‚d S )	NrE   r   r   FrL   r    zDfn test(x: f64, y: f64) -> f64 {
    let x = x.powi(2) + y;
    x
}
r   )r	   r"   r#   r   r   r4   r   r   r   Útest_InOutArgument_orderN  s"     ÿÿÿrj   c                  C   sN   t dƒ} d| tƒ t¡tjgf}t|dddd�\}|d }d}||ksJt‚d S )NÚfr   r   Fr   r    z«fn test(x: f64) -> (f64, f64) {
    // unsupported: Derivative(f(x), x)
    // unsupported: zoo
    let out1 = Derivative(f(x), x);
    let out2 = zoo;
    (out1, out2)
}
)r   r"   Údiffr   ZComplexInfinityr   r   )rk   r&   r'   r   r(   r   r   r   Útest_not_supportedj  s    ÿ	rm   c                  C   s�   t dƒ\} }}}td| | fddd|fd�}|d d }d}||ksHt‚td| | | fddd| |f||fd	�}|d d }d
}||ksŒt‚d S )Nzx y z trk   r   F)r   r   Úglobal_varsr   r    z5fn f(x: f64) -> f64 {
    let out1 = x*y;
    out1
}
)r   r   r>   rn   zAfn f(x: f64, y: f64) -> f64 {
    let out1 = x*y + z;
    out1
}
)r   r   r   )r"   r#   r$   Útr'   r   r(   r   r   r   Útest_global_vars_rust{  s     ÿÿ ÿÿrp   ),Úior   Z
sympy.corer   r   r   r   r   r   Zsympy.core.relationalr	   Z$sympy.functions.elementary.piecewiser
   Zsympy.utilities.codegenr   r   r   Zsympy.testing.pytestr   r-   r"   r#   r$   r   r)   r3   r6   r9   r<   r@   rC   rK   rM   rT   rX   r`   ra   re   rf   rh   ri   rj   rm   rp   r   r   r   r   Ú<module>   s<    

