Latest posts on finite state machine на Питоне topichttps://python.su/forum/topic/837/2007-06-03T00:16:38+03:00Общий :: Python для экспертов :: finite state machine на Питоне
2007-06-03T00:16:38+03:00Андрей Светлов5607Да, ты хорошо уловил суть. И структура с указателями на функции - хорошее решение для С. В питоне это создается автоматически при генерации класса.<br/>Если опишешь DSL, то написать генератор, кажется, не сложно и не долго.
Общий :: Python для экспертов :: finite state machine на Питоне
2007-06-01T19:30:16+03:00bialix5591<blockquote><em>Андрей Светлов</em><br/>… Это обычные экземпляры классов с мутирующим поведением. Не за счет if/switch, а за счет изменения интерфейса. <br/>Данные общие для всего экземпляра, а методы переключаются на лету при смене состояния. При этом, как ты заметил, есть __enter__, __exit__. И, что немаловажно для меня, набор методов тоже мутирует в зависимости от состояния. Имена этих методов - входные сигналы. При этом к каждому цепляется список параметров (для каждого метода разный). А если из состояния нет нужного перехода - нет и нужного метода. Хорошая трансляция из UML в код.</blockquote>Перечитал еще раз внимательно. Все правильно. Вот эта фраза ключевая собственно:<br/><br/><strong>Данные общие для всего экземпляра, а методы переключаются на лету при смене состояния</strong><br/><br/>Наконец-то понял как это удобно реализовать и на Си: набор методов сделать таблицей и переключать указатель на таблицу в зависимости от состояний. Тогда можно отказаться от бесконечных switch. Но тут точно придется искать пути для автоматической генерации кода таких таблиц.<br/><br/>Есть еще несколько вопросов, хотелось бы обсудить. <br/>/me Попробую сформулировать в следующем ответе.
Общий :: Python для экспертов :: finite state machine на Питоне
2007-06-01T01:25:00+03:00Андрей Светлов5587Буду рад. На прошлом так на тебя насели по вопросам о Bazaar, что было не подступиться
Общий :: Python для экспертов :: finite state machine на Питоне
2007-06-01T00:08:54+03:00bialix5586<blockquote><em>Андрей Светлов</em><br/>Алексанр, можно на “ты”? Мне так удобней.</blockquote>Да, конечно.<br/><br/><blockquote><em>Андрей Светлов</em><br/>epsilon.modal - всего лишь класс, описывающий автомат. Наследуйся от него и делай свои автоматы. Размножай их, вкладывай друг в друга - все можно. В терминах игры это будет: автомат логики игры, по автомату на игрока, по автомату на компьютерного персонажа (NPC) и т.д. (автоматы на персонажа так и стремятся к вложенности). Это обычные экземпляры классов с мутирующим поведением. Не за счет if/switch, а за счет изменения интерфейса.</blockquote>Я как раз думал примерно в таком направлении.<br/><br/><blockquote><em>Андрей Светлов</em><br/>Если нужно, готов выложить примеры</blockquote>Может быть удастся немного пообщаться на семинаре (после)завтра.
Общий :: Python для экспертов :: finite state machine на Питоне
2007-05-31T23:59:33+03:00Андрей Светлов5585Алексанр, можно на “ты”? Мне так удобней.<br/><br/>epsilon.modal - всего лишь класс, описывающий автомат. Наследуйся от него и делай свои автоматы. Размножай их, вкладывай друг в друга - все можно. В терминах игры это будет: автомат логики игры, по автомату на игрока, по автомату на компьютерного персонажа (NPC) и т.д. (автоматы на персонажа так и стремятся к вложенности). Это обычные экземпляры классов с мутирующим поведением. Не за счет if/switch, а за счет изменения интерфейса. <br/>Данные общие для всего экземпляра, а методы переключаются на лету при смене состояния. При этом, как ты заметил, есть __enter__, __exit__. И, что немаловажно для меня, набор методов тоже мутирует в зависимости от состояния. Имена этих методов - входные сигналы. При этом к каждому цепляется список параметров (для каждого метода разный). А если из состояния нет нужного перехода - нет и нужного метода. Хорошая трансляция из UML в код.<br/><br/>IAR рассчитан на embedded programming. Когда я писал под Atmel ATMega контроллеры (три года занимался) - постоянно делал простые конечные автоматы. Прописывал все руками, и совмещал несколько в параллельной работе (несколько таймеров, АЦП и входы, изменение сигнала на которых позволяло возбуждать прерывание сильно помогали). Но только при специфицеском кодировании. Выход из узких микропроцессорных рамок позволил применять подход гораздо шире.<br/><br/>Помимо gamedev автоматы очень полезны в internet клиентах . Сеть - ненадежная штука, сообщения приходят негарантированно (возможны отказы) и с непостоянной задержкой. А если ты при этом работаешь с несколькими серверыми (лицензий, биллинга, игровым)?<br/>Без автоматов очень трудно.<br/><br/>Если нужно, готов выложить примеры
Общий :: Python для экспертов :: finite state machine на Питоне
2007-05-31T15:04:33+03:00bialix5582Вот еще пара моментов, относящихся к автоматам.<br/><br/>1) Для меня автомат – это переменная, показывающая состояние, плюс некая логика, которая обеспечивает реагирование на события. Т.е. как бы в терминах сиплюсизма: описание автомата – это некий класс, а конкретный автомат – это экземпляр класса. Тогда можно (по идее) работать с несколькими однотипными автоматами одновременно, используя ссылку на переменную состояния в коде. Но… (см. ниже)<br/><br/>2) Почему-то почти всегда подразумевается, что вся программа – это один автомат, либо это совокупность параллельно работающих разных автоматов. И никогда не рассматривается случай (по крайней мере мне не попадалось) в явном виде: группа однотипных автоматов, работающих параллельно. Например, у меня игра с несколькими игроками. Есть автомат, отвечающий за логику игры, и группа автоматов, отвечающих за состояние игроков. В упоминавшемся IAR Visual State я не нашел способа создать массив однотипных автоматов. Это главная причина, почему я его не использую. А вообще, как с этим жить в других либах (например, в epsilon.modal)? Что вобще диктует на эту тему ваш здравый смысл?
Общий :: Python для экспертов :: finite state machine на Питоне
2007-05-30T08:57:08+03:00bialix5562<blockquote><em>Андрей Светлов</em><br/>aspn - простенько до неудобства. У меня каждое состояние - довольно большая вещь, скорее не атом, а режим работы программы. Так удобнее. Иначе состояний появляется бесчетное множество и прописывать переходы между ними становится затруднительно.</blockquote>То, что aspn пример прост до безобразия – я согласен и сразу говорил. Более того, он немного заточен под задачи парсинга.<br/><br/>Однако, не вижу противоречий между простым механизмом, обеспечивающим переходы и большими состояниями. Может я конечно что-то не понимаю, но поскольку у вас уже все работает – то это ХОРОШО.<br/>Спасибо вам, узнал новые готовые имплементации КА для питона. :-)
Общий :: Python для экспертов :: finite state machine на Питоне
2007-05-30T04:13:37+03:00j2a5561<blockquote><em>Андрей Светлов</em><br/>Как связаться с ребятами из divmod.org?<br/>То, что я доделал к их epsilon.modal у них же помечено как todo: fix this bug.<br/>В процессе дальнейшей работы мы скорее всего еще несколько расширим функциональность (нам важны конечные автоматы, а у них почти-почти то).<br/>Я не прочь отправить им патч к модулю и тесту - авось включат.<br/>Кстати, их тест весь модуль не покрывал - была нестыковочка.<br/>Вот только на их trac guest новый тикет создать не может. А почтового адреса, чтобы послать письмо, я так и не нашел.<br/>Что делать?</blockquote>Хм. С полгода назад я регистрировался на их trac и открывал тикеты.<br/><br/>Если хочешь написать разработчикам - пиши <a href="http://twistedmatrix.com/trac/wiki/TwistedMatrixLaboratories">Жан-Полю Кальдерону (exarkun at twistedmatrix.com)</a>, но он весьма… эээ… своеобразный человек, так что лучше <a href="http://twistedmatrix.com/trac/wiki/ReviewProcess">открывай тикет, аттач патч и юнит-тест, ставь приоритет тикета highest, в ключевых словах указывай review</a>.<br/><br/>P.S. Это ничего, что все ссылки на Twisted Matrix; в Divmod работают ровно те же люди, так что и email, и dev process у них одинаковы.<br/><br/>P.P.S. Ну или в IRC
Общий :: Python для экспертов :: finite state machine на Питоне
2007-05-30T02:10:52+03:00Андрей Светлов5560Да, кстати, глупый вопрос.<br/>Как связаться с ребятами из divmod.org?<br/>То, что я доделал к их epsilon.modal у них же помечено как todo: fix this bug.<br/>В процессе дальнейшей работы мы скорее всего еще несколько расширим функциональность (нам важны конечные автоматы, а у них почти-почти то).<br/>Я не прочь отправить им патч к модулю и тесту - авось включат. <br/>Кстати, их тест весь модуль не покрывал - была нестыковочка.<br/>Вот только на их trac guest новый тикет создать не может. А почтового адреса, чтобы послать письмо, я так и не нашел.<br/>Что делать?<br/><br/>Написал, и самому смешно.
Общий :: Python для экспертов :: finite state machine на Питоне
2007-05-29T19:45:50+03:00Андрей Светлов5557По поводу DSL спорить точно бессмысленно. Это почти как религия, и каждый подход имеет свои достоинства и недостатки.<br/>Посмотрел WhatOS и aspn coockbook.<br/>WhatOS - интересно, но С специфика сильно проявляется. aspn - простенько до неудобства. У меня каждое состояние - довольно большая вещь, скорее не атом, а режим работы программы. Так удобнее. Иначе состояний появляется бесчетное множество и прописывать переходы между ними становится затруднительно.<br/>Немного докрутил (были проблемы с наследованием состояний), и доволен. Состояния можно разносить по отдельным модулям - удобно.<br/>По сути наследник mode рассматривается как специфическая запись контейнера именованных функций, не более того. И экземпляр его не создается.<br/>Занятная вещь получилась
Общий :: Python для экспертов :: finite state machine на Питоне
2007-05-29T11:11:59+03:00bialix5542вот кстати тот рецепт из поваренной книги, который я упоминал:<br/><a href="http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/146262">http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/146262</a><br/><br/>так, до кучи. там нет действий по выходу и входу из/в состояние, но наверное их можно доточить по принципу epsilon, при желании конечно. видел код этого рецепта использовался в каком-то реальном OSS проекте. Не помню каком.
Общий :: Python для экспертов :: finite state machine на Питоне
2007-05-29T11:07:15+03:00bialix5541<blockquote><em>Андрей Светлов</em><br/>мне нужно описать поведение клиента. Естественнее всего оно выражается в два десятка состояний с довольно нетривиальными переходами. Так что без FSM обойтись сложно.</blockquote>У меня практически все сишные программы строятся на автоматах. Поэтому мне без них вобще обойтись сложно. А питон – ИМХО – слишком сложно или некрасиво там автоматы делать руками, поэтому я там не заморачиваюсь.<br/><br/><blockquote><em>Андрей Светлов</em><br/>У divmod традиционно туго с документацией. Но неплохо с тестами, а epsilon весьма невелика. Мне тестов (а потом и исходников) вполне хватило.</blockquote>Исходники-то я прочел и кажется понял как оно предполагается работать. Просто хотелось уточнить.<br/><br/><blockquote><em>Андрей Светлов</em><br/>P.S. Питон вполне может заменить DSL - по моему глубокому убеждению.<br/>Примерно как в nevow.tags - еще одном продукте от divmod:<br/>a(href='url')['This is', b, ‘and’, i, ‘text’]</blockquote>Не-а. По моему глубокому убеждению – не может. Слишком нечитаемо получается, слишком много мусора.<br/>Теже кавычки надо городить, см. ваш же пример.<br/>DSL на то он и domain-specific language, чтобы кратко и изящно описывать некую предметную область.<br/>Я использовал питон как DSL в нескольких проектах – слишком много ненужных знаков пунктуации надо городить, чтобы соблюсти правильный питон-синтаксис. <br/>Это плохо, если на таком DSL будет писать не питонщик. Это мой реальный опыт.<br/>Тот же scons – все вроде хорошо, кроме изврата с записью списка файлов.<br/>Так что не согласен я с вами, но спорить долго и нудно не буду.
Общий :: Python для экспертов :: finite state machine на Питоне
2007-05-29T10:26:10+03:00Андрей Светлов5539мне нужно описать поведение клиента. Естественнее всего оно выражается в два десятка состояний с довольно нетривиальными переходами. Так что без FSM обойтись сложно. <br/><br/>В epsilon введение состояний как внутренних классов с их последующей инструментацией мне понравилось. Хорошо разносит логику различных режимов.<br/>IAR видел. Не прижился почему-то. Наверное, я тогда думал несколько по другому.<br/>Для С++ есть statechart (официально включена в boost) и fsm - лежит в boost vault. Обе - вполне изящны.<br/><br/>У divmod традиционно туго с документацией. Но неплохо с тестами, а epsilon весьма невелика. Мне тестов (а потом и исходников) вполне хватило.<br/><br/>P.S. Питон вполне может заменить DSL - по моему глубокому убеждению.<br/>Примерно как в nevow.tags - еще одном продукте от divmod:<br/>a(href='url')['This is', b, ‘and’, i, ‘text’]
Общий :: Python для экспертов :: finite state machine на Питоне
2007-05-29T09:42:27+03:00bialix5538<blockquote><em>bialix</em><br/>Посмотрю названные вами либы. Может пойму, что именно вам нужно.</blockquote>Посмотрел. В общем понятно к чему вы стремитесь.<br/>Хотя по-прежнему считаю, что FSM нужно описывать не программно, а через понятные человеку диаграммы или что-то типа специализированного DSL. А из этого понятного описания генерить код автоматом.<br/><br/>Имел очень приятный опыт общения с генератором IAR Visual State (для Си и за деньги).<br/><br/>Пробовал SMC. Остался разочарован.<br/><a href="http://smc.sourceforge.net/">http://smc.sourceforge.net/</a><br/><br/>Были мысли написать свой DSL для автоматов с питоно-подобным синтаксисом. Но пока мне лень.<br/><br/>А у divmod есть где-то дока на пакет Epsilon или Use the source, Luke?
Общий :: Python для экспертов :: finite state machine на Питоне
2007-05-29T09:17:18+03:00bialix5537По рюсски – это конечные автоматы.<br/><br/>Вот здесь неплохое введение для чайников: <a href="http://softcraft.ru/design/ap/ap01.shtml">http://softcraft.ru/design/ap/ap01.shtml</a><br/><br/>А здесь: <a href="http://softcraft.ru/auto.shtml">http://softcraft.ru/auto.shtml</a><br/>туча статей на эту тему, для более глубокого погружения.<br/><br/>Можно видеть, что автоматное движение имеет несколько основных направлений и идеологий: switch и КА.<br/>Также неплохо почитать статью о состоянии дел за рубежом, искать по ключевому слову “синхронное программирование” (гугля с википедией рулят)<br/><a href="http://www.softcraft.ru/auto/switch/syncprog/index.shtml">http://www.softcraft.ru/auto/switch/syncprog/index.shtml</a><br/><br/>Вот на википедии: <a href="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">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</a><br/><br/>Вобщем для старта этого будет достаточно.