From cb66ca9fb6c42224578d23fcaf7a26de94e371c4 Mon Sep 17 00:00:00 2001 From: Franck Dary <franck.dary@lis-lab.fr> Date: Wed, 9 Oct 2019 13:53:01 +0200 Subject: [PATCH] Added fix for empty nodes --- transition_machine/src/ActionBank.cpp | 12 +++++++++++- transition_machine/src/Config.cpp | 2 ++ transition_machine/src/Oracle.cpp | 10 ++++++---- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/transition_machine/src/ActionBank.cpp b/transition_machine/src/ActionBank.cpp index d68d017..51466c1 100644 --- a/transition_machine/src/ActionBank.cpp +++ b/transition_machine/src/ActionBank.cpp @@ -184,7 +184,7 @@ Action::BasicAction ActionBank::stackPop(bool checkGov) if (!checkGov) return true; - return split(c.getTape("ID").getRef(c.stackTop()-c.getHead()), '-').size() > 1 || (!c.getTape("GOV").getHyp(c.stackTop()-c.getHead()).empty() && c.stackTop() != c.getHead()); + return split(c.getTape("ID").getRef(c.stackTop()-c.getHead()), '.').size() > 1 || split(c.getTape("ID").getRef(c.stackTop()-c.getHead()), '-').size() > 1 || (!c.getTape("GOV").getHyp(c.stackTop()-c.getHead()).empty() && c.stackTop() != c.getHead()); }; Action::BasicAction basicAction = {Action::BasicAction::Type::Pop, "", apply, undo, appliable}; @@ -433,6 +433,10 @@ std::vector<Action::BasicAction> ActionBank::str2sequence(const std::string & na return false; if (split(c.getTape("ID").getRef(c.stackTop()-c.getHead()), '-').size() > 1) return false; + if (split(c.getTape("ID").getRef(0), '.').size() > 1) + return false; + if (split(c.getTape("ID").getRef(c.stackTop()-c.getHead()), '.').size() > 1) + return false; return simpleBufferWriteAppliable(c, "GOV", s0-b0); }; @@ -491,6 +495,10 @@ std::vector<Action::BasicAction> ActionBank::str2sequence(const std::string & na return false; if (split(c.getTape("ID").getRef(c.stackTop()-c.getHead()), '-').size() > 1) return false; + if (split(c.getTape("ID").getRef(0), '.').size() > 1) + return false; + if (split(c.getTape("ID").getRef(c.stackTop()-c.getHead()), '.').size() > 1) + return false; return simpleBufferWriteAppliable(c, "GOV", 0); }; Action::BasicAction basicAction = @@ -557,6 +565,8 @@ std::vector<Action::BasicAction> ActionBank::str2sequence(const std::string & na auto s = c.stackGetElem(i); if (split(ids.getRef(s-b0), '-').size() > 1) continue; + if (split(ids.getRef(s-b0), '.').size() > 1) + continue; if (govs.getHyp(s-b0).empty() || govs.getHyp(s-b0) == "0") { if (rootIndex == -1) diff --git a/transition_machine/src/Config.cpp b/transition_machine/src/Config.cpp index 5bcfc8d..e38b6b2 100644 --- a/transition_machine/src/Config.cpp +++ b/transition_machine/src/Config.cpp @@ -187,6 +187,8 @@ void Config::fillTapesWithInput() { if (split(ids.getRef(word), '-').size() > 1) continue; + if (split(ids.getRef(word), '.').size() > 1) + continue; if (govs.getRef(word) == "0") continue; diff --git a/transition_machine/src/Oracle.cpp b/transition_machine/src/Oracle.cpp index 2242fc1..20bf53c 100644 --- a/transition_machine/src/Oracle.cpp +++ b/transition_machine/src/Oracle.cpp @@ -597,12 +597,14 @@ void Oracle::createDatabase() int head = c.getHead(); bool headIsMultiword = split(ids.getRef(0), '-').size() > 1; + bool headIsEmptyNode = split(ids.getRef(0), '.').size() > 1; int headGov = -1; try {headGov = head + std::stoi(govs.getRef(0));} catch (std::exception &) {headGov = -1;} int stackHead = c.stackEmpty() ? 0 : c.stackTop(); bool stackHeadIsMultiword = split(ids.getRef(stackHead-head), '-').size() > 1; + bool stackHeadIsEmptyNode = split(ids.getRef(stackHead-head), '.').size() > 1; int stackGov = -1; try {stackGov = stackHead + std::stoi(govs.getRef(stackHead-head));} catch (std::exception &) {stackGov = -1;} @@ -625,7 +627,7 @@ void Oracle::createDatabase() if (parts[0] == "SHIFT") { - if (headIsMultiword) + if (headIsMultiword || headIsEmptyNode) return 0; for (int j = 0; j < c.stackSize(); j++) @@ -668,7 +670,7 @@ void Oracle::createDatabase() } else if (parts[0] == "REDUCE") { - if (stackHeadIsMultiword) + if (stackHeadIsMultiword || stackHeadIsEmptyNode) return 0; for (int i = head; i <= sentenceEnd; i++) @@ -689,7 +691,7 @@ void Oracle::createDatabase() } else if (parts[0] == "LEFT") { - if (stackHeadIsMultiword || headIsMultiword) + if (stackHeadIsMultiword || headIsMultiword || headIsEmptyNode || stackHeadIsEmptyNode) return 1; if (eos.getRef(stackHead-head) == ProgramParameters::sequenceDelimiter) @@ -719,7 +721,7 @@ void Oracle::createDatabase() } else if (parts[0] == "RIGHT") { - if (stackHeadIsMultiword || headIsMultiword) + if (stackHeadIsMultiword || headIsMultiword || headIsEmptyNode || stackHeadIsEmptyNode) return 1; for (int j = 0; j < c.stackSize(); j++) -- GitLab