SymbolicTracing looks interesting and the two packages certainly have similar approaches to tracing. A few differences I see though (based on the README):
- SymbolicTracing works only with abstract type while Ghost can as well trace through concrete types and struct fields
- SymbolicTracing doesn’t seem to handle control flow; Ghost can follow branches, including conditions and loops
- Loops in Ghost can also be traced as a separate operation
- I’m not sure it’s possible to include operations out of the dependency graph in SymbolicTracing (e.g.
println()
statement); in Ghost you can have both - a pure computational graph and a graph with side effects - In general, Symbolic* packages seem to be more oriented to pure symbolic graphs, while Ghost’s
Tape
is an abstraction for any kind of computation