diff --git a/dev/src/dev.cpp b/dev/src/dev.cpp index d33d37063d2761c0500755bc76b70a4687ac3aab..c538b98dcec2753c5588697de57239e76b36a29f 100644 --- a/dev/src/dev.cpp +++ b/dev/src/dev.cpp @@ -8,23 +8,49 @@ int main(int argc, char * argv[]) { - /* - BaseConfig goldConfig(argv[3], argv[1], argv[2]); + if (argc != 5) + { + fmt::print(stderr, "needs 4 arguments.\n"); + exit(1); + } + + std::string machineFile = argv[1]; + std::string mcdFile = argv[2]; + std::string tsvFile = argv[3]; + //std::string rawFile = argv[4]; + std::string rawFile = ""; + + ReadingMachine machine(machineFile); + BaseConfig goldConfig(mcdFile, tsvFile, rawFile); SubConfig config(goldConfig); - auto other = config; - while (config.moveWordIndex(1)) + config.setState(machine.getStrategy().getInitialState()); + + config.printForDebug(stderr); + + while (true) { + auto * transition = machine.getTransitionSet().getBestAppliableTransition(config); + if (!transition) + util::myThrow("No transition appliable !"); + + fmt::print(stderr, "Transition : {}\n", transition->getName()); + transition->apply(config); + + auto movement = machine.getStrategy().getMovement(config, transition->getName()); + if (movement == Strategy::endMovement) + break; + + config.setState(movement.first); + if (!config.moveWordIndex(movement.second)) + util::myThrow("Cannot move word index !"); + if (config.needsUpdate()) config.update(); - } - - fmt::print(stderr, "ok\n"); - std::scanf("%*c"); - */ - ReadingMachine machine(argv[1]); + config.printForDebug(stderr); + } return 0; } diff --git a/reading_machine/include/Classifier.hpp b/reading_machine/include/Classifier.hpp index ce61d5a6c850dc5efab0a9cd70acb2282168717c..5d38ae88ec4e893b523e6fcd17391e0957cc4934 100644 --- a/reading_machine/include/Classifier.hpp +++ b/reading_machine/include/Classifier.hpp @@ -16,6 +16,7 @@ class Classifier public : Classifier(const std::string & name, const std::string & topology, const std::string & tsFile); + TransitionSet & getTransitionSet(); }; #endif diff --git a/reading_machine/include/ReadingMachine.hpp b/reading_machine/include/ReadingMachine.hpp index dc4be73e0b6710f6606a7ed406acc7d5a7c90aab..ab5d79483be3f0c7b919d17de8e59b307af7ba27 100644 --- a/reading_machine/include/ReadingMachine.hpp +++ b/reading_machine/include/ReadingMachine.hpp @@ -16,6 +16,8 @@ class ReadingMachine public : ReadingMachine(const std::string & filename); + TransitionSet & getTransitionSet(); + Strategy & getStrategy(); }; #endif diff --git a/reading_machine/include/Strategy.hpp b/reading_machine/include/Strategy.hpp index e1bc580c2dadc42d896c2c4156c6c7a8248cb274..10d96282ad9bbfe408b4708b6ba324922e6d9f60 100644 --- a/reading_machine/include/Strategy.hpp +++ b/reading_machine/include/Strategy.hpp @@ -21,6 +21,7 @@ class Strategy std::map<std::pair<std::string, std::string>, std::string> edges; std::map<std::string, bool> isDone; std::vector<std::string> defaultCycle; + std::string initialState{"UNDEFINED"}; private : @@ -31,6 +32,7 @@ class Strategy Strategy(const std::vector<std::string_view> & lines); std::pair<std::string, int> getMovement(const Config & c, const std::string & transition); + const std::string getInitialState() const; }; #endif diff --git a/reading_machine/include/Transition.hpp b/reading_machine/include/Transition.hpp index ecd90dfc68380bd19de4a2b07e3ed40341103c28..cbdf21f8fda73f3f79ec462b104067642f38ecfe 100644 --- a/reading_machine/include/Transition.hpp +++ b/reading_machine/include/Transition.hpp @@ -23,6 +23,7 @@ class Transition void apply(Config & config); bool appliable(const Config & config) const; int getCost(const Config & config) const; + const std::string & getName() const; }; #endif diff --git a/reading_machine/include/TransitionSet.hpp b/reading_machine/include/TransitionSet.hpp index 04c1e9098c330812805e308642d0e598f9fe4463..188ce70e1e4d77c3e8dfccec0f09de83d916f5eb 100644 --- a/reading_machine/include/TransitionSet.hpp +++ b/reading_machine/include/TransitionSet.hpp @@ -11,13 +11,13 @@ class TransitionSet private : std::vector<Transition> transitions; - std::unordered_map<std::string, std::size_t> name2index; std::optional<std::size_t> defaultAction; public : TransitionSet(const std::string & filename); - std::vector<std::pair<Transition &, int>> getAppliableTransitionsCosts(const Config & c); + std::vector<std::pair<Transition*, int>> getAppliableTransitionsCosts(const Config & c); + Transition * getBestAppliableTransition(const Config & c); }; #endif diff --git a/reading_machine/src/Classifier.cpp b/reading_machine/src/Classifier.cpp index 47100c74920d8fdf399171a55b34f281ae28adc7..d446be2ce9bfe40b8502ff658a4507dc1d29adc0 100644 --- a/reading_machine/src/Classifier.cpp +++ b/reading_machine/src/Classifier.cpp @@ -7,3 +7,8 @@ Classifier::Classifier(const std::string & name, const std::string & topology, c this->nn = MLP(topology); } +TransitionSet & Classifier::getTransitionSet() +{ + return *transitionSet; +} + diff --git a/reading_machine/src/Config.cpp b/reading_machine/src/Config.cpp index 1a29fff27ab39bf511cf853670a4063665e0052c..f4d1001d3d5cc35b49d352d93bc889a3b280a3bb 100644 --- a/reading_machine/src/Config.cpp +++ b/reading_machine/src/Config.cpp @@ -80,7 +80,9 @@ void Config::printForDebug(FILE * dest) const { static constexpr int windowSize = 5; static constexpr int lettersWindowSize = 40; - static constexpr int maxWordLength = 10; + static constexpr int maxWordLength = 7; + + fmt::print(dest, "\n"); int firstLineToPrint = wordIndex; int lastLineToPrint = wordIndex; @@ -138,7 +140,8 @@ void Config::printForDebug(FILE * dest) const fmt::print(dest, "{}\n", longLine); for (std::size_t index = characterIndex; index < util::getSize(rawInput) and index - characterIndex < lettersWindowSize; index++) fmt::print(dest, "{}", getLetter(index)); - fmt::print(dest, "\n{}\n", longLine); + if (rawInput.size()) + fmt::print(dest, "\n{}\n", longLine); fmt::print(dest, "State={}\nwordIndex={} characterIndex={}\nhistory=({})\nstack=({})\n", state, wordIndex, characterIndex, historyStr, stackStr); fmt::print(dest, "{}\n", longLine); @@ -151,8 +154,6 @@ void Config::printForDebug(FILE * dest) const if (toPrint[line].back() == EOSSymbol1) fmt::print(dest, "\n"); } - - fmt::print(dest, "\n"); } Config::String & Config::getLastNotEmpty(int colIndex, int lineIndex) diff --git a/reading_machine/src/ReadingMachine.cpp b/reading_machine/src/ReadingMachine.cpp index cc484eb3c84459b7748985b24cb2b6e609a90a4c..f2d49bef54f288c70deca580d981a06b256ba556 100644 --- a/reading_machine/src/ReadingMachine.cpp +++ b/reading_machine/src/ReadingMachine.cpp @@ -34,3 +34,13 @@ ReadingMachine::ReadingMachine(const std::string & filename) } catch(std::exception & e) {util::myThrow(fmt::format("during reading of '{}' : {}", filename, e.what()));} } +TransitionSet & ReadingMachine::getTransitionSet() +{ + return classifier->getTransitionSet(); +} + +Strategy & ReadingMachine::getStrategy() +{ + return *strategy; +} + diff --git a/reading_machine/src/Strategy.cpp b/reading_machine/src/Strategy.cpp index 3b49cd4738d55eb05ae38c8dbc92757af28744f6..ca045f1db32bb5549da9b4a160d12901c1aaad31 100644 --- a/reading_machine/src/Strategy.cpp +++ b/reading_machine/src/Strategy.cpp @@ -16,6 +16,8 @@ Strategy::Strategy(const std::vector<std::string_view> & lines) { key = std::pair<std::string,std::string>(splited[0], ""); value = splited[1]; + if (defaultCycle.empty()) + initialState = splited[0]; defaultCycle.emplace_back(value); } else if (splited.size() == 3) @@ -100,3 +102,8 @@ std::pair<std::string, int> Strategy::getMovementIncremental(const Config & c, c return {defaultCycle.back(), 1}; } +const std::string Strategy::getInitialState() const +{ + return initialState; +} + diff --git a/reading_machine/src/Transition.cpp b/reading_machine/src/Transition.cpp index d8b9c8a1b62929f6138063fc3c47c017816b7249..46147d4264cc6f10ab4e89d42230e5d9bfcf23c6 100644 --- a/reading_machine/src/Transition.cpp +++ b/reading_machine/src/Transition.cpp @@ -61,3 +61,8 @@ void Transition::initWrite(std::string colName, std::string object, std::string }; } +const std::string & Transition::getName() const +{ + return name; +} + diff --git a/reading_machine/src/TransitionSet.cpp b/reading_machine/src/TransitionSet.cpp index 467ad42e659670e343a3a333fb53a751f56bf10e..a1a1f8904b1874230bde7c257f6f6ea36b4b2732 100644 --- a/reading_machine/src/TransitionSet.cpp +++ b/reading_machine/src/TransitionSet.cpp @@ -1,4 +1,5 @@ #include "TransitionSet.hpp" +#include <limits> TransitionSet::TransitionSet(const std::string & filename) { @@ -23,14 +24,14 @@ TransitionSet::TransitionSet(const std::string & filename) std::fclose(file); } -std::vector<std::pair<Transition &, int>> TransitionSet::getAppliableTransitionsCosts(const Config & c) +std::vector<std::pair<Transition*, int>> TransitionSet::getAppliableTransitionsCosts(const Config & c) { - using Pair = std::pair<Transition &, int>; + using Pair = std::pair<Transition*, int>; std::vector<Pair> appliableTransitions; - for (auto & transition : transitions) - if (transition.appliable(c)) - appliableTransitions.emplace_back(transition, transition.getCost(c)); + for (unsigned int i = 0; i < transitions.size(); i++) + if (transitions[i].appliable(c)) + appliableTransitions.emplace_back(&transitions[i], transitions[i].getCost(c)); std::sort(appliableTransitions.begin(), appliableTransitions.end(), [](const Pair & a, const Pair & b) @@ -41,3 +42,28 @@ std::vector<std::pair<Transition &, int>> TransitionSet::getAppliableTransitions return appliableTransitions; } +Transition * TransitionSet::getBestAppliableTransition(const Config & c) +{ + Transition * result = nullptr; + int bestCost = std::numeric_limits<int>::max(); + + for (unsigned int i = 0; i < transitions.size(); i++) + { + if (!transitions[i].appliable(c)) + continue; + + int cost = transitions[i].getCost(c); + + if (cost == 0) + return &transitions[i]; + + if (cost < bestCost) + { + result = &transitions[i]; + bestCost = cost; + } + } + + return result; +} +