Source code for discrete_optimization.generic_tasks_tools.solvers.cpsat.cumulative_resource

#  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 ortools.sat.python.cp_model import IntervalVar

from discrete_optimization.generic_tasks_tools.base import Task
from discrete_optimization.generic_tasks_tools.cumulative_resource import (
    CumulativeResource,
    CumulativeResourceProblem,
    OtherCalendarResource,
    Resource,
)
from discrete_optimization.generic_tasks_tools.solvers.cpsat.calendar_resource import (
    CalendarResourceCpSatSolver,
)
from discrete_optimization.generic_tasks_tools.solvers.cpsat.multimode_scheduling import (
    MultimodeSchedulingCpSatSolver,
)


[docs] class CumulativeResourceSchedulingCpSatSolver( CalendarResourceCpSatSolver[Task, Resource], MultimodeSchedulingCpSatSolver[Task], Generic[Task, CumulativeResource, OtherCalendarResource], ): """Base class for cpsat solvers dealing with scheduling problems handling cumulative resources.""" problem: CumulativeResourceProblem[Task, CumulativeResource, OtherCalendarResource]
[docs] def get_resource_consumption_intervals( self, resource: Resource ) -> list[tuple[IntervalVar, int]]: if self.problem.is_cumulative_resource(resource): return [ ( self.get_task_mode_interval(task=task, mode=mode), self.problem.get_cumulative_resource_consumption( resource=resource, task=task, mode=mode ), ) for task in self.problem.tasks_list for mode in self.problem.get_task_modes(task=task) ] else: raise NotImplementedError( f"{resource} is not a cumulative resource whose consumption depends only on task mode." )