Найти - Пользователи
Полная версия: finite state machine на Питоне
Начало » Python для экспертов » finite state machine на Питоне
1 2
Андрей Светлов
Возникла необходимость реализации.
Пока нашел только два достойных варианта:
fsm из panda3d и epsilon.modal из divmod.org команды. modal, кажется, куда лучше.
Может, еще что посоветуете?
Хоть тема в вебе и не нужна практически, но в standalone клиентах часто требуется
bialix
По своему опыту знаю, что под FSM часто понимают весьма разные вещи. Может уточните?

Названные вещи не видел.
Но видел рецепт в поваренной книге на сайте ActiveState. Очень просто и логично.
Плюс пытался пользоваться генератором SMС. Ну и гадость этот SMС скажу я вам. Хотя… на вкус и цвет…
Кажется еще в проекте WhatOS было что-то.

Посмотрю названные вами либы. Может пойму, что именно вам нужно.
proDiva
Так интересно узнать новые термины (вернее не новые, но мне пока неизвестные). Расскажите, пожалуйста, на русском языке, что такое “finite state machine”? заранее благодарна
bialix
По рюсски – это конечные автоматы.

Вот здесь неплохое введение для чайников: http://softcraft.ru/design/ap/ap01.shtml

А здесь: http://softcraft.ru/auto.shtml
туча статей на эту тему, для более глубокого погружения.

Можно видеть, что автоматное движение имеет несколько основных направлений и идеологий: switch и КА.
Также неплохо почитать статью о состоянии дел за рубежом, искать по ключевому слову “синхронное программирование” (гугля с википедией рулят)
http://www.softcraft.ru/auto/switch/syncprog/index.shtml

Вот на википедии: http://ru.wikipedia.org/wiki/%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5

Вобщем для старта этого будет достаточно.
bialix
bialix
Посмотрю названные вами либы. Может пойму, что именно вам нужно.
Посмотрел. В общем понятно к чему вы стремитесь.
Хотя по-прежнему считаю, что FSM нужно описывать не программно, а через понятные человеку диаграммы или что-то типа специализированного DSL. А из этого понятного описания генерить код автоматом.

Имел очень приятный опыт общения с генератором IAR Visual State (для Си и за деньги).

Пробовал SMC. Остался разочарован.
http://smc.sourceforge.net/

Были мысли написать свой DSL для автоматов с питоно-подобным синтаксисом. Но пока мне лень.

А у divmod есть где-то дока на пакет Epsilon или Use the source, Luke?
Андрей Светлов
мне нужно описать поведение клиента. Естественнее всего оно выражается в два десятка состояний с довольно нетривиальными переходами. Так что без FSM обойтись сложно.

В epsilon введение состояний как внутренних классов с их последующей инструментацией мне понравилось. Хорошо разносит логику различных режимов.
IAR видел. Не прижился почему-то. Наверное, я тогда думал несколько по другому.
Для С++ есть statechart (официально включена в boost) и fsm - лежит в boost vault. Обе - вполне изящны.

У divmod традиционно туго с документацией. Но неплохо с тестами, а epsilon весьма невелика. Мне тестов (а потом и исходников) вполне хватило.

P.S. Питон вполне может заменить DSL - по моему глубокому убеждению.
Примерно как в nevow.tags - еще одном продукте от divmod:
a(href='url')['This is', b, ‘and’, i, ‘text’]
bialix
Андрей Светлов
мне нужно описать поведение клиента. Естественнее всего оно выражается в два десятка состояний с довольно нетривиальными переходами. Так что без FSM обойтись сложно.
У меня практически все сишные программы строятся на автоматах. Поэтому мне без них вобще обойтись сложно. А питон – ИМХО – слишком сложно или некрасиво там автоматы делать руками, поэтому я там не заморачиваюсь.

Андрей Светлов
У divmod традиционно туго с документацией. Но неплохо с тестами, а epsilon весьма невелика. Мне тестов (а потом и исходников) вполне хватило.
Исходники-то я прочел и кажется понял как оно предполагается работать. Просто хотелось уточнить.

Андрей Светлов
P.S. Питон вполне может заменить DSL - по моему глубокому убеждению.
Примерно как в nevow.tags - еще одном продукте от divmod:
a(href='url')['This is', b, ‘and’, i, ‘text’]
Не-а. По моему глубокому убеждению – не может. Слишком нечитаемо получается, слишком много мусора.
Теже кавычки надо городить, см. ваш же пример.
DSL на то он и domain-specific language, чтобы кратко и изящно описывать некую предметную область.
Я использовал питон как DSL в нескольких проектах – слишком много ненужных знаков пунктуации надо городить, чтобы соблюсти правильный питон-синтаксис.
Это плохо, если на таком DSL будет писать не питонщик. Это мой реальный опыт.
Тот же scons – все вроде хорошо, кроме изврата с записью списка файлов.
Так что не согласен я с вами, но спорить долго и нудно не буду.
bialix
вот кстати тот рецепт из поваренной книги, который я упоминал:
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/146262

так, до кучи. там нет действий по выходу и входу из/в состояние, но наверное их можно доточить по принципу epsilon, при желании конечно. видел код этого рецепта использовался в каком-то реальном OSS проекте. Не помню каком.
Андрей Светлов
По поводу DSL спорить точно бессмысленно. Это почти как религия, и каждый подход имеет свои достоинства и недостатки.
Посмотрел WhatOS и aspn coockbook.
WhatOS - интересно, но С специфика сильно проявляется. aspn - простенько до неудобства. У меня каждое состояние - довольно большая вещь, скорее не атом, а режим работы программы. Так удобнее. Иначе состояний появляется бесчетное множество и прописывать переходы между ними становится затруднительно.
Немного докрутил (были проблемы с наследованием состояний), и доволен. Состояния можно разносить по отдельным модулям - удобно.
По сути наследник mode рассматривается как специфическая запись контейнера именованных функций, не более того. И экземпляр его не создается.
Занятная вещь получилась
Андрей Светлов
Да, кстати, глупый вопрос.
Как связаться с ребятами из divmod.org?
То, что я доделал к их epsilon.modal у них же помечено как todo: fix this bug.
В процессе дальнейшей работы мы скорее всего еще несколько расширим функциональность (нам важны конечные автоматы, а у них почти-почти то).
Я не прочь отправить им патч к модулю и тесту - авось включат.
Кстати, их тест весь модуль не покрывал - была нестыковочка.
Вот только на их trac guest новый тикет создать не может. А почтового адреса, чтобы послать письмо, я так и не нашел.
Что делать?

Написал, и самому смешно.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB