Векторные часы (Лэмпорта) Множество чисел

Векторные часы — это механизм установления частичного порядка между событиями в распределенной системе. Поскольку локальное время (то, что возвращает функция clock) может отличаться на разных компьютерах, то события, происходящие на разных компьютерах, нельзя сравнивать по времени. Элементы распределенной системы — которые называются процессами и, как правило, являются одновременно работающими на нескольких физических компьютерах программами, — помечают события специальными метками. Эти метки, суть значения векторных часов, позволяют определить частичный порядок прчинно-следственной зависмости на множестве событий. Предполагается, что все локальные события кадого процесса упорядочены по времени (значения clock монотонно увеличиваются), а при передаче сообщений от одного процесса другому, событие отпрвки сообщения логически предшествует событию получения этого сообщения — нельзя получить то, что не было отправлено.

В системе с N процессами каждый процесс поддерживает N-мерный вектор натуральных чисел. Изменение вектора определяется следующими правилами.

  1. При запуске процесса его вектор обнуляется.
  2. При выполнении k-ым процессом "важного" внутреннего события происходит увеличение k-ой координаты его вектора на единицу (событие "подписывается"). Какие внутренние события нужно подписывать определяется протоколом решения задачи и для нас не имеет значения.
  3. Отправка сообщения другому процессу "подписывается" на стороне отрпавителя. Вместе с сообщением отправляется и метка момента отправки (подписали и отравили пару сообщение/метка).
  4. При получении сообщения, вместе с присоединенной меткой m момента отправки, процесс-получатель сначала подписывает факт получения (произошло событие "что-то было получено"), а потом изменяет каждую координату своего вектора на максимум ее значения и значения из метки m.

Если заданы метки M1 и M2, то M1 < M2 тогда и только тогда, когда:

Выполнение условия M1 < M2 означает, что событие M1 произошло раньше события M2. И наоборот.

Требуется реализовать класс для работы с векторными часам. Интерфейс класса должен поддерживать следующие операции.

В случае обнаружения ошибочных данных методы, вкючая конструкторы, должны генерировать исключения.

Не должно быть возможности вызвать аварийную остановку программы при использовании общедоступного интерфейса класса.

Решение должно содержать набор тестов, которые вы разрабатываете самостоятельно.