-
Notifications
You must be signed in to change notification settings - Fork 140
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Поправил нумерацию задач. Удалил лишние.
- Loading branch information
Showing
7 changed files
with
257 additions
and
309 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,16 +1,40 @@ | ||
# Задача 11. Тензорный алгоритм решения задачи достижимости с КС ограничениями | ||
# Задача 10. Экспериментальное исследование алгоритмов решения задачи достижимости с КС ограничениями | ||
|
||
* **Мягкий дедлайн**: 27.11.2022, 23:59 | ||
* **Жёсткий дедлайн**: 30.11.2022, 23:59 | ||
* Полный балл: 5 | ||
* **Мягкий дедлайн**: !!!, 23:59 | ||
* **Жёсткий дедлайн**: !!!, 23:59 | ||
* Полный балл: 19 | ||
|
||
## Задача | ||
|
||
- [ ] Реализовать **функцию**, основанную на тензорном алгоритме, решающую задачу достижимости между всеми парами вершин для заданного графа и заданной КС грамматики. | ||
- Результат работы функции --- множество троек вида (вершина, нетерминал, вершина). | ||
- Предусмотрите возможность получать граф из различных источников в различных форматах. | ||
- Предусмотрите возможность получать грамматику из различных источников (из файла, как результат работы других функций). | ||
- Для преобразования грамматики в РКА использовать результаты предыдущих работ. | ||
- Для реализации матричных операций использовать [sciPy](https://docs.scipy.org/doc/scipy/reference/sparse.html). | ||
- [ ] На основе предыдущей функции реализовать функцию, позволяющую решать задачу достижимости для заданного набора стартовых и финальных вершин, и заданного нетерминала. | ||
- [ ] Добавить необходимые тесты. | ||
Задача посвящена анализу производительности различных алгоритмов решения задачи достижимости между всеми парами вершин с контекстно-свободными ограничениями: алгоритма Хеллингса, матричного алгоритма, тензорного алгоритма. В ходе анализа необходимо ответить на следующие вопросы. | ||
- Какой из трёх указанных алгоритмов обладает лучшей производительностью? | ||
- Имеет ли смысл для решения задачи достижимости с регулярными ограничениями использовать алгоритмы для КС ограничений (ведь регулярные --- частный случай КС) или всё же лучше использовать специализированные алгоритмы для регулярных ограничений? | ||
|
||
Решение данной задачи оформляется как Python notebook. Для того, чтобы обеспечить возможность проверки, необходимо сделать notebook самодостаточным: в него должны быть включены все действия, необходимые для воспроизведения эксперимента. Также в notebook размещается отчет и анализ результатов ваших экспериментов в текстовом виде. Отчет сопровождается диаграммами, таблицами, картинками, если это необходимо для объяснения результатов. | ||
|
||
Решением является не просто код, но отчёт об экспериментальном исследовании, который должен являться связанным текстом и содержать (как минимум) следующие разделы: | ||
- Постановка задачи | ||
- Описание исследуемых решений | ||
- Описание набора данных для экспериментов | ||
- Графы | ||
- Запросы | ||
- Описание эксперимента | ||
- Оборудование | ||
- Что и как замерялось, как эти измерения должны помочь ответить на поставленные вопросы | ||
- Результаты экспериментов | ||
- Графики, таблицы | ||
- Анализ результатов экспериментов | ||
- Ответы на поставленные вопросы, аргументация ответов | ||
|
||
- [ ] Создать Python notebook, подключить необходимые зависимости. | ||
- [ ] Подключить необходимые решения из предыдущих работ. | ||
- [ ] Сформировать набор данных. | ||
- [ ] Выбрать некоторые графы из [набора](https://formallanguageconstrainedpathquerying.github.io/CFPQ_Data/graphs/index.html). Не забудьте обосновать, почему выбрали именно эти графы. Обратите внимание, что в наборе есть графы и грамматики для различных прикладных задач (анализ RDF, анализ указателей в С, анализ Java-программ). Рекомендуется выбирать графы, относящиеся к различным областям. | ||
- [ ] В качестве запросов предлагается использовать грамматики из раздела "Canonical grammars" в описании соответствующего графа ([пример](https://formallanguageconstrainedpathquerying.github.io/CFPQ_Data/graphs/data/taxonomy_hierarchy.html#canonical-grammars)). | ||
- [ ] Сформулировать этапы эксперимента. Что нужно сделать, чтобы ответить на поставленные вопросы? Почему? | ||
- [ ] Провести необходимые эксперименты, замеры | ||
- [ ] Оформить результаты экспериментов | ||
- [ ] Провести анализ результатов | ||
- [ ] Ответить на поставленные вопросы | ||
- [ ] Аргументировать ответы (пользуясь полученными результатами экспериментов) | ||
- [ ] Не забыть опубликовать notebook в репозитории |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,40 +1,202 @@ | ||
# Задача 12. Экспериментальное исследование алгоритмов решения задачи достижимости с КС ограничениями | ||
# Задача 11. Язык запросов к графам | ||
|
||
* **Мягкий дедлайн**: 11.12.2022, 23:59 | ||
* **Жёсткий дедлайн**: 14.12.2022, 23:59 | ||
* **Жёсткий дедлайн**: 15.05.2024, 23:59 | ||
* Полный балл: 10 | ||
|
||
## Задача | ||
## Конкретный синтаксис | ||
``` | ||
prog = stmt* | ||
stmt = bind | add | remove | declare | ||
declare = VAR 'is' 'graph' | ||
bind = 'let' VAR '=' expr | ||
remove = 'remove' ('vertex' | 'edge' | 'vertices') expr 'from' VAR | ||
add = 'add' ('vertex' | 'edge') expr 'to' VAR | ||
expr = NUM | CHAR | VAR | edge_expr | set_expr | regexp | select | ||
set_expr = '[' expr (',' expr)* ']' | ||
edge_expr = '(' expr ',' expr ',' expr ')' | ||
regexp = CHAR | VAR | '(' regexp ')' | (regexp '|' regexp) | (regexp '^' range) | (regexp '.' regexp) | (regexp '&' regexp) | ||
range = '[' NUM '..' NUM? ']' | ||
select = v_filter? v_filter? 'return' VAR (',' VAR)? 'where' VAR 'reachable' 'from' VAR 'in' VAR 'by' expr | ||
v_filter = 'for' VAR 'in' expr | ||
VAR = [a..z]+[a..z 0..1]* | ||
NUM = [1..9]+[0..9]* | ||
CHAR = '"' [a..z] '"' | ||
``` | ||
|
||
Пример запроса. | ||
|
||
``` | ||
let g is graph | ||
add edge (1, "a", 2) to g | ||
add edge (2, "a", 3) to g | ||
add edge (3, "a", 1) to g | ||
add edge (1, "c", 0) to g | ||
add edge (0, "b", 4) to g | ||
add edge (4, "b", 0) to g | ||
let q = "a"^[1..3] . q . "b"^[2..3] | "c" | ||
let r1 = for v in [2] return u where u reachable from v in g by q | ||
add edge (0, "d", 5) to g | ||
let r2 = for v in [2,3] return u,v where u reachable from v in g by (q . "d") | ||
``` | ||
|
||
## Правила вывода типов | ||
|
||
Константы типизируются очевидным образом. | ||
|
||
Тип переменной определяется типом выражения, с которым она связана. | ||
``` | ||
[b(v)] => t | ||
_________________ | ||
[Var (v)](b) => t | ||
``` | ||
|
||
Пересечение для двух КС не определено. | ||
|
||
``` | ||
[e1](b) => FA ; [e2](b) => FA | ||
______________________________________ | ||
[Intersect (e1, e2)](b) => FA | ||
[e1](b) => FA ; [e2](b) => RSM | ||
_______________________________________ | ||
[Intersect (e1, e2)](b) => RSM | ||
[e1](b) => RSM ; [e2](b) => FA | ||
_______________________________________ | ||
[Intersect (e1, e2)](b) => RSM | ||
``` | ||
|
||
Остальные операции над автоматами типизируются согласно формальных свойств классов языков. | ||
``` | ||
[e1](b) => FA ; [e2](b) => FA | ||
_____________________________________ | ||
[Concat (e1, e2)](b) => FA | ||
[e1](b) => FA ; [e2](b) => RSM | ||
______________________________________ | ||
[Concat (e1, e2)](b) => RSM | ||
Задача посвящена анализу производительности различных алгоритмов решения задачи достижимости между всеми парами вершин с контекстно-свободными ограничениями: алгоритма Хеллингса, матричного алгоритма, тензорного алгоритма. В ходе анализа необходимо ответить на следующие вопросы. | ||
- Какой из трёх указанных алгоритмов обладает лучшей производительностью? | ||
- Имеет ли смысл для решения задачи достижимости с регулярными ограничениями использовать алгоритмы для КС ограничений (ведь регулярные --- частный случай КС) или всё же лучше использовать специализированные алгоритмы для регулярных ограничений? | ||
|
||
Решение данной задачи оформляется как Python notebook. Для того, чтобы обеспечить возможность проверки, необходимо сделать notebook самодостаточным: в него должны быть включены все действия, необходимые для воспроизведения эксперимента. Также в notebook размещается отчет и анализ результатов ваших экспериментов в текстовом виде. Отчет сопровождается диаграммами, таблицами, картинками, если это необходимо для объяснения результатов. | ||
|
||
Решением является не просто код, но отчёт об экспериментальном исследовании, который должен являться связанным текстом и содержать (как минимум) следующие разделы: | ||
- Постановка задачи | ||
- Описание исследуемых решений | ||
- Описание набора данных для экспериментов | ||
- Графы | ||
- Запросы | ||
- Описание эксперимента | ||
- Оборудование | ||
- Что и как замерялось, как эти измерения должны помочь ответить на поставленные вопросы | ||
- Результаты экспериментов | ||
- Графики, таблицы | ||
- Анализ результатов экспериментов | ||
- Ответы на поставленные вопросы, аргументация ответов | ||
|
||
- [ ] Создать Python notebook, подключить необходимые зависимости. | ||
- [ ] Подключить необходимые решения из предыдущих работ. | ||
- [ ] Сформировать набор данных. | ||
- [ ] Выбрать некоторые графы из [набора](https://formallanguageconstrainedpathquerying.github.io/CFPQ_Data/graphs/index.html). Не забудьте обосновать, почему выбрали именно эти графы. Обратите внимание, что в наборе есть графы и грамматики для различных прикладных задач (анализ RDF, анализ указателей в С, анализ Java-программ). Рекомендуется выбирать графы, относящиеся к различным областям. | ||
- [ ] В качестве запросов предлагается использовать грамматики из раздела "Canonical grammars" в описании соответствующего графа ([пример](https://formallanguageconstrainedpathquerying.github.io/CFPQ_Data/graphs/data/taxonomy_hierarchy.html#canonical-grammars)). | ||
- [ ] Сформулировать этапы эксперимента. Что нужно сделать, чтобы ответить на поставленные вопросы? Почему? | ||
- [ ] Провести необходимые эксперименты, замеры | ||
- [ ] Оформить результаты экспериментов | ||
- [ ] Провести анализ результатов | ||
- [ ] Ответить на поставленные вопросы | ||
- [ ] Аргументировать ответы (пользуясь полученными результатами экспериментов) | ||
- [ ] Не забыть опубликовать notebook в репозитории | ||
[e1](b) => RSM ; [e2](b) => FA | ||
______________________________________ | ||
[Concat (e1, e2)](b) => RSM | ||
[e1](b) => RSM ; [e2](b) => RSM | ||
______________________________________ | ||
[Concat (e1, e2)](b) => RSM | ||
``` | ||
|
||
``` | ||
[e1](b) => FA ; [e2](b) => FA | ||
______________________________________ | ||
[Union (e1, e2)](b) => FA | ||
[e1](b) => FA ; [e2](b) => RSM | ||
_______________________________________ | ||
[Union (e1, e2)](b) => RSM | ||
[e1](b) => RSM ; [e2](b) => FA | ||
_______________________________________ | ||
[Union (e1, e2)](b) => RSM | ||
[e1](b) => RSM ; [e2](b) => RSM | ||
_______________________________________ | ||
[Union (e1, e2)](b) => RSM | ||
``` | ||
|
||
``` | ||
[e](b) => FA | ||
______________________ | ||
[Repeat (e)](b) => FA | ||
[e](b) => RSM | ||
______________________ | ||
[Repeat (e)](b) => RSM | ||
``` | ||
|
||
``` | ||
[e](b) => char | ||
________________________ | ||
[Symbol (e)](b) => FA | ||
``` | ||
|
||
Запрос возвращает множество (вершин или пар вершин) | ||
|
||
``` | ||
[e](b) => Set<int> | ||
_______________________________ | ||
[VFilter (v, e)](b) => Set<int> | ||
[q](b) => RSM, [ret](b) => int | ||
_____________________________________________________ | ||
[Select (vf1, vf2, ret, v1, v2, g, q)](b) => Set<int> | ||
[q](b) => FA, [ret](b) => int | ||
_____________________________________________________ | ||
[Select (vf1, vf2, ret, v1, v2, g, q)](b) => Set<int> | ||
[q](b) => FA, [ret](b) => int * int | ||
____________________________________________________________ | ||
[Select (vf1, vf2, ret, v1, v2, g, q)](b) => Set<int * int> | ||
[q](b) => RSM, [ret](b) => int * int | ||
____________________________________________________________ | ||
[Select (vf1, vf2, ret, v1, v2, g, q)](b) => Set<int * int> | ||
``` | ||
|
||
|
||
## Динамическая семантика языка запросов | ||
|
||
Связывание переопределяет имя. | ||
|
||
``` | ||
[e](b1) => x,b2 | ||
_____________________________________ | ||
[Bind (v, e)](b1) => (), (b1(v) <= x) | ||
``` | ||
|
||
Результатом исполнения программы является словарь, где ключ --- имя переменной в связывании, у которого в правой части select, а значение --- результат вычисления соответствующего запроса. | ||
|
||
## Задача | ||
- [ ] С использованием ANTLR реализовать синтаксический анализатор предложенного выше языка. А именно, реализовать функцию, которая принимает строку и возвращает дерево разбора. | ||
- [ ] Реализовать функцию, которая по дереву разбора возвращает количество узлов в нём. | ||
- [ ] Реализовать функцию, которая по дереву разбора строит строку, которая была разобрана. |
Oops, something went wrong.