Skip to content

Commit

Permalink
Поправил нумерацию задач. Удалил лишние.
Browse files Browse the repository at this point in the history
  • Loading branch information
gsvgit committed Apr 19, 2024
1 parent f3a454a commit f2623ba
Show file tree
Hide file tree
Showing 7 changed files with 257 additions and 309 deletions.
48 changes: 36 additions & 12 deletions tasks/task10.md
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 в репозитории
2 changes: 1 addition & 1 deletion tasks/task11_bonus.md → tasks/task10_bonus.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Задача 12. Экспериментальное исследование алгоритмов решения задачи достижимости с КС ограничениями
# Задача 10. Экспериментальное исследование алгоритмов решения задачи достижимости с КС ограничениями

* **Мягкий дедлайн**: 11.12.2022, 23:59
* **Жёсткий дедлайн**: 14.12.2022, 23:59
Expand Down
234 changes: 198 additions & 36 deletions tasks/task11.md
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 реализовать синтаксический анализатор предложенного выше языка. А именно, реализовать функцию, которая принимает строку и возвращает дерево разбора.
- [ ] Реализовать функцию, которая по дереву разбора возвращает количество узлов в нём.
- [ ] Реализовать функцию, которая по дереву разбора строит строку, которая была разобрана.
Loading

0 comments on commit f2623ba

Please sign in to comment.