diff --git a/reading_machine/include/Action.hpp b/reading_machine/include/Action.hpp index 7900c7bbeafcba5940ccc5c4d620c88321818e40..17e71149d37626029548251b7f3f0ae3c69c0d03 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 5c68d392a440e03ff55949c4c1d991ac325d3189..dbe4c12364af3d444c7b7b4eeef23240b5e24393 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 61681fcb4f4aed1a6d7a1d74d3406225dc6ff05f..11ad8e990054290957e1c98175e6a808c9ffd19a 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) {