11 #ifndef DENSESUBSETFEATURES_H__
12 #define DENSESUBSETFEATURES_H__
20 template<
class ST>
class CDenseFeatures;
21 template<
class ST>
class SGVector;
33 :m_fea(fea), m_idx(idx) {
SG_REF(m_fea); set_generic<ST>(); }
39 virtual const char*
get_name()
const {
return "DenseSubsetFeatures"; }
74 return m_fea->get_feature_type();
85 return m_fea->get_feature_class();
96 return m_fea->get_num_vectors();
122 SG_ERROR(
"Require DenseSubsetFeatures of the same kind to perform dot\n")
124 if (m_idx.
vlen != dsf->m_idx.vlen)
125 SG_ERROR(
"Cannot dot vectors of different length\n")
127 SGVector<ST> vec1 = m_fea->get_feature_vector(vec_idx1);
128 SGVector<ST> vec2 = dsf->m_fea->get_feature_vector(vec_idx2);
131 for (int32_t i=0; i < m_idx.
vlen; ++i)
132 sum += vec1[m_idx[i]] * vec2[dsf->m_idx[i]];
145 if (m_idx.
vlen != vec2_len)
146 SG_ERROR(
"Cannot dot vectors of different length\n")
147 SGVector<ST> vec1 = m_fea->get_feature_vector(vec_idx1);
150 for (int32_t i=0; i < vec2_len; ++i)
151 sum += vec1[m_idx[i]] * vec2[i];
166 if (m_idx.
vlen != vec2_len)
167 SG_ERROR(
"Cannot add_to_dense_vec vectors of different length\n")
169 SGVector<ST> vec1 = m_fea->get_feature_vector(vec_idx1);
172 for (int32_t i=0; i < vec2_len; ++i)
173 vec2[i] += alpha *
CMath::abs(vec1[m_idx[i]]);
177 for (int32_t i=0; i < vec2_len; ++i)
178 vec2[i] += alpha * vec1[m_idx[i]];