JuliaSymbolics is the Julia organization dedicated to building a fully-featured and high performance Computer Algebra System (CAS) for the Julia programming language. It is currently home to a layered architecture of packages:
Layer 3: Symbolics.jl – A fast symbolic system designed for everyday symbolic computing needs. It features:
Symbolic arithmetic with type information and multiple dispatch
Symbolic polynomials and trigonometric functions
Symbolic linear algebra (factorizations, inversion, determinants, eigencomputations, etc.)
Discrete math (representations of summations, products, binomial coefficients, etc.)
Logical and Boolean expressions
Symbolic equation solving and conversion to arbitrary precision
Support for non-standard algebras (non-commutative symbols and customizable rulesets)
Special functions (list provided by SpecialFunctions.jl)
Automatic conversion of Julia code to symbolic code
Generation of (high performance and parallel) functions from symbolic expressions
Fast automated sparsity detection and generation of sparse Jacobian and Hessians
Layer 2: SymbolicUtils.jl – The low-level representation and expression rewriting system:
Stores common expressions in a fast canonical form that is simplified by default
Rule-based simplification for further simplification
Polynomial-normalization (i.e. use polynomial algebra to expand expressions)
Layer 1: Metatheory.jl – General purpose algebraic metaprogramming and symbolic computation library.
A powerful expression rewriting system and first-class pattern matching engine, based on the pattern matcher in the SICM book.
An eDSL (domain specific language) to define different kinds of symbolic rewrite rules.
A flexible library of rewriter combinators.
E-graph rewriting (equality saturation) system and pattern matcher, inspired from the egg library
Backtracking and non-deterministic term rewriting using e-graphs.
Features available as generic as possible: rewrite on Julia native
Expr, Symbolics.jl expressions or any expression satisfying TermInterface.jl.
Layer 0: TermInterface.jl – Shared generic interface for symbolic expressions.
Definition of general functions for fast primitive manipulation of symbolic expressions.
Define methods for your expression types for the functions in this interface to use Metatheory.jl features on any expression type.
Due to its deep connection to the expansive Julia package ecosystem, many organizations utilize the building blocks offered by JuliaSymbolics as the underpinning of their symbolic packages to build and extend the ecosystem.
ModelingToolkit.jl – Symbolic representations of common numerical systems
Ordinary differential equations
Stochastic differential equations
Partial differential equations
Causal and acausal modeling (Simulink/Modelica)
Automated model transformation, simplification, and composition
Catalyst.jl – Symbolic representations of chemical reactions
Symbolically build and represent large systems of chemical reactions
Generate code for ODEs, SDEs, continuous-time Markov Chains, and more
Simulate the models using the SciML ecosystem with O(1) Gillespie methods
DataDrivenDiffEq.jl: Automatic identification of equations from data
Automated construction of ODEs and DAEs from data
Representations of Koopman operators and Dynamic Mode Decomposition (DMD)
SymbolicRegression.jl: Distributed High-Performance symbolic regression in Julia
Parallelized generic algorithms for finding equations from data
Pareto frontier based scoring
ReversePropagation.jl: Source-to-source reverse mode automatic differentiation
Automated tracing of code and construction of backpropagation equations
Composes with symbolic transformation and simplification functionality