passing around allow slack

This commit is contained in:
Khalim Conn-Kowlessar 2026-02-18 12:11:14 +00:00
parent 8e22ced679
commit c08ab7a767
2 changed files with 15 additions and 17 deletions

View file

@ -1,6 +1,6 @@
from enum import Enum
from mip import OptimizationStatus
from typing import Sequence, Optional, TypedDict, List
from typing import Mapping, Optional, TypedDict, List
from recommendations.optimiser.CostOptimiser import CostOptimiser
from recommendations.optimiser.GainOptimiser import GainOptimiser
@ -41,9 +41,10 @@ class StrategicOptimiser:
def __init__(
self,
components: Sequence[Sequence[Measure]],
components: list[list[Mapping[str, int | float | str]]],
budget: Optional[float] = None,
target_gain: Optional[float] = None,
allow_slack: bool = False,
verbose: bool = False,
) -> None:
@ -57,6 +58,7 @@ class StrategicOptimiser:
self.budget = budget
self.target_gain = target_gain
self.verbose = verbose
self.allow_slack = allow_slack
self.solution: List[Measure] = []
self.solution_cost: float = 0.0
@ -128,7 +130,7 @@ class StrategicOptimiser:
self.components,
min_gain=self.target_gain,
verbose=self.verbose,
allow_slack=False
allow_slack=self.allow_slack
)
opt.setup()
@ -147,7 +149,7 @@ class StrategicOptimiser:
self.components,
max_cost=self.budget,
max_gain=None,
allow_slack=False,
allow_slack=self.allow_slack,
verbose=self.verbose
)

View file

@ -18,6 +18,7 @@ from backend.app.plan.schemas import (
)
from recommendations.optimiser.CostOptimiser import CostOptimiser
from recommendations.optimiser.GainOptimiser import GainOptimiser
from recommendations.optimiser.StrategicOptimiser import StrategicOptimiser
from utils.logger import setup_logger
from backend.Funding import Funding
from backend.app.BatterySapScorer import BatterySAPScorer
@ -1118,22 +1119,17 @@ def run_optimizer(
if not input_measures:
return None, 0.0, 0.0
if budget is not None:
opt = StrategicOptimiser(
components=input_measures,
budget=budget,
target_gain=sub_target_gain,
allow_slack=allow_slack,
verbose=False,
)
opt = GainOptimiser(
input_measures, max_cost=budget, max_gain=0 if sub_target_gain == 0 else (sub_target_gain or float("inf")),
allow_slack=allow_slack
)
else:
if sub_target_gain is None:
raise ValueError("Either budget or target_gain must be provided.")
opt = CostOptimiser(input_measures, min_gain=sub_target_gain)
opt.setup()
opt.solve()
cost = sum([x["cost"] for x in opt.solution])
return opt.solution, cost, opt.solution_gain
return opt.solution, opt.solution_cost, opt.solution_gain
# ---- Define optimisation paths ----------------------------------------------------------