Grammar System
The grammar system defines the search space for symbolic optimization: which operators, variables, and constants are available, and how they can be combined.
Simple Grammar (Untyped)
For standard symbolic regression:
grammar = Grammar(
binary_operators = [+, -, *, /],
unary_operators = [sin, cos, exp, log],
variables = [:x, :y],
constant_range = (-2.0, 2.0),
)Typed Grammar
For domains with multiple types (e.g., vector/scalar operations):
grammar = Grammar(
types = [:Scalar, :Vector],
variables = [
:ps => :Vector,
:n => :Scalar,
],
operators = [
(mean, [:Vector] => :Scalar),
(sum, [:Vector] => :Scalar),
(+, [:Scalar, :Scalar] => :Scalar),
(*, [:Scalar, :Scalar] => :Scalar),
(Symbol(".^"), [:Vector, :Scalar] => :Vector),
],
constant_types = [:Scalar],
output_type = :Scalar,
)Querying the Grammar
unary_operators(grammar) # Unary operators
binary_operators(grammar) # Binary operators
operators_producing(grammar, :Scalar) # Operators producing a type
sample_constant(grammar) # Random constant
valid, msg = check_tree_validity(tree, grammar) # Validate a treeSafe Operations
All standard operators have "safe" versions that return NaN instead of throwing:
safe_div(1.0, 0.0) # NaN
safe_log(-1.0) # NaN
safe_sqrt(-1.0) # NaN
safe_pow(-2.0, 0.5) # NaNAdditional safe functions include safe_exp, safe_mean, safe_sum, safe_std, safe_var, and activation functions like sigmoid, relu, softplus, clamp01.
The SAFE_IMPLEMENTATIONS dictionary maps standard function symbols to their safe counterparts.
Grammar Reference
SymbolicOptimization.Grammar — Type
GrammarA complete grammar specification for symbolic optimization.
Two Modes
Simple Mode (like SymbolicRegression.jl)
g = Grammar(
binary_operators = [+, -, *, /],
unary_operators = [sin, cos, exp],
variables = [:x, :y],
constant_range = (-2.0, 2.0),
)Typed Mode (for complex domains)
g = Grammar(
types = [:Scalar, :Vector],
variables = [:ps => :Vector, :n => :Scalar],
operators = [
(mean, [:Vector] => :Scalar),
(+, [:Scalar, :Scalar] => :Scalar),
(.^, [:Vector, :Scalar] => :Vector),
],
constant_types = [:Scalar],
output_type = :Scalar,
)SymbolicOptimization.OperatorSpec — Type
OperatorSpecComplete specification of an operator in the grammar.
SymbolicOptimization.VariableSpec — Type
VariableSpecSpecification for a variable in the grammar.
SymbolicOptimization.ConstantSpec — Type
ConstantSpecSpecification for how to sample constants.
SymbolicOptimization.ValidationResult — Type
ValidationResultResult of grammar validation.
SymbolicOptimization.is_typed — Function
Check if grammar uses types.
SymbolicOptimization.all_operators — Function
Get all operator specs.
SymbolicOptimization.all_variables — Function
Get all variable specs.
SymbolicOptimization.all_constants — Function
Get all constant specs.
SymbolicOptimization.operators_by_name — Function
Get operators by name.
SymbolicOptimization.operators_by_arity — Function
Get operators by arity.
SymbolicOptimization.operators_producing — Function
Get operators that produce a given type.
SymbolicOptimization.unary_operators — Function
Get unary operators.
SymbolicOptimization.binary_operators — Function
Get binary operators.
SymbolicOptimization.ternary_operators — Function
Get ternary operators (for conditionals like ifelse).
SymbolicOptimization.variables_of_type — Function
Get variables of a given type.
SymbolicOptimization.constants_of_type — Function
Get constant specs for a given type.
SymbolicOptimization.has_type — Function
Check if a type exists in the grammar.
SymbolicOptimization.num_operators — Function
Get the number of operators.
SymbolicOptimization.num_variables — Function
Get the number of variables.
SymbolicOptimization.sample_constant — Function
Sample a constant value.
SymbolicOptimization.validate_grammar — Function
validate_grammar(g::Grammar) -> ValidationResultValidate a grammar for consistency and completeness.
Checks performed:
- All operator input/output types exist in the grammar
- All variable types exist in the grammar
- At least one operator or variable produces each output type
- No duplicate operator signatures (in typed mode)
- Constants can be generated for required types
SymbolicOptimization.validate_grammar! — Function
validate_grammar!(g::Grammar)Validate grammar and throw an error if invalid.
SymbolicOptimization.check_tree_validity — Function
check_tree_validity(tree::AbstractNode, g::Grammar) -> Tuple{Bool, String}Check if an expression tree is valid according to the grammar. Returns (valid, message).
SymbolicOptimization.infer_type — Function
infer_type(tree::AbstractNode, g::Grammar, var_env::Dict{Symbol, Symbol}) -> SymbolInfer the type of an expression tree in a typed grammar. Returns :Any for untyped grammars.