Source code for salbpone.checkers
"""
Модуль перевірки вхідних даних задачі
"""
from typing import Any
from .data_types import OperationsCosts, TimeUnit, GraphDict
from .logger_setup import logger
[docs]class InputChecker:
"""
Забезпечує перевірку вхідних значень задачі.
Здійснюється звірка очікуваних типів та структур даних.
"""
def __init__(self, parent):
self.parent = parent
[docs] def check_costs(self, value: Any) -> OperationsCosts:
"""
Перевіряє допустимість значень вартості операцій.
:param value: Змінна для перевірки
:return: повертається вхідна змінна, якщо відповідає вимогам допустимості (інакше - помилка з описом)
"""
assert isinstance(value, list), "Вартість (тривалість) операцій мають бути передані списком t"
assert all([isinstance(x, (int, float)) for x in value]), "Тривалості всіх операцій (t_i) мають бути числом"
if self.parent.verbose:
labels = []
for ti in range(len(value)):
labels.append(f't{ti + 1} = {value[ti]}')
message = ', '.join(labels)
logger.debug(f'Тривалості операцій (t_i): {message}')
return value
[docs] def check_cycletime(self, value: Any) -> TimeUnit:
"""
Перевіряє допустимість значень тривалості виробничого циклу.
:param value: Змінна для перевірки
:return: повертається вхідна змінна, якщо відповідає вимогам допустимості (інакше - помилка з описом)
"""
assert isinstance(value, TimeUnit), "Час (Т) виробничого циклу має бути числом "
if self.parent.verbose:
logger.debug(f'Тривалість циклу (Т): {value}')
return value
[docs] def check_graph(self, value: Any) -> GraphDict:
"""
Перевіряє допустимість наданого графу обмежень.
:param value: Змінна для перевірки
:return: повертається вхідна змінна, якщо відповідає вимогам допустимості (інакше - помилка з описом)
"""
assert isinstance(value, dict), "Граф попередніх обов'язкових операцій має бути словником"
assert all([isinstance(x, int) for x in value.keys()]), "Всі ключі графу залежностей мають бути цілими числами"
assert all([x > 0 for x in value.keys()]), "Всі ключі графу залежностей мають бути додатніми числами"
assert all(isinstance(item, int)
for sublist in value.values()
for item in sublist), "Всі обов'язкові операції графу залежностей мають бути цілими числами"
if self.parent.verbose:
for k, v in value.items():
if len(v):
o_list = []
for o in v:
o_list.append(f't{o}')
operations = ", ".join(o_list)
logger.debug(f'До початку операції t{k} мають бути виконані операції: {operations}')
else:
logger.debug(f'До початку операції t{k} обмежень немає')
return value