OnionGrief / Chipollino

преобразования регулярных выражений и конечных автоматов
Other
19 stars 4 forks source link

Прототип рендера автоматов #222

Closed TonitaN closed 1 year ago

TonitaN commented 1 year ago

Конвертер из исходного dot в промежуточное представление

Постпроцессинг tikz

Постпроцессинг latex

Прототипы рендера в одном архиве:

добавлена настраиваемая поддержка разметки Annote и Linearize и перегрузка запятой

TonitaN commented 1 year ago

Постпроцессинг latex пока идёт лесом, т.к. в связи с Antimirov и MergeBisim всё равно нужны длинные метки и разбивка, и оно стоило того, чтобы его сделать.

Всякие автоматы

Можно с чистой совестью включать какую-нибудь подобную картинку в тезисы.

Большая часть времени убита на взаимодействие всего этого дела с latex и dot2tex (ох уж эти относительные зависимости в питоне :( ). Попытка обойтись без препроцессинга, только одной постобработкой, дала крайне печальные результаты. Поэтому пока только в режиме Preprocess -> dot2tex -> Postprocess нормально получилось.

Скрипты ниже. В них есть похожие куски в синтаксическом разборе, т.к. существует гомоморфизм tikz в dot (увы, не наоборот, иначе бы было всё совсем просто), и по идее нужно сделать разбор по параметризованной грамматике. Но дедлайн 6 утра через час, и вообще лнь.

[Долой из EDIT-ов старые версии]

HeaderColor должен быть установлен в преамбуле. У меня так:

\definecolor{HeaderColor}{rgb}{0.85,.86,0.95}

Остальная преамбула (включая прочие цвета) подойдёт, например, из слайдов про бисимуляцию (а вообще нужно всё-таки сделать расширяемую преамбулу).

Скрипт запуска под виндой:

set arg=%1
refgo Preprocess+MathMode %arg%".dot" 2>error_refal
dot2tex -ftikz -tmath "Mod_"%arg%".dot" > %arg%".tex"  2>error_dot2tex
refgo Postprocess+MathMode %arg%".tex" 2>error_refal

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

EDIT: Откорректирована яркость цветов в стилях и ещё пара косметических изменений (про ловушку). +исправлена документация

TonitaN commented 1 year ago

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

TonitaN commented 1 year ago

Да! Эксперименты показали, что препроцессинг рулит по скорости. --autosize в dot2tex работает оооооооооочень долго, а рефал даёт пренебрежимо малую задержку (несоизмеримо быстрее, чем даже базовый dot2tex). В целом скорость приемлемая и не бесящая даже для автоматов из 50 состояний.

TonitaN commented 1 year ago

На светлое будущее

Не в шапке, чтобы не пугать себя объёмом TODO.

TonitaN commented 1 year ago

При автозуме вариант корректного размещения на слайде логично писать в комментарии к Latex - исходнику с диаграммой либо ещё как-то дополнительно (не сразу в include). Т.к. если диаграмму можно вписать в министраницу, то ещё нужно проверить, а впишется ли в министраницу соседняя с ней, а если переносить на сдедующий слайд, то это нужно делать вместе с поясняющим текстом. По комментариям + шаблону уже возможно построить окончательный вариант размещения.

TonitaN commented 1 year ago

Читаем pagedata --- сколько процентов от ширины и высоты фрейма сжирается по умолчанию (например, 50 ; 80). В итоговом исходнике первой строкой --- комментарий, в котором указано, можно ли пользоваться дефолтным размещением автомата по горизонтали и по вертикали, и какой процент от рассчитанного размещения (дефолтного или сброшенного) приблизительно будет занимать диаграмма. Чтобы этот процент можно было использовать как входные данные для соседней с ней диаграммы. Т.к. часто диаграммы очень растянутые, и две нормально помещаются на одном фрейме, но друг под другом и с большим уменьшением. Если они компактные, то адекватное размещение подразумевает министраницу. Если одна компактная, а другая длинная - вот в этом случае получается фигня, но она так или иначе получится.

TonitaN commented 1 year ago

Какая-то случайная последовательность автоматов с очень длинными и очень широкими и с небольшими:

R = {(a|b)(ba|aab|bc)*(ab|cb)(ca|aab|bca)*(a|)} !!
A4 = MergeBisim.Antimirov R !!
A5 = Minimize.Determinize.RemEps.Thompson R !!
R2 = {a|ba|aa*} !!
A6 = Reverse.Reverse.Antimirov R2 !!
A7 = Minimize.Determinize.Glushkov R2 !!

Результат на pagedata: 48; 75 DummyTest4875.pdf Результат на pagedata: 48; 50 DummyTest4850.pdf Результат на pagedata: 60; 50 DummyTest6050.pdf Результат на pagedata: 80; 85 DummyTest8085.pdf

Многие автоматы повторяются, потому что тупо взяты из старого логгера все подряд. Первый параметр pagedata --- предельно допустимая ширина для вписывания в министраницу. Если он больше 49, то он нагло игнорируется, т.к. две такие параллельные министраницы наверняка не вместятся и поедут. Второй параметр pagedata --- сколько места на слайде в высоту максимум должна занимать диаграмма, если она не переносится на новую страницу. Итоговый векторный тайпсет кажется приемлемым, кроме очень больших в высоту диаграмм, в которых ничего не разобрать даже при максимальном выделении им места на слайде. В случае таких диаграмм спасёт только переход в текстовую форму, который обычно не нужен. Поэтому нормально, если чрезмерно высокая степень переполнения будет вызывать предупреждение, что масштаб нечитаемый. Логгер для логгера )

TonitaN commented 1 year ago

Для (не)рабской силы. Расшифровка pagedata с точки зрения логов (соответствующие проценты желательно оставить в метаданных - комментарии сразу после \begin{frame}{имя} в шаблонах):

  1. если часть слайда занимают какие-то пояснения, вычитаем её из второго параметра (процент слайда в длину на диаграмму)
  2. если хочется дать возможность разместить два автомата на одном слайде (например, было - стало, или при сравнении), первый или второй параметры pagedata (или оба сразу) делаем чуть меньше 50

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

TonitaN commented 1 year ago

Про хранящиеся в кэше автоматы: по идее, достаточно сохранить имя tex-исходника (после альфа-преобразования и стирания разметки) в логгере языка (???). И дальше при обращении к кэшу просто \input{cached_diagram_name}.

mathhyyn commented 1 year ago

В архиве нет Preprocess

TonitaN commented 1 year ago

Уже теперь должно быть)

TonitaN commented 1 year ago

На всякий случай напомню:

От рефал-юникода зависеть вроде как не должно, все образцы читают только ASCII. Кое-где это нехорошо (в шапке таблицы-легенды), но нет у меня юникод-рефала :'-(

xtoter commented 1 year ago

Если кто-то вдруг потестить захочет, то воть тык. Проверили, на данной версии отрабатывает корректно.

TonitaN commented 1 year ago

Эдгару привет ) Лабу сдать всё равно придётся.

И ещё немного прекрасного от студентов иу9 по теме дня: Refal0 Shrek_Refal

mathhyyn commented 1 year ago

Кстати говоря, (не)раб согласен и уже приступил. (Рефал мы ему уже поставили) Завтра консультация в 14 в 309ю? а то 1я группа не в курсе)))

EDIT: да.

TonitaN commented 1 year ago

В 14 в 330.

EDIT: Скромно так всё спряталось в EDIT-ы.

TonitaN commented 1 year ago

Кстати говоря, (не)раб согласен и уже приступил. (Рефал мы ему уже поставили) Завтра консультация в 14 в 309ю? а то 1я группа не в курсе)))

EDIT: да.

Тогда зону обновлений рефал-рендера логично переместить в нерабский репозиторий, т.к. там будет более актуально согласование с рендерингом (эх, кто бы ещё ревьюил рефал-код? @xtoter , не хотите попробовать?). Но шаблон для тайпчекера у меня первый приоритет, когда закончу с лабами и РК (и его тоже с рефалом придётся согласовать из-за таблиц, поэтому пока что на плантацию не переезжаю).

mathhyyn commented 1 year ago

Если подразумеваются коммиты, то не возражаем. а если только issue, то лучше остаться в этом репозитории, чтобы все оставалось в одном месте. я максимум могу только тестить как работает..... (второй репозиторий(fork) был создан, чтобы не давать лишних прав не участникам проекта)

TonitaN commented 1 year ago

Если оперативно что-то фиксить и согласовывать, то удобнее коммитами, т.к. всё время сидеть в EDITах - это конечно наше всё, но рефал github не считает нормальными файлами, и аттачить его приходится через стиль девятки (ака .pdf.doc.pdf). Но пока рано об этом, решим, когда перейдём непосредственно к генерации.

К тому же issue вроде перемещаются, так что можно будет по необходимости сделать рефал-~бэд~-трип.

EDIT: Увы, бэд трип отменяется, можно переместить рефал-топики только в другой репозиторий Андрея ))

TonitaN commented 1 year ago

Я тут почитала wiki и поняла, что если пока остаётся рефал, то нужен скрипт, который бы взял на себя часть технических моментов. Для эстетов можно сделать в докере вместе со сборкой основной части проекта ))) А именно, что нам нужно:

  1. Скачивание и настройка рефала
  2. Сборка рефал-скриптов
  3. Скачивание и сетап dot2tex (причём если dot2tex уже есть более старой версии, то нужно выдать предупреждение, что придётся его снести, и отказаться от дальнейшей установки) Кстати вот latex не обязательно устанавливать, т.к. результатом работы логгера является tex-исходник, а его автоматическая трансляция в pdf - уже приятное дополнение.

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

xtoter commented 1 year ago

Ой, я бы взял🙃

TonitaN commented 1 year ago

Ок, берите, будет +2 балла ))

TonitaN commented 1 year ago

Только рефал, видимо, правильнее конкретно для установки под линукс брать для архитектуры x64, - тот, с которым вы работали на практике. В версии 2008 года поддерживается только архитектура x32, насколько я понимаю.

xtoter commented 1 year ago

Ну тут неясен вопрос что по лицензиям, правам и вообще, ибо 2008 года открыто публиковался (может взять любой желающий), а вот х64 я конечно вижу где взять (и вообще много его версий в одном месте вижу, хоть и видеть не должен), но все-таки прав на него у меня нету, и насколько хорошо его указывать в проекте и вообще куда-то выкладывать вопрос открытый(не знаю как там принято в сообществе). (Возможно стоит взять вариант Маздайщика, ибо там все красиво на гите, но не пробывал его запускать)

TonitaN commented 1 year ago

Есть такая проблема (( Если x32 будет неадекватен, придётся пока взять 5-лямбда (и всё-таки надеюсь, мы с вами дождёмся официального юникод-рефала x64 в ближайшем будущем ^_^ т.к. чистый пятый намного компактнее).

KarumaRey commented 1 year ago

Ошибка при вставке таблицы:

image

image

(В моём репозитории: ветка refal)

UPD: Исправлено)

TonitaN commented 1 year ago

В заголовке tex есть две следующие строки?

\PassOptionsToPackage{table}{xcolor}
...
\definecolor{HeaderColor}{rgb}{0.85,.86,0.95} % или любой другой RGB
TonitaN commented 1 year ago

Для xcolor должен быть либо подключён xcolor, либо так:

\usepackage{graphicx}
\usepackage{color}

(пакет graphicx подгружает xcolor, и если он подключён, то при подключении xcolor непосредственно может быть ошибка, поэтому я в преамбуле использую хак с передачей дополнительного параметра table)

KarumaRey commented 1 year ago

image

TonitaN commented 1 year ago

Ошибка при вставке таблицы:

image

image

(В моём репозитории: ветка refal)

А где там эта ветка? 👀 Мне не видно.

KarumaRey commented 1 year ago

добавил

TonitaN commented 1 year ago

Предлагаю всю математическую разметку делать с помощью рефала пока что:

Конечно, можно и двумя способами: что-то рефалом, что-то внутри модуля логгера. Если рефал потом будет что-то разрезать для масштабирования, что нам стоит дополнить его ещё одним уровнем рефал-стиля? Элементарно!

mathhyyn commented 1 year ago

добавить раскраску узлов по группам из метаданных и порождение необходимых цветов с помощью xcolor

как должны эти метаданные выглядеть и где должны находиться?

TonitaN commented 1 year ago

Они в dot-файле, после описания узла или стрелки, выглядят как комментарии: /*'group'[ID]*/. [ID] любое слово непустое, может быть общим у узлов и стрелок. По каждому id порождается свой цвет. Перед group и после открывающего значка комментария может стоять ещё что-нибудь, но пока что оно не учитывается.

mathhyyn commented 1 year ago

хм, тогда автоматы будут доставаться не из кэша N = MergeBisim.Glushkov {a*a}

(в MergeBisim автомат "до" будет отличаться от выходного после Glushkov из-за раскрашенных состояний)

TonitaN commented 1 year ago

Да, по идее в кеш не надо класть раскрашенные. А вроде пока нигде ничего не раскрашивается?

mathhyyn commented 1 year ago

Да, по идее в кеш не надо класть раскрашенные. А вроде пока нигде ничего не раскрашивается?

Нет((

TonitaN commented 1 year ago

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

xendalm commented 1 year ago

Поддерживаю. Лучше сделать для AutomatonToImage свой условный to_txt с параметрами, чем каждый раз создавать раскрашенные копии автоматов только для отображения.

TonitaN commented 1 year ago

Ну в общем да.

TonitaN commented 1 year ago

Кэш + наложение цветов =) (спасибо вектору)

rendered_report.pdf