Skip to main content

oximo_expr/
visit.rs

1use crate::arena::{ExprArena, ExprId, ExprNode};
2
3/// Pre-order visitor over an arena. Backends implement this to translate the
4/// expression tree into solver-specific representations without copying.
5pub trait Visitor {
6    fn visit(&mut self, arena: &ExprArena, id: ExprId, node: &ExprNode);
7}
8
9/// Walk the subtree rooted at `id` in pre-order.
10pub fn walk<V: Visitor>(arena: &ExprArena, id: ExprId, visitor: &mut V) {
11    let node = arena.get(id);
12    visitor.visit(arena, id, node);
13    match node {
14        ExprNode::Add(children) | ExprNode::Mul(children) => {
15            for &child in children {
16                walk(arena, child, visitor);
17            }
18        }
19        ExprNode::Neg(inner)
20        | ExprNode::Sin(inner)
21        | ExprNode::Cos(inner)
22        | ExprNode::Exp(inner)
23        | ExprNode::Log(inner)
24        | ExprNode::Abs(inner) => {
25            let inner = *inner;
26            walk(arena, inner, visitor);
27        }
28        ExprNode::Pow(base, exp) => {
29            let base = *base;
30            let exp = *exp;
31            walk(arena, base, visitor);
32            walk(arena, exp, visitor);
33        }
34        ExprNode::Div(num, den) => {
35            let num = *num;
36            let den = *den;
37            walk(arena, num, visitor);
38            walk(arena, den, visitor);
39        }
40        ExprNode::Const(_) | ExprNode::Var(_) | ExprNode::Param(_) | ExprNode::Linear { .. } => {}
41    }
42}