diff --git a/cirbo/circuits_db/data_utils.py b/cirbo/circuits_db/data_utils.py new file mode 100644 index 00000000..01c15918 --- /dev/null +++ b/cirbo/circuits_db/data_utils.py @@ -0,0 +1,27 @@ +"""Module defines default paths to data files (e.g. databases).""" + +import os +import pathlib +from importlib.resources import files + + +__all__ = [ + 'resolve_default_data_path', + 'DEFAULT_XAIG_DB_PATH', + 'DEFAULT_AIG_DB_PATH', +] + + +def resolve_default_data_path(data_path: os.PathLike[str]) -> pathlib.Path: + """ + Resolves `Traversable` path to default data item (e.g. database of small circuits) + based on given relative path to data file. + + :param data_path: relative to the `data/` directory path to the data file. + + """ + return pathlib.Path(files("cirbo").joinpath(f"data/{data_path}")) # type: ignore + + +DEFAULT_XAIG_DB_PATH = resolve_default_data_path(pathlib.Path("xaig_db.bin.xz")) +DEFAULT_AIG_DB_PATH = resolve_default_data_path(pathlib.Path("aig_db.bin.xz")) diff --git a/cirbo/circuits_db/db.py b/cirbo/circuits_db/db.py index ee509857..3a695725 100644 --- a/cirbo/circuits_db/db.py +++ b/cirbo/circuits_db/db.py @@ -31,6 +31,11 @@ class CircuitsDatabase: circuits. It supports operations such as opening and closing the database, adding circuits, and querying circuits based on labels and truth tables. + Default (pre-calculated) databases are accessible through: + ```py + from cirbo.circuits_db.data_utils import DEFAULT_AIG_DB_PATH, DEFAULT_XAIG_DB_PATH + ``` + """ def __init__(self, db_source: tp.Optional[tp.Union[tp.BinaryIO, Path, str]] = None): diff --git a/cirbo/core/circuit/circuit.py b/cirbo/core/circuit/circuit.py index 1833ee1e..40cfdd55 100644 --- a/cirbo/core/circuit/circuit.py +++ b/cirbo/core/circuit/circuit.py @@ -6,6 +6,7 @@ import io import itertools import logging +import os import pathlib import textwrap import typing as tp @@ -169,7 +170,7 @@ class Circuit(Function): """ @staticmethod - def from_bench_file(file_path: str) -> "Circuit": + def from_bench_file(file_path: tp.Union[str, os.PathLike[str]]) -> "Circuit": """ Initialization the circuit with given data from file. diff --git a/data/aig_db.bin.xz b/cirbo/data/aig_db.bin.xz similarity index 100% rename from data/aig_db.bin.xz rename to cirbo/data/aig_db.bin.xz diff --git a/data/circuit.bench b/cirbo/data/simple_circuit.bench similarity index 100% rename from data/circuit.bench rename to cirbo/data/simple_circuit.bench diff --git a/data/xaig_db.bin.xz b/cirbo/data/xaig_db.bin.xz similarity index 100% rename from data/xaig_db.bin.xz rename to cirbo/data/xaig_db.bin.xz diff --git a/tests/conftest.py b/tests/conftest.py index cbdcfc10..b5391201 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,14 +1,17 @@ +from cirbo.circuits_db.data_utils import DEFAULT_AIG_DB_PATH, DEFAULT_XAIG_DB_PATH + + def pytest_addoption(parser): parser.addoption( "--db-xaig-path", action="store", - default="./data/xaig_db.bin.xz", + default=DEFAULT_XAIG_DB_PATH, help="Path to the xaig database file", ) parser.addoption( "--db-aig-path", action="store", - default="./data/aig_db.bin.xz", + default=DEFAULT_AIG_DB_PATH, help="Path to the aig database file", ) diff --git a/tutorial/checking_satisfiability.py b/tutorial/checking_satisfiability.py index d7b9bb48..c278ef04 100644 --- a/tutorial/checking_satisfiability.py +++ b/tutorial/checking_satisfiability.py @@ -1,8 +1,13 @@ +import pathlib + +from cirbo.circuits_db.data_utils import resolve_default_data_path from cirbo.core.circuit import Circuit from cirbo.sat import is_circuit_satisfiable -path = '../data/circuit.bench' +path = resolve_default_data_path(pathlib.Path('simple_circuit.bench')) ckt = Circuit.from_bench_file(path) +print(ckt) + result = is_circuit_satisfiable(ckt) print(result.answer)