00001 #include "moses/TranslationModel/WordCoocTable.h"
00002 using namespace std;
00003 namespace Moses
00004 {
00005
00006 WordCoocTable::
00007 WordCoocTable()
00008 {
00009 m_cooc.reserve(1000000);
00010 m_marg1.reserve(1000000);
00011 m_marg2.reserve(1000000);
00012 }
00013
00014 WordCoocTable::
00015 WordCoocTable(wordID_t const VocabSize1, wordID_t const VocabSize2)
00016 : m_cooc(VocabSize1), m_marg1(VocabSize1,0), m_marg2(VocabSize2, 0)
00017 {}
00018
00019 void
00020 WordCoocTable::
00021 Count(size_t const a, size_t const b)
00022 {
00023 while (a >= m_marg1.size()) {
00024 m_cooc.push_back(my_map_t());
00025 m_marg1.push_back(0);
00026 }
00027 while (b >= m_marg2.size())
00028 m_marg2.push_back(0);
00029 ++m_marg1[a];
00030 ++m_marg2[b];
00031 ++m_cooc[a][b];
00032 }
00033
00034 uint32_t
00035 WordCoocTable::
00036 GetJoint(size_t const a, size_t const b) const
00037 {
00038 if (a >= m_marg1.size() || b >= m_marg2.size()) return 0;
00039 my_map_t::const_iterator m = m_cooc.at(a).find(b);
00040 if (m == m_cooc[a].end()) return 0;
00041 return m->second;
00042 }
00043
00044 uint32_t
00045 WordCoocTable::
00046 GetMarg1(size_t const x) const
00047 {
00048 return x >= m_marg1.size() ? 0 : m_marg1[x];
00049 }
00050
00051 uint32_t
00052 WordCoocTable::
00053 GetMarg2(size_t const x) const
00054 {
00055 return x >= m_marg2.size() ? 0 : m_marg2[x];
00056 }
00057
00058 float
00059 WordCoocTable::
00060 pfwd(size_t const a, size_t const b) const
00061 {
00062 return float(GetJoint(a,b))/GetMarg1(a);
00063 }
00064
00065 float
00066 WordCoocTable::
00067 pbwd(size_t const a, size_t const b) const
00068 {
00069
00070 return float(GetJoint(a,b))/GetMarg2(b);
00071 }
00072 }