pyndakaas 0.1.0

Python bindings for the pindakaas crate
Documentation
import pindakaas
import pytest


def test_unsat():
    f = pindakaas.CNF()
    with pytest.raises(pindakaas.Unsatisfiable):
        f.add_clause([])


def test_cnf():
    f = pindakaas.CNF()
    x, y = f.new_vars(2)
    f.add_clause([x, y])
    assert f.to_dimacs() == "p cnf 2 1\n1 2 0\n"


def test_encode_bool_lin_unsat():
    f = pindakaas.CNF()
    x, y, z = f.new_vars(3)
    with pytest.raises(pindakaas.Unsatisfiable):
        f += x * 3 + y * 2 + z >= 10


def test_invalid_encoder():
    f = pindakaas.CNF()
    x, y, z = f.new_vars(3)
    with pytest.raises(pindakaas.InvalidEncoder):
        f.add_encoding(x * 3 + y * 2 + z >= 3, encoder=pindakaas.Encoder.PAIRWISE)


def test_encode_bool_lin_default():
    f = pindakaas.CNF()
    x, y, z = f.new_vars(3)
    f += x * 3 + y * 2 + z >= 3
    x, y, z = f.new_vars(3)
    f.add_encoding(x + y + z == 1)
    print(f.to_dimacs())
    assert (
        f.to_dimacs()
        == """p cnf 11 13
2 5 0
3 4 0
3 2 6 0
-4 1 0
-5 1 0
-6 1 0
7 8 9 0
-7 -10 0
-7 -11 0
-8 10 0
-8 -11 0
-9 -10 0
-9 11 0
"""
    )


def test_encode_formula():
    f = pindakaas.CNF()
    x, y, z = f.new_vars(3)
    f += x ^ z
    f.add_encoding(x == y, pindakaas.Encoder.TSEITIN)
    f.add_encoding(x & y)
    assert f.to_dimacs() == "p cnf 3 6\n1 3 0\n-1 -3 0\n-1 2 0\n1 -2 0\n1 0\n2 0\n"


def test_wcnf():
    f = pindakaas.WCNF()
    x, y = f.new_vars(2)
    f.add_clause([x, y])
    f.add_weighted_clause([x], 1)
    f.add_weighted_clause([y], 2)
    assert f.to_dimacs() == "p wcnf 2 3 4\n4 1 2 0\n1 1 0\n2 2 0\n"


def test_conditions():
    f = pindakaas.CNF()
    x, y, p = f.new_vars(3)
    f.add_encoding(x ^ y, conditions=[p])
    assert f.to_dimacs() == "p cnf 3 2\n3 1 2 0\n3 -1 -2 0\n"