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