|
|
- #!python3
-
- from pysat.formula import CNF
- from pysat.solvers import Glucose4
-
- import pathlib as pl
- import random
- import bz2
- import sys
-
- CORE_DIR = pl.Path("./cores")
- EXTENDED_DIR = pl.Path("./extended")
-
- usage_str = "usage: gen_eq_instance.py [instance dir] [num per instance]"
-
- def main():
- instances_dir = None
-
- try:
- instances_dir = pl.Path(sys.argv[1])
- except:
- print(usage_str)
- return
- else:
- if not instances_dir.is_dir():
- print(usage_str)
- return
-
- num_per_instance = 0
- try:
- num_per_instance = int(sys.argv[2])
- except:
- print(usage_str)
- return
-
-
- instances = get_instance_paths(instances_dir)
-
- for instance in instances:
- run(instance, num_per_instance)
-
- def get_instance_paths(instances_dir):
- instances = []
-
- for p in instances_dir.iterdir():
- if str(p).endswith(".cnf.bz2"):
- instances.append(p)
-
- return instances
-
- def run(instance, calls_per_instance):
- ipath = pl.Path(instance)
- iname = ipath.stem[:-4]
-
- f = CNF(str(ipath))
-
- for i in range(calls_per_instance):
- extension = gen_extension(iname, len(f.clauses) / 10)
-
- ext_f = CNF()
- ext_f.extend(extension)
-
- print(iname)
- print(len(f.clauses))
- print()
-
- fpath, nr = next_file_path(iname)
- ext_f.to_file(fpath,
- comments=["c extending:{} nr:{}".format(iname, nr),
- "c number of cores: {}".format(len(extension))],
- compress_with="bzip2")
-
- def gen_extension(instance, expected_num_of_core):
- cores = parse_cores(instance)
-
- p = expected_num_of_core / len(cores)
-
- extension = []
-
- print((expected_num_of_core * 10) / len(cores))
- print(expected_num_of_core * 10, len(cores))
-
- for core in cores:
- if p >= random.random():
- extension.append(core)
-
- return extension
-
- def parse_cores(instance):
- cores = []
-
- with bz2.open(CORE_DIR / (instance + ".cores.bz2"), "tr") as cores_file:
- cores = list(map(lambda l: l.strip(), cores_file.readlines()))
-
- cores = list(map(lambda l: l.split(","), cores))
-
- for i in range(len(cores)):
- cores[i] = list(map(int, cores[i]))
- cores[i] = list(map(lambda lit: -1 * lit, cores[i]))
-
- return cores
-
- def next_file_path(name):
- counter = 0
-
- ext_file_path = EXTENDED_DIR / ("{}_{:04}.cnf.bz2".format(name, counter))
-
- while ext_file_path.exists():
- counter += 1
- ext_file_path = EXTENDED_DIR / ("{}_{:04}.cnf.bz2".format(name, counter))
-
- return ext_file_path, counter
-
- if __name__ == "__main__":
- main()
|