00001
00002 #pragma once
00003
00004 #include <boost/thread.hpp>
00005 #include <boost/unordered_map.hpp>
00006
00007 #include "ug_typedefs.h"
00008 #include "ug_bitext_jstats.h"
00009 #include "moses/thread_safe_container.h"
00010
00011 namespace sapt
00012 {
00013 struct
00014 pstats
00015 {
00016 typedef boost::unordered_map<uint64_t, SPTR<pstats> > map_t;
00017 typedef Moses::ThreadSafeContainer<uint64_t, SPTR<pstats>, map_t> cache_t;
00018 typedef std::vector<unsigned char> alnvec;
00019 typedef boost::unordered_map<uint64_t, jstats> trg_map_t;
00020 typedef boost::unordered_map<uint32_t,uint32_t> indoc_map_t;
00021 #if UG_BITEXT_TRACK_ACTIVE_THREADS
00022 static ThreadSafeCounter active;
00023 #endif
00024 mutable boost::mutex lock;
00025 mutable boost::condition_variable ready;
00026
00027 size_t raw_cnt;
00028 size_t sample_cnt;
00029 size_t good;
00030 size_t sum_pairs;
00031 size_t in_progress;
00032
00033 uint32_t ofwd[LRModel::NONE+1];
00034 uint32_t obwd[LRModel::NONE+1];
00035
00036 indoc_map_t indoc;
00037 trg_map_t trg;
00038 bool track_sids;
00039 pstats(bool const track_sids);
00040 ~pstats();
00041 void release();
00042 void register_worker();
00043 size_t count_workers() { return in_progress; }
00044
00045 size_t
00046 add(uint64_t const pid,
00047 float const w,
00048 float const b,
00049 alnvec const& a,
00050 uint32_t const cnt2,
00051 uint32_t fwd_o,
00052 uint32_t bwd_o,
00053 int const docid,
00054 uint32_t const sid);
00055
00056 void
00057 count_sample(int const docid,
00058 size_t const num_pairs,
00059 int const po_fwd,
00060 int const po_bwd);
00061 void wait() const;
00062 };
00063
00064 }
00065