Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/bisim-interpreter' into bisim
Browse files Browse the repository at this point in the history
  • Loading branch information
xendalm committed Apr 15, 2024
2 parents 3dbbe4c + dc2ca45 commit db4034b
Show file tree
Hide file tree
Showing 11 changed files with 97 additions and 22 deletions.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,9 @@ TG.generate_task(3, 5, false, false);
- `AddTrap: MFA -> MFA`
- `Complement: MFA -> MFA`
- `Deterministic: MFA -> Boolean`
- `Bisimilar: (MFA, MFA) -> OptionalBool`
- `ActionBisimilar: (MFA, MFA) -> Boolean`
- `LiterallyBisimilar: (MFA, MFA) -> Boolean`

**Метод Test**

Expand Down
3 changes: 3 additions & 0 deletions libs/FuncLib/include/FuncLib/Functions.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,9 @@ inline static const std::vector<Function> functions = {
{"OneUnambiguity", {ObjectType::NFA}, ObjectType::Boolean},
{"SemDet", {ObjectType::NFA}, ObjectType::Boolean},
{"IsAcreg", {ObjectType::BRefRegex}, ObjectType::Boolean},
{"Bisimilar", {ObjectType::MFA, ObjectType::MFA}, ObjectType::OptionalBool},
{"ActionBisimilar", {ObjectType::MFA, ObjectType::MFA}, ObjectType::Boolean},
{"LiterallyBisimilar", {ObjectType::MFA, ObjectType::MFA}, ObjectType::Boolean},
{"getNFA", {ObjectType::String}, ObjectType::NFA},
{"getMFA", {ObjectType::String}, ObjectType::MFA},
};
Expand Down
17 changes: 15 additions & 2 deletions libs/Interpreter/src/Interpreter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ optional<GeneralObject> Interpreter::apply_function(const Function& function,
if (function.name == "Arden") {
return ObjectRegex((get<ObjectNFA>(arguments[0]).value.to_regex(&log_template)));
}
if (function.name == "Bisimilar") {
if (function.name == "Bisimilar" && function.input[0] == ObjectType::NFA) {
return ObjectBoolean(FiniteAutomaton::bisimilar(
get_automaton(arguments[0]), get_automaton(arguments[1]), &log_template));
}
Expand Down Expand Up @@ -322,6 +322,18 @@ optional<GeneralObject> Interpreter::apply_function(const Function& function,
string filename = get<ObjectString>(arguments[0]).value;
return ObjectMFA(Parser::parse_MFA(filename));
}
if (function.name == "Bisimilar" && function.input[0] == ObjectType::MFA) {
return ObjectOptionalBool(MemoryFiniteAutomaton::bisimilar(
get<ObjectMFA>(arguments[0]).value, get<ObjectMFA>(arguments[1]).value, &log_template));
}
if (function.name == "ActionBisimilar") {
return ObjectBoolean(MemoryFiniteAutomaton::action_bisimilar(
get<ObjectMFA>(arguments[0]).value, get<ObjectMFA>(arguments[1]).value, &log_template));
}
if (function.name == "LiterallyBisimilar") {
return ObjectBoolean(MemoryFiniteAutomaton::literally_bisimilar(
get<ObjectMFA>(arguments[0]).value, get<ObjectMFA>(arguments[1]).value, &log_template));
}
// # place for another diff types funcs

/*
Expand Down Expand Up @@ -475,7 +487,8 @@ bool Interpreter::typecheck(vector<ObjectType> func_input_type, vector<ObjectTyp
// сверяем тип каждого аргумента
for (int i = 0; i < argument_type.size(); i++) {
// тип либо одинаковый, либо аргумент явл-ся подтипом требуемого типа
if (!(Typization::get_types(func_input_type[i], Typization::types_children).count(argument_type[i]) != 0 ||
if (!(Typization::get_types(func_input_type[i], Typization::types_children)
.count(argument_type[i]) != 0 ||
// если включен флаг динамического тайпчека - принимать DFA<-NFA
(flags[Flag::weak_type_comparison] && argument_type[i] == ObjectType::NFA &&
func_input_type[i] == ObjectType::DFA) ||
Expand Down
3 changes: 3 additions & 0 deletions libs/Objects/include/Objects/MemoryFiniteAutomaton.h
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,9 @@ class MemoryFiniteAutomaton : public AbstractMachine {
const std::unordered_set<int>& path_states) const;
bool path_contains_decisions(const std::unordered_set<int>& path_states) const;

static std::optional<bool> bisimilarity_checker(const MemoryFiniteAutomaton&,
const MemoryFiniteAutomaton&);

public:
MemoryFiniteAutomaton();
MemoryFiniteAutomaton(int initial_state, std::vector<MFAState> states,
Expand Down
15 changes: 7 additions & 8 deletions libs/Objects/src/FiniteAutomaton.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1686,7 +1686,7 @@ bool FiniteAutomaton::equal(const FiniteAutomaton& fa1, const FiniteAutomaton& f
if (log) {
log->set_parameter("automaton1", fa1);
log->set_parameter("automaton2", fa2);
log->set_parameter("result", result);
log->set_parameter("result", result ? "True" : "False");
}
return result;
}
Expand All @@ -1709,7 +1709,7 @@ bool FiniteAutomaton::equivalent(const FiniteAutomaton& fa1, const FiniteAutomat
if (log) {
log->set_parameter("automaton1", fa1);
log->set_parameter("automaton2", fa2);
log->set_parameter("result", result);
log->set_parameter("result", result ? "True" : "False");
}
return result;
}
Expand All @@ -1720,7 +1720,7 @@ bool FiniteAutomaton::subset(const FiniteAutomaton& fa, iLogTemplate* log) const
if (log) {
log->set_parameter("automaton1", *this);
log->set_parameter("automaton2", fa);
log->set_parameter("result", result);
log->set_parameter("result", result ? "True" : "False");
}
return result;
}
Expand Down Expand Up @@ -2147,12 +2147,11 @@ std::optional<bool> FiniteAutomaton::is_nfa_minimal(iLogTemplate* log) const {
log->set_parameter("oldautomaton", *this);
}
std::optional<bool> result = get_nfa_minimality_value();
if (result) {
if (log) {
if (log) {
if (result)
log->set_parameter("result", *result ? "True" : "False");
}
} else if (log) {
log->set_parameter("result", "Unknown");
else
log->set_parameter("result", "Unknown");
}
return result;
}
Expand Down
40 changes: 28 additions & 12 deletions libs/Objects/src/MemoryFiniteAutomaton.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1193,9 +1193,9 @@ bool MemoryFiniteAutomaton::action_bisimilar(const MemoryFiniteAutomaton& mfa1,
FiniteAutomaton fa1(mfa1.to_fa()), fa2(mfa2.to_fa());
bool result = FiniteAutomaton::bisimilar(fa1, fa2);
if (log) {
log->set_parameter("automaton1", fa1);
log->set_parameter("automaton2", fa2);
log->set_parameter("result", result);
log->set_parameter("mfa1", mfa1);
log->set_parameter("mfa2", mfa2);
log->set_parameter("result", result ? "True" : "False");
}
return result;
}
Expand Down Expand Up @@ -1257,9 +1257,9 @@ bool MemoryFiniteAutomaton::literally_bisimilar(const MemoryFiniteAutomaton& mfa
FiniteAutomaton fa1(mfa1.to_fa_mem()), fa2(mfa2.to_fa_mem());
bool result = FiniteAutomaton::bisimilar(fa1, fa2);
if (log) {
log->set_parameter("automaton1", fa1);
log->set_parameter("automaton2", fa2);
log->set_parameter("result", result);
log->set_parameter("mfa1", mfa1);
log->set_parameter("mfa2", mfa2);
log->set_parameter("result", result ? "True" : "False");
}
return result;
}
Expand Down Expand Up @@ -1317,7 +1317,7 @@ void find_opening_states_dfs(int state_index,

for (const auto& [symbol, symbol_transitions] : reversed_transitions[state_index])
for (const auto& tr : symbol_transitions) {
std::optional<MFATransition::MemoryAction> action;
optional<MFATransition::MemoryAction> action;
if (tr.memory_actions.count(cell))
action = tr.memory_actions.at(cell);
if (action && (action == MFATransition::open || action == MFATransition::reset))
Expand All @@ -1335,7 +1335,7 @@ vector<vector<int>> MemoryFiniteAutomaton::find_cg_traces(int state_index,

for (const auto& [symbol, symbol_transitions] : states[state_index].transitions)
for (const auto& tr : symbol_transitions) {
std::optional<MFATransition::MemoryAction> action;
optional<MFATransition::MemoryAction> action;
if (tr.memory_actions.count(cell))
action = tr.memory_actions.at(cell);
if (action && (action == MFATransition::close || action == MFATransition::reset)) {
Expand Down Expand Up @@ -1383,7 +1383,7 @@ bool MemoryFiniteAutomaton::find_path_decisions(int state_index, vector<int>& vi
const unordered_set<int>& path_states) const {
visited[state_index] = 1;

std::optional<MFATransition> single_tr;
optional<MFATransition> single_tr;
int count = 0;
for (const auto& [symbol, symbol_transitions] : states[state_index].transitions)
for (const auto& tr : symbol_transitions)
Expand Down Expand Up @@ -1414,9 +1414,8 @@ bool MemoryFiniteAutomaton::path_contains_decisions(const unordered_set<int>& pa
return false;
}

optional<bool> MemoryFiniteAutomaton::bisimilar(const MemoryFiniteAutomaton& mfa1,
const MemoryFiniteAutomaton& mfa2,
iLogTemplate* log) {
optional<bool> MemoryFiniteAutomaton::bisimilarity_checker(const MemoryFiniteAutomaton& mfa1,
const MemoryFiniteAutomaton& mfa2) {
const int N = 2;
// раскрашиваем состояния
vector<unordered_map<int, unordered_set<int>>> mfa_colors(N);
Expand Down Expand Up @@ -1543,3 +1542,20 @@ optional<bool> MemoryFiniteAutomaton::bisimilar(const MemoryFiniteAutomaton& mfa

return true;
}

optional<bool> MemoryFiniteAutomaton::bisimilar(const MemoryFiniteAutomaton& mfa1,
const MemoryFiniteAutomaton& mfa2,
iLogTemplate* log) {
optional<bool> result = bisimilarity_checker(mfa1, mfa2);

if (log) {
if (result)
log->set_parameter("result", *result ? "True" : "False");
else
log->set_parameter("result", "Unknown");

log->set_parameter("mfa1", mfa1);
log->set_parameter("mfa2", mfa2);
}
return result;
}
12 changes: 12 additions & 0 deletions resources/template/ActionBisimilar.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
\section{ActionBisimilar}
\begin{frame}{$\ActionBisimilar\TypeIs\pair{\MFATYPE}{\MFATYPE}\to\BooleanTYPE$}
Первый автомат:
%template_mfa1

Второй автомат:
%template_mfa2

Результат:
%template_result

\end{frame}
File renamed without changes.
12 changes: 12 additions & 0 deletions resources/template/Bisimilar2.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
\section{Bisimilar}
\begin{frame}{$\Bisimilar\TypeIs\pair{\MFATYPE}{\MFATYPE}\to\OptionalBoolTYPE$}
Первый автомат:
%template_mfa1

Второй автомат:
%template_mfa2

Результат:
%template_result

\end{frame}
12 changes: 12 additions & 0 deletions resources/template/LiterallyBisimilar.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
\section{LiterallyBisimilar}
\begin{frame}{$\LiterallyBisimilar\TypeIs\pair{\MFATYPE}{\MFATYPE}\to\BooleanTYPE$}
Первый автомат:
%template_mfa1

Второй автомат:
%template_mfa2

Результат:
%template_result

\end{frame}
2 changes: 2 additions & 0 deletions resources/template/head.tex
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,8 @@
\def\MFAexpt{\mathtt{MFAexpt}}
\def\AddTrap{\mathtt{AddTrap}}
\def\IsAcreg{\mathtt{IsAcreg}}
\def\ActionBisimilar{\mathtt{ActionBisimilar}}
\def\LiterallyBisimilar{\mathtt{LiterallyBisimilar}}

% типы интерпретатора
\def\VoidTYPE{\mathtt{VOID}}
Expand Down

0 comments on commit db4034b

Please sign in to comment.