From c08ab7a76765c476290fe7d70cd0d7d3bff07c28 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Wed, 18 Feb 2026 12:11:14 +0000 Subject: [PATCH] passing around allow slack --- .../optimiser/StrategicOptimiser.py | 10 +++++---- .../optimiser/funding_optimiser.py | 22 ++++++++----------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/recommendations/optimiser/StrategicOptimiser.py b/recommendations/optimiser/StrategicOptimiser.py index b75268eb..8ffc307c 100644 --- a/recommendations/optimiser/StrategicOptimiser.py +++ b/recommendations/optimiser/StrategicOptimiser.py @@ -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 ) diff --git a/recommendations/optimiser/funding_optimiser.py b/recommendations/optimiser/funding_optimiser.py index aaf97226..80ba02fd 100644 --- a/recommendations/optimiser/funding_optimiser.py +++ b/recommendations/optimiser/funding_optimiser.py @@ -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 ----------------------------------------------------------