Mona is a calculation framework that provides persistent memoization and turns the Python call stack into a task dependency graph. The graph contains three types of edges: a task input depending on outputs of other tasks, a task creating new tasks, and a task output referencing outputs of other tasks.
Install and update using Pip.
pip install -U mona
from mona import Mona, Rule
app = Mona()
@Rule
def total(xs):
return sum(xs)
@app.entry('fib', int)
@Rule
def fib(n):
if n <= 2:
return 1
return total([fib(n - 1), fib(n - 2)])
$ export MONA_APP=fib:app
$ mona init
Initializing an empty repository in /home/mona/fib/.mona.
$ mona run fib 5
7c3947: fib(5): will run
0383f6: fib(3): will run
b0287d: fib(4): will run
f47d51: fib(1): will run
9fd61c: fib(2): will run
45c92d: total([fib(2), fib(1)]): will run
2c136c: total([fib(3), fib(2)]): will run
521a8b: total([fib(4), fib(3)]): will run
Finished
$ mona graph
from fib import app, fib
with app.create_session() as sess:
assert sess.eval(fib(5)) == sum(sess.eval([fib(4), fib(3)]))
- Documentation: https://jhrmnn.github.io/mona