
    sg#0                        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	 Zd
 Zd Zd Zd Zed        Zd Zd Zd Zd Z d Z!d Z"d Z#ed        Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+y)    )StringIO)SsymbolspiCatalan
EulerGammaFunction)Equality)	Piecewise)RustCodeGencodegenmake_routine)XFAILNzx,y,zc                      t               } t               }| j                  g |ddd       |j                         }|dk(  sJ y )NfileFheaderempty )r   r   dump_rsgetvalue)code_genoutputsources      Z/var/www/html/venv/lib/python3.12/site-packages/sympy/utilities/tests/test_codegen_rust.pytest_empty_rust_coder      sA    }HZFRUC__FR<<    c                      dt         t        z   t        z  f} t        | ddd      \  }|d   dk(  sJ |d   }d}||k(  sJ y )	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   expecteds       r   test_simple_rust_coder+      s[    !a%#IiUCGF!9	!!!AYF	  Xr   c                      dt         t        z   t        z  f} t        | ddd      \  }|d   dk(  sJ |d   }d	t        j
                  z  }|j                  d
      j                         }dd|iz  }||k(  sJ y )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*   s         r   test_simple_code_with_headerr6   $   s    !a%#IiEBGF!9	!!!AYF053D3DDK%%b)002L
	 
&'H Xr   c                      t        t        t        t        z         } d| f}t	        |ddd      \  }|d   }d}||k(  sJ y )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*   s        r   test_simple_code_nameoutr:   ;   sP    AADIiUCGFAYF	  Xr   c                      dt         t        z  f} t        | ddd      \  }|d   }dt        j                  d      z  }||k(  sJ y )Nr   r    Fr   r"   z\fn test() -> f64 {
    const Catalan: f64 = %s;
    let out1 = PI.powf(Catalan);
    out1
}
   )r   r   r   evalfr'   s       r   test_numbersymbolr>   I   sU    W%IiUCGFAYF	
 	bH Xr   c                      dt         t        z  t        gf} t        | dddd      \  }|d   }dt        j                  d      d	t        j                  d      d
}||k(  sJ y )Nr   r    FTr   r   inliner"   z3fn test() -> (f64, f64) {
    const Catalan: f64 = r<   z;
    const EulerGamma: f64 = zR;
    let out1 = PI.powf(Catalan);
    let out2 = EulerGamma);
    (out1, out2)
}
)r   r   r   r   r=   r'   s       r   test_numbersymbol_inlinerB   W   si     "g+z23Ii!$0GFAYF 
r	J,,R02H Xr   c                      t         t        z   } t        d| t        t         t        gd      }t	               }t               }|j                  |g|ddd       |j                         }d}||k(  sJ y )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   )r9   routiner   r   r   r*   s         r   test_argument_orderrH   j   sp    q5D64Aq!9vVG}HZFgYuEJ__F	  Xr   c                      t         t        z   t        z  } t         t        z
  t        z  }d| |gf}t        |ddd      \  }|d   }d}||k(  sJ y )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*   s         r   test_multiple_results_rustrL   z   s_    UAIEUAIE%(IiUCGFAYF	  Xr   c                     t        d      \  } }}t        |t        t        z   t        z        }t        | t        t        z
  t        z        }t        |dt        z        }d|||gf}t        |ddd      \  }|d   }d}	||	k(  sJ y )	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CrJ   rK   expr3r(   r)   r   r*   s
             r   test_results_named_unorderedrV      s    gGAq!QQ	"EQQ	"EQ!E%./IiUCGFAYF	  Xr   c            	      H   t        d      \  } }}t        |t        t        z   t        z        }t        | t        t        z
  t        z        }t        |dt        z        }d|||gf}t        |dddt        t        t        f      }|d   d   dk(  sJ |d   d	   }d
}	||	k(  sJ y )NrN   rO   r   r    Fr   r   rE   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)
}
rP   rQ   s
             r   test_results_named_orderedrY      s    gGAq!QQ	"EQQ	"EQ!E%./IYuE()1ay2F!9Q<9$$$AYq\F	  Xr   c                  l   ddl m} m}m} d |t               | t
              z    |t              z   dz  j                          |  |  |  |  |  |  |  | t        t
        z   t        z                                                   gf}t        |ddd      }|d   d   dk(  sJ |d   d	   }d
}||k(  sJ y )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.trigonometricr[   r\   r]   r$   r%   r&   expandr   )r[   r\   r]   r(   r)   r   r*   s          r   test_complicated_rs_codegenrb      s    HHAQ#a&(1,446CCCAEAI$7 89:;<=I YuEBF!9Q<=(((AYq\F		  Xr   c                     ddl m} m} t        d      }d | dt        z        t        t         |t                     | t              t        | |dt        z              gf}t        |ddd      \  }|d   d	k(  sJ |d
   }d}||k(  sJ y )Nr   )r[   r\   afoorO   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)
}
)r`   r[   r\   r   r$   r
   r%   r   )r[   r\   rd   r(   r)   r   r*   s          r   test_output_arg_mixed_unorderedrg      s    CAQqS8As1v#6ACPQRSPSH@UVWIiUCGF!9   AYF	  Xr   c                      t        dt        dk  ft        dz  t        dk  ft         dz   t        dkD  fdd      } d| f}t        |d	dd
      \  }|d   }d}||k(  sJ y )Nr   rO   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*   s        r   test_piecewise_rp      su    	Aq2v;AqAv!Aq1uySX	YB2IiUCGFAYF	  Xr   c                      t        dt        dk  ft        dz  t        dk  ft         dz   t        dkD  fd      } d| f}t        |dddd	
      \  }|d   }d}||k(  sJ y )Nr   ri   rO   r"   rj   rl   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
}
rm   rn   s        r   test_piecewise_inlinerr      sy     
Aq2v;AqAv!Aq1uy	IB2IiU!#GFAYF	  Xr   c                      ddt         z  dt        z  gfdt        dz  dt        z  gfg} t        | ddd      }|d	   d	   d
k(  sJ |d	   d   }d}||k(  sJ y )Nre   rO   r_   bar   r    Fr   r   rf   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'   s       r   test_multifcns_per_filerw     s{    1Q3!*%1ac{';=IYuEBF!9Q<8###AYq\F		  Xr   c                     ddt         z  dt        z  gfdt        dz  dt        z  gfg} t        | ddd	      }|d
   d
   dk(  sJ |d
   d   }dt        j                  z  }|j                  d      j                         }dd|iz  }||k(  sJ y )Nre   rO   r_   rt   ru   r    TFr   r   rf   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   r0   r1   r2   r3   r4   s         r    test_multifcns_per_file_w_headerry     s    1Q3!*%1ac{';=IYt5AF!9Q<8###AYq\F053D3DDK%%b)002L	" 
&%'H& Xr   c                      ddt         z  dt        z  gfdt        dz  dt        z  gfg} t        | dddd	      \  }|d
   dk(  sJ y )Nre   rO   r_   rt   ru   r    bazF)prefixr   r   r   zbaz.rsrv   )r(   r)   s     r   test_filename_match_prefixr}   9  sW    1Q3!*%1ac{';=Iie "GF!9   r   c                  x    t        t        t        dz        } d| f}t        |ddd      \  }|d   }d}||k(  sJ y )NrO   mysqrr    Fr   r"   z9fn mysqr(x: f64) -> f64 {
    let x = x.powi(2);
    x
}
)r
   r$   r   r8   s        r   test_InOutArgumentr   @  sP    Aq!tD$IiUCGFAYF	  Xr   c                     t        t        t        dz  t        z         } d| f}t        |dddt        t        f      \  }|d   }d}||k(  sJ t        t        t        dz  t        z         } d| f}t        |ddd      \  }|d   }d}||k(  sJ y )	NrO   r   r    FrX   r"   zDfn test(x: f64, y: f64) -> f64 {
    let x = x.powi(2) + y;
    x
}
r   )r
   r$   r%   r   r8   s        r   test_InOutArgument_orderr   N  s    Aq!tax DIi!aU<GFAYF	  XAq!tax DIiUCGFAYF	  Xr   c                      t        d      } d | t              j                  t              t        j                  gf}t        |ddd      \  }|d   }d}||k(  sJ y )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   )r   r(   r)   r   r*   s        r   test_not_supportedr   j  sa    A!A$))A,(9(9:;IiUCGFAYF	  Xr   c            	          t        d      \  } }}}t        d| |z  fddd|f      }|d   d   }d}||k(  sJ t        d| |z  |z   fddd| |f||f	      }|d   d   }d
}||k(  sJ y )Nzx y z tr   r    F)r   r   global_varsr   r"   z5fn f(x: f64) -> f64 {
    let out1 = x*y;
    out1
}
)r   r   rE   r   zAfn f(x: f64, y: f64) -> f64 {
    let out1 = x*y + z;
    out1
}
)r   r   )r$   r%   r&   tr)   r   r*   s          r   test_global_vars_rustr   {  s    #JAq!Qc1Q3ZU"#'FAYq\F	  Xc1Q3q5\6%u()1vAq6CFAYq\F	  Xr   ),ior   
sympy.corer   r   r   r   r   r	   sympy.core.relationalr
   $sympy.functions.elementary.piecewiser   sympy.utilities.codegenr   r   r   sympy.testing.pytestr   r0   r$   r%   r&   r   r+   r6   r:   r>   rB   rH   rL   rV   rY   rb   rg   rp   rr   rw   ry   r}   r   r   r   r    r   r   <module>r      s     D D * : F F &  '
1a.  $ "(*0(,  "(:!8"r   