|
|
- #!python3
-
- from pysat.formula import CNF
- from pysat.solvers import Glucose4
-
- import pathlib as pl
- import random
- import bz2
- import sys
- import argparse
-
- CORE_DIR = pl.Path("./cores")
- EXTENDED_DIR = pl.Path("./extensions")
-
-
- def main():
- args = parse_args()
-
- instances = get_instance_paths(pl.Path(args.instance_dir))
-
- CORE_DIR = pl.Path(args.cores_dir)
- EXTENDED_DIR = pl.Path(args.extensions_dir)
-
- for instance in instances:
- run(instance, args.nr_per_instance, args.verbosity > 0)
-
- def parse_args():
- parser = argparse.ArgumentParser()
- parser.add_argument( "-i"
- ,"--instance_dir"
- ,type=str
- ,default="./instances"
- ,help="directory containing the instances")
- parser.add_argument( "-c"
- ,"--cores_dir"
- ,type=str
- ,default="./cores"
- ,help="directory containing the cores")
- parser.add_argument( "-e"
- ,"--extensions_dir"
- ,type=str
- ,default="./extensions"
- ,help="directory target directory to store the generated core extensions")
- parser.add_argument( "-n"
- ,"--nr_per_instance"
- ,type=int
- ,default=1
- ,help="number of extensions per instance")
- parser.add_argument( "-v"
- ,"--verbosity"
- ,type=int
- ,default=1
- ,help="1 to print progress, 0 for silent mode")
-
- return parser.parse_args()
-
- 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, verb):
- ipath = pl.Path(instance)
- iname = ipath.stem[:-4]
-
- f = CNF(str(ipath))
-
- cores = parse_cores(iname)
-
-
- for i in range(calls_per_instance):
- extension = gen_extension(cores)
-
- if verb and i % 20 == 0:
- print("instance: {}".format(iname))
-
- if verb:
- print("extension: {} | #cores: {} ({:2.2f}%)".format(i+1, len(extension), 100 * len(extension) / len(cores)))
-
- ext_f = CNF()
- ext_f.extend(extension)
-
- fpath, nr = next_file_path(iname)
-
- if not EXTENDED_DIR.exists():
- EXTENDED_DIR.mkdir(parents=True)
-
- ext_f.to_file(fpath,
- comments=["c extending:{} nr:{}".format(iname, nr),
- "c number of cores: {}".format(len(extension))],
- compress_with="bzip2")
-
- if verb:
- print()
-
- def gen_extension(cores):
-
- p = (len(cores) / 10 ) / len(cores)
-
- extension = []
- while len(extension) == 0:
- 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()
|