diff --git a/trainer/src/Trainer.cpp b/trainer/src/Trainer.cpp index 16a436271923c5a091355144ffe05375edf31123..ca8ef4588ba78e0fc47e6dadaf298462e06cceeb 100644 --- a/trainer/src/Trainer.cpp +++ b/trainer/src/Trainer.cpp @@ -233,6 +233,9 @@ void Trainer::train() if (pAction == oAction) pActionIsZeroCost = true; + if (oAction.empty()) + oAction = tm.getCurrentClassifier()->getDefaultAction(); + if (oAction.empty()) { if (trainConfig.endOfTapes()) @@ -241,6 +244,7 @@ void Trainer::train() trainConfig.stackPop(); break; } + fprintf(stderr, "ERROR (%s) : Unable to find any zero cost action. Aborting.\n", ERRINFO); fprintf(stderr, "State : %s\n", tm.getCurrentState().c_str()); trainConfig.printForDebug(stderr); diff --git a/transition_machine/include/Classifier.hpp b/transition_machine/include/Classifier.hpp index 656d2899222df23b32216d7a6a13fb72c26bbfac..338325e7af07ebde1b3fc7c80ac94ddf26a76b7f 100644 --- a/transition_machine/include/Classifier.hpp +++ b/transition_machine/include/Classifier.hpp @@ -77,6 +77,10 @@ class Classifier public : + /// @brief If the ActionScript has a default action, get it. + /// + /// @return The default action name, or an empty string. + std::string getDefaultAction() const; /// @brief Return how many errors will an action introduce. /// /// @param config The current config. diff --git a/transition_machine/src/Classifier.cpp b/transition_machine/src/Classifier.cpp index a1ecb645161506b6ae3a2d0cfc6b5487551dd985..c1c99988f2bfc9e9633bfab7e7a086fbc5d0fe51 100644 --- a/transition_machine/src/Classifier.cpp +++ b/transition_machine/src/Classifier.cpp @@ -260,6 +260,14 @@ std::vector<std::string> Classifier::getZeroCostActions(Config & config) return result; } +std::string Classifier::getDefaultAction() const +{ + if (as->hasDefaultAction) + return as->getActionName(0); + + return std::string(); +} + float Classifier::trainOnExample(Config & config, int gold) { auto fd = fm->getFeatureDescription(config);