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); }
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();
108 return m_fea->get_size();
135 SG_ERROR(
"Require DenseSubsetFeatures of the same kind to perform dot\n");
137 if (m_idx.
vlen != dsf->m_idx.vlen)
138 SG_ERROR(
"Cannot dot vectors of different length\n");
140 SGVector<ST> vec1 = m_fea->get_feature_vector(vec_idx1);
141 SGVector<ST> vec2 = dsf->m_fea->get_feature_vector(vec_idx2);
144 for (int32_t i=0; i < m_idx.
vlen; ++i)
145 sum += vec1[m_idx[i]] * vec2[dsf->m_idx[i]];
158 if (m_idx.
vlen != vec2_len)
159 SG_ERROR(
"Cannot dot vectors of different length\n");
160 SGVector<ST> vec1 = m_fea->get_feature_vector(vec_idx1);
163 for (int32_t i=0; i < vec2_len; ++i)
164 sum += vec1[m_idx[i]] * vec2[i];
179 if (m_idx.
vlen != vec2_len)
180 SG_ERROR(
"Cannot add_to_dense_vec vectors of different length\n");
182 SGVector<ST> vec1 = m_fea->get_feature_vector(vec_idx1);
185 for (int32_t i=0; i < vec2_len; ++i)
186 vec2[i] += alpha *
CMath::abs(vec1[m_idx[i]]);
190 for (int32_t i=0; i < vec2_len; ++i)
191 vec2[i] += alpha * vec1[m_idx[i]];