From b760ad8a7edbe253a9b366f088d51919a1eb67a5 Mon Sep 17 00:00:00 2001 From: David Madl Date: Mon, 21 Mar 2016 19:35:12 +0100 Subject: [PATCH] BUGFIX: fix ScoreComponentCollection::ZeroAll(), affecting MIRA I observed a bug that ScoreComponentCollection core entries would retain their score even after ZeroAll(). This may have affected the Moses implementation of MIRA. * std::valarray::resize(0) means "resize to 0" [1] * subsequent accesses using operator[] result in undefined behavior [2] FeatureVector::clear() is used by ScoreComponentCollection::ZeroAll(), which in turn was used in these places: ./contrib/mira/Main.cpp:665: cumulativeWeights.ZeroAll(); ./contrib/mira/Main.cpp:666: cumulativeWeightsBinary.ZeroAll(); ./moses/Incremental.cpp:580: features.ZeroAll(); It seems to me that the Moses implementation of MIRA may have been affected? [1] http://www.cplusplus.com/reference/valarray/valarray/resize/ [2] http://www.cplusplus.com/reference/valarray/valarray/operator%5B%5D/ --- moses/FeatureVector.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/moses/FeatureVector.cpp b/moses/FeatureVector.cpp index 45a198c84..f92bcedae 100644 --- a/moses/FeatureVector.cpp +++ b/moses/FeatureVector.cpp @@ -175,7 +175,7 @@ void FVector::resize(size_t newsize) void FVector::clear() { - m_coreFeatures.resize(0); + m_coreFeatures.resize(m_coreFeatures.size(), 0); m_features.clear(); }