mirror of
https://github.com/ANL-CEEESA/MIPLearn.git
synced 2025-12-06 01:18:52 -06:00
Rename before/after_solve to before/after_solve_mip
This commit is contained in:
@@ -21,14 +21,14 @@ class Component(ABC):
|
||||
strategy.
|
||||
"""
|
||||
|
||||
def before_solve(
|
||||
def before_solve_mip(
|
||||
self,
|
||||
solver: "LearningSolver",
|
||||
instance: Instance,
|
||||
model: Any,
|
||||
) -> None:
|
||||
"""
|
||||
Method called by LearningSolver before the problem is solved.
|
||||
Method called by LearningSolver before the MIP is solved.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
@@ -42,7 +42,7 @@ class Component(ABC):
|
||||
return
|
||||
|
||||
@abstractmethod
|
||||
def after_solve(
|
||||
def after_solve_mip(
|
||||
self,
|
||||
solver: "LearningSolver",
|
||||
instance: Instance,
|
||||
@@ -51,7 +51,7 @@ class Component(ABC):
|
||||
training_data: TrainingSample,
|
||||
) -> None:
|
||||
"""
|
||||
Method called by LearningSolver after the problem is solved to optimality.
|
||||
Method called by LearningSolver after the MIP is solved.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
|
||||
@@ -21,11 +21,11 @@ class CompositeComponent(Component):
|
||||
def __init__(self, children):
|
||||
self.children = children
|
||||
|
||||
def before_solve(self, solver, instance, model):
|
||||
def before_solve_mip(self, solver, instance, model):
|
||||
for child in self.children:
|
||||
child.before_solve(solver, instance, model)
|
||||
child.before_solve_mip(solver, instance, model)
|
||||
|
||||
def after_solve(
|
||||
def after_solve_mip(
|
||||
self,
|
||||
solver,
|
||||
instance,
|
||||
@@ -34,7 +34,7 @@ class CompositeComponent(Component):
|
||||
training_data,
|
||||
):
|
||||
for child in self.children:
|
||||
child.after_solve(solver, instance, model, stats, training_data)
|
||||
child.after_solve_mip(solver, instance, model, stats, training_data)
|
||||
|
||||
def fit(self, training_instances):
|
||||
for child in self.children:
|
||||
|
||||
@@ -33,7 +33,7 @@ class UserCutsComponent(Component):
|
||||
self.classifier_prototype: Classifier = classifier
|
||||
self.classifiers: Dict[Any, Classifier] = {}
|
||||
|
||||
def before_solve(self, solver, instance, model):
|
||||
def before_solve_mip(self, solver, instance, model):
|
||||
instance.found_violated_user_cuts = []
|
||||
logger.info("Predicting violated user cuts...")
|
||||
violations = self.predict(instance)
|
||||
@@ -42,7 +42,7 @@ class UserCutsComponent(Component):
|
||||
cut = instance.build_user_cut(model, v)
|
||||
solver.internal_solver.add_constraint(cut)
|
||||
|
||||
def after_solve(
|
||||
def after_solve_mip(
|
||||
self,
|
||||
solver,
|
||||
instance,
|
||||
|
||||
@@ -33,7 +33,7 @@ class DynamicLazyConstraintsComponent(Component):
|
||||
self.classifier_prototype: Classifier = classifier
|
||||
self.classifiers: Dict[Any, Classifier] = {}
|
||||
|
||||
def before_solve(self, solver, instance, model):
|
||||
def before_solve_mip(self, solver, instance, model):
|
||||
instance.found_violated_lazy_constraints = []
|
||||
logger.info("Predicting violated lazy constraints...")
|
||||
violations = self.predict(instance)
|
||||
@@ -54,7 +54,7 @@ class DynamicLazyConstraintsComponent(Component):
|
||||
solver.internal_solver.add_constraint(cut)
|
||||
return True
|
||||
|
||||
def after_solve(
|
||||
def after_solve_mip(
|
||||
self,
|
||||
solver,
|
||||
instance,
|
||||
|
||||
@@ -40,7 +40,7 @@ class StaticLazyConstraintsComponent(Component):
|
||||
self.use_two_phase_gap = use_two_phase_gap
|
||||
self.violation_tolerance = violation_tolerance
|
||||
|
||||
def before_solve(self, solver, instance, model):
|
||||
def before_solve_mip(self, solver, instance, model):
|
||||
self.pool = []
|
||||
if not solver.use_lazy_cb and self.use_two_phase_gap:
|
||||
logger.info("Increasing gap tolerance to %f", self.large_gap)
|
||||
@@ -52,7 +52,7 @@ class StaticLazyConstraintsComponent(Component):
|
||||
if instance.has_static_lazy_constraints():
|
||||
self._extract_and_predict_static(solver, instance)
|
||||
|
||||
def after_solve(
|
||||
def after_solve_mip(
|
||||
self,
|
||||
solver,
|
||||
instance,
|
||||
|
||||
@@ -44,7 +44,7 @@ class ObjectiveValueComponent(Component):
|
||||
self._predicted_ub: Optional[float] = None
|
||||
self._predicted_lb: Optional[float] = None
|
||||
|
||||
def before_solve(
|
||||
def before_solve_mip(
|
||||
self,
|
||||
solver: "LearningSolver",
|
||||
instance: Instance,
|
||||
@@ -63,7 +63,7 @@ class ObjectiveValueComponent(Component):
|
||||
)
|
||||
)
|
||||
|
||||
def after_solve(
|
||||
def after_solve_mip(
|
||||
self,
|
||||
solver: "LearningSolver",
|
||||
instance: Instance,
|
||||
|
||||
@@ -52,7 +52,7 @@ class PrimalSolutionComponent(Component):
|
||||
self._n_zero = 0
|
||||
self._n_one = 0
|
||||
|
||||
def before_solve(self, solver, instance, model):
|
||||
def before_solve_mip(self, solver, instance, model):
|
||||
if len(self.thresholds) > 0:
|
||||
logger.info("Predicting primal solution...")
|
||||
solution = self.predict(instance)
|
||||
@@ -77,7 +77,7 @@ class PrimalSolutionComponent(Component):
|
||||
else:
|
||||
solver.internal_solver.set_warm_start(solution)
|
||||
|
||||
def after_solve(
|
||||
def after_solve_mip(
|
||||
self,
|
||||
solver: "LearningSolver",
|
||||
instance: Instance,
|
||||
|
||||
@@ -46,7 +46,7 @@ class ConvertTightIneqsIntoEqsStep(Component):
|
||||
self.converted = []
|
||||
self.original_sense = {}
|
||||
|
||||
def before_solve(self, solver, instance, _):
|
||||
def before_solve_mip(self, solver, instance, _):
|
||||
logger.info("Predicting tight LP constraints...")
|
||||
x, constraints = DropRedundantInequalitiesStep._x_test(
|
||||
instance,
|
||||
@@ -73,7 +73,7 @@ class ConvertTightIneqsIntoEqsStep(Component):
|
||||
|
||||
logger.info(f"Converted {self.n_converted} inequalities")
|
||||
|
||||
def after_solve(
|
||||
def after_solve_mip(
|
||||
self,
|
||||
solver,
|
||||
instance,
|
||||
|
||||
@@ -50,7 +50,7 @@ class DropRedundantInequalitiesStep(Component):
|
||||
self.total_kept = 0
|
||||
self.total_iterations = 0
|
||||
|
||||
def before_solve(self, solver, instance, _):
|
||||
def before_solve_mip(self, solver, instance, _):
|
||||
self.current_iteration = 0
|
||||
|
||||
logger.info("Predicting redundant LP constraints...")
|
||||
@@ -79,7 +79,7 @@ class DropRedundantInequalitiesStep(Component):
|
||||
self.total_kept += 1
|
||||
logger.info(f"Extracted {self.total_dropped} predicted constraints")
|
||||
|
||||
def after_solve(
|
||||
def after_solve_mip(
|
||||
self,
|
||||
solver,
|
||||
instance,
|
||||
|
||||
@@ -14,11 +14,11 @@ class RelaxIntegralityStep(Component):
|
||||
Component that relaxes all integrality constraints before the problem is solved.
|
||||
"""
|
||||
|
||||
def before_solve(self, solver, instance, _):
|
||||
def before_solve_mip(self, solver, instance, _):
|
||||
logger.info("Relaxing integrality...")
|
||||
solver.internal_solver.relax()
|
||||
|
||||
def after_solve(
|
||||
def after_solve_mip(
|
||||
self,
|
||||
solver,
|
||||
instance,
|
||||
|
||||
@@ -86,7 +86,7 @@ class LearningSolver:
|
||||
If true, use native solver callbacks for enforcing lazy constraints,
|
||||
instead of a simple loop. May not be supported by all solvers.
|
||||
solve_lp_first: bool
|
||||
If true, solve LP relaxation first, then solve original MILP. This
|
||||
If true, solve LP relaxation first, then solve original MIP. This
|
||||
option should be activated if the LP relaxation is not very
|
||||
expensive to solve and if it provides good hints for the integer
|
||||
solution.
|
||||
@@ -187,9 +187,9 @@ class LearningSolver:
|
||||
training_sample["LP value"] = 0.0
|
||||
|
||||
# Before-solve callbacks
|
||||
logger.debug("Running before_solve callbacks...")
|
||||
logger.debug("Running before_solve_mip callbacks...")
|
||||
for component in self.components.values():
|
||||
component.before_solve(self, instance, model)
|
||||
component.before_solve_mip(self, instance, model)
|
||||
|
||||
# Define wrappers
|
||||
def iteration_cb_wrapper() -> bool:
|
||||
@@ -212,8 +212,8 @@ class LearningSolver:
|
||||
if self.use_lazy_cb:
|
||||
lazy_cb = lazy_cb_wrapper
|
||||
|
||||
# Solve MILP
|
||||
logger.info("Solving MILP...")
|
||||
# Solve MIP
|
||||
logger.info("Solving MIP...")
|
||||
stats = cast(
|
||||
LearningSolveStats,
|
||||
self.internal_solver.solve(
|
||||
@@ -238,9 +238,9 @@ class LearningSolver:
|
||||
training_sample["Solution"] = self.internal_solver.get_solution()
|
||||
|
||||
# After-solve callbacks
|
||||
logger.debug("Calling after_solve callbacks...")
|
||||
logger.debug("Calling after_solve_mip callbacks...")
|
||||
for component in self.components.values():
|
||||
component.after_solve(self, instance, model, stats, training_sample)
|
||||
component.after_solve_mip(self, instance, model, stats, training_sample)
|
||||
|
||||
# Write to file, if necessary
|
||||
if not discard_output and filename is not None:
|
||||
|
||||
Reference in New Issue
Block a user