
    g#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+dS )    )StringIO)SsymbolspiCatalan
EulerGammaFunction)Equality)	Piecewise)RustCodeGencodegenmake_routine)XFAILNzx,y,zc                      t                      } t                      }|                     g |ddd           |                                }|dk    sJ d S )NfileFheaderempty )r   r   dump_rsgetvalue)code_genoutputsources      c/var/www/html/ai-engine/env/lib/python3.11/site-packages/sympy/utilities/tests/test_codegen_rust.pytest_empty_rust_coder      sS    }}HZZFRUCC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 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   expecteds       r   test_simple_rust_coder+      sm    !a%#IiUCC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  }|                    d
                                          }dd|iz  }||k    sJ 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*   s         r   test_simple_code_with_headerr6   $   s    !a%#IiEBBBGF!9	!!!!AYF053DDK%%b))0022L
	 
&'H Xr   c                      t          t          t          t          z             } d| f}t	          |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*   s        r   test_simple_code_nameoutr:   ;   sb    AADIiUCCCGFAYF	  Xr   c                      dt           t          z  f} t          | ddd          \  }|d         }dt          j        d          z  }||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'   s       r   test_numbersymbolr>   I   se    W%IiUCC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 d S )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   s     "g+z23Ii!$0 0 0GFAYFF 
r				J,R00002H Xr   c                     t           t          z   } t          d| t          t           t          gd          }t	                      }t                      }|                    |g|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   )r9   routiner   r   r   r*   s         r   test_argument_orderrH   j   s    q5D64Aq!9vVVVG}}HZZFgYuEJJ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 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*   s         r   test_multiple_results_rustrL   z   sn    UAIEUAIE%(IiUCCCGFAYF	  Xr   c                  L   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 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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CC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t          t          t          f          }|d         d         dk    sJ |d         d	         }d
}	||	k    sJ d S )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2 2 2F!9Q<9$$$$AYq\F	  Xr   c                     ddl m} m}m} d |t                     | t
                    z    |t                    z   dz                                   |  |  |  |  |  |  |  | t          t
          z   t          z                                                                                   gf}t          |ddd          }|d         d         dk    sJ |d         d	         }d
}||k    sJ 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.trigonometricr[   r\   r]   r$   r%   r&   expandr   )r[   r\   r]   r(   r)   r   r*   s          r   test_complicated_rs_codegenrb      s   HHHHHHHHHHAQ##a&&(1,4466CCCCCCCAEAI$7$7 8 899::;;<<==I YuEBBBF!9Q<=((((AYq\F		  Xr   c                  l   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 d S )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CCCCCCCAQqS8Ass1vv#6#6ACCPQRSPSHH@U@UVWIiUCCCGF!9    AYF	  Xr   c                      t          dt          dk     ft          dz  t          dk    ft           dz   t          dk    fdd          } d| f}t          |d	dd
          \  }|d         }d}||k    sJ d S )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      s    	Aq2v;AqAv!Aq1uySX	Y	Y	YB2IiUCCCGFAYF	  Xr   c                      t          dt          dk     ft          dz  t          dk    ft           dz   t          dk    fd          } d| f}t          |dddd	
          \  }|d         }d}||k    sJ d S )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      s     
Aq2v;AqAv!Aq1uy	I	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 d S )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BBBF!9Q<8####AYq\F		  Xr   c                  R   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  }|                    d                                          }dd|iz  }||k    sJ d S )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AAAF!9Q<8####AYq\F053DDK%%b))002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 d S )Nre   rO   r_   rt   ru   r    bazF)prefixr   r   r   zbaz.rsrv   )r(   r)   s     r   test_filename_match_prefixr}   9  sj    1Q3!*%1ac{';=Iie " " "GF!9      r   c                      t          t          t          dz            } d| f}t          |ddd          \  }|d         }d}||k    sJ d S )NrO   mysqrr    Fr   r"   z9fn mysqr(x: f64) -> f64 {
    let x = x.powi(2);
    x
}
)r
   r$   r   r8   s        r   test_InOutArgumentr   @  sb    Aq!tD$IiUCC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 d S )	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CCCGFAYF	  Xr   c                      t          d          } d | t                                        t                    t          j        gf}t          |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   )r   r(   r)   r   r*   s        r   test_not_supportedr   j  su    A!!A$$))A,,(9:;IiUCC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 d S )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 C 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 D D D D D D D D D D D D D D * * * * * * : : : : : : F F F F F F F F F F & & & & & &  ''

1a      .       $     "  (  *  0  (  ,   "  (  :! ! !    8  "    r   