| |
| #include "ug_im_bitext.h" |
|
|
| namespace sapt |
| { |
| using namespace tpt; |
| template<> |
| SPTR<imBitext<L2R_Token<SimpleWordId> > > |
| imBitext<L2R_Token<SimpleWordId> >:: |
| add(std::vector<std::string> const& s1, |
| std::vector<std::string> const& s2, |
| std::vector<std::string> const& aln) const |
| { |
| typedef L2R_Token<SimpleWordId> TKN; |
| assert(s1.size() == s2.size() && s1.size() == aln.size()); |
|
|
| #ifndef NDEBUG |
| size_t first_new_snt = this->T1 ? this->T1->size() : 0; |
| #endif |
|
|
| SPTR<imBitext<TKN> > ret; |
| { |
| boost::unique_lock<boost::shared_mutex> guard(m_lock); |
| ret.reset(new imBitext<TKN>(*this)); |
| } |
|
|
| |
| boost::thread thread1(snt_adder<TKN>(s1,*ret->V1,ret->myT1,ret->myI1)); |
| |
| boost::thread thread2(snt_adder<TKN>(s2,*ret->V2,ret->myT2,ret->myI2)); |
| BOOST_FOREACH(std::string const& a, aln) |
| { |
| std::istringstream ibuf(a); |
| std::ostringstream obuf; |
| uint32_t row,col; char c; |
| while (ibuf >> row >> c >> col) |
| { |
| UTIL_THROW_IF2(c != '-', "[" << HERE << "] " |
| << "Error in alignment information:\n" << a); |
| binwrite(obuf,row); |
| binwrite(obuf,col); |
| } |
| |
| |
| |
| std::string foo = obuf.str(); |
| char const* x = foo.c_str(); |
| std::vector<char> v(x,x+foo.size()); |
| ret->myTx = append(ret->myTx, v); |
| } |
| |
| thread1.join(); |
| thread2.join(); |
| |
| ret->Tx = ret->myTx; |
| ret->T1 = ret->myT1; |
| ret->T2 = ret->myT2; |
| ret->I1 = ret->myI1; |
| ret->I2 = ret->myI2; |
| |
| #ifndef NDEBUG |
| |
| for (size_t i = first_new_snt; i < ret->T1->size(); ++i) |
| { |
| size_t slen1 = ret->T1->sntLen(i); |
| size_t slen2 = ret->T2->sntLen(i); |
| char const* p = ret->Tx->sntStart(i); |
| char const* q = ret->Tx->sntEnd(i); |
| size_t k; |
| while (p < q) |
| { |
| p = binread(p,k); |
| assert(p); |
| assert(p < q); |
| assert(k < slen1); |
| p = binread(p,k); |
| assert(p); |
| assert(k < slen2); |
| } |
| } |
| #endif |
| return ret; |
| } |
| |
| } |
|
|
|
|