U
    	-e#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   h/var/www/html/Darija-Ai-Train/env/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 %sL   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    zfn 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    zfn 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std S )NrD   rE   r   r   Fr   r   r>   r   r   r    zfn 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st	|d d	 }d
}||kst	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std S )Nr   )rN   rO   afoorE   r   Fr   foo.rsr    zfn 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   zfn 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:   zfn 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    zfn 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st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st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    zfn 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st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<    

