DecodeStep::DecodeStep(const DecodeFeature *decodeFeature, const DecodeStep* prev, const std::vector<FeatureFunction*> &features) : m_decodeFeature(decodeFeature) { FactorMask prevOutputFactors; if (prev) prevOutputFactors = prev->m_outputFactors; m_outputFactors = prevOutputFactors; FactorMask conflictMask = (m_outputFactors & decodeFeature->GetOutputFactorMask()); m_outputFactors |= decodeFeature->GetOutputFactorMask(); FactorMask newOutputFactorMask = m_outputFactors ^ prevOutputFactors; //xor m_newOutputFactors.resize(newOutputFactorMask.count()); m_conflictFactors.resize(conflictMask.count()); size_t j=0, k=0; for (size_t i = 0; i < MAX_NUM_FACTORS; i++) { if (newOutputFactorMask[i]) m_newOutputFactors[j++] = i; if (conflictMask[i]) m_conflictFactors[k++] = i; } VERBOSE(2,"DecodeStep():\n\toutputFactors=" << m_outputFactors << "\n\tconflictFactors=" << conflictMask << "\n\tnewOutputFactors=" << newOutputFactorMask << std::endl); // find out which feature function can be applied in this decode step for (size_t i = 0; i < features.size(); ++i) { FeatureFunction *feature = features[i]; if (feature->IsUseable(m_outputFactors)) { m_featuresToApply.push_back(feature); } else { m_featuresRemaining.push_back(feature); } } }
DecodeStep::DecodeStep(Dictionary *ptr, const DecodeStep* prev) :m_ptr(ptr) { FactorMask prevOutputFactors; if (prev) prevOutputFactors = prev->m_outputFactors; m_outputFactors = prevOutputFactors; FactorMask conflictMask = (m_outputFactors & ptr->GetOutputFactorMask()); m_outputFactors |= ptr->GetOutputFactorMask(); FactorMask newOutputFactorMask = m_outputFactors ^ prevOutputFactors; //xor m_newOutputFactors.resize(newOutputFactorMask.count()); m_conflictFactors.resize(conflictMask.count()); size_t j=0, k=0; for (size_t i = 0; i < MAX_NUM_FACTORS; i++) { if (newOutputFactorMask[i]) m_newOutputFactors[j++] = i; if (conflictMask[i]) m_conflictFactors[k++] = i; } VERBOSE(2,"DecodeStep():\n\toutputFactors=" << m_outputFactors << "\n\tconflictFactors=" << conflictMask << "\n\tnewOutputFactors=" << newOutputFactorMask << std::endl); }