#ifndef _FF_WORD_ALIGN_H_ #define _FF_WORD_ALIGN_H_ #include "ff.h" #include "array2d.h" class RelativeSentencePosition : public FeatureFunction { public: RelativeSentencePosition(const std::string& param); protected: virtual void TraversalFeaturesImpl(const SentenceMetadata& smeta, const Hypergraph::Edge& edge, const std::vector& ant_contexts, SparseVector* features, SparseVector* estimated_features, void* out_context) const; private: const int fid_; }; class MarkovJump : public FeatureFunction { public: MarkovJump(const std::string& param); protected: virtual void TraversalFeaturesImpl(const SentenceMetadata& smeta, const Hypergraph::Edge& edge, const std::vector& ant_contexts, SparseVector* features, SparseVector* estimated_features, void* out_context) const; private: const int fid_; bool individual_params_per_jumpsize_; bool condition_on_flen_; std::string template_; }; class AlignerResults : public FeatureFunction { public: AlignerResults(const std::string& param); protected: virtual void TraversalFeaturesImpl(const SentenceMetadata& smeta, const Hypergraph::Edge& edge, const std::vector& ant_contexts, SparseVector* features, SparseVector* estimated_features, void* out_context) const; private: int fid_; std::vector > > is_aligned_; mutable int cur_sent_; const Array2D mutable* cur_grid_; }; #include #include #include class BlunsomSynchronousParseHack : public FeatureFunction { public: BlunsomSynchronousParseHack(const std::string& param); protected: virtual void TraversalFeaturesImpl(const SentenceMetadata& smeta, const Hypergraph::Edge& edge, const std::vector& ant_contexts, SparseVector* features, SparseVector* estimated_features, void* out_context) const; private: inline bool DoesNotBelong(const void* state) const { for (int i = 0; i < NumBytesContext(); ++i) { if (*(static_cast(state) + i)) return false; } return true; } inline void AppendAntecedentString(const void* state, std::vector* yield) const { int i = 0; int ind = 0; while (i < NumBytesContext() && !(*(static_cast(state) + i))) { ++i; ind += 8; } // std::cerr << i << " " << NumBytesContext() << std::endl; assert(i != NumBytesContext()); assert(ind < cur_ref_->size()); int cur = *(static_cast(state) + i); int comp = 1; while (comp < 256 && (comp & cur) == 0) { comp <<= 1; ++ind; } assert(ind < cur_ref_->size()); assert(comp < 256); do { assert(ind < cur_ref_->size()); yield->push_back((*cur_ref_)[ind]); ++ind; comp <<= 1; if (comp == 256) { comp = 1; ++i; cur = *(static_cast(state) + i); } } while (comp & cur); } inline void SetStateMask(int start, int end, void* state) const { assert((end / 8) < NumBytesContext()); int i = 0; int comp = 1; for (int j = 0; j < start; ++j) { comp <<= 1; if (comp == 256) { ++i; comp = 1; } } //std::cerr << "SM: " << i << "\n"; for (int j = start; j < end; ++j) { *(static_cast(state) + i) |= comp; //std::cerr << " " << comp << "\n"; comp <<= 1; if (comp == 256) { ++i; comp = 1; } } //std::cerr << " MASK: " << ((int)*(static_cast(state))) << "\n"; } const int fid_; mutable int cur_sent_; typedef std::tr1::unordered_map, int, boost::hash > > Vec2Int; mutable Vec2Int cur_map_; const std::vector mutable * cur_ref_; mutable std::vector > refs_; }; #endif