gen eq instances
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
extended/*
|
117
gen_eq_instances.py
Executable file
117
gen_eq_instances.py
Executable file
@@ -0,0 +1,117 @@
|
|||||||
|
#!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)
|
||||||
|
|
||||||
|
#tmp_f = f.copy()
|
||||||
|
#tmp_f.extend(extension)
|
||||||
|
|
||||||
|
ext_f = CNF()
|
||||||
|
ext_f.extend(extension)
|
||||||
|
|
||||||
|
print(iname)
|
||||||
|
print(len(f.clauses))
|
||||||
|
print()
|
||||||
|
|
||||||
|
ext_f.to_file(next_file_path(iname),
|
||||||
|
comments=["c {} core extended".format(iname),
|
||||||
|
"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
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
Reference in New Issue
Block a user