#!python3
|
|
|
|
from pysat.formula import CNF
|
|
from pysat.solvers import Glucose4
|
|
|
|
import pathlib as pl
|
|
import random
|
|
import bz2
|
|
import sys
|
|
import argparse
|
|
|
|
|
|
def main():
|
|
args = parse_args()
|
|
|
|
instances = get_instance_paths(pl.Path(args.instance_dir))
|
|
|
|
global CORE_DIR
|
|
CORE_DIR = pl.Path(args.cores_dir)
|
|
|
|
global EXTENDED_DIR
|
|
EXTENDED_DIR = pl.Path(args.extensions_dir)
|
|
|
|
print(CORE_DIR)
|
|
|
|
for instance in instances:
|
|
run(instance, args.nr_per_instance)
|
|
|
|
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 containing the core extensions")
|
|
parser.add_argument( "-n"
|
|
,"--nr_per_instance"
|
|
,type=int
|
|
,default=1
|
|
,help="number of extensions per instance")
|
|
|
|
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):
|
|
ipath = pl.Path(instance)
|
|
iname = ipath.stem[:-4]
|
|
|
|
f = CNF(str(ipath))
|
|
|
|
for i in range(calls_per_instance):
|
|
cores = parse_cores(iname)
|
|
|
|
print(iname)
|
|
print(len(f.clauses), len(cores))
|
|
print("{0:.3g}".format(len(cores) * 100 / len(f.clauses)))
|
|
|
|
print()
|
|
|
|
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()
|