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

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

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

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

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

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

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

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

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