From f669bcfa7e085dab88d771607801c032e842346a Mon Sep 17 00:00:00 2001
From: Franck Dary <franck.dary@lis-lab.fr>
Date: Mon, 17 Feb 2020 10:27:57 +0100
Subject: [PATCH] Avoiding loops at end of decoding

---
 reading_machine/include/Config.hpp        | 2 ++
 reading_machine/include/TransitionSet.hpp | 1 -
 reading_machine/src/Action.cpp            | 7 +++++--
 reading_machine/src/Config.cpp            | 6 ++++++
 4 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/reading_machine/include/Config.hpp b/reading_machine/include/Config.hpp
index daaeae1..b18bc88 100644
--- a/reading_machine/include/Config.hpp
+++ b/reading_machine/include/Config.hpp
@@ -32,6 +32,7 @@ class Config
 
   std::vector<String> lines;
   std::set<std::string> predicted;
+  int lastPoppedStack{-1};
 
   protected :
 
@@ -109,6 +110,7 @@ class Config
   std::vector<long> extractContext(int leftBorder, int rightBorder, Dict & dict) const;
   void addPredicted(const std::set<std::string> & predicted);
   bool isPredicted(const std::string & colName) const;
+  int getLastPoppedStack() const;
 };
 
 #endif
diff --git a/reading_machine/include/TransitionSet.hpp b/reading_machine/include/TransitionSet.hpp
index 4263ba4..2daaa2e 100644
--- a/reading_machine/include/TransitionSet.hpp
+++ b/reading_machine/include/TransitionSet.hpp
@@ -11,7 +11,6 @@ class TransitionSet
   private :
 
   std::vector<Transition> transitions;
-  std::optional<std::size_t> defaultAction;
 
   public :
 
diff --git a/reading_machine/src/Action.cpp b/reading_machine/src/Action.cpp
index 427ec98..b24d547 100644
--- a/reading_machine/src/Action.cpp
+++ b/reading_machine/src/Action.cpp
@@ -139,9 +139,12 @@ Action Action::pushWordIndexOnStack()
     config.popStack();
   };
 
-  auto appliable = [](const Config &, const Action &)
+  auto appliable = [](const Config & config, const Action &)
   {
-    return true;
+    if (config.hasStack(0) and config.getStack(0) == config.getWordIndex())
+      return false;
+
+    return (int)config.getWordIndex() != config.getLastPoppedStack();
   };
 
   return {Type::Push, apply, undo, appliable}; 
diff --git a/reading_machine/src/Config.cpp b/reading_machine/src/Config.cpp
index 49ad509..286386a 100644
--- a/reading_machine/src/Config.cpp
+++ b/reading_machine/src/Config.cpp
@@ -309,6 +309,7 @@ void Config::addToStack(std::size_t index)
 
 void Config::popStack()
 {
+  lastPoppedStack = getStack(0);
   stack.pop_back();
 }
 
@@ -491,3 +492,8 @@ bool Config::isPredicted(const std::string & colName) const
   return predicted.count(colName);
 }
 
+int Config::getLastPoppedStack() const
+{
+  return lastPoppedStack;
+}
+
-- 
GitLab