diff --git a/domain/modelling/optimisation/optimiser.py b/domain/modelling/optimisation/optimiser.py index 43a87dfce..4a5edd28e 100644 --- a/domain/modelling/optimisation/optimiser.py +++ b/domain/modelling/optimisation/optimiser.py @@ -271,13 +271,23 @@ def optimise_package_fabric_first( leftover_budget: Optional[float] = ( None if budget is None else budget - _package_cost(fabric_package.selected) ) + # A dependency phase 1 already injected (e.g. the wall's ventilation) is + # satisfied for the whole package: phase 2 must not force it in again. + fabric_types: set[MeasureType] = { + scored.option.measure_type for scored in fabric_package.selected + } + outstanding_dependencies: list[MeasureDependency] = [ + dependency + for dependency in dependencies + if dependency.required.option.measure_type not in fabric_types + ] top_up: OptimisedPackage = optimise_package( groups=_rescored_groups(remaining_groups, post_fabric_scorer, baseline_epc), scorer=post_fabric_scorer, baseline_epc=baseline_epc, budget=leftover_budget, target_sap=target_sap, - dependencies=dependencies, + dependencies=outstanding_dependencies, ) return OptimisedPackage( selected=[*fabric_package.selected, *top_up.selected],