пятница, 12 июня 2015 г.

Обновленная Aivika for .NET

Открыл по лицензии GNU дополнительные компоненты к версии своей библиотеки имитационного моделирования Айвика, написанной на языке F#. Теперь по открытой лицензии доступны не только разработка и запуск модели в Visual Studio или Xamarin Studio, но можно также сохранять результаты, строить графики и т.п. Все это удовольствие автоматизируется несколькими дополнительными строками кода.


В дополнение к существующей документации в формате PDF выложил исходники примеров, которые охватывают наиболее известные области имитационного моделирования: системная динамика, дискретно-событийное моделирование (управляемое временем, событиями и процессами), базовое агентное моделирование.

Здесь замечу, что версия на Haskell по-прежнему остается более функциональной, и она имеет более чистый дизайн. В случае с F# пришлось пойти на некоторые упрощения. Зато доступна Visual Studio с IntelliSense, хотя лично я предпочитаю Aquamacs и runghc / cabal в терминале :)

понедельник, 4 мая 2015 г.

Зарелизил Aivika for .NET

Выпустил движок имитационного моделирования Aivika for .NET по двойной лицензии: GPLv3 и коммерческая. Коммерческая версия имеет дополнительные плюшки в виде модулей для быстрого и удобного возвращения результатов, обработки и анализа. Но сам движок полностью самодостаточен, и он лежит теперь на гитхабе:

https://github.com/dsorokin/aivika-fsharp-ce

пятница, 1 мая 2015 г.

Айвика для .NET Framework и Mono

Айвика для .NET Framework и Mono

Портировал свою библиотеку имитационного моделирования Айвику на .NET Framework и Mono. Если кратко, это такая библиотека, которая поддерживает большинство известных парадигм имитационного моделирования. Звучит очень амбициозно, но это действительно так. Можете проверить, взяв открытую версию для Haskell. Код доступен. Есть примеры. Есть документация. Даже Google очень уважает мою библиотеку по поисковой фразе «simulation library», хотя замечу, что его выдача бывает нестабильной и зависит от многих факторов.


Теперь есть порт для .NET и Mono. Написано на F#. В отличие от открытой версии для Haskell, этот порт закрыт, но доступна документация в формате PDF по ссылке в конце  приведенной выше страницы Wiki. Больше 100 страниц с описанием основного API, примерами, графиками и т.п.

Что может дать новая версия? 

Как и в случае Haskell, можно составлять имитационные модели практически любой степени сложности и нетривиальности, используя очень простую концепцию, где основные моделируемые активности представлены как вычисления. По сути, это функциональное программирование в чистом виде: монады, потоки, стрелки и т.п., но этим можно особо не заморачиваться, поскольку F# создает иллюзию простоты, насколько возможно.

Все настолько топорно устроено, что не может не работать. Чем больше проверяю на разных примерах, тем больше убеждаюсь, что метод работает. Иногда вношу неточности в примеры моделей, но потом обычно исправляюсь. Получаю такие же результаты, как в других источниках литературы, хотя последние иногда грешат :)

Библиотека охватывает такие вещи, как обыкновенные диффуры, так и вытесняющую многопроцессность для систем массового обслуживания. Например, вытеснение ресурса позволяет с легкостью моделировать поломку станков. А потоки с мультиплексированием позволяют моделировать станки параллельно.

По модели можно запустить вычислительный эксперимент и получить итоговую страницу HTML с графиками, гистограммами, таблицами в формате CSV и прочим, что позволяет проводить быстрый анализ модели, если нужно, экспортируя результаты в R для более детального изучения. 


Теперь это все доступно на платформах .NET Framework и Mono. Работает на Windows, OS X и Linux. Можно составлять модели в удобном редакторе Visual Studio или Xamarin Studio с подсветкой типов и автодополнением.  Возможно создание интерактивных тренажеров. Можно интегрировать с существующими решениями, использующими .NET. 

воскресенье, 29 июня 2014 г.

Версия 1.3 моей библиотеки имитационного моделирования Айвики на Haskell

Вчера обновил документацию, а также новую версию моей библиотеки имитационного моделирования Айвики, написанную целиком на языке функционального программирования Haskell.

Айвика уже много лет умеет:
  • системную динамику (обыкновенные диффуры и разностные уравнения);
  • дискретно-событийное моделирование (управляемое временем, событиями и процессами);
  • самые базовые вещи из агентного моделирования.


Примерно год назад добавил потоки данных и процессоры, которые позволяют на достаточно высоком уровне и декларативно описывать сети массового ожидания с очередями, серверами и прочими сущностями. Код выглядит близко к тому, как если бы мы описывали такую сеть с помощью диаграмм.

Совсем недавно добавил конечные автоматы, которые позволяют моделировать с некоторым упрощением цифровые схемы. Для интеграции со всем остальным эти автоматы синхронизируются с очередью событий. Схемы могут быть рекурсивными, могут иметь задержки на такт.

Все работает на единой схеме. Формализм и базовое API описаны в документе PDF на странице Wiki проекта Aivika (пока к сожалению, только на английском):


Сам код библиотеки полностью документирован с помощью комментариев haddock. Это стандартный для Haskell способ документирования API.

Для реализации я использовал очень много разных вещей из мира функционального программирования - ввел несколько монад и две стрелки. Многое взял из учебников по Haskell и F#. Библиотека по всей своей природе целиком принадлежит миру ФП, хотя и ориентирована на императивные вычисления: стохастику и прочее IO. Просто некоторые слишком узком понимают ФП, ограничивая себя рамками детерминированности, но забывая при этом, что IO вполне поддается ссылочной прозрачности. У меня нигде там нет unsafePerformIO, и это особый предмет гордости :)

Библиотека ориентирована на практику. Мало составить модель, нужно еще вывести результаты, как-то их обработать и представить в удобном виде при минимуме рутины. Для этого существуют дополнительные пакеты, которые позволяют автоматизировать имитационные эксперименты, где мы можем достаточно декларативно описать, какие данные мы хотим вывести и в каком виде. 

Можем сохранить таблицы в файлы CSV, нарисовать графики, гистограммы, подсчитать сводную статистику по переменным, показать на специальном графике тренд и вероятные границы отклонения по правилу 3-х сигм. 

В результате эксперимента создается файл HTML с результатами, который может быть просмотрен в любом современном браузере интернета.

Модель может иметь внешние параметры, которые могут быть случайными или быть прочитанными из файла в случае необходимости. 

Например, это позволяет проводить анализ чувствительности тех или иных переменных по отношению к внешним параметрам посредством множественных запусков по методу Монте-Карло. Можем планировать эксперимент. 

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

Библиотека со всеми пакетами размещена на официальном репозитории Hackage DB, который интегрирован с Haskell Platform. Используемая лицензия очень либеральна - BSD3. Код распространяется полностью в открытых исходниках. 

На винде устанавливается так:

> cabal update
> cabal install aivika
> cabal install aivika-experiment
> cabal install aivika-experiment-chart
> cabal install aivika-experiment-diagrams

Первые три пакета помимо самого кода содержат еще и примеры. Особенно интересными могут быть примеры из третьего пакета, где выводятся графики, но для этого как раз нужен четвертый, который уже непосредственно рендерит графики.

На маке (OS X) и особенно линуксе лучше установить еще другой рендерер графиков:

$ cabal install aivika-experiment-cairo

Он использует библиотеку Cairo, и графики на мой взгляд получаются красивее.

Будет интересно получить комментарии и пожелания. Так же интересует, насколько вероятна возможность консалтинга. Готов рассмотреть взаимовыгодные и заманчивые предложения. 

воскресенье, 25 августа 2013 г.

F# на юниксе


Оказывается, можно замечательно использовать F# на маке с помощью Mono и Xamarin Studio. Очень удобно, и мой проект от Visual Studio работает прекрасно. Попробовал редактировать и создавать файлы в Xamarin Studio. Мне понравилось. Даже лень было сегодня загружаться в винду, где у меня установлена Visual Studio. 

Надо сказать, что ребята из Xamarin достигли заметного прогресса. Что меня больше всего потрясло, так это то, что в некоторых моих тестах Mono заметно обгоняет .NET, делая поправку на то, что гонял я тесты на одной машине, но под разными операционками, да и тесты, вероятно были несколько специфическими. Ни за что бы не поверил в возможность такого еще пару лет назад!

суббота, 10 августа 2013 г.

А вдруг есть такой чудесный плагин для Scala?


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

Есть у меня одна уже работающая задумка, но мне нужен для Scala хороший и удобный синтаксический сахар для монад (эх, еще бы для стрелок…). Мечтаю о чем-то подобном computation expressions из F# - это такой аналог нотации do для языка, в котором нет классов типов. Как понимаю, нужен плагин к компилятору в случае Scala.

Ни встроенный for-comprehension, ни плагин продолжений не впечатляют нисколько. Отчасти они дублируют друг друга, но ни одно из них не решает свою задачу хорошо в моем понимании, давно извращенным другими языками. В общем, тот случай, где количество не переходит в качество, и даже не помышляет о том.

Очень хотел использовать Scala, но сейчас пребываю в полной печали. Для моей задачи технически идеально подходит Haskell, но я хочу продвинуть библиотеку в широкие массы, а потому Haskell пока хорош только как полигон для выработки, обкатки и кристаллизации моих безумных идей, и здесь он свою миссию уже выполнил на все 350% с блеском и шиком. Но сейчас хочется получить уже широкую аудиторию из исключительно меркантильных соображений, а потому интересует Scala. 

пятница, 22 марта 2013 г.

Комментарий о хвостовой рекурсии


Как известно, дьявол скрывается в деталях. Порою, небольшая деталь может сильно изменить смысл. Получается эффект бабочки. Что-то такое иногда происходит с пониманием хвостовой рекурсии. Мне всегда эта тема казалось сложной.

В прошлом году вышел замечательный перевод книги Пола Грэма "ANSI Common Lisp". В оригинале этой книги на странице 216 есть такое предложение: "A good compiler can compile a tail call into a goto, and so can compile a tail-recursive function into a loop". Дальше идет довольно общее описание того, как это может быть сделано.

Проблема в том, что без знания контекста тот текст можно неправильно истолковать. Все встает на свои места, если обратиться к книге PAIP Питера Норвига, которую Пол Грэм безусловно читал. В той книге приведена некая абстрактная машина. Там действительно хвостовая рекурсия компилируется в циклы, но в циклы не языка высокого уровня, а в циклы ассемблера той абстрактной машины (фактически через goto). Вот, в чем загвоздка.

Многие почему-то считают, что хвостовую рекурсию можно всегда преобразовать в циклы Scala, F# или Common Lisp. Мне кажется это неправильным. Можно придумать контр-пример. Достаточно обернуть рекурсивный вызов в лямбду и дальше передать эту лямбду другой функции. Например, компилятор Scala не сможет это превратить в цикл на уровне явовского байт-кода, а на уровне абстрактной машины из PAIP цикл получился бы сам собою.