Source code for classic_solve_UDMISes

"""Solves UDMIS instances with Gurobi, recording the objectives and solution times.

USAGE:
    python -m classic_solve_UDMISes | tee ./run_logs/classic_solutions/UDMIS.log


Relies on :py:func:`MIS_inst.create_orig_MIS_IP` to create the MIP model. The
solution itself is implemented in :py:func:`solve_UDMIS_classically`.
"""
from gurobipy import GRB
from time import time
from glob import glob
import pandas as pd
import json
from MIS_inst import load_orig_MIS, create_orig_MIS_IP


[docs] def solve_UDMIS_classically(instance_file, quiet=True, timeout=None) -> None: """Solves the MIS instance using Gurobi. Uses :py:func:`MIS_inst.create_orig_MIS_IP` to create the model. """ G, origjs = load_orig_MIS(instance_file) start = time() model, x = create_orig_MIS_IP(G) if quiet: model.setParam("OutputFlag", 0) if timeout is not None: model.setParam("TimeLimit", timeout) model.update() model.optimize() end = time() if timeout is None: assert model.status == GRB.OPTIMAL else: assert (model.status == GRB.OPTIMAL) or (model.status == GRB.TIME_LIMIT) obj = model.objVal return pd.DataFrame([{ "instance_id": origjs["description"]["instance_id"], "sol_time": end - start, "status": model.status, "solution": "".join([str(int(x[list(G.nodes)[i]].X)) for i in range(len(G.nodes))]), "objective": obj, "gap": model.MIPGap }])
[docs] def main(): """Main script code (specifies timeout and filenames). Solves all instances given by ``./instances/orig/UDMIS*.json`` and saves the results into ``./run_logs/classic_solutions/UDMIS.csv``. """ df = pd.DataFrame(columns=[ "instance_id", "sol_time", "status", "solution", "objective", "gap"]) for filename in glob("./instances/orig/UDMIS*.json"): print(f"Solving {filename}...", flush=True, end="") df = pd.concat([df, solve_UDMIS_classically(filename, timeout = 30*60)]) df.to_csv("./run_logs/classic_solutions/UDMIS.csv", index=False) print(f"({df['sol_time'].iloc[-1]:.1f} sec.) ✅", flush=True)
if __name__ == '__main__': main()