ó
¡¼™\c           @   sÜ  d  d l  m Z m Z m Z m Z m Z m Z m Z m Z m	 Z	 d  d l
 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 m Z m Z d  d l m Z d  d	 l 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 „  Z0 d „  Z1 d „  Z2 d „  Z3 d „  Z4 d  „  Z5 d! „  Z6 d S("   iÿÿÿÿ(	   t   St   symbolst   Eqt   pit   Catalant
   EulerGammat   Lambdat   Dummyt   Function(   t   StringIO(   t   erft   Integralt	   Piecewise(   t   Equality(   t   Matrixt   MatrixSymbol(   t
   Assignment(   t   RustCodeGent   codegent   make_routine(   t   raises(   t   implemented_function(   t   XFAILNs   x,y,zc          C   sS   t  ƒ  }  t ƒ  } |  j g  | d d t d t ƒ| j ƒ  } | d k sO t ‚ d  S(   Nt   filet   headert   emptyt    (   R   R	   t   dump_rst   Falset   getvaluet   AssertionError(   t   code_gent   outputt   source(    (    sF   lib/python2.7/site-packages/sympy/utilities/tests/test_codegen_rust.pyt   test_empty_rust_code   s
    		c          C   sn   d t  t t f }  t |  d d t d t ƒ\ } | d d k sH t ‚ | d } d } | | k sj t ‚ d  S(	   Nt   testt   RustR   R   i    s   test.rsi   sN   fn test(x: f64, y: f64, z: f64) -> f64 {
    let out1 = z*(x + y);
    out1
}
(   t   xt   yt   zR   R   R   (   t	   name_exprt   resultR!   t   expected(    (    sF   lib/python2.7/site-packages/sympy/utilities/tests/test_codegen_rust.pyt   test_simple_rust_code   s    
c          C   s›   d t  t t f }  t |  d d t d t ƒ\ } | d d k sH t ‚ | d } d t j } | j	 d	 ƒ j
 ƒ  } d
 i | d 6} | | k s— t ‚ d  S(   NR#   R$   R   R   i    s   test.rsi   s   Code generated with sympy %siL   sæ   /*
 *%(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
}
t   version_line(   R%   R&   R'   R   t   TrueR   R   t   sympyt   __version__t   centert   rstrip(   R(   R)   R!   t   version_strR,   R*   (    (    sF   lib/python2.7/site-packages/sympy/utilities/tests/test_codegen_rust.pyt   test_simple_code_with_header(   s    
c          C   sc   t  t t t ƒ }  d |  f } t | d d t d t ƒ\ } | d } d } | | k s_ t ‚ d  S(   NR#   R$   R   R   i   s<   fn test(x: f64, y: f64) -> f64 {
    let z = x + y;
    z
}
(   R   R'   R%   R&   R   R   R   (   t   exprR(   R)   R!   R*   (    (    sF   lib/python2.7/site-packages/sympy/utilities/tests/test_codegen_rust.pyt   test_simple_code_nameout?   s    
c          C   sa   d t  t f }  t |  d d t d t ƒ\ } | d } d t j d ƒ } | | k s] t ‚ d  S(   NR#   R$   R   R   i   s\   fn test() -> f64 {
    const Catalan: f64 = %s;
    let out1 = PI.powf(Catalan);
    out1
}
i   (   R   R   R   R   t   evalfR   (   R(   R)   R!   R*   (    (    sF   lib/python2.7/site-packages/sympy/utilities/tests/test_codegen_rust.pyt   test_numbersymbolM   s    
c       	   C   s|   d t  t t g f }  t |  d d t d t d t ƒ\ } | d } d t j d ƒ t j d ƒ f } | | k sx t ‚ d  S(	   NR#   R$   R   R   t   inlinei   s§   fn test() -> (f64, f64) {
    const Catalan: f64 = %s;
    const EulerGamma: f64 = %s;
    let out1 = PI.powf(Catalan);
    let out2 = EulerGamma);
    (out1, out2)
}
i   (   R   R   R   R   R   R-   R6   R   (   R(   R)   R!   R*   (    (    sF   lib/python2.7/site-packages/sympy/utilities/tests/test_codegen_rust.pyt   test_numbersymbol_inline[   s    
c          C   sŠ   t  t }  t d |  d t t  t g d d ƒ} t ƒ  } t ƒ  } | j | g | d d t d t ƒ| j ƒ  } d } | | k s† t	 ‚ d  S(   NR#   t   argument_sequencet   languaget   rustR   R   sJ   fn test(z: f64, x: f64, y: f64) -> f64 {
    let out1 = x + y;
    out1
}
(
   R%   R&   R   R'   R   R	   R   R   R   R   (   R4   t   routineR   R    R!   R*   (    (    sF   lib/python2.7/site-packages/sympy/utilities/tests/test_codegen_rust.pyt   test_argument_ordern   s    
$		"c          C   sr   t  t t }  t  t t } d |  | g f } t | d d t d t ƒ\ } | d } d } | | k sn t ‚ d  S(   NR#   R$   R   R   i   sw   fn test(x: f64, y: f64, z: f64) -> (f64, f64) {
    let out1 = z*(x + y);
    let out2 = z*(x - y);
    (out1, out2)
}
(   R%   R&   R'   R   R   R   (   t   expr1t   expr2R(   R)   R!   R*   (    (    sF   lib/python2.7/site-packages/sympy/utilities/tests/test_codegen_rust.pyt   test_multiple_results_rust~   s    
c    
      C   s¯   t  d ƒ \ }  } } t | t t t ƒ } t |  t t t ƒ } t | d t ƒ } d | | | g f } t | d d t d t ƒ\ } | d } d }	 | |	 k s« t ‚ d  S(	   Ns   A,B,Ci   R#   R$   R   R   i   s„   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   R   (
   t   At   Bt   CR?   R@   t   expr3R(   R)   R!   R*   (    (    sF   lib/python2.7/site-packages/sympy/utilities/tests/test_codegen_rust.pyt   test_results_named_unordered   s    
c    
      C   sÙ   t  d ƒ \ }  } } t | t t t ƒ } t |  t t t ƒ } t | d t ƒ } d | | | g f } t | d d t d t d t t t f ƒ} | d d d	 k s¯ t ‚ | d d
 } d }	 | |	 k sÕ t ‚ d  S(   Ns   A,B,Ci   R#   R$   R   R   R:   i    s   test.rsi   s„   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)
}
(   R   R   R%   R&   R'   R   R   R   (
   RB   RC   RD   R?   R@   RE   R(   R)   R!   R*   (    (    sF   lib/python2.7/site-packages/sympy/utilities/tests/test_codegen_rust.pyt   test_results_named_ordered£   s    c          C   sé   d d l  m }  m } m } d |  t ƒ | t ƒ | t ƒ d j ƒ  | | | | | | | | t t t ƒ ƒ ƒ ƒ ƒ ƒ ƒ ƒ g f } t | d d t	 d t	 ƒ} | d d d	 k s¿ t
 ‚ | d d
 } d } | | k så t
 ‚ d  S(   Niÿÿÿÿ(   t   sint   cost   tant   testlongi   R$   R   R   i    s   testlong.rsi   s›  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)
}
(   R.   RH   RI   RJ   R%   R&   R'   t   expandR   R   R   (   RH   RI   RJ   R(   R)   R!   R*   (    (    sF   lib/python2.7/site-packages/sympy/utilities/tests/test_codegen_rust.pyt   test_complicated_rs_codegen¸   s    'Dc       	   C   sÌ   d d l  m }  m } m } t d ƒ } d | d t ƒ t t |  t ƒ ƒ | t ƒ t | |  d t ƒ ƒ g f } t | d d t	 d t	 ƒ\ } | d	 d
 k s¦ t
 ‚ | d } d } | | k sÈ t
 ‚ d  S(   Niÿÿÿÿ(   RH   RI   RJ   t   at   fooi   R$   R   R   i    s   foo.rsi   s¤   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)
}
(   R.   RH   RI   RJ   R   R%   R   R&   R   R   R   (   RH   RI   RJ   RN   R(   R)   R!   R*   (    (    sF   lib/python2.7/site-packages/sympy/utilities/tests/test_codegen_rust.pyt   test_output_arg_mixed_unorderedÐ   s    J
c          C   sž   t  d t d k  f t d t d k f t d t d k f d t f d t ƒ}  d |  f } t | d d t d	 t ƒ\ } | d } d
 } | | k sš t ‚ d  S(   Ni    iÿÿÿÿi   i   t   evaluatet   pwtestR$   R   R   s¼   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   R   R   (   t   pwR(   R)   R!   R*   (    (    sF   lib/python2.7/site-packages/sympy/utilities/tests/test_codegen_rust.pyt   test_piecewise_ä   s    N
c       	   C   sž   t  d t d k  f t d t d k f t d t d k f d t f ƒ }  d |  f } t | d d t d t d	 t ƒ\ } | d } d
 } | | k sš t ‚ d  S(   Ni    iÿÿÿÿi   i   RR   R$   R   R   R8   s   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   R   (   RS   R(   R)   R!   R*   (    (    sF   lib/python2.7/site-packages/sympy/utilities/tests/test_codegen_rust.pyt   test_piecewise_inlineú   s    H
c          C   s“   d d t  d t g f d t d d t g f g }  t |  d d t d t ƒ} | d	 d	 d
 k si t ‚ | d	 d } d } | | k s t ‚ d  S(   NRO   i   i   t   bari   R$   R   R   i    s   foo.rsi   sÂ   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!   R*   (    (    sF   lib/python2.7/site-packages/sympy/utilities/tests/test_codegen_rust.pyt   test_multifcns_per_file  s    4c          C   sÀ   d d t  d t g f d t d d t g f g }  t |  d d t d t ƒ} | d	 d	 d
 k si t ‚ | d	 d } d t j } | j d ƒ j	 ƒ  } d i | d 6} | | k s¼ t ‚ d  S(   NRO   i   i   RV   i   R$   R   R   i    s   foo.rsi   s   Code generated with sympy %siL   sZ  /*
 *%(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.   R/   R0   R1   (   R(   R)   R!   R2   R,   R*   (    (    sF   lib/python2.7/site-packages/sympy/utilities/tests/test_codegen_rust.pyt    test_multifcns_per_file_w_header   s    4c       	   C   sr   d d t  d t g f d t d d t g f g }  t |  d d d d	 t d
 t ƒ\ } | d d k sn t ‚ d  S(   NRO   i   i   RV   i   R$   t   prefixt   bazR   R   i    s   baz.rs(   R%   R&   R   R   R   (   R(   R)   (    (    sF   lib/python2.7/site-packages/sympy/utilities/tests/test_codegen_rust.pyt   test_filename_match_prefix=  s    4c          C   sc   t  t t d ƒ }  d |  f } t | d d t d t ƒ\ } | d } d } | | k s_ t ‚ d  S(   Ni   t   mysqrR$   R   R   i   s9   fn mysqr(x: f64) -> f64 {
    let x = x.powi(2);
    x
}
(   R   R%   R   R   R   (   R4   R(   R)   R!   R*   (    (    sF   lib/python2.7/site-packages/sympy/utilities/tests/test_codegen_rust.pyt   test_InOutArgumentD  s    
c       
   C   sÖ   t  t t d t ƒ }  d |  f } t | d d t d t d t t f ƒ\ } | d } d } | | k so t ‚ t  t t d t ƒ }  d |  f } t | d d t d t ƒ\ } | d } d } | | k sÒ t ‚ d  S(	   Ni   R#   R$   R   R   R:   i   sD   fn test(x: f64, y: f64) -> f64 {
    let x = x.powi(2) + y;
    x
}
(   R   R%   R&   R   R   R   (   R4   R(   R)   R!   R*   (    (    sF   lib/python2.7/site-packages/sympy/utilities/tests/test_codegen_rust.pyt   test_InOutArgument_orderR  s    

c          C   st   t  d ƒ }  d |  t ƒ j t ƒ t j g f } t | d d t d t ƒ\ } | d } d } | | k sp t ‚ d  S(   Nt   fR#   R$   R   R   i   s«   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%   t   diffR    t   ComplexInfinityR   R   R   (   R_   R(   R)   R!   R*   (    (    sF   lib/python2.7/site-packages/sympy/utilities/tests/test_codegen_rust.pyt   test_not_supportedn  s    $
c          C   s×   t  d ƒ \ }  } } } t d |  | f d d t d t d | f ƒ} | d d } d	 } | | k sl t ‚ t d |  | | f d d t d t d
 |  | f d | | f ƒ} | d d } d } | | k sÓ t ‚ d  S(   Ns   x y z tR_   R$   R   R   t   global_varsi    i   s5   fn f(x: f64) -> f64 {
    let out1 = x*y;
    out1
}
R:   sA   fn f(x: f64, y: f64) -> f64 {
    let out1 = x*y + z;
    out1
}
(   R   R   R   R   (   R%   R&   R'   t   tR)   R!   R*   (    (    sF   lib/python2.7/site-packages/sympy/utilities/tests/test_codegen_rust.pyt   test_global_vars_rust  s    "&(7   t
   sympy.coreR    R   R   R   R   R   R   R   R   t   sympy.core.compatibilityR	   R.   R
   R   R   R   t   sympy.matricesR   R   t   sympy.printing.codeprinterR   t   sympy.utilities.codegenR   R   R   t   sympy.utilities.pytestR   t   sympy.utilities.lambdifyR   R   R%   R&   R'   R"   R+   R3   R5   R7   R9   R>   RA   RF   RG   RM   RP   RT   RU   RW   RX   R[   R]   R^   Rb   Re   (    (    (    sF   lib/python2.7/site-packages/sympy/utilities/tests/test_codegen_rust.pyt   <module>   s@   @																		