1
0
This repository has been archived on 2025-03-06. You can view files and clone it, but cannot push or open issues or pull requests.

169 lines
4.8 KiB
Python
Executable File

#!/usr/bin/env python3
import os
import sys
import time
import csv
MZNR_HOME = os.getcwd() + "/software/install/minizinc/bin"
os.environ["PATH"] = MZNR_HOME + ":" + os.environ["PATH"]
os.environ["MZN_SOLVER_PATH"] = (
os.getcwd() + "/software/install/gecode/share/minizinc/solvers"
)
import minizinc
MZA_HOME = os.getcwd() + "/software/mza"
sys.path.append(MZA_HOME)
mza_lib = os.getcwd() + "/software/install/mza/lib"
if sys.platform == "linux" or sys.platform == "linux2":
rerun = True
if not "LD_LIBRARY_PATH" in os.environ:
os.environ["LD_LIBRARY_PATH"] = mza_lib
elif not mza_lib in os.environ.get("LD_LIBRARY_PATH"):
os.environ["LD_LIBRARY_PATH"] += ":" + mza_lib
else:
rerun = False
if rerun:
os.execve(os.path.realpath(__file__), sys.argv, os.environ)
import mza
from mza import Instance
mza.DEBUG = False
SOLVER = "gecode_presolver"
PROTO_MODEL = "gbac/proto.uzn"
RESTART_MODEL = "gbac/on_restart.mzn"
DATA = [
"gbac/reduced_UD4-gbac.dzn",
"gbac/UD2-gbac.dzn",
"gbac/UD4-gbac.dzn",
"gbac/UD5-gbac.dzn",
"gbac/UD8-gbac.dzn",
]
FN_ID = "f_lex_obj_i"
N_NBH = 2
ROUNDS = 1000
RUNS = 1
def gbac_restart(data_file):
os.environ["MZN_STDLIB_DIR"] = (
os.getcwd() + "/software/install/minizinc/share/minizinc"
)
gecode = minizinc.Solver.lookup("gecode")
inst = minizinc.Instance(gecode, minizinc.Model(RESTART_MODEL))
inst.add_file(data_file)
args = {
"--restart": "constant",
"--restart-scale": 500,
"--restart-limit": ROUNDS,
}
res = inst.solve(**args)
return (
res.statistics["flatTime"].total_seconds(),
(res.statistics["initTime"] + res.statistics["solveTime"]).total_seconds(),
)
def gbac_incr(data_file):
os.environ["MZN_STDLIB_DIR"] = os.getcwd() + "/software/mza/share/minizinc"
compile_time = 0.0
solve_time = 0.0
incumbent = None
start = time.perf_counter()
mza.set_rnd_seed(0)
inst = Instance(PROTO_MODEL, data_file, "gecode_presolver")
compile_time += time.perf_counter() - start
start = time.perf_counter()
status, sol = inst.solve()
solve_time += time.perf_counter() - start
# print(f"{status}: {sol}")
assert status in ["SAT", "OPT"]
incumbent = sol
for i in range(1, ROUNDS):
mza.set_rnd_seed(i)
inst.set_limit(500)
with inst.branch() as child:
start = time.perf_counter()
child.add_call("f_LNS_i", i % 2)
compile_time += time.perf_counter() - start
start = time.perf_counter()
status, sol = child.solve()
solve_time += time.perf_counter() - start
# print(f"{status}: {sol}")
if status == "SAT" or status == "OPT":
incumbent = sol
assert status != "ERROR"
return compile_time, solve_time
def gbac_redo(data_file):
os.environ["MZN_STDLIB_DIR"] = os.getcwd() + "/software/mza/share/minizinc"
compile_time = 0.0
solve_time = 0.0
incumbent = None
for i in range(ROUNDS):
start = time.perf_counter()
mza.set_rnd_seed(i)
inst = Instance(PROTO_MODEL, data_file, "gecode_presolver")
inst.output_dict(True)
limit = 0
if i > 0:
inst.set_limit(500)
assert incumbent is not None
limit = 500
inst.set_incumbent(incumbent)
inst.add_call("f_LNS_i", i % 2)
compile_time += time.perf_counter() - start
start = time.perf_counter()
status, sol = inst.solve()
solve_time += time.perf_counter() - start
# print(
# f"{i} {status}: [{ ', '.join([str(v) for k, v in sol.items()]) if isinstance(sol, dict) else sol}]"
# )
if status == "SAT" or status == "OPT":
incumbent = sol
elif status == "ERROR":
print("ERROR!!!!")
exit(0)
return compile_time, solve_time
if __name__ == "__main__":
fieldnames = ["Configuration", "Data", "Compile Time (s)", "Solve Time (s)"]
writer = csv.writer(sys.stdout)
writer.writerow(fieldnames)
# --- Run Restart based strategy
for d in DATA:
t1, t2 = 0, 0
for i in range(RUNS):
ct, st = gbac_restart(d)
t1 += ct
t2 += st
writer.writerow(["RBS", d, t1 / RUNS, t2 / RUNS])
# --- Run incremental rewriting
for d in DATA:
t1, t2 = 0, 0
for i in range(RUNS):
ct, st = gbac_incr(d)
t1 += ct
t2 += st
writer.writerow(["Incr.", d, t1 / RUNS, t2 / RUNS])
# --- Run baseline
for d in DATA:
t1, t2 = 0, 0
for i in range(RUNS):
ct, st = gbac_redo(d)
t1 += ct * 10
t2 += st * 10
writer.writerow(["Base", d, t1 / RUNS, t2 / RUNS])