void ensemble_factory<dType>::ensembles_models() { int num_models = models.size(); for(int i=0; i<outputdist.rows(); i++) { for(int j=0; j< outputdist.cols(); j++) { double temp_sum = 0; for(int k=0; k<models.size(); k++) { temp_sum+=models[k].outputdist(i,j); } outputdist(i,j) = temp_sum/num_models; } } //normalize now // for(int j=0; j< outputdist.cols(); j++) { // double temp_sum = 0; // for(int i=0; i<outputdist.rows(); i++) { // temp_sum+=outputdist(i,j); // } // for(int i=0; i<outputdist.rows(); i++) { // outputdist(i,j) = outputdist(i,j)/temp_sum; // } // } normalization.setZero(); for(int i=0; i<outputdist.rows(); i++) { normalization+=outputdist.row(i); } for(int i=0; i<outputdist.rows(); i++) { outputdist.row(i) = (outputdist.row(i).array()/normalization.array()).matrix(); } }
void ensemble_factory<dType>::ensembles_models() { int num_models = models.size(); for(int i=0; i<outputdist.rows(); i++) { for(int j=0; j< outputdist.cols(); j++) { double temp_sum = 0; for(int k=0; k<models.size(); k++) { temp_sum+=models[k].outputdist(i,j); } outputdist(i,j) = temp_sum/num_models; } } //normalize now // for(int j=0; j< outputdist.cols(); j++) { // double temp_sum = 0; // for(int i=0; i<outputdist.rows(); i++) { // temp_sum+=outputdist(i,j); // } // for(int i=0; i<outputdist.rows(); i++) { // outputdist(i,j) = outputdist(i,j)/temp_sum; // } // } normalization.setZero(); for(int i=0; i<outputdist.rows(); i++) { normalization+=outputdist.row(i); } for(int i=0; i<outputdist.rows(); i++) { outputdist.row(i) = (outputdist.row(i).array()/normalization.array()).matrix(); } //now averaging alignment scores for unk replacement if(BZ_CUDA::unk_replacement) { //average the scores for(int i=0; i<models[0].longest_sent;i++) { for(int j=0; j<models[0].beam_size; j++) { dType temp_sum = 0; for(int k=0; k<models.size(); k++) { temp_sum+=models[k].viterbi_alignments_scores[IDX2C(i,j,models[0].longest_sent)]; } BZ_CUDA::alignment_scores[IDX2C(i,j,models[0].longest_sent)] = temp_sum; } } // std::cout << "-------------------------------------------\n"; // for(int i=0; i<models[0].longest_sent;i++) { // for(int j=0; j<models[0].beam_size; j++) { // std::cout << BZ_CUDA::alignment_scores[IDX2C(i,j,models[0].longest_sent)] << " "; // } // std::cout << "\n"; // } // std::cout << "\n"; // std::cout << "-------------------------------------------\n\n"; //choose the max and fill in BZ_CUDA::viterbi_alignments for(int i=0; i<models[0].beam_size; i++) { dType max_val = 0; int max_index = -1; for(int j=0; j<models[0].longest_sent; j++) { dType temp_val = BZ_CUDA::alignment_scores[IDX2C(j,i,models[0].longest_sent)]; if(temp_val > max_val) { max_val = temp_val; max_index = j; } } // if(max_index==-1) { // std::cout << "ERROR: max_index is still -1, so all values are zero\n"; // } BZ_CUDA::viterbi_alignments[i] = max_index; } } }