Skip to main content

Library for creating circuits that encode discrete distributions.

Project description

py-aiger-coins

warning 3.0.0 and greater are a major rewrite of this code base. I am trying to port most of the useful features.

Build Status codecov Updates PyPI version License: MIT

Library for creating circuits that encode discrete distributions and Markov Decision Processes. The name comes from the random bit model of drawing from discrete distributions using coin flips.

Table of Contents

Install

To install this library run:

$ pip install py-aiger-coins

Note that to actually compute probabilities, one needs to install with the bdd option.

$ pip install py-aiger-coins[bdd]

For developers, note that this project uses the poetry python package/dependency management tool. Please familarize yourself with it and then run:

$ poetry install

Usage

py-aiger-coins extends the standard py-aiger-bv and py-aiger-discrete abstractions to allow for certain bits to be set via biased coins.

The library centers around the PCirc object. The easiest way to use py-aiger-coins is to throught the pcirc function.

import aiger_bv as BV
import aiger_coins as C


expr1 = BV.uatom(2, 'x') + BV.uatom(2, 'y')

# Create distribution over bits.
my_pcirc = C.pcirc(expr1) \
            .randomize({'x': {0: 1/6, 1: 2/6, 2: 3/6}})

assert my_pcirc.outputs == {expr1.output}

# This probablistic circuit uses 2 biased coins to represent this input.
assert my_pcirc.num_coins == 2
assert my_pcirc.coin_biases == (1/3, 1/2)

# 'x' input is replaced with coinflips.
assert my_pcirc.inputs == {'y'}

# Underlying circuit now has a single input representing coin inputs.
underlying_circ = my_pcirc.circ

assert underlying_circ.inputs == {'y', my_pcirc.coins_id}

Note that aiger_coins.PCirc implements the same API as aiger_bv and aiger_coins.

Sequential Circuit API

For example, sequential and parallel composition allow combining probablistic circuits.

incr = (BV.uatom(2, 'z') + 1)
adder = (BV.uatom(2, 'x') + BV.uatom(2, 'y')).with_output('z')

# Create distribution over bits.
pcirc = C.pcirc(adder)                                         \
         .randomize({'x': {0: 1/6, 1: 2/6, 2: 3/6}})
pcirc >>= incr

or

inc_x = C.pcirc(BV.uatom(2, 'x') + 1)          \
         .randomize({'x': {0: 1/3, 2: 2/3}})                      # Pr(x=2) = 2/3

inc_y = C.pcirc(BV.uatom(3, 'y') + 1)          \
         .randomize({'y': {0: 1/3, 5: 1/3, 3: 1/3}})

inc_xy = inc_x | inc_y  #

Similarly, unroll, loopback are also implemented.

note unroll combines all coin flips into a single input in temporal order.

Finite Functions

py-aiger-coins also works well with the py-aiger-discrete API for working with arbitrary functions over finite sets. For example:

from bidict import bidict  # `pip install bidict`

# Create encoder/decoder for dice.
lookup = bidict({0: '⚀', 1: '⚁', 2: '⚂', 3: '⚃'})     # invertable dictionary.
encoder = aiger_discrete.Encoding(decode=lookup.get, encode=lookup.inv.get)

# Represent dice with a 2 bit vector.
expr1 = BV.uatom(2, '🎲')

# Add encoded dice to x. Because why not.
expr2 = BV.uatom(2, 'x') + expr1
func = aiger_discrete.from_aigbv(
    expr2.aigbv, input_encodings={'🎲': encoder}
)

# Create distribution over bits.
circ = C.pcirc(func) \
        .randomize({'🎲': {'⚀': 1/6, '⚁': 2/6, '⚂': 3/6}})

assert circ.inputs == {'x'}
assert circ.outputs == {expr2.output}
assert circ.coin_biases == (Fraction(1, 3), Fraction(1, 2))

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

py-aiger-coins-3.3.3.tar.gz (9.1 kB view details)

Uploaded Source

Built Distribution

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

py_aiger_coins-3.3.3-py3-none-any.whl (8.8 kB view details)

Uploaded Python 3

File details

Details for the file py-aiger-coins-3.3.3.tar.gz.

File metadata

  • Download URL: py-aiger-coins-3.3.3.tar.gz
  • Upload date:
  • Size: 9.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.6 CPython/3.9.4 Linux/5.10.32-1-MANJARO

File hashes

Hashes for py-aiger-coins-3.3.3.tar.gz
Algorithm Hash digest
SHA256 516ce7955833bde5d7557c72516a75dfecf017612e1d7a8ff5c45eced3731ee6
MD5 8a8a0767e754914869fef3ad35e93cf2
BLAKE2b-256 87cb995ed5ecb031a210445c59b4367edae64171498b4cbfaa573f58b080f9fb

See more details on using hashes here.

File details

Details for the file py_aiger_coins-3.3.3-py3-none-any.whl.

File metadata

  • Download URL: py_aiger_coins-3.3.3-py3-none-any.whl
  • Upload date:
  • Size: 8.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.6 CPython/3.9.4 Linux/5.10.32-1-MANJARO

File hashes

Hashes for py_aiger_coins-3.3.3-py3-none-any.whl
Algorithm Hash digest
SHA256 227279fdee5030d1641768dfdf48e6db76d9adfd608d6d141de8bc136e9cee93
MD5 aa92588eeeb31a9f37376124c2f1d301
BLAKE2b-256 5041db603d7f88e2c3a6d9abdee8cbf4a68b04ce65ab854f2fed8c276f3bb044

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