Include objective sense in benchmark file; update charts

pull/1/head
Alinson S. Xavier 6 years ago
parent 9a2dd52566
commit b609b4a0ee
No known key found for this signature in database
GPG Key ID: A796166E4E218E02

@ -114,6 +114,13 @@ def charts():
benchmark.load_results("%s/benchmark_ml.csv" % basepath) benchmark.load_results("%s/benchmark_ml.csv" % basepath)
results = benchmark.raw_results() results = benchmark.raw_results()
results["Gap (%)"] = results["Gap"] * 100.0 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={ palette={
"baseline": "#9b59b6", "baseline": "#9b59b6",
"ml-exact": "#3498db", "ml-exact": "#3498db",
@ -151,7 +158,7 @@ def charts():
); );
axes[2].set_ylim(0.95,1.01) axes[2].set_ylim(0.95,1.01)
sns.stripplot(x="Solver", sns.stripplot(x="Solver",
y="Relative Lower Bound", y=primal_column,
jitter=0.25, jitter=0.25,
data=results[results["Solver"] == "ml-heuristic"], data=results[results["Solver"] == "ml-heuristic"],
ax=axes[2], ax=axes[2],

@ -31,7 +31,10 @@ class BenchmarkRunner:
label="Solve (%s)" % name, label="Solve (%s)" % name,
collect_training_data=False) collect_training_data=False)
for i in range(len(instances)): 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): def raw_results(self):
return self.results return self.results
@ -60,6 +63,7 @@ class BenchmarkRunner:
"Gap", "Gap",
"Nodes", "Nodes",
"Mode", "Mode",
"Sense",
]) ])
lb = result["Lower bound"] lb = result["Lower bound"]
ub = result["Upper bound"] ub = result["Upper bound"]
@ -73,6 +77,7 @@ class BenchmarkRunner:
"Gap": gap, "Gap": gap,
"Nodes": result["Nodes"], "Nodes": result["Nodes"],
"Mode": solver.mode, "Mode": solver.mode,
"Sense": result["Sense"],
}, ignore_index=True) }, ignore_index=True)
groups = self.results.groupby("Instance") groups = self.results.groupby("Instance")
best_lower_bound = groups["Lower Bound"].transform("max") best_lower_bound = groups["Lower Bound"].transform("max")

@ -94,8 +94,13 @@ class InternalSolver:
(count_fixed, count_total)) (count_fixed, count_total))
def set_model(self, model): def set_model(self, model):
from pyomo.core.kernel.objective import minimize, maximize
self.model = model self.model = model
self.solver.set_instance(model) self.solver.set_instance(model)
if self.solver._objective.sense == minimize:
self.sense = "min"
else:
self.sense = "max"
self.var_name_to_var = {} self.var_name_to_var = {}
for var in model.component_objects(Var): for var in model.component_objects(Var):
self.var_name_to_var[var.name] = var self.var_name_to_var[var.name] = var
@ -140,6 +145,7 @@ class GurobiSolver(InternalSolver):
"Upper bound": results["Problem"][0]["Upper bound"], "Upper bound": results["Problem"][0]["Upper bound"],
"Wallclock time": results["Solver"][0]["Wallclock time"], "Wallclock time": results["Solver"][0]["Wallclock time"],
"Nodes": self.solver._solver_model.getAttr("NodeCount"), "Nodes": self.solver._solver_model.getAttr("NodeCount"),
"Sense": self.sense,
} }
def _load_vars(self): def _load_vars(self):
@ -179,6 +185,7 @@ class CPLEXSolver(InternalSolver):
"Upper bound": results["Problem"][0]["Upper bound"], "Upper bound": results["Problem"][0]["Upper bound"],
"Wallclock time": results["Solver"][0]["Wallclock time"], "Wallclock time": results["Solver"][0]["Wallclock time"],
"Nodes": 1, "Nodes": 1,
"Sense": self.sense,
} }
def solve_lp(self, tee=False): def solve_lp(self, tee=False):

Loading…
Cancel
Save