Skip to main content

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 .[test]

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 operator
import functools

from effectful.handlers.operator import OPERATORS
from effectful.ops.types import Term
from effectful.ops.syntax import defop
from effectful.ops.semantics import handler, evaluate, coproduct, fwd
import effectful.handlers.operator

add = OPERATORS[operator.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

effectful-0.0.1.tar.gz (47.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

effectful-0.0.1-py3-none-any.whl (34.7 kB view details)

Uploaded Python 3

File details

Details for the file effectful-0.0.1.tar.gz.

File metadata

  • Download URL: effectful-0.0.1.tar.gz
  • Upload date:
  • Size: 47.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.10.13

File hashes

Hashes for effectful-0.0.1.tar.gz
Algorithm Hash digest
SHA256 81ed3a4c386b47ffce0e598622c99c0dc4b416a843ebc1badff8af13c26f7641
MD5 f72046dd0f5540ba382be8ccf313bf5e
BLAKE2b-256 6202058b65e0a338fb289cd9c072c7f73509a2602ee2c46fbf82a1b8c5276b7a

See more details on using hashes here.

File details

Details for the file effectful-0.0.1-py3-none-any.whl.

File metadata

  • Download URL: effectful-0.0.1-py3-none-any.whl
  • Upload date:
  • Size: 34.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.10.13

File hashes

Hashes for effectful-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a8c74c0e25b50edf61f243eedf505b4313972020f994741dda9a3ca5da116e45
MD5 a833e8d755bb77eb795b0e939a11e33e
BLAKE2b-256 3363d7406959348efa5ce36c0da21e15f15b79cb6df16811ef7d7318de5cc99d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page