193 lines
5.9 KiB
Python
193 lines
5.9 KiB
Python
from collections.abc import Mapping, Sequence
|
|
from enum import Enum
|
|
from typing import Callable, Iterator, Literal, NamedTuple, Protocol
|
|
|
|
from docplex.mp.model import Model
|
|
from docplex.mp.solution import SolveSolution
|
|
|
|
class ProgressData(NamedTuple):
|
|
has_incumbent: bool
|
|
current_objective: float | None
|
|
best_bound: float
|
|
mip_gap: float | None
|
|
current_nb_iterations: int
|
|
current_nb_nodes: int
|
|
remaining_nb_nodes: int
|
|
time: float
|
|
det_time: float
|
|
|
|
class ProgressClock(Enum):
|
|
All = ...
|
|
Solutions = ...
|
|
BestBound = ...
|
|
Objective = ...
|
|
Gap = ...
|
|
|
|
@property
|
|
def listens_to_solution(self) -> bool: ...
|
|
|
|
class _Filter(Protocol):
|
|
def accept(self, data: ProgressData) -> bool: ...
|
|
def reset(self) -> None: ...
|
|
|
|
class _AbstractProgressListener:
|
|
def abort(self) -> None: ...
|
|
def notify_start(self) -> None: ...
|
|
|
|
class ProgressListener(_AbstractProgressListener):
|
|
"""The base class for progress listeners."""
|
|
|
|
def __init__(
|
|
self,
|
|
clock_ar: ProgressClock = ...,
|
|
absdiff: float | None = None,
|
|
reldiff: float | None = None,
|
|
) -> None: ...
|
|
@property
|
|
def clock(self) -> ProgressClock: ...
|
|
@property
|
|
def abs_diff(self) -> float: ...
|
|
@property
|
|
def relative_diff(self) -> float: ...
|
|
@property
|
|
def current_progress_data(self) -> ProgressData | None: ...
|
|
def accept(self, pdata: ProgressData) -> bool: ...
|
|
def requires_solution(self) -> bool: ...
|
|
def notify_solution(self, s: SolveSolution) -> None: ...
|
|
def notify_jobid(self, jobid: int) -> None: ...
|
|
def notify_end(self, status: int, objective: float | None) -> None: ...
|
|
def notify_progress(self, progress_data: ProgressData) -> None: ...
|
|
|
|
class FilterAcceptAll:
|
|
def accept(self, pdata: ProgressData) -> bool: ...
|
|
def reset(self) -> None: ...
|
|
|
|
class FilterAcceptAllSolutions(object):
|
|
def accept(self, pdata: ProgressData) -> bool: ...
|
|
def reset(self) -> None: ...
|
|
|
|
class Watcher:
|
|
def __init__(
|
|
self,
|
|
name: str,
|
|
absdiff: float,
|
|
reldiff: float,
|
|
update_fn: Callable[[ProgressData], bool],
|
|
) -> None: ...
|
|
def reset(self) -> None: ...
|
|
def accept(self, progress_data: ProgressData) -> bool: ...
|
|
def sync(self, pdata: ProgressData) -> None: ...
|
|
|
|
class ClockFilter:
|
|
def __init__(
|
|
self,
|
|
level: ProgressClock,
|
|
obj_absdiff: float,
|
|
bbound_absdiff: float,
|
|
obj_reldiff: float = ...,
|
|
bbound_reldiff: float = ...,
|
|
node_delta: int = ...,
|
|
) -> None: ...
|
|
def accept(self, progress_data: ProgressData) -> bool: ...
|
|
def peek(self, progress_data: ProgressData) -> Watcher | None: ...
|
|
def reset(self) -> None: ...
|
|
|
|
class TextProgressListener(ProgressListener):
|
|
def __init__(
|
|
self,
|
|
clock: ProgressClock = ...,
|
|
gap_fmt: str | None = ...,
|
|
obj_fmt: str | None = ...,
|
|
absdiff: float | None = ...,
|
|
reldiff: float | None = ...,
|
|
) -> None: ...
|
|
def notify_start(self) -> None: ...
|
|
def notify_progress(self, progress_data: ProgressData) -> None: ...
|
|
|
|
class ProgressDataRecorder(ProgressListener):
|
|
"""A specialized class of ProgressListener, which collects all ProgressData it receives."""
|
|
|
|
def __init__(
|
|
self,
|
|
clock: ProgressClock = ...,
|
|
absdiff: float | None = ...,
|
|
reldiff: float | None = ...,
|
|
) -> None: ...
|
|
def notify_start(self) -> None: ...
|
|
def notify_progress(self, progress_data: ProgressData) -> None: ...
|
|
@property
|
|
def number_of_records(self) -> int: ...
|
|
@property
|
|
def iter_recorded(self) -> Iterator[ProgressData]: ...
|
|
@property
|
|
def recorded(self) -> Sequence[ProgressData]: ...
|
|
|
|
class SolutionListener(ProgressListener):
|
|
def __init__(
|
|
self,
|
|
clock: Literal[
|
|
ProgressClock.Solutions, ProgressClock.Objective, ProgressClock.Gap
|
|
] = ...,
|
|
absdiff: float | None = ...,
|
|
reldiff: float | None = ...,
|
|
) -> None: ...
|
|
def requires_solution(self) -> bool: ...
|
|
def notify_solution(self, s: SolveSolution) -> None: ...
|
|
def notify_start(self) -> None: ...
|
|
def accept(self, pdata: ProgressData) -> bool: ...
|
|
|
|
class SolutionRecorder(SolutionListener):
|
|
def __init__(
|
|
self,
|
|
clock: Literal[
|
|
ProgressClock.Solutions, ProgressClock.Objective, ProgressClock.Gap
|
|
] = ...,
|
|
absdiff: float | None = ...,
|
|
reldiff: float | None = ...,
|
|
) -> None: ...
|
|
def notify_start(self) -> None: ...
|
|
def notify_solution(self, s: SolveSolution) -> None: ...
|
|
def iter_solutions(self) -> Iterator[SolveSolution]: ...
|
|
@property
|
|
def number_of_solutions(self) -> int: ...
|
|
@property
|
|
def current_solution(self) -> SolveSolution | None: ...
|
|
|
|
class FunctionalSolutionListener(SolutionListener):
|
|
def __init__(
|
|
self,
|
|
solution_fn: Callable[[SolveSolution], None],
|
|
clock: Literal[
|
|
ProgressClock.Solutions, ProgressClock.Objective, ProgressClock.Gap
|
|
] = ...,
|
|
absdiff: float | None = ...,
|
|
reldiff: float | None = ...,
|
|
) -> None: ...
|
|
def notify_solution(self, s: SolveSolution) -> None: ...
|
|
|
|
class KpiListener(SolutionListener):
|
|
def __init__(
|
|
self,
|
|
model: Model,
|
|
clock: Literal[
|
|
ProgressClock.Solutions, ProgressClock.Objective, ProgressClock.Gap
|
|
] = ...,
|
|
absdiff: float | None = ...,
|
|
reldiff: float | None = ...,
|
|
) -> None: ...
|
|
def publish(self, kpi_dict: Mapping[str, float | str]) -> None: ...
|
|
def notify_solution(self, s: SolveSolution) -> None: ...
|
|
|
|
class KpiPrinter(KpiListener):
|
|
def __init__(
|
|
self,
|
|
model: Model,
|
|
clock: Literal[
|
|
ProgressClock.Solutions, ProgressClock.Objective, ProgressClock.Gap
|
|
] = ...,
|
|
absdiff: float | None = ...,
|
|
reldiff: float | None = ...,
|
|
kpi_format: str = ...,
|
|
) -> None: ...
|
|
def publish(self, kpi_dict: Mapping[str, float | str]) -> None: ...
|