# 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 abc import abstractmethod
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.multimode_scheduling import (
MultimodeSchedulingProblem,
SinglemodeSchedulingProblem,
)
from discrete_optimization.generic_tasks_tools.solvers.cpsat.multimode import (
MultimodeCpSatSolver,
SinglemodeCpSatSolver,
)
from discrete_optimization.generic_tasks_tools.solvers.cpsat.scheduling import (
SchedulingCpSatSolver,
)
[docs]
class MultimodeSchedulingCpSatSolver(
SchedulingCpSatSolver[Task], MultimodeCpSatSolver[Task], Generic[Task]
):
"""Base class for cpsat solvers dealing with scheduling problems whose tasks durations depend only on mode."""
problem: MultimodeSchedulingProblem[Task]
[docs]
@abstractmethod
def get_task_mode_interval(self, task: Task, mode: int) -> IntervalVar:
"""Get the interval variable corresponding to given task and mode."""
...
[docs]
class SinglemodeSchedulingCpSatSolver(
MultimodeSchedulingCpSatSolver[Task], SinglemodeCpSatSolver[Task]
):
"""Base class for cpsat solvers dealing with single mode scheduling problems with fixed tasks durations."""
problem: SinglemodeSchedulingProblem[Task]
[docs]
@abstractmethod
def get_task_interval(self, task: Task) -> IntervalVar:
"""Get the interval variable corresponding to given task."""
...
[docs]
def get_task_mode_interval(self, task: Task, mode: int) -> IntervalVar:
return self.get_task_interval(task=task)