diff --git a/miplearn/components/static_lazy.py b/miplearn/components/static_lazy.py index ebf204b..b8dfa29 100644 --- a/miplearn/components/static_lazy.py +++ b/miplearn/components/static_lazy.py @@ -78,7 +78,7 @@ class StaticLazyConstraintsComponent(Component): assert solver.internal_solver is not None assert sample.after_load is not None assert sample.after_load.instance is not None - assert sample.after_load.constraints is not None + assert sample.after_load.constraints_old is not None logger.info("Predicting violated (static) lazy constraints...") if sample.after_load.instance.lazy_constraint_count == 0: @@ -86,7 +86,7 @@ class StaticLazyConstraintsComponent(Component): self.enforced_cids = set(self.sample_predict(sample)) logger.info("Moving lazy constraints to the pool...") self.pool = {} - for (cid, cdict) in sample.after_load.constraints.items(): + for (cid, cdict) in sample.after_load.constraints_old.items(): if cdict.lazy and cid not in self.enforced_cids: self.pool[cid] = cdict solver.internal_solver.remove_constraint(cid) @@ -194,8 +194,8 @@ class StaticLazyConstraintsComponent(Component): y: Dict[Hashable, List[List[float]]] = {} cids: Dict[Hashable, List[str]] = {} assert sample.after_load is not None - assert sample.after_load.constraints is not None - for (cid, constr) in sample.after_load.constraints.items(): + assert sample.after_load.constraints_old is not None + for (cid, constr) in sample.after_load.constraints_old.items(): # Initialize categories if not constr.lazy: continue @@ -213,9 +213,9 @@ class StaticLazyConstraintsComponent(Component): sf = sample.after_lp assert sf.instance is not None features = list(sf.instance.to_list()) - assert sf.constraints is not None - assert sf.constraints[cid] is not None - features.extend(sf.constraints[cid].to_list()) + assert sf.constraints_old is not None + assert sf.constraints_old[cid] is not None + features.extend(sf.constraints_old[cid].to_list()) x[category].append(features) cids[category].append(cid) diff --git a/miplearn/features.py b/miplearn/features.py index a1c7cba..f249056 100644 --- a/miplearn/features.py +++ b/miplearn/features.py @@ -116,7 +116,7 @@ class Constraint: class Features: instance: Optional[InstanceFeatures] = None variables: Optional[VariableFeatures] = None - constraints: Optional[Dict[str, Constraint]] = None + constraints_old: Optional[Dict[str, Constraint]] = None lp_solve: Optional["LPSolveStats"] = None mip_solve: Optional["MIPSolveStats"] = None extra: Optional[Dict] = None @@ -147,7 +147,7 @@ class FeaturesExtractor: with_static=with_static, with_sa=self.with_sa, ) - features.constraints = solver.get_constraints( + features.constraints_old = solver.get_constraints( with_static=with_static, ) if with_static: @@ -201,9 +201,9 @@ class FeaturesExtractor: instance: "Instance", features: Features, ) -> None: - assert features.constraints is not None + assert features.constraints_old is not None has_static_lazy = instance.has_static_lazy_constraints() - for (cid, constr) in features.constraints.items(): + for (cid, constr) in features.constraints_old.items(): user_features = None category = instance.get_constraint_category(cid) if category is not None: @@ -232,7 +232,7 @@ class FeaturesExtractor: instance: "Instance", features: Features, ) -> None: - assert features.constraints is not None + assert features.constraints_old is not None user_features = instance.get_instance_features() if isinstance(user_features, np.ndarray): user_features = user_features.tolist() @@ -246,7 +246,7 @@ class FeaturesExtractor: f"Found {type(v).__name__} instead." ) lazy_count = 0 - for (cid, cdict) in features.constraints.items(): + for (cid, cdict) in features.constraints_old.items(): if cdict.lazy: lazy_count += 1 features.instance = InstanceFeatures( diff --git a/tests/components/test_static_lazy.py b/tests/components/test_static_lazy.py index 5c3e6d5..7d0d7ab 100644 --- a/tests/components/test_static_lazy.py +++ b/tests/components/test_static_lazy.py @@ -32,7 +32,7 @@ def sample() -> Sample: instance=InstanceFeatures( lazy_constraint_count=4, ), - constraints={ + constraints_old={ "c1": Constraint(category="type-a", lazy=True), "c2": Constraint(category="type-a", lazy=True), "c3": Constraint(category="type-a", lazy=True), @@ -42,7 +42,7 @@ def sample() -> Sample: ), after_lp=Features( instance=InstanceFeatures(), - constraints={ + constraints_old={ "c1": Constraint(), "c2": Constraint(), "c3": Constraint(), @@ -57,16 +57,16 @@ def sample() -> Sample: ), ) sample.after_lp.instance.to_list = Mock(return_value=[5.0]) # type: ignore - sample.after_lp.constraints["c1"].to_list = Mock( # type: ignore + sample.after_lp.constraints_old["c1"].to_list = Mock( # type: ignore return_value=[1.0, 1.0] ) - sample.after_lp.constraints["c2"].to_list = Mock( # type: ignore + sample.after_lp.constraints_old["c2"].to_list = Mock( # type: ignore return_value=[1.0, 2.0] ) - sample.after_lp.constraints["c3"].to_list = Mock( # type: ignore + sample.after_lp.constraints_old["c3"].to_list = Mock( # type: ignore return_value=[1.0, 3.0] ) - sample.after_lp.constraints["c4"].to_list = Mock( # type: ignore + sample.after_lp.constraints_old["c4"].to_list = Mock( # type: ignore return_value=[1.0, 4.0, 0.0] ) return sample @@ -115,7 +115,7 @@ def test_usage_with_solver(instance: Instance) -> None: stats: LearningSolveStats = {} sample = instance.samples[0] assert sample.after_load is not None - assert sample.after_load.constraints is not None + assert sample.after_load.constraints_old is not None assert sample.after_mip is not None assert sample.after_mip.extra is not None del sample.after_mip.extra["lazy_enforced"] @@ -143,7 +143,7 @@ def test_usage_with_solver(instance: Instance) -> None: # Should ask internal solver to verify if constraints in the pool are # satisfied and add the ones that are not - c3 = sample.after_load.constraints["c3"] + c3 = sample.after_load.constraints_old["c3"] internal.is_constraint_satisfied.assert_called_once_with(c3, tol=1.0) internal.is_constraint_satisfied.reset_mock() internal.add_constraint.assert_called_once_with(c3, name="c3") diff --git a/tests/test_features.py b/tests/test_features.py index 9aab95b..1b2b938 100644 --- a/tests/test_features.py +++ b/tests/test_features.py @@ -27,7 +27,7 @@ def test_knapsack() -> None: features = FeaturesExtractor().extract(instance, solver) assert features.variables is not None - assert features.constraints is not None + assert features.constraints_old is not None assert features.instance is not None assert_equals( @@ -65,7 +65,7 @@ def test_knapsack() -> None: ), ) assert_equals( - _round_constraints(features.constraints), + _round_constraints(features.constraints_old), { "eq_capacity": Constraint( basis_status="N",