You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
44 lines
1.6 KiB
44 lines
1.6 KiB
# MIPLearn: Extensible Framework for Learning-Enhanced Mixed-Integer Optimization
|
|
# Copyright (C) 2020-2022, UChicago Argonne, LLC. All rights reserved.
|
|
# Released under the modified BSD license. See COPYING.md for more details.
|
|
|
|
import json
|
|
from typing import Any, Dict, List
|
|
|
|
import gurobipy as gp
|
|
|
|
from ..h5 import H5File
|
|
|
|
|
|
class ExpertLazyComponent:
|
|
def __init__(self) -> None:
|
|
pass
|
|
|
|
def fit(self, train_h5: List[str]) -> None:
|
|
pass
|
|
|
|
def before_mip(self, test_h5: str, model: gp.Model, stats: Dict[str, Any]) -> None:
|
|
with H5File(test_h5, "r") as h5:
|
|
constr_names = h5.get_array("static_constr_names")
|
|
constr_lazy = h5.get_array("mip_constr_lazy")
|
|
constr_violations = h5.get_scalar("mip_constr_violations")
|
|
|
|
assert constr_names is not None
|
|
assert constr_violations is not None
|
|
|
|
# Static lazy constraints
|
|
n_static_lazy = 0
|
|
if constr_lazy is not None:
|
|
for (constr_idx, constr_name) in enumerate(constr_names):
|
|
if constr_lazy[constr_idx]:
|
|
constr = model.getConstrByName(constr_name.decode())
|
|
constr.lazy = 3
|
|
n_static_lazy += 1
|
|
stats.update({"Static lazy constraints": n_static_lazy})
|
|
|
|
# Dynamic lazy constraints
|
|
if hasattr(model, "_fix_violations"):
|
|
violations = json.loads(constr_violations)
|
|
model._fix_violations(model, violations, "aot")
|
|
stats.update({"Dynamic lazy constraints": len(violations)})
|