quantrs2_symengine_pure/ops/
complex.rs1use crate::expr::{ExprLang, Expression};
4use egg::RecExpr;
5
6pub fn re(x: &Expression) -> Expression {
8 let mut expr = x.as_rec_expr().clone();
9 let id = egg::Id::from(expr.as_ref().len() - 1);
10 expr.add(ExprLang::Re([id]));
11 Expression::from_rec_expr(expr)
12}
13
14pub fn im(x: &Expression) -> Expression {
16 let mut expr = x.as_rec_expr().clone();
17 let id = egg::Id::from(expr.as_ref().len() - 1);
18 expr.add(ExprLang::Im([id]));
19 Expression::from_rec_expr(expr)
20}
21
22pub fn conj(x: &Expression) -> Expression {
24 x.conjugate()
25}
26
27pub fn complex(re: &Expression, im: &Expression) -> Expression {
29 re.clone() + im.clone() * Expression::i()
30}
31
32pub fn magnitude(x: &Expression) -> Expression {
34 crate::ops::trig::sqrt(&(re(x).pow(&Expression::int(2)) + im(x).pow(&Expression::int(2))))
35}
36
37pub fn phase(x: &Expression) -> Expression {
39 crate::ops::trig::atan(&(im(x) / re(x)))
40}
41
42#[cfg(test)]
43mod tests {
44 use super::*;
45
46 #[test]
47 fn test_complex_parts() {
48 let z = Expression::symbol("z");
49 let re_z = re(&z);
50 let im_z = im(&z);
51
52 assert!(!re_z.is_symbol());
53 assert!(!im_z.is_symbol());
54 }
55}