/* * ProbingPT.h * * Created on: 3 Nov 2015 * Author: hieu */ #pragma once #include #include #include #include #include "PhraseTable.h" #include "../Vector.h" #include "../Phrase.h" #include "../SCFG/ActiveChart.h" #include "util/mmap.hh" namespace probingpt { class QueryEngine; class target_text; } namespace Moses2 { class AlignmentInfo; class MemPool; class System; class RecycleData; namespace SCFG { class TargetPhraseImpl; class TargetPhrases; } class ProbingPT: public Moses2::PhraseTable { ////////////////////////////////////// class ActiveChartEntryProbing : public SCFG::ActiveChartEntry { typedef SCFG::ActiveChartEntry Parent; public: ActiveChartEntryProbing(MemPool &pool) :Parent(pool) ,m_key(0) {} ActiveChartEntryProbing( MemPool &pool, const ActiveChartEntryProbing &prevEntry); uint64_t GetKey() const { return m_key; } std::pair GetKey(const SCFG::Word &nextWord, const ProbingPT &pt) const; virtual void AddSymbolBindElement( const Range &range, const SCFG::Word &word, const Moses2::Hypotheses *hypos, const Moses2::PhraseTable &pt); protected: uint64_t m_key; }; ////////////////////////////////////// public: ProbingPT(size_t startInd, const std::string &line); virtual ~ProbingPT(); void Load(System &system); virtual void SetParameter(const std::string& key, const std::string& value); void Lookup(const Manager &mgr, InputPathsBase &inputPaths) const; uint64_t GetUnk() const { return m_unkId; } // SCFG void InitActiveChart( MemPool &pool, const SCFG::Manager &mgr, SCFG::InputPath &path) const; virtual void Lookup(MemPool &pool, const SCFG::Manager &mgr, size_t maxChartSpan, const SCFG::Stacks &stacks, SCFG::InputPath &path) const; protected: std::vector m_sourceVocab; // factor id -> pt id std::vector< std::pair > m_targetVocab; // pt id -> factor* std::vector m_aligns; util::LoadMethod load_method; uint64_t m_unkId; probingpt::QueryEngine *m_engine; void CreateAlignmentMap(System &system, const std::string path); TargetPhrases *Lookup(const Manager &mgr, MemPool &pool, InputPath &inputPath) const; TargetPhrases *CreateTargetPhrases(MemPool &pool, const System &system, const Phrase &sourcePhrase, uint64_t key) const; TargetPhraseImpl *CreateTargetPhrase(MemPool &pool, const System &system, const char *&offset) const; inline const std::pair *GetTargetFactor(uint32_t probingId) const { if (probingId >= m_targetVocab.size()) { return NULL; } return &m_targetVocab[probingId]; } std::pair GetKey(const Phrase &sourcePhrase) const; void GetSourceProbingIds(const Phrase &sourcePhrase, bool &ok, uint64_t probingSource[]) const; uint64_t GetSourceProbingId(const Word &word) const; // caching typedef boost::unordered_map CachePb; CachePb m_cachePb; typedef boost::unordered_map CacheSCFG; CacheSCFG m_cacheSCFG; void CreateCache(System &system); void ReformatWord(System &system, std::string &wordStr, bool &isNT); // SCFG void LookupGivenNode( MemPool &pool, const SCFG::Manager &mgr, const SCFG::ActiveChartEntry &prevEntry, const SCFG::Word &wordSought, const Moses2::Hypotheses *hypos, const Moses2::Range &subPhraseRange, SCFG::InputPath &outPath) const; std::pair CreateTargetPhrasesSCFG(MemPool &pool, const System &system, const Phrase &sourcePhrase, uint64_t key) const; // return value: 1st = there are actual rules, not just a empty cell for prefix SCFG::TargetPhraseImpl *CreateTargetPhraseSCFG( MemPool &pool, const System &system, const char *&offset) const; }; }