Expression Nodes
Expression Nodes
Expression nodes are the building blocks of mathematical expressions and equations in OMD. They form a tree structure that represents the mathematical content.
Overview
OMD uses a node-based system where every mathematical element is represented as a node in an expression tree. This allows for powerful manipulation, simplification, and visualization of mathematical expressions.
Core Node Classes
omdNode
The abstract base class for all nodes in the expression tree.
See: omdNode API Documentation
omdEquationNode
Represents a complete mathematical equation with left side, right side, and equals sign.
Class: omdEquationNode extends omdNode
Static Methods
fromString(equationString)
Creates an equation node from a string representation.
import { omdEquationNode } from '@teachinglab/omd';
const equation = omdEquationNode.fromString('2x + 3 = 11');
- Parameters:
equationString(string): The equation string (e.g.,"2x + 4 = 10")
- Returns:
omdEquationNode - Throws: Error if string is not a valid equation
Properties
left(omdNode): The left side of the equationright(omdNode): The right side of the equationequalsSign(omdOperatorNode): The equals sign operator
Manipulation Methods
addToBothSides(value)
Returns a new equation with a value added to both sides.
const newEq = equation.addToBothSides(5);
- Parameters:
value(number | object): Value to add
- Returns:
omdEquationNode
subtractFromBothSides(value)
Returns a new equation with a value subtracted from both sides.
const newEq = equation.subtractFromBothSides(3);
- Parameters:
value(number | object): Value to subtract
- Returns:
omdEquationNode
multiplyBothSides(value)
Returns a new equation with both sides multiplied by a value.
const newEq = equation.multiplyBothSides(2);
- Parameters:
value(number | object): Value to multiply by
- Returns:
omdEquationNode
divideBothSides(value)
Returns a new equation with both sides divided by a value.
const newEq = equation.divideBothSides(2);
- Parameters:
value(number | object): Value to divide by
- Returns:
omdEquationNode
applyFunction(functionName)
Applies a function (e.g., sqrt, log) to both sides.
const newEq = equation.applyFunction('sqrt');
- Parameters:
functionName(string): Name of function to apply
- Returns:
omdEquationNode
applyOperation(value, operation, side = 'both')
Applies an arithmetic operation to one or both sides.
const newEq = equation.applyOperation(5, 'add', 'left');
- Parameters:
value(number | omdNode): Value to applyoperation(string): Operation type:'add','subtract','multiply', or'divide'side(string): Side to apply to:'left','right', or'both'(default:'both')
- Returns:
omdEquationNode
swapSides()
Swaps the left and right sides of the equation.
const swapped = equation.swapSides();
- Returns:
omdEquationNode
simplify()
Simplifies both sides using the simplification engine.
const result = equation.simplify();
// Returns: { success: boolean, newRoot: omdEquationNode, message: string }
- Returns: Object with
success,newRoot, andmessageproperties
Utility Methods
clone()
Creates a deep clone of the equation node.
const copy = equation.clone();
- Returns:
omdEquationNode
toString()
Converts the equation to its string representation.
const str = equation.toString();
// Returns: "2x + 3 = 11"
- Returns:
string
evaluate(variables)
Evaluates both sides with given variable values.
const result = equation.evaluate({ x: 4 });
// Returns: { left: 11, right: 11 }
- Parameters:
variables(object): Map of variable names to values
- Returns: Object with
leftandrightevaluated values
getLeft()
Returns the node representing the left side.
const leftSide = equation.getLeft();
- Returns:
omdNode
getRight()
Returns the node representing the right side.
const rightSide = equation.getRight();
- Returns:
omdNode
Styling Methods
setBackgroundStyle(style)
Configures background styling for the equation node.
equation.setBackgroundStyle({
backgroundColor: '#E3F2FD',
cornerRadius: 8,
pill: true
});
- Parameters:
style(object): Style properties (backgroundColor,cornerRadius,pill)
getEqualsAnchorX()
Returns the X-coordinate of the equals sign center (for alignment).
const anchorX = equation.getEqualsAnchorX();
- Returns:
number
getBackgroundPaddingX()
Returns the horizontal padding applied by background style.
const padding = equation.getBackgroundPaddingX();
- Returns:
number
Visualization Methods
renderTo(visualizationType, options)
Renders the equation to different visualization formats.
// Render to coordinate plane
const graphJSON = equation.renderTo('graph', {
xMin: -10,
xMax: 10,
yMin: -10,
yMax: 10
});
// Render to table
const tableJSON = equation.renderTo('table', {
xMin: -5,
xMax: 5,
stepSize: 1
});
// Render to balance hanger
const hangerJSON = equation.renderTo('hanger');
// Render to tile equation
const tileJSON = equation.renderTo('tileequation');
- Parameters:
visualizationType(string): Type of visualization:'graph','table','hanger', or'tileequation'options(object): Configuration options specific to visualization type
- Returns: JSON object for the visualization
See: omdEquationNode Full API Documentation
Expression Component Nodes
omdConstantNode
Represents numeric constants.
import { omdConstantNode } from '@teachinglab/omd';
const constant = new omdConstantNode(ast);
See: omdConstantNode API Documentation
omdVariableNode
Represents algebraic variables.
import { omdVariableNode } from '@teachinglab/omd';
const variable = new omdVariableNode(ast);
See: omdVariableNode API Documentation
omdOperatorNode
Represents mathematical operators (+, -, ×, ÷, =).
import { omdOperatorNode } from '@teachinglab/omd';
const operator = new omdOperatorNode(ast);
See: omdOperatorNode API Documentation
omdBinaryExpressionNode
Represents binary operations (addition, subtraction, multiplication, division).
import { omdBinaryExpressionNode } from '@teachinglab/omd';
const binaryExpr = new omdBinaryExpressionNode(ast);
See: omdBinaryExpressionNode API Documentation
omdUnaryExpressionNode
Represents unary operations (negation).
import { omdUnaryExpressionNode } from '@teachinglab/omd';
const unaryExpr = new omdUnaryExpressionNode(ast);
See: omdUnaryExpressionNode API Documentation
omdPowerNode
Represents exponentiation (x²).
import { omdPowerNode } from '@teachinglab/omd';
const power = new omdPowerNode(ast);
See: omdPowerNode API Documentation
omdRationalNode
Represents fractions and rational numbers.
import { omdRationalNode } from '@teachinglab/omd';
const rational = new omdRationalNode(ast);
See: omdRationalNode API Documentation
omdSqrtNode
Represents square root expressions.
import { omdSqrtNode } from '@teachinglab/omd';
const sqrt = new omdSqrtNode(ast);
See: omdSqrtNode API Documentation
omdFunctionNode
Represents mathematical functions (sin, cos, log, etc.).
import { omdFunctionNode } from '@teachinglab/omd';
const func = new omdFunctionNode(ast);
See: omdFunctionNode API Documentation
omdParenthesisNode
Represents expressions enclosed in parentheses.
import { omdParenthesisNode } from '@teachinglab/omd';
const paren = new omdParenthesisNode(ast);
See: omdParenthesisNode API Documentation
Container Nodes
omdGroupNode
A container for grouping related nodes.
import { omdGroupNode } from '@teachinglab/omd';
const group = new omdGroupNode(ast);
See: omdGroupNode API Documentation
omdEquationSequenceNode
A container for displaying step-by-step equation solutions.
import { omdEquationSequenceNode } from '@teachinglab/omd';
const sequence = new omdEquationSequenceNode();
sequence.addChild(equation1);
sequence.addChild(equation2);
See: omdEquationSequenceNode API Documentation
Node Tree Structure
Nodes are organized in a tree structure:
omdEquationNode
├── left (omdNode)
│ └── omdBinaryExpressionNode
│ ├── left (omdConstantNode: 2)
│ ├── operator (omdOperatorNode: +)
│ └── right (omdConstantNode: 3)
├── equalsSign (omdOperatorNode: =)
└── right (omdNode)
└── omdConstantNode: 11
Working with Expression Trees
Creating Nodes from Strings
The simplest way to create nodes is from strings:
import { omdEquationNode } from '@teachinglab/omd';
const equation = omdEquationNode.fromString('2x + 3 = 11');
Manipulating Nodes
Nodes can be manipulated to perform mathematical operations:
// Start with: 2x + 3 = 11
const step1 = equation.subtractFromBothSides(3);
// Result: 2x = 8
const step2 = step1.divideBothSides(2);
// Result: x = 4
Traversing the Tree
Nodes can be traversed to analyze structure:
const leftSide = equation.getLeft();
const rightSide = equation.getRight();
console.log(equation.toString()); // "2x + 3 = 11"
Evaluating Expressions
Nodes can be evaluated with variable values:
const result = equation.evaluate({ x: 4 });
console.log(result); // { left: 11, right: 11 }
Common Patterns
Creating a Step-by-Step Solution
import { omdEquationNode, omdEquationStack } from '@teachinglab/omd';
const original = omdEquationNode.fromString('2x + 3 = 11');
const step1 = original.subtractFromBothSides(3);
const step2 = step1.divideBothSides(2);
const steps = [original, step1, step2];
const stack = new omdEquationStack(steps);
Simplifying Expressions
const equation = omdEquationNode.fromString('2x + 3x = 10');
const result = equation.simplify();
if (result.success) {
console.log(result.newRoot.toString()); // "5x = 10"
}
Rendering to Visualizations
const equation = omdEquationNode.fromString('y = x^2 - 4');
// Render to graph
const graphData = equation.renderTo('graph', {
xMin: -10,
xMax: 10,
yMin: -10,
yMax: 10
});
// Render to table
const tableData = equation.renderTo('table', {
xMin: -5,
xMax: 5,
stepSize: 1
});