@@ -10,6 +10,7 @@ import {
1010 ModelicaSimpleEquation ,
1111} from "./dae.js" ;
1212import { isolateSymbolically } from "./symbolic.js" ;
13+ import { egraphSimplify } from "./symbolic/egraph.js" ;
1314
1415/**
1516 * Visitor that collects all variable names referenced in an expression/equation.
@@ -68,13 +69,22 @@ function isExplicitlySolvableFor(eq: ModelicaEquation, v: string): boolean {
6869
6970/**
7071 * Attempt to symbolically isolate `v` from a `ModelicaSimpleEquation`.
72+ *
73+ * Before isolation, applies E-Graph Equality Saturation to simplify both sides
74+ * of the equation (constant folding, identity elimination, exp/log/trig identities).
75+ * This canonicalization improves the chance of successful symbolic isolation.
76+ *
7177 * Returns a new explicit equation `v = expr` if successful, or null.
7278 */
7379function trySymbolicIsolation ( eq : ModelicaEquation , v : string ) : ModelicaSimpleEquation | null {
7480 if ( ! ( eq instanceof ModelicaSimpleEquation ) ) return null ;
7581 if ( ! eq . expression1 || ! eq . expression2 ) return null ;
7682
77- const result = isolateSymbolically ( eq . expression1 , eq . expression2 , v ) ;
83+ // E-Graph pre-simplification: canonicalize expressions before isolation
84+ const lhs = egraphSimplify ( eq . expression1 ) ;
85+ const rhs = egraphSimplify ( eq . expression2 ) ;
86+
87+ const result = isolateSymbolically ( lhs , rhs , v ) ;
7888 if ( ! result ) return null ;
7989
8090 const nameExpr = new ModelicaNameExpression ( v ) ;
0 commit comments