From 5c114f0c704e5a574c9e1b0b518cab60fe677092 Mon Sep 17 00:00:00 2001
From: Franck Dary <franck.dary@lis-lab.fr>
Date: Mon, 30 Mar 2020 19:05:26 +0200
Subject: [PATCH] Made it impossible to do a splitword on splitedwords or to
 modify splitedwords

---
 reading_machine/include/Action.hpp |  3 ++-
 reading_machine/src/Action.cpp     | 26 ++++++++++++++++++++++++--
 reading_machine/src/Transition.cpp |  4 +++-
 3 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/reading_machine/include/Action.hpp b/reading_machine/include/Action.hpp
index 7900c7b..17e7114 100644
--- a/reading_machine/include/Action.hpp
+++ b/reading_machine/include/Action.hpp
@@ -58,11 +58,12 @@ class Action
   static Action setRoot();
   static Action updateIds();
   static Action endWord();
+  static Action assertIdIsEmpty();
   static Action attach(Object governorObject, int governorIndex, Object dependentObject, int dependentIndex);
   static Action addCurCharToCurWord();
   static Action ignoreCurrentCharacter();
   static Action consumeCharacterIndex(std::string consumed);
-  static Action setMultiwordId(int multiwordSize);
+  static Action setMultiwordIds(int multiwordSize);
 };
 
 #endif
diff --git a/reading_machine/src/Action.cpp b/reading_machine/src/Action.cpp
index 5c68d39..dbe4c12 100644
--- a/reading_machine/src/Action.cpp
+++ b/reading_machine/src/Action.cpp
@@ -48,16 +48,20 @@ Action Action::moveWordIndex(int movement)
   return {Type::MoveWord, apply, undo, appliable};
 }
 
-Action Action::setMultiwordId(int multiwordSize)
+Action Action::setMultiwordIds(int multiwordSize)
 {
   auto apply = [multiwordSize](Config & config, Action & a)
   {
     addHypothesisRelative(Config::idColName, Object::Buffer, 0, fmt::format("{}-{}", config.getCurrentWordId()+1, config.getCurrentWordId()+multiwordSize)).apply(config, a);
+    for (int i = 0; i < multiwordSize; i++)
+      addHypothesisRelative(Config::idColName, Object::Buffer, i+1, fmt::format("{}", config.getCurrentWordId()+1+i)).apply(config, a);
   };
 
-  auto undo = [](Config & config, Action &)
+  auto undo = [multiwordSize](Config & config, Action &)
   {
     config.getLastNotEmpty(Config::idColName, config.getWordIndex()) = "";
+    for (int i = 0; i < multiwordSize; i++)
+      config.getLastNotEmpty(Config::idColName, config.getWordIndex()+1+i) = "";
   };
 
   auto appliable = [](const Config &, const Action &)
@@ -366,6 +370,24 @@ Action Action::ignoreCurrentCharacter()
   return {Type::MoveChar, apply, undo, appliable}; 
 }
 
+Action Action::assertIdIsEmpty()
+{
+  auto apply = [](Config &, Action &)
+  {
+  };
+
+  auto undo = [](Config &, Action &)
+  {
+  };
+
+  auto appliable = [](const Config & config, const Action &)
+  {
+    return util::isEmpty(config.getAsFeature(Config::idColName, config.getWordIndex()));
+  };
+
+  return {Type::Check, apply, undo, appliable}; 
+}
+
 Action Action::addCurCharToCurWord()
 {
   auto apply = [](Config & config, Action & a)
diff --git a/reading_machine/src/Transition.cpp b/reading_machine/src/Transition.cpp
index 61681fc..11ad8e9 100644
--- a/reading_machine/src/Transition.cpp
+++ b/reading_machine/src/Transition.cpp
@@ -164,6 +164,7 @@ void Transition::initEndWord()
 
 void Transition::initAddCharToWord()
 {
+  sequence.emplace_back(Action::assertIdIsEmpty());
   sequence.emplace_back(Action::addLinesIfNeeded(0));
   sequence.emplace_back(Action::addCurCharToCurWord());
   sequence.emplace_back(Action::moveCharacterIndex(1));
@@ -190,11 +191,12 @@ void Transition::initAddCharToWord()
 void Transition::initSplitWord(std::vector<std::string> words)
 {
   auto & consumedWord = words[0];
+  sequence.emplace_back(Action::assertIdIsEmpty());
   sequence.emplace_back(Action::addLinesIfNeeded(words.size()));
   sequence.emplace_back(Action::consumeCharacterIndex(consumedWord));
   for (unsigned int i = 0; i < words.size(); i++)
     sequence.emplace_back(Action::addHypothesisRelative("FORM", Action::Object::Buffer, i, words[i]));
-  sequence.emplace_back(Action::setMultiwordId(words.size()-1));
+  sequence.emplace_back(Action::setMultiwordIds(words.size()-1));
 
   cost = [words](const Config & config)
   {
-- 
GitLab