o
    jg#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sJ d S )NfileFheaderempty )r   r   dump_rsgetvalue)code_genoutputsource r   _/var/www/html/zoom/venv/lib/python3.10/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sJ |d }d}||ks%J 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   	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sJ |d }d	tj }|d
 }dd|i }||ks5J 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   sympy__version__centerrstripr%   r&   r   version_strr+   r'   r   r   r   test_simple_code_with_header$   s   
r2   c                  C   sD   t ttt } d| f}t|dddd\}|d }d}||ks J d S )Nr   r   Fr   r   z<fn test(x: f64, y: f64) -> f64 {
    let z = x + y;
    z
}
)r	   r#   r!   r"   r   exprr%   r&   r   r'   r   r   r   test_simple_code_nameout;      r5   c                  C   sD   dt t f} t| dddd\}|d }dtd }||ks J 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   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s(J 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   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s,J 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   )r4   routiner   r   r   r'   r   r   r   test_argument_orderj   s   rA   c                  C   sR   t t t } t t t }d| |gf}t|dddd\}|d }d}||ks'J 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   rD   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s<J 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   
ABCrB   rC   expr3r%   r&   r   r'   r   r   r   test_results_named_unordered   s   rM   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s=J |d d	 }d
}	||	ksKJ d S )NrE   rF   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)
}
rG   rH   r   r   r   test_results_named_ordered   s   
rO   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sDJ |d d	 }d
}||ksRJ d S )Nr   )cossintan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.trigonometricrP   rQ   rR   r!   r"   r#   expandr   )rP   rQ   rR   r%   r&   r   r'   r   r   r   test_complicated_rs_codegen   s   *rW   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s7J |d
 }d}||ksCJ d S )Nr   )rP   rQ   afoorF   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)
}
)rU   rP   rQ   r   r!   r	   r"   r   )rP   rQ   rX   r%   r&   r   r'   r   r   r   test_output_arg_mixed_unordered   s   4	r[   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s3J d S )Nr   rF   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   pwr%   r&   r   r'   r   r   r   test_piecewise_   s   4rc   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s2J d S )Nr   r\   rF   r   r]   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`   ra   r   r   r   test_piecewise_inline   s   0
rd   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s&J |d	 d }d}||ks4J d S )NrY   rF   rT   bar   r   Fr   r   rZ   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   test_multifcns_per_file  s   (rh   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s&J |d
 d }dtj }|d }dd|i }||ksDJ d S )NrY   rF   rT   re   rf   r   TFr   r   rZ   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   r   r   r    test_multifcns_per_file_w_header  s   (
ri   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s&J d S )NrY   rF   rT   re   rf   r   bazF)prefixr   r   r   zbaz.rsrg   )r%   r&   r   r   r   test_filename_match_prefix9  s
   (
rl   c                  C   sD   t ttd } d| f}t|dddd\}|d }d}||ks J d S )NrF   mysqrr   Fr   r   z9fn mysqr(x: f64) -> f64 {
    let x = x.powi(2);
    x
}
)r	   r!   r   r3   r   r   r   test_InOutArgument@  r6   rn   c                  C   s   t ttd t } d| f}t|dddttfd\}|d }d}||ks%J t ttd t } d| f}t|dddd\}|d }d}||ksGJ d S )	NrF   r   r   FrN   r   zDfn test(x: f64, y: f64) -> f64 {
    let x = x.powi(2) + y;
    x
}
r   )r	   r!   r"   r   r3   r   r   r   test_InOutArgument_orderN  s    ro   c                  C   sN   t d} d| tttjgf}t|dddd\}|d }d}||ks%J 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   ComplexInfinityr   )rp   r%   r&   r   r'   r   r   r   test_not_supportedj  s   	rs   c                  C   s   t d\} }}}td| | fddd|fd}|d d }d}||ks$J td| | | fddd| |f||fd	}|d d }d
}||ksFJ d S )Nzx y z trp   r   F)r   r   global_varsr   r   z5fn f(x: f64) -> f64 {
    let out1 = x*y;
    out1
}
)r   r   r>   rt   zAfn f(x: f64, y: f64) -> f64 {
    let out1 = x*y + z;
    out1
}
)r   r   )r!   r"   r#   tr&   r   r'   r   r   r   test_global_vars_rust{  s   rv   ),ior   
sympy.corer   r   r   r   r   r   sympy.core.relationalr	   $sympy.functions.elementary.piecewiser
   sympy.utilities.codegenr   r   r   sympy.testing.pytestr   r,   r!   r"   r#   r   r(   r2   r5   r9   r<   rA   rD   rM   rO   rW   r[   rc   rd   rh   ri   rl   rn   ro   rs   rv   r   r   r   r   <module>   s>     

