void GenerateTupleTgtCands(OutputFactor2TgtCandList& tCand,E2Costs& e2costs,GCData& data) { // check if candidates are non-empty bool gotCands=1; for(size_t j=0; gotCands && j<tCand.size(); ++j) gotCands &= !tCand[j].empty(); if(gotCands) { // enumerate tuples CHECK(data.DistinctOutFactors()==tCand.size()); std::vector<unsigned> radix(data.DistinctOutFactors()); for(size_t i=0; i<tCand.size(); ++i) radix[i]=tCand[i].size(); unsigned *tuples=0; size_t numTuples=GenerateTuples(radix.size(),&radix[0],tuples); data.totalTuples+=numTuples; for(size_t i=0; i<numTuples; ++i) { mPhrase e(radix.size()); float costs=0.0; for(size_t j=0; j<radix.size(); ++j) { CHECK(tuples[radix.size()*i+j]<tCand[j].size()); std::pair<float,vFactor> const& mycand=tCand[j][tuples[radix.size()*i+j]]; e[j]=mycand.second; costs+=mycand.first; } #ifdef DEBUG bool mismatch=0; for(size_t j=1; !mismatch && j<e.size(); ++j) if(e[j].size()!=e[j-1].size()) mismatch=1; CHECK(mismatch==0); #endif std::pair<E2Costs::iterator,bool> p=e2costs.insert(std::make_pair(e,costs)); if(p.second) ++data.distinctTuples; else { // entry known, take min of costs, alternative: sum probs if(costs<p.first->second) p.first->second=costs; } } delete [] tuples; } }
void GeneratePerFactorTgtList(size_t factorType,PPtr pptr,GCData& data,Len2Cands& len2cands) { std::vector<FactorTgtCand> cands; data.pdicts[factorType]->GetTargetCandidates(pptr,cands); for(std::vector<FactorTgtCand>::const_iterator cand=cands.begin(); cand!=cands.end(); ++cand) { CHECK(data.weights[factorType].size()==cand->second.size()); float costs=std::inner_product(data.weights[factorType].begin(), data.weights[factorType].end(), cand->second.begin(), 0.0); size_t len=cand->first.size(); if(len>=len2cands.size()) len2cands.resize(len+1,0); if(!len2cands[len]) len2cands[len]=new OutputFactor2TgtCandList(data.DistinctOutFactors()); OutputFactor2TgtCandList &outf2tcandlist=*len2cands[len]; outf2tcandlist[data.OutFT(factorType)].push_back(std::make_pair(costs,cand->first)); } }