00001 #ifndef __ug_mm_bitext_h
00002 #define __ug_mm_bitext_h
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include <string>
00014 #include <vector>
00015 #include <cassert>
00016 #include <iomanip>
00017 #include <algorithm>
00018
00019 #include <boost/unordered_map.hpp>
00020 #include <boost/foreach.hpp>
00021 #include <boost/thread.hpp>
00022
00023 #include "moses/TranslationModel/UG/generic/sorting/VectorIndexSorter.h"
00024 #include "moses/TranslationModel/UG/generic/sampling/Sampling.h"
00025 #include "moses/TranslationModel/UG/generic/file_io/ug_stream.h"
00026
00027 #include "ug_typedefs.h"
00028 #include "ug_mm_ttrack.h"
00029 #include "ug_mm_tsa.h"
00030 #include "tpt_tokenindex.h"
00031 #include "ug_corpus_token.h"
00032 #include "tpt_pickler.h"
00033
00034
00035
00036 namespace Moses {
00037
00038 typedef L2R_Token<SimpleWordId> Token;
00039 typedef mmTSA<Token>::tree_iterator iter;
00040
00041 class mmbitext
00042 {
00043 public:
00044 typedef mmTSA<Token>::tree_iterator iter;
00045 class pstats;
00046 class jstats;
00047 class agenda
00048 {
00049 boost::mutex lock;
00050 boost::condition_variable ready;
00051 class job;
00052 class worker;
00053 list<job> joblist;
00054 std::vector<SPTR<boost::thread> > workers;
00055 bool shutdown;
00056 size_t doomed;
00057 public:
00058 mmbitext const& bitext;
00059 agenda(mmbitext const& bitext);
00060 ~agenda();
00061 void add_workers(int n);
00062 SPTR<pstats> add_job(mmbitext::iter const& phrase,
00063 size_t const max_samples);
00064 bool get_task(uint64_t & sid, uint64_t & offset, uint64_t & len,
00065 bool & fwd, SPTR<mmbitext::pstats> & stats);
00066 };
00067
00068
00069
00070
00071 agenda* ag;
00072 mmTtrack<char> Tx;
00073 mmTtrack<Token> T1,T2;
00074 TokenIndex V1,V2;
00075 mmTSA<Token> I1,I2;
00076
00078
00079
00080
00081
00082 bool
00083 find_trg_phr_bounds
00084 (size_t const sid, size_t const start, size_t const stop,
00085 size_t & s1, size_t & s2, size_t & e1, size_t & e2,
00086 std::vector<uchar> * core_alignment, bool const flip) const;
00087
00088 boost::unordered_map<uint64_t,SPTR<pstats> > cache1,cache2;
00089 private:
00090 SPTR<pstats>
00091 prep2(iter const& phrase);
00092 public:
00093 mmbitext();
00094 ~mmbitext();
00095
00096 void open(string const base, string const L1, string const L2);
00097
00098 SPTR<pstats> lookup(iter const& phrase);
00099 void prep(iter const& phrase);
00100 };
00101
00102
00103 class
00104 mmbitext::
00105 jstats
00106 {
00107 uint32_t my_rcnt;
00108 float my_wcnt;
00109 std::vector<pair<size_t, vector<uchar> > > my_aln;
00110 boost::mutex lock;
00111 public:
00112 jstats();
00113 jstats(jstats const& other);
00114 uint32_t rcnt() const;
00115 float wcnt() const;
00116 std::vector<pair<size_t, vector<uchar> > > const & aln() const;
00117 void add(float w, std::vector<uchar> const& a);
00118 };
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138 struct
00139 mmbitext::
00140 pstats
00141 {
00142 boost::mutex lock;
00143 boost::condition_variable ready;
00144
00145 size_t raw_cnt;
00146 size_t sample_cnt;
00147 size_t good;
00148 size_t sum_pairs;
00149
00150
00151 size_t in_progress;
00152 boost::unordered_map<uint64_t, jstats> trg;
00153 pstats();
00154
00155
00156 void release();
00157 void register_worker();
00158 void add(mmbitext::iter const& trg_phrase, float const w, std::vector<uchar> const& a);
00159 };
00160
00161 class
00162 mmbitext::
00163 agenda::
00164 worker
00165 {
00166 agenda& ag;
00167 public:
00168 worker(agenda& a);
00169 void operator()();
00170
00171 };
00172
00173 class
00174 mmbitext::
00175 agenda::
00176 job
00177 {
00178 public:
00179 char const* next;
00180 char const* stop;
00181 size_t max_samples;
00182 size_t ctr;
00183 size_t len;
00184 bool fwd;
00185 SPTR<mmbitext::pstats> stats;
00186 bool step(uint64_t & sid, uint64_t & offset);
00187 };
00188
00189 }
00190 #endif
00191