diff options
Diffstat (limited to 'moses/FF/PhraseOrientationFeature.h')
-rw-r--r-- | moses/FF/PhraseOrientationFeature.h | 58 |
1 files changed, 53 insertions, 5 deletions
diff --git a/moses/FF/PhraseOrientationFeature.h b/moses/FF/PhraseOrientationFeature.h index 4d9dc20dc..c8bb8ceba 100644 --- a/moses/FF/PhraseOrientationFeature.h +++ b/moses/FF/PhraseOrientationFeature.h @@ -16,7 +16,7 @@ #include "StatefulFeatureFunction.h" #include "FFState.h" #include "moses/Factor.h" -#include "phrase-extract/extract-ghkm/PhraseOrientation.h" +#include "phrase-extract/PhraseOrientation.h" #include "moses/PP/OrientationPhraseProperty.h" #include <boost/unordered_set.hpp> @@ -226,6 +226,54 @@ protected: return CompareRightBoundaryRecursive(*prevState, *otherPrevState, useSparseNT); }; + + static void HashCombineLeftBoundaryRecursive(size_t &hash, const PhraseOrientationFeatureState& state, bool useSparseNT) { + if (useSparseNT) { + boost::hash_combine(hash, state.m_leftBoundaryNonTerminalSymbol); + } + // boost::hash_combine(hash, state.m_leftBoundaryNonTerminalL2RHeuristicScoreIndex); + // boost::hash_combine(hash, state.m_leftBoundaryNonTerminalL2RPossibleFutureOrientations); + + for (size_t i=0; i<state.m_leftBoundaryNonTerminalL2RScores.size(); ++i) { + if (state.m_leftBoundaryNonTerminalL2RPossibleFutureOrientations[i]) { + boost::hash_combine(hash, state.m_leftBoundaryNonTerminalL2RScores[i]); + } else { + boost::hash_combine(hash, 0); + } + } + + if (!state.m_leftBoundaryRecursionGuard) { + const PhraseOrientationFeatureState *prevState = state.m_leftBoundaryPrevState; + if (prevState->m_leftBoundaryIsSet) { + HashCombineLeftBoundaryRecursive(hash, *prevState, useSparseNT); + } + } + }; + + static void HashCombineRightBoundaryRecursive(size_t &hash, const PhraseOrientationFeatureState& state, bool useSparseNT) { + if (useSparseNT) { + boost::hash_combine(hash, state.m_rightBoundaryNonTerminalSymbol); + } + // boost::hash_combine(hash, state.m_leftBoundaryNonTerminalL2RHeuristicScoreIndex); + // boost::hash_combine(hash, state.m_leftBoundaryNonTerminalL2RPossibleFutureOrientations); + + for (size_t i=0; i<state.m_rightBoundaryNonTerminalR2LScores.size(); ++i) { + if (state.m_rightBoundaryNonTerminalR2LPossibleFutureOrientations[i]) { + boost::hash_combine(hash, state.m_rightBoundaryNonTerminalR2LScores[i]); + } else { + boost::hash_combine(hash, 0); + } + } + + if (!state.m_rightBoundaryRecursionGuard) { + const PhraseOrientationFeatureState *prevState = state.m_rightBoundaryPrevState; + if (prevState->m_rightBoundaryIsSet) { + HashCombineRightBoundaryRecursive(hash, *prevState, useSparseNT); + } + } + }; + + template<std::size_t N> static bool Smaller(const std::bitset<N>& x, const std::bitset<N>& y) { for (size_t i=0; i<N; ++i) { if (x[i] ^ y[i]) @@ -264,8 +312,8 @@ public: struct ReoClassData { public: - std::vector<MosesTraining::Syntax::GHKM::PhraseOrientation::REO_CLASS> nonTerminalReoClassL2R; - std::vector<MosesTraining::Syntax::GHKM::PhraseOrientation::REO_CLASS> nonTerminalReoClassR2L; + std::vector<MosesTraining::PhraseOrientation::REO_CLASS> nonTerminalReoClassL2R; + std::vector<MosesTraining::PhraseOrientation::REO_CLASS> nonTerminalReoClassR2L; bool firstNonTerminalIsBoundary; bool firstNonTerminalPreviousSourceSpanIsAligned; bool firstNonTerminalFollowingSourceSpanIsAligned; @@ -289,7 +337,7 @@ public: void SetParameter(const std::string& key, const std::string& value); - void Load(); + void Load(AllOptions::ptr const& opts); void EvaluateInIsolation(const Phrase &source , const TargetPhrase &targetPhrase @@ -351,7 +399,7 @@ protected: ScoreComponentCollection* scoreBreakdown, const std::string* o) const; - const std::string* ToString(const MosesTraining::Syntax::GHKM::PhraseOrientation::REO_CLASS o) const; + const std::string* ToString(const MosesTraining::PhraseOrientation::REO_CLASS o) const; static const std::string MORIENT; static const std::string SORIENT; |