Skip to content

Commit 79445de

Browse files
authored
Унифицирование сигнатур функций rpq и cfpq (#166)
* Change signatures of tasks 3 and 4 Also delete all not necessary functions * Delete unused import * Rewrite task 3 about constructor
1 parent 3ff89ae commit 79445de

5 files changed

Lines changed: 19 additions & 64 deletions

File tree

tasks.md

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757

5858
Полный балл: 5
5959

60-
- [ ] Реализовать тип (`AdjacencyMatrixFA`), представляющий конечный автомат в виде разреженной матрицы смежности из [sciPy](https://docs.scipy.org/doc/scipy/reference/sparse.html) (или сразу её булевой декомпозиции) и информации о стартовых и финальных вершинах. У типа должны быть конструкторы от `DeterministicFiniteAutomaton` и `NondeterministicFiniteAutomaton` из [Задачи 2](#задача-2-построение-детерминированного-конечного-автомата-по-регулярному-выражению-и-недетерминированного-конечного-автомата-по-графу).
60+
- [ ] Реализовать тип (`AdjacencyMatrixFA`), представляющий конечный автомат в виде разреженной матрицы смежности из [sciPy](https://docs.scipy.org/doc/scipy/reference/sparse.html) (или сразу её булевой декомпозиции) и информации о стартовых и финальных вершинах. У типа должны быть конструктор от `DeterministicFiniteAutomaton` и `NondeterministicFiniteAutomaton` (первый является подклассом второго, так что можно не различать их явно) из [Задачи 2](#задача-2-построение-детерминированного-конечного-автомата-по-регулярному-выражению-и-недетерминированного-конечного-автомата-по-графу).
6161
- [ ] Реализовать функцию-интерпретатор для типа `AdjacencyMatrixFA`, выясняющую, принимает ли автомат заданную строку и является ли язык, задающийся автоматом, пустым. Для реализации последней функции рекомендуется использовать транзитивное замыкание матрицы смежности.
6262
- Требуемые функции:
6363
```python
@@ -76,8 +76,8 @@
7676
- [ ] На основе предыдущей функции реализовать **функцию** выполнения регулярных запросов к графам: по графу с заданными стартовыми и финальными вершинами и регулярному выражению вернуть те пары вершин из заданных стартовых и финальных, которые связанны путём, формирующем слово из языка, задаваемого регулярным выражением.
7777
- Требуемая функция:
7878
```python
79-
def tensor_based_rpq(graph: MultiDiGraph, start_nodes: set[int],
80-
final_nodes: set[int], regex:str) -> list[tuple[NodeView, NodeView]]:
79+
def tensor_based_rpq(regex: str, graph: MultiDiGraph, start_nodes: set[int],
80+
final_nodes: set[int]) -> set[tuple[int, int]]:
8181
pass
8282
```
8383

@@ -90,11 +90,10 @@
9090

9191
- [ ] Используя [разреженные матрицы из sciPy](https://docs.scipy.org/doc/scipy/reference/sparse.html) реализовать **функцию** достижимости с регулярными ограничениями с несколькими стартовыми вершинами (алгоритм на основе multiple source BFS через линейную алгебру).
9292
- Для конструирования регулярного запроса и графа использовать [Задачи 2](#задача-2-построение-детерминированного-конечного-автомата-по-регулярному-выражению-и-недетерминированного-конечного-автомата-по-графу).
93-
- Для каждой из стартовых вывести множество достижимых из неё.
9493
- Требуемая функция:
9594
```python
96-
def ms_bfs_based_rpq(fa: AdjacencyMatrixFA,
97-
constraints_fa: AdjacencyMatrixFA) -> dict[int, set[int]]:
95+
def ms_bfs_based_rpq(regex: str, graph: MultiDiGraph, start_nodes: set[int],
96+
final_nodes: set[int]) -> set[tuple[int, int]]:
9897
pass
9998
```
10099
- [ ] Добавить собственные тесты при необходимости.

tests/autotests/helper.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,6 @@ def generate_rnd_start_and_final(graph: nx.MultiDiGraph) -> tuple[set[int], set[
4141
return start_nodes, final_nodes
4242

4343

44-
def rpq_dict_to_set(rpq: dict[int, set[int]]) -> set[tuple[int, int]]:
45-
rpq_set = set()
46-
for node_from, nodes_to in rpq.items():
47-
for node_to in nodes_to:
48-
rpq_set.add((node_from, node_to))
49-
return rpq_set
50-
51-
5244
class GraphWordsHelper:
5345
graph = None
5446
final_nodes = None

tests/autotests/rpq_concrete_cases.py

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import graphs
44
from copy import copy
5-
from helper import rpq_dict_to_set
65
from networkx import MultiDiGraph
76

87

@@ -28,7 +27,7 @@ def __init__(
2827
def check_answer_regex(
2928
self,
3029
function: Callable[
31-
[MultiDiGraph, set[int], set[int], str], list[tuple[int, int]]
30+
[str, MultiDiGraph, set[int], set[int]], set[tuple[int, int]]
3231
],
3332
):
3433
"""
@@ -37,32 +36,10 @@ def check_answer_regex(
3736
:return: assertion
3837
"""
3938
assert (
40-
set(function(self.graph, self.start_nodes, self.final_nodes, self.regex))
39+
function(self.regex, self.graph, self.start_nodes, self.final_nodes)
4140
== self.expected_answer
4241
)
4342

44-
def check_answer_automata(
45-
self,
46-
function,
47-
fa,
48-
constraints_fa,
49-
):
50-
"""
51-
assertion function for algorithms with automata
52-
:param function: the function under test (*ms_bfs_based_rpq*)
53-
:param fa: automata by graph
54-
:param constraints_fa: automata by regex
55-
:return: assertion
56-
"""
57-
assert rpq_dict_to_set(function(fa, constraints_fa)) == self.expected_answer
58-
59-
def __str__(self):
60-
return (
61-
f"expected result: {self.expected_answer}\n"
62-
+ f"regex: {self.regex}"
63-
+ f"graph: {self.graph.edges(data=True)}"
64-
)
65-
6643

6744
CASES_RPQ = [
6845
CaseRPQ(graphs.point_graph, "a", set()),

tests/autotests/rpq_template_test.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
from copy import deepcopy
2-
from helper import generate_rnd_start_and_final, rpq_dict_to_set
2+
from helper import generate_rnd_start_and_final
33
from networkx import MultiDiGraph
44
from pyformlang.cfg import CFG
55
from pyformlang.rsa import RecursiveAutomaton
66
from typing import Callable, Iterable
77

88
try:
9-
from project.task2 import graph_to_nfa, regex_to_dfa
10-
from project.task3 import AdjacencyMatrixFA
119
from project.task4 import ms_bfs_based_rpq
1210
except ImportError:
1311
pass
@@ -27,12 +25,10 @@ def rpq_cfpq_test(
2725
cfpq: set[tuple[int, int]] = function(
2826
cf_gram, deepcopy(graph), start_nodes, final_nodes
2927
)
30-
rpq: set[tuple[int, int]] = rpq_dict_to_set(
31-
ms_bfs_based_rpq(
32-
AdjacencyMatrixFA(graph_to_nfa(graph, start_nodes, final_nodes)),
33-
AdjacencyMatrixFA(regex_to_dfa(regex_str)),
34-
)
28+
rpq: set[tuple[int, int]] = ms_bfs_based_rpq(
29+
regex_str, deepcopy(graph), start_nodes, final_nodes
3530
)
31+
3632
assert cfpq == rpq
3733

3834

tests/autotests/test_task04.py

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,12 @@
66
from copy import deepcopy
77
import pytest
88
from grammars_constants import REGEXES
9-
from helper import generate_rnd_start_and_final, rpq_dict_to_set
9+
from helper import generate_rnd_start_and_final
1010
from rpq_concrete_cases import CASES_RPQ, CaseRPQ
1111

1212
# Fix import statements in try block to run tests
1313
try:
14-
from project.task2 import regex_to_dfa, graph_to_nfa
15-
from project.task3 import tensor_based_rpq, AdjacencyMatrixFA
14+
from project.task3 import tensor_based_rpq
1615
from project.task4 import ms_bfs_based_rpq
1716
except ImportError:
1817
pytestmark = pytest.mark.skip("Task 4 is not ready to test!")
@@ -26,23 +25,15 @@ def query(request) -> str:
2625
class TestRPQ:
2726
@pytest.mark.parametrize("case", CASES_RPQ)
2827
def test_concrete_cases(self, case: CaseRPQ):
29-
fa = AdjacencyMatrixFA(
30-
graph_to_nfa(case.graph, case.start_nodes, case.final_nodes)
31-
)
32-
constraint_fa = AdjacencyMatrixFA(regex_to_dfa(case.regex))
33-
case.check_answer_automata(ms_bfs_based_rpq, fa, constraint_fa)
28+
case.check_answer_regex(ms_bfs_based_rpq)
3429

3530
def test(self, graph, query) -> None:
3631
start_nodes, final_nodes = generate_rnd_start_and_final(graph.copy())
37-
fa = AdjacencyMatrixFA(
38-
graph_to_nfa(deepcopy(graph), deepcopy(start_nodes), deepcopy(final_nodes))
39-
)
40-
constraint_fa = AdjacencyMatrixFA(regex_to_dfa(query))
41-
reachable = rpq_dict_to_set(
42-
ms_bfs_based_rpq(deepcopy(fa), deepcopy(constraint_fa))
32+
ms_bfs = ms_bfs_based_rpq(
33+
query, deepcopy(graph), deepcopy(start_nodes), deepcopy(final_nodes)
4334
)
44-
ends = tensor_based_rpq(
45-
deepcopy(graph), deepcopy(start_nodes), deepcopy(final_nodes), query
35+
tensor = tensor_based_rpq(
36+
query, deepcopy(graph), deepcopy(start_nodes), deepcopy(final_nodes)
4637
)
4738

48-
assert set(ends) == reachable
39+
assert tensor == ms_bfs

0 commit comments

Comments
 (0)