From b609b4a0ee2da6226e79c80a43790d5f87a9abb2 Mon Sep 17 00:00:00 2001 From: Alinson S Xavier Date: Wed, 26 Feb 2020 13:28:16 -0600 Subject: [PATCH] Include objective sense in benchmark file; update charts --- benchmark/benchmark.py | 9 ++++++++- miplearn/benchmark.py | 7 ++++++- miplearn/solvers.py | 7 +++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/benchmark/benchmark.py b/benchmark/benchmark.py index 3744805..31a5f72 100755 --- a/benchmark/benchmark.py +++ b/benchmark/benchmark.py @@ -114,6 +114,13 @@ def charts(): benchmark.load_results("%s/benchmark_ml.csv" % basepath) results = benchmark.raw_results() results["Gap (%)"] = results["Gap"] * 100.0 + + sense = results.loc[0, "Sense"] + if sense == "min": + primal_column = "Relative Upper Bound" + else: + primal_column = "Relative Lower Bound" + palette={ "baseline": "#9b59b6", "ml-exact": "#3498db", @@ -151,7 +158,7 @@ def charts(): ); axes[2].set_ylim(0.95,1.01) sns.stripplot(x="Solver", - y="Relative Lower Bound", + y=primal_column, jitter=0.25, data=results[results["Solver"] == "ml-heuristic"], ax=axes[2], diff --git a/miplearn/benchmark.py b/miplearn/benchmark.py index 8525d53..c46c009 100644 --- a/miplearn/benchmark.py +++ b/miplearn/benchmark.py @@ -31,7 +31,10 @@ class BenchmarkRunner: label="Solve (%s)" % name, collect_training_data=False) for i in range(len(instances)): - self._push_result(results[i], solver=solver, name=name, instance=i) + self._push_result(results[i], + solver=solver, + name=name, + instance=i) def raw_results(self): return self.results @@ -60,6 +63,7 @@ class BenchmarkRunner: "Gap", "Nodes", "Mode", + "Sense", ]) lb = result["Lower bound"] ub = result["Upper bound"] @@ -73,6 +77,7 @@ class BenchmarkRunner: "Gap": gap, "Nodes": result["Nodes"], "Mode": solver.mode, + "Sense": result["Sense"], }, ignore_index=True) groups = self.results.groupby("Instance") best_lower_bound = groups["Lower Bound"].transform("max") diff --git a/miplearn/solvers.py b/miplearn/solvers.py index 9077639..7449129 100644 --- a/miplearn/solvers.py +++ b/miplearn/solvers.py @@ -94,8 +94,13 @@ class InternalSolver: (count_fixed, count_total)) def set_model(self, model): + from pyomo.core.kernel.objective import minimize, maximize self.model = model self.solver.set_instance(model) + if self.solver._objective.sense == minimize: + self.sense = "min" + else: + self.sense = "max" self.var_name_to_var = {} for var in model.component_objects(Var): self.var_name_to_var[var.name] = var @@ -140,6 +145,7 @@ class GurobiSolver(InternalSolver): "Upper bound": results["Problem"][0]["Upper bound"], "Wallclock time": results["Solver"][0]["Wallclock time"], "Nodes": self.solver._solver_model.getAttr("NodeCount"), + "Sense": self.sense, } def _load_vars(self): @@ -179,6 +185,7 @@ class CPLEXSolver(InternalSolver): "Upper bound": results["Problem"][0]["Upper bound"], "Wallclock time": results["Solver"][0]["Wallclock time"], "Nodes": 1, + "Sense": self.sense, } def solve_lp(self, tee=False):