Skip to main content

math_parser_rs/dsl/optimizations/
trig.rs

1use crate::dsl::ast_types::{AstNode, OperatorKind};
2
3pub fn rewrite_cos_as_sin(node: &AstNode) -> AstNode {
4    match node {
5        AstNode::FunctionCall { name, args } if name == "cos" && args.len() == 1 => {
6            AstNode::FunctionCall {
7                name: "sin".to_string(),
8                args: vec![AstNode::BinaryOp {
9                    op: OperatorKind::Plus,
10                    left: Box::new(rewrite_cos_as_sin(&args[0])),
11                    right: Box::new(AstNode::Number(std::f64::consts::FRAC_PI_2)), // π/2
12                }],
13            }
14        }
15        AstNode::FunctionCall { name, args } => AstNode::FunctionCall {
16            name: name.clone(),
17            args: args.iter().map(rewrite_cos_as_sin).collect(),
18        },
19        AstNode::BinaryOp { op, left, right } => AstNode::BinaryOp {
20            op: *op,
21            left: Box::new(rewrite_cos_as_sin(left)),
22            right: Box::new(rewrite_cos_as_sin(right)),
23        },
24        AstNode::Number(n) => AstNode::Number(*n),
25        AstNode::Variable(v) => AstNode::Variable(v.clone()),
26    }
27}