#include #include #include "MiraFeatureVector.h" using namespace std; namespace MosesTuning { void MiraFeatureVector::InitSparse(const SparseVector& sparse, size_t ignoreLimit) { vector sparseFeats = sparse.feats(); bool bFirst = true; size_t lastFeat = 0; m_sparseFeats.reserve(sparseFeats.size()); m_sparseVals.reserve(sparseFeats.size()); for(size_t i=0; i=feat) { cerr << "Error: Feature indeces must be strictly ascending coming out of SparseVector" << endl; exit(1); } } lastFeat = feat; } } MiraFeatureVector::MiraFeatureVector(const FeatureDataItem& vec) : m_dense(vec.dense) { InitSparse(vec.sparse); } MiraFeatureVector::MiraFeatureVector(const SparseVector& sparse, size_t num_dense) { m_dense.resize(num_dense); //Assume that features with id [0,num_dense) are the dense features for (size_t id = 0; id < num_dense; ++id) { m_dense[id] = sparse.get(id); } InitSparse(sparse,num_dense); } MiraFeatureVector::MiraFeatureVector(const MiraFeatureVector& other) : m_dense(other.m_dense), m_sparseFeats(other.m_sparseFeats), m_sparseVals(other.m_sparseVals) { if(m_sparseVals.size()!=m_sparseFeats.size()) { cerr << "Error: mismatching sparse feat and val sizes" << endl; exit(1); } } MiraFeatureVector::MiraFeatureVector(const vector& dense, const vector& sparseFeats, const vector& sparseVals) : m_dense(dense), m_sparseFeats(sparseFeats), m_sparseVals(sparseVals) { if(m_sparseVals.size()!=m_sparseFeats.size()) { cerr << "Error: mismatching sparse feat and val sizes" << endl; exit(1); } } ValType MiraFeatureVector::val(size_t index) const { if(index < m_dense.size()) return m_dense[index]; else return m_sparseVals[index-m_dense.size()]; } size_t MiraFeatureVector::feat(size_t index) const { if(index < m_dense.size()) return index; else return m_sparseFeats[index-m_dense.size()]; } size_t MiraFeatureVector::size() const { return m_dense.size() + m_sparseVals.size(); } ValType MiraFeatureVector::sqrNorm() const { ValType toRet = 0.0; for(size_t i=0; i dense; if(a.m_dense.size()!=b.m_dense.size()) { cerr << "Mismatching dense vectors passed to MiraFeatureVector subtraction" << endl; exit(1); } for(size_t i=0; i sparseVals; vector sparseFeats; while(i < a.m_sparseFeats.size() && j < b.m_sparseFeats.size()) { if(a.m_sparseFeats[i] < b.m_sparseFeats[j]) { sparseFeats.push_back(a.m_sparseFeats[i]); sparseVals.push_back(a.m_sparseVals[i]); i++; } else if(b.m_sparseFeats[j] < a.m_sparseFeats[i]) { sparseFeats.push_back(b.m_sparseFeats[j]); sparseVals.push_back(-b.m_sparseVals[j]); j++; } else { ValType newVal = a.m_sparseVals[i] - b.m_sparseVals[j]; if(abs(newVal)>1e-6) { sparseFeats.push_back(a.m_sparseFeats[i]); sparseVals.push_back(newVal); } i++; j++; } } while(i0) o << " "; o << e.feat(i) << ":" << e.val(i); } return o; } // --Emacs trickery-- // Local Variables: // mode:c++ // c-basic-offset:2 // End: }