From f97310f3882313a9da162438400f6c6ad936b709 Mon Sep 17 00:00:00 2001
From: Franck Dary <franck.dary@lis-lab.fr>
Date: Thu, 12 Sep 2019 13:50:21 +0200
Subject: [PATCH] Fixed accuracy computing when using iterationSize argument

---
 trainer/include/TrainInfos.hpp        | 2 ++
 trainer/src/TrainInfos.cpp            | 7 ++++++-
 trainer/src/Trainer.cpp               | 3 +++
 transition_machine/include/Config.hpp | 5 ++++-
 transition_machine/src/Config.cpp     | 6 +++---
 5 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/trainer/include/TrainInfos.hpp b/trainer/include/TrainInfos.hpp
index fb0de97..3fb815a 100644
--- a/trainer/include/TrainInfos.hpp
+++ b/trainer/include/TrainInfos.hpp
@@ -18,6 +18,7 @@ class TrainInfos
   std::string filename;
   int lastEpoch;
   int lastSaved;
+  int lastIndexTreated;
   std::map< std::string, std::vector<float> > trainLossesPerClassifierPerEpoch;
   std::map< std::string, std::vector<float> > devLossesPerClassifierPerEpoch;
   std::map< std::string, std::vector<float> > trainScoresPerClassifierPerEpoch;
@@ -55,6 +56,7 @@ class TrainInfos
   void nextEpoch();
   bool mustSave(const std::string & classifier);
   void printScores(FILE * output);
+  void setLastIndexTreated(int index);
 };
 
 #endif
diff --git a/trainer/src/TrainInfos.cpp b/trainer/src/TrainInfos.cpp
index daaa46b..b8ea231 100644
--- a/trainer/src/TrainInfos.cpp
+++ b/trainer/src/TrainInfos.cpp
@@ -148,7 +148,7 @@ float TrainInfos::computeScoreOnTapes(Config & c, std::vector<std::string> tapes
   float res = 0.0;
 
   for (auto & tape : tapes)
-    res += c.getTape(tape).getScore();
+    res += c.getTape(tape).getScore(0, lastIndexTreated);
 
   return res / tapes.size();
 }
@@ -292,3 +292,8 @@ bool TrainInfos::mustSave(const std::string & classifier)
   return mustSavePerClassifierPerEpoch.count(classifier) && mustSavePerClassifierPerEpoch[classifier].back();
 }
 
+void TrainInfos::setLastIndexTreated(int index)
+{
+  lastIndexTreated = index;
+}
+
diff --git a/trainer/src/Trainer.cpp b/trainer/src/Trainer.cpp
index 56a2a49..7d847dd 100644
--- a/trainer/src/Trainer.cpp
+++ b/trainer/src/Trainer.cpp
@@ -192,6 +192,7 @@ void Trainer::resetAndShuffle()
 {
   tm.reset();
   trainConfig.reset();
+  TI.setLastIndexTreated(0);
 
   if(ProgramParameters::shuffleExamples)
     trainConfig.shuffle(ProgramParameters::sequenceDelimiterTape, ProgramParameters::sequenceDelimiter);
@@ -540,6 +541,8 @@ void Trainer::train()
       if (ProgramParameters::iterationSize != -1 && nbSteps >= ProgramParameters::iterationSize)
         try {prepareNextEpoch();}
         catch (EndOfTraining &) {break;}
+
+      TI.setLastIndexTreated(trainConfig.getHead());
     }
 
     if (ProgramParameters::debug)
diff --git a/transition_machine/include/Config.hpp b/transition_machine/include/Config.hpp
index 7d1e719..fc7eefc 100644
--- a/transition_machine/include/Config.hpp
+++ b/transition_machine/include/Config.hpp
@@ -132,8 +132,11 @@ class Config
     void maskIndex(int index);
     /// @brief Compare hyp and ref to give a matching score.
     ///
+    /// @param from first index to evaluate
+    /// @param to last index to evaluate
+    ///
     /// @return The score as a percentage.
-    float getScore();
+    float getScore(int from, int to);
   };
 
   private :
diff --git a/transition_machine/src/Config.cpp b/transition_machine/src/Config.cpp
index ff3c2bc..10fe33b 100644
--- a/transition_machine/src/Config.cpp
+++ b/transition_machine/src/Config.cpp
@@ -647,14 +647,14 @@ std::vector< std::pair<std::string, int> > & Config::getActionsHistory(std::stri
   return actionsHistory[state+"_"+std::to_string(head)];
 }
 
-float Config::Tape::getScore()
+float Config::Tape::getScore(int from, int to)
 {
   float res = 0.0;
 
-  for (int i = 0; i < refSize()-1; i++)
+  for (int i = from; i <= to; i++)
     if (getRef(i-head) == getHyp(i-head))
       res += 1;
 
-  return 100.0*res / (refSize()-1);
+  return 100.0*res / (1+to-from);
 }
 
-- 
GitLab