Metaprogramming infrastructure
Project description
Effectful is an algebraic effect system for Python, intended for use in the implementation of probabilistic programming languages. It is a core component of the ChiRho causal modeling language.
Installation
Install From Source
git clone git@github.com:BasisResearch/effectful.git
cd effectful
git checkout master
pip install -e .[pyro]
Install With Optional PyTorch/Pyro Support
effectful has optional support for PyTorch (tensors with named dimensions) and Pyro (wrappers for Pyro effects).
To enable PyTorch support:
pip install effectful[torch]
Pyro support (which includes PyTorch support):
pip install effectful[pyro]
Getting Started
Here’s an example demonstrating how effectful can be used to implement a simple DSL that performs arithmetic on terms with free variables.
import functools
from effectful.ops.types import Term
from effectful.ops.syntax import defop
from effectful.ops.semantics import handler, evaluate, coproduct, fwd
from effectful.handlers.numbers import add
def beta_add(x: int, y: int) -> int:
match x, y:
case int(), int():
return x + y
case _:
return fwd()
def commute_add(x: int, y: int) -> int:
match x, y:
case Term(), int():
return y + x
case _:
return fwd()
def assoc_add(x: int, y: int) -> int:
match x, y:
case _, Term(op, (a, b)) if op == add:
return (x + a) + b
case _:
return fwd()
beta_rules = {add: beta_add}
commute_rules = {add: commute_add}
assoc_rules = {add: assoc_add}
eager_mixed = functools.reduce(coproduct, (beta_rules, commute_rules, assoc_rules))
We can represent free variables as operations with no arguments, generated using defop:
>>> x = defop(int, name="x")
>>> y = defop(int, name="y")
If we evaluate an expression containing free variables, we get a term:
>>> e = 1 + 1 + (x() + 1) + (5 + y())
>>> print(e)
add(2, add(add(x(), 1), add(5, y())))
We can make the evaluation strategy smarter by taking advantage of the commutativity and associativity of addition, as expressed by the commute_add and assoc_add handlers.
>>> with handler(eager_mixed):
>>> print(evaluate(e))
add(8, add(x(), y()))
Learn More
More examples and API documentation can be found in the docs.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file effectful-0.1.0.tar.gz.
File metadata
- Download URL: effectful-0.1.0.tar.gz
- Upload date:
- Size: 51.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.9.21
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e4c15f98730b5340ab319b6eaea36c9d134a156d7ca29b86b6da0d9b8c6ff8bd
|
|
| MD5 |
f663a7031e287da2189f82e101b4ed19
|
|
| BLAKE2b-256 |
6954773361bd3564f189dc105b71b63cc1deede94b7c4e25368f400567fd8fd3
|
File details
Details for the file effectful-0.1.0-py3-none-any.whl.
File metadata
- Download URL: effectful-0.1.0-py3-none-any.whl
- Upload date:
- Size: 37.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.9.21
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a7a2e1013f571bc6cd89b47bc66ea802d09bcc20b3b5bc8b3355d944f64025ae
|
|
| MD5 |
3e090f7a9753fc3615053a6875fa057e
|
|
| BLAKE2b-256 |
614afb66370fc0fe4ebc899c5cdcdb14d5d1f6b28c2b3bf865e5b6485361e99a
|