Ptolemy
Ptolemy – это среда моделирования параллельных гетерогенных систем, работающих в режиме реального времени. Проект разрабатывается студентами университета Беркли под руководством профессора Эдварда Ли (Edward Lee). В качестве языка разработки используется Java. Ptolemy постоянно развивается. Добавляется поддержка новых моделей вычислений и новые демонстрационные модели, расширяется документация.
Ptolemy позволяет работать с десятком различных моделей вычислений, среди которых есть, например, дискретно временная модель (discrete-event modeling) и конечный автомат (finite-state machine). В основе моделирования лежат понятия Actor и Director, которые можно перевести как «Исполнительное звено» и «Управляющее звено» соответственно. Director задаёт модель вычисления, в которой работает симулируемая система. Множество Actor'ов в сочетании со связями между ними определяют собственно устройство системы. В рамках первой статьи я хочу обратиться к дискретно-временной модели.
Discrete Event
DE предоставляет основные инструменты для симуляции систем реального времени, например, систем массового обслуживания и сетей связи. Процесс имитационного моделирования представляет собой перемещение маркеров (token) между Actor'ами. Маркер по своей сути представляет какую-либо структуру данных. Когда маркер попадает в Actor, он запустить какое-либо действие, которое может изменить внутренне состояние Actor'а и породить новые события. DE-планировщик гарантирует, что все события происходят строго синхронно. Передача маркера между Actor'ами не занимает времени. Важно помнить, что маркеры не могут самопроизвольно появляться или исчезать.
Соберём простую дискретно-временную модель. Пусть это будет канал передачи данных, в котором моделируется задержка и потеря пакетов. В роли пакетов будут выступать маркеры. Для начала откроем окно редактора (File — New — Graph Editor). Большую часть окна занимает рабочая область, на которой предстоит собирать модель. Слева от рабочей области находится библиотека Actor'ов и Director'ов. Добавим на рабочую область DE Director из раздела Directors. Вместо английского слова Actor, которе в данном контексте лаконично на русский никак не переводится, далее я буду использовать слово «блок».
Поскольку маркеры не могут самопроизвольно появляться и исчезать, нам понадобится какой-нибудь источник. Используем блок SingleEvent из раздела Actors/DomainSpecific/DescreteEvents. Работает этот блок не хитро: выдаёт один маркер в указанный момент времени. Значение маркера и время можно указать в настройках блока (окно настройки параметров открывается двойным щелчком на блоке). Далее нам потребуется смоделировать задержку передачи пакетов в канале. Для этого добавим блок Server из того же раздела библиотеки.

Соединим выход SingleEvent со входом сервера.



Пока что блок Server задерживает любой маркер на строго определенное время, указанное в его параметрах. Внесём элемент случайности. Для этого понадобится блок Uniform из раздела Actors/Random, который при поступлении маркера на вход генерирует новый маркер со случайным значением, распределенным по нормальному закону между нижней и верхней границами (задаются в параметрах).


Для грубого соответствия смоделированного канала реальному не хватает только потерь пакетов при их передаче. Для моделирования потерь используем блок DiscreteRandomSource из того же раздела Random. В его параметре values указывается массив генерируемых значений, а в параметре pmf (Probability mass function) — массив вероятностей генерации каждого значения. Укажем в values значения 0 и 1, а в pmf — 0.85 и 0.15.

При приходе маркера на вход trigger блок с вероятность 85% будет генерировать ноль и с вероятность 15% — единицу. Соединим вход trigger с выходом сервера. (Для ветвления линий используются узлы — черный ромб на панели инструментов) Используем эти значения в качестве признака потери (единица — пакет потерян).

Такой простой канал сам по себе представляет небольшой интерес, зато его удобно использовать для моделирования сетевых протоколов. Смоделированный канал может передавать пакеты со случайной задержкой и терять их с определенной вероятностью.
Ptolemy позволяет создавать новые Actor'ы, собирая их из уже существующих. В разделе библиотеки Utilities находится блок CompositeActor, в который можно поместить любые другие блоки, в том числе и CompositeActor. Поместим модель канала в CompositeActor. Рабочая область CompositeActor открывается командой OpenActor из контекстного меню. Блок SingleEvent больше не нужен. Вместо этого добавим один входной и один выходной порт.

Можно упростить работу с каналом, если «вывести наружу» все важные параметры: нижнюю и верхнюю границы диапазона временных задержек и вероятность потери пакета. Для этого в окне настройки параметров блока добавим параметры lowDelayBorder, highDelayBorder и lossProbability. Кнопка Add вызывает соответствующий диалог, в котором в частности можно указать значения по-умолчанию для добавляемых параметров. Имена новых параметров теперь доступны внутри блока. Заменим конкретные значения именами параметров в блоках Uniform и DiscreteRandomsource.

Собрав примитивный источник пакетов:

можно протестировать работу канала:

В настройках DE Director'а есть важный параметр — stopTime. По-умолчанию он выставлен в бесконечность, но для наблюдения за такой простой моделью будет вполне достаточно значения 50.
На этом разрешите закончить знакомство с Птолемеем. Если тема окажется востребованной, то вскоре последует продолжение.