среда, 14 апреля 2010 г.

Aivika версии 1.0.3.0

Выложил новую версию библиотеки моделирования Aivika. Написана она на F# с использованием двух монад. Эта библиотека позволяет создавать и запускать имитацию гибридных моделей. Сейчас охватывается системная динамика (System Dynamics) и Discrete Event Simulation (как time-driven, event-driven так и process-driven simulation). В планах добавление agent-based modeling. В тестах обгоняет SimPy примерно в два раза на его же типе задач, хотя Aivika умеет значительно больше. Есть недописанный обрывок документации.

Сейчас не буду вдаваться в маркетинговые лозунги. Напишу лишь пару технических деталей.

В основе лежит (императивная) монада Dynamics, которая умеет системную динамику, т.е. запускать имитацию и интегрировать динамическую систему. Что характерно, дифф.-уравнения задаются в высшей степени декларативно.

Поверх этой монады есть ее продолжение DynamicsCont<’a> = Dynamics<’a -> unit> -> Dynamics<unit>. Фишка в том, что используя синтаксис вычислительный выражений, можно писать как бы “обычный” код на F# в монаде DynamicsCont, который будет временами прерываться. Это нужно для реализации “процессов”, которые могут усыпляться, просыпаться, ставиться в очередь на выполнение в такое-то время, блокироваться для захвата разделяемого ресурса и т.д. Все это предполагается в process-driven simulation. Используются свойства продолжения.

Так вот, такой код, используя лифт, может вызывать вычисления в исходной монаде Dynamics, т.е. интегрироваться с динамическими системами. Частный случай монадного трансформера. Это позволяет строить гибридный модели, где одна часть может быть описана дифф.урами, а другая задаваться дискретными процессами. В перспективе сюда добавлю агенты – вся инфраструктура готова.

Все хозяйство представляет собой embedded domain specific language (eDSL). Поскольку внутри используются монады, то легко встраивать вызовы функций .NET внутрь симуляции через вычислительные выражения, т.е. через монадический bind. eDSL же дает возможность встраивать симуляции в обычные .NET приложения.

Подозреваю, что подобные системы стоят дорого. Проблема в том, что мой код получился очень маленьким по объему (90 кб)… и не таким быстрым.

3 комментария:

  1. Вы таки хотите ее продавать? ;)
    Не откроете общественности исходники? Крайне интересно! Особенно про монадный трансформер и eDSL.

    ОтветитьУдалить
  2. Код по ссылке. Проект Aivika хостится на sourceforge.net. Лицензия BSD-like.

    Монадный трансформер - в файлах DynamicsCont.fsi и DynamicsCont.fs. Он используется в Env.fsi и Env.fs, которые собственно реализуют DES (Discrete Event Simulation).

    Примеры можно найти в пакете Maritegra.Aivika.Tests. К сожалению, про DES так еще ничего и не написал в той PDF, что лежит в каталоге doc. Про System Dynamics написано много.

    ОтветитьУдалить
  3. Env.fsi -> Discrete.fsi, Env.fs -> Discrete.fs

    Небольшое дополнение. Некоторые примеры по DES идут по книге "Объектно-ориентированное моделирование на C++". Автор - Илья Труб.

    ОтветитьУдалить