Store solution into instance object after solving

pull/1/head
Alinson S. Xavier 6 years ago
parent 4bf7636f51
commit 141c8f0fdf

@ -4,6 +4,7 @@
from . import WarmStartComponent, BranchPriorityComponent from . import WarmStartComponent, BranchPriorityComponent
import pyomo.environ as pe import pyomo.environ as pe
from pyomo.core import Var
from copy import deepcopy from copy import deepcopy
import pickle import pickle
from scipy.stats import randint from scipy.stats import randint
@ -76,7 +77,7 @@ class LearningSolver:
if self.threads is not None: if self.threads is not None:
self.internal_solver.options["Threads"] = self.threads self.internal_solver.options["Threads"] = self.threads
if self.time_limit is not None: if self.time_limit is not None:
self.internal_solver.options["TimeLimit"] = self.time_limit self.internal_solver.options["timelimit"] = self.time_limit
if self.gap_limit is not None: if self.gap_limit is not None:
self.internal_solver.options["MIPGap"] = self.gap_limit self.internal_solver.options["MIPGap"] = self.gap_limit
@ -100,6 +101,14 @@ class LearningSolver:
else: else:
solve_results = self.internal_solver.solve(model, tee=tee, warmstart=is_warm_start_available) solve_results = self.internal_solver.solve(model, tee=tee, warmstart=is_warm_start_available)
instance.solution = {}
instance.lower_bound = solve_results["Problem"][0]["Lower bound"]
instance.upper_bound = solve_results["Problem"][0]["Upper bound"]
for var in model.component_objects(Var):
instance.solution[str(var)] = {}
for index in var:
instance.solution[str(var)][index] = var[index].value
if self.internal_solver.name == "gurobi_persistent": if self.internal_solver.name == "gurobi_persistent":
solve_results["Solver"][0]["Nodes"] = self.internal_solver._solver_model.getAttr("NodeCount") solve_results["Solver"][0]["Nodes"] = self.internal_solver._solver_model.getAttr("NodeCount")
else: else:
@ -124,11 +133,22 @@ class LearningSolver:
solver.internal_solver = None solver.internal_solver = None
if not collect_training_data: if not collect_training_data:
solver.components = {} solver.components = {}
return solver, results return {
"solver": solver,
"results": results,
"solution": instance.solution,
"upper bound": instance.upper_bound,
"lower bound": instance.lower_bound,
}
solver_result_pairs = p_map(_process, instances, num_cpus=n_jobs, desc=label) p_map_results = p_map(_process, instances, num_cpus=n_jobs, desc=label)
subsolvers = [p[0] for p in solver_result_pairs] subsolvers = [p["solver"] for p in p_map_results]
results = [p[1] for p in solver_result_pairs] results = [p["results"] for p in p_map_results]
for (idx, r) in enumerate(p_map_results):
instances[idx].solution = r["solution"]
instances[idx].lower_bound = r["lower bound"]
instances[idx].upper_bound = r["upper bound"]
for (name, component) in self.components.items(): for (name, component) in self.components.items():
subcomponents = [subsolver.components[name] subcomponents = [subsolver.components[name]

@ -18,6 +18,13 @@ def test_solver():
instance = _get_instance() instance = _get_instance()
solver = LearningSolver() solver = LearningSolver()
solver.solve(instance) solver.solve(instance)
assert instance.solution["x"][0] == 1.0
assert instance.solution["x"][1] == 0.0
assert instance.solution["x"][2] == 1.0
assert instance.solution["x"][3] == 1.0
assert instance.lower_bound == 1183.0
assert instance.upper_bound == 1183.0
solver.fit() solver.fit()
solver.solve(instance) solver.solve(instance)
@ -52,3 +59,6 @@ def test_parallel_solve():
assert len(solver.components["warm-start"].x_train["default"]) == 40 assert len(solver.components["warm-start"].x_train["default"]) == 40
assert len(solver.components["warm-start"].y_train["default"]) == 40 assert len(solver.components["warm-start"].y_train["default"]) == 40
for instance in instances:
assert len(instance.solution["x"].keys()) == 4

Loading…
Cancel
Save