|
|
|
#include <boost/thread/locks.hpp> |
|
#include "ug_bitext_pstats.h" |
|
|
|
namespace sapt |
|
{ |
|
|
|
#if UG_BITEXT_TRACK_ACTIVE_THREADS |
|
ThreadSafeCounter pstats::active; |
|
#endif |
|
|
|
pstats:: |
|
pstats(bool const track_sids) : raw_cnt(0), sample_cnt(0), good(0), sum_pairs(0), in_progress(0), track_sids(track_sids) |
|
{ |
|
for (int i = 0; i <= LRModel::NONE; ++i) |
|
ofwd[i] = obwd[i] = 0; |
|
} |
|
|
|
pstats:: |
|
~pstats() |
|
{ |
|
#if UG_BITEXT_TRACK_ACTIVE_THREADS |
|
|
|
try { --active; } catch (...) {} |
|
#endif |
|
} |
|
|
|
void |
|
pstats:: |
|
register_worker() |
|
{ |
|
this->lock.lock(); |
|
++this->in_progress; |
|
this->lock.unlock(); |
|
} |
|
|
|
void |
|
pstats:: |
|
release() |
|
{ |
|
this->lock.lock(); |
|
if (this->in_progress-- == 1) |
|
this->ready.notify_all(); |
|
this->lock.unlock(); |
|
} |
|
|
|
void |
|
pstats |
|
::count_sample(int const docid, size_t const num_pairs, |
|
int const po_fwd, int const po_bwd) |
|
{ |
|
boost::lock_guard<boost::mutex> guard(lock); |
|
++sample_cnt; |
|
if (num_pairs == 0) return; |
|
++good; |
|
sum_pairs += num_pairs; |
|
++ofwd[po_fwd]; |
|
++obwd[po_bwd]; |
|
if (docid >= 0) |
|
{ |
|
|
|
++indoc[docid]; |
|
} |
|
} |
|
|
|
size_t |
|
pstats:: |
|
add(uint64_t pid, float const w, float const b, |
|
std::vector<unsigned char> const& a, |
|
uint32_t const cnt2, |
|
uint32_t fwd_o, |
|
uint32_t bwd_o, int const docid, uint32_t const sid) |
|
{ |
|
boost::lock_guard<boost::mutex> guard(this->lock); |
|
jstats& entry = this->trg[pid]; |
|
size_t ret = entry.add(w, b, a, cnt2, fwd_o, bwd_o, docid, sid, track_sids); |
|
if (this->good < entry.rcnt()) |
|
{ |
|
UTIL_THROW(util::Exception, "more joint counts than good counts:" |
|
<< entry.rcnt() << "/" << this->good << "!"); |
|
} |
|
return ret; |
|
} |
|
|
|
void |
|
pstats:: |
|
wait() const |
|
{ |
|
boost::unique_lock<boost::mutex> lock(this->lock); |
|
while (this->in_progress) |
|
this->ready.wait(lock); |
|
} |
|
|
|
} |
|
|
|
|