# Copyright (c) 2026 AIRBUS and its affiliates.
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
from typing import Generic
from discrete_optimization.generic_tasks_tools.calendar_resource import (
CalendarResourceProblem,
CalendarResourceSolution,
Resource,
Task,
)
from discrete_optimization.generic_tasks_tools.generic_scheduling_utils import Objective
from discrete_optimization.generic_tasks_tools.non_renewable_resource import (
NonRenewableResource,
NonRenewableResourceProblem,
NonRenewableResourceSolution,
)
from discrete_optimization.generic_tasks_tools.objectives.objective_computer import (
ObjectiveComputer,
)
[docs]
class CalendarRenewableResourceLevelObjectiveComputer(
ObjectiveComputer[Task], Generic[Task, Resource]
):
problem: CalendarResourceProblem[Task, Resource]
[docs]
@staticmethod
def get_objective_name() -> Objective | str:
return Objective.CALENDAR_RESOURCES_LEVELS
def __init__(
self,
problem: CalendarResourceProblem[Task, Resource],
weight_objective: float = 1.0,
weight_resource: dict[Resource, float] = None,
):
super().__init__(problem, weight_objective)
if weight_resource is None:
self.weight_resource = {}
else:
self.weight_resource = weight_resource
[docs]
def get_weight_resource(self, resource: Resource) -> float:
return self.weight_resource.get(resource, 0)
[docs]
def has_any_weight(self):
return any(self.get_weight_resource(res) > 0 for res in self.weight_resource)
[docs]
def compute_objective(
self, solution: CalendarResourceSolution[Task, Resource]
) -> float:
return solution.compute_aggregated_calendar_resources_levels(
weights={
r: self.get_weight_resource(r)
for r in self.problem.calendar_resources_list
}
)
[docs]
class NonRenewableResourceLevelObjectiveComputer(
ObjectiveComputer[Task], Generic[Task, NonRenewableResource]
):
problem: NonRenewableResourceProblem[Task, NonRenewableResource]
[docs]
@staticmethod
def get_objective_name() -> Objective | str:
return Objective.NON_RENEWABLE_RESOURCES_LEVELS
def __init__(
self,
problem: NonRenewableResourceProblem[Task, Resource],
weight_objective: float = 1.0,
weight_resource: dict[Resource, float] = None,
):
super().__init__(problem, weight_objective)
if weight_resource is None:
self.weight_resource = {}
else:
self.weight_resource = weight_resource
[docs]
def get_weight_resource(self, resource: Resource) -> float:
return self.weight_resource.get(resource, 0)
[docs]
def has_any_weight(self):
return any(self.get_weight_resource(res) > 0 for res in self.weight_resource)
[docs]
def compute_objective(
self, solution: NonRenewableResourceSolution[Task, NonRenewableResource]
) -> float:
return solution.compute_nb_non_renewable_resources_used(
weights={
r: self.get_weight_resource(r)
for r in self.problem.non_renewable_resources_list
}
)