Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef _COMBINEDDOTFEATURES_H___
00014 #define _COMBINEDDOTFEATURES_H___
00015
00016 #include "lib/common.h"
00017 #include "lib/List.h"
00018 #include "features/DotFeatures.h"
00019 #include "features/Features.h"
00020
00021 namespace shogun
00022 {
00023 class CFeatures;
00024 class CList;
00025 class CListElement;
00045 class CCombinedDotFeatures : public CDotFeatures
00046 {
00047 void init(void);
00048
00049 public:
00051 CCombinedDotFeatures();
00052
00054 CCombinedDotFeatures(const CCombinedDotFeatures & orig);
00055
00057 virtual ~CCombinedDotFeatures();
00058
00063 inline virtual int32_t get_num_vectors()
00064 {
00065 return num_vectors;
00066 }
00067
00072 inline virtual int32_t get_dim_feature_space()
00073 {
00074 return num_dimensions;
00075 }
00076
00084 virtual float64_t dot(int32_t vec_idx1, CDotFeatures* df, int32_t vec_idx2);
00085
00092 virtual float64_t dense_dot(int32_t vec_idx1, const float64_t* vec2, int32_t vec2_len);
00093
00105 virtual void dense_dot_range(float64_t* output, int32_t start, int32_t stop, float64_t* alphas, float64_t* vec, int32_t dim, float64_t b);
00106
00118 virtual void dense_dot_range_subset(int32_t* sub_index, int32_t num, float64_t* output, float64_t* alphas, float64_t* vec, int32_t dim, float64_t b);
00119
00128 virtual void add_to_dense_vec(float64_t alpha, int32_t vec_idx1, float64_t* vec2, int32_t vec2_len, bool abs_val=false);
00129
00135 virtual int32_t get_nnz_features_for_vector(int32_t num);
00136
00141 inline virtual EFeatureType get_feature_type()
00142 {
00143 return F_DREAL;
00144 }
00145
00150 inline virtual EFeatureClass get_feature_class()
00151 {
00152 return C_COMBINED_DOT;
00153 }
00154
00159 inline virtual int32_t get_size()
00160 {
00161 return sizeof(float64_t);
00162 }
00163
00165 struct combined_feature_iterator
00166 {
00168 CDotFeatures* f;
00170 CListElement* current;
00172 void* iterator;
00173
00174 int32_t vector_index;
00175 };
00176
00186 virtual void* get_feature_iterator(int32_t vector_index)
00187 {
00188 combined_feature_iterator* it=new combined_feature_iterator[1];
00189
00190 it->current=NULL;
00191 it->f=get_first_feature_obj(it->current);
00192 it->iterator=it->f->get_feature_iterator(vector_index);
00193 it->vector_index=vector_index;
00194 return it;
00195 }
00196
00207 virtual bool get_next_feature(int32_t& index, float64_t& value, void* iterator)
00208 {
00209 ASSERT(iterator);
00210 combined_feature_iterator* it = (combined_feature_iterator*) iterator;
00211
00212 while (it->f)
00213 {
00214 if (it->f->get_next_feature(index, value, it->iterator))
00215 {
00216 value*=get_combined_feature_weight();
00217 return true;
00218 }
00219
00220 it->f->free_feature_iterator(it->iterator);
00221 it->f=get_next_feature_obj(it->current);
00222 if (it->f)
00223 it->iterator=it->f->get_feature_iterator(it->vector_index);
00224 else
00225 it->iterator=NULL;
00226 }
00227 return false;
00228 }
00229
00235 virtual void free_feature_iterator(void* iterator)
00236 {
00237 if (iterator)
00238 {
00239 combined_feature_iterator* it = (combined_feature_iterator*) iterator;
00240 if (it->iterator && it->f)
00241 it->f->free_feature_iterator(it->iterator);
00242 delete[] it;
00243 }
00244 }
00245
00250 virtual CFeatures* duplicate() const;
00251
00253 void list_feature_objs();
00254
00259 inline CDotFeatures* get_first_feature_obj()
00260 {
00261 return (CDotFeatures*) feature_list->get_first_element();
00262 }
00263
00269 inline CDotFeatures* get_first_feature_obj(CListElement*& current)
00270 {
00271 return (CDotFeatures*) feature_list->get_first_element(current);
00272 }
00273
00278 inline CDotFeatures* get_next_feature_obj()
00279 {
00280 return (CDotFeatures*) feature_list->get_next_element();
00281 }
00282
00288 inline CDotFeatures* get_next_feature_obj(CListElement*& current)
00289 {
00290 return (CDotFeatures*) feature_list->get_next_element(current);
00291 }
00292
00297 inline CDotFeatures* get_last_feature_obj()
00298 {
00299 return (CDotFeatures*) feature_list->get_last_element();
00300 }
00301
00307 inline bool insert_feature_obj(CDotFeatures* obj)
00308 {
00309 ASSERT(obj);
00310 bool result=feature_list->insert_element(obj);
00311 update_dim_feature_space_and_num_vec();
00312 return result;
00313 }
00314
00320 inline bool append_feature_obj(CDotFeatures* obj)
00321 {
00322 ASSERT(obj);
00323 bool result=feature_list->append_element(obj);
00324 update_dim_feature_space_and_num_vec();
00325 return result;
00326 }
00327
00332 inline bool delete_feature_obj()
00333 {
00334 CDotFeatures* f=(CDotFeatures*) feature_list->delete_element();
00335 if (f)
00336 {
00337 SG_UNREF(f);
00338 update_dim_feature_space_and_num_vec();
00339 return true;
00340 }
00341 else
00342 return false;
00343 }
00344
00349 inline int32_t get_num_feature_obj()
00350 {
00351 return feature_list->get_num_elements();
00352 }
00353
00359 virtual void get_subfeature_weights(float64_t** weights, int32_t* num_weights);
00360
00366 virtual void set_subfeature_weights(
00367 float64_t* weights, int32_t num_weights);
00368
00370 inline virtual const char* get_name() const { return "CombinedDotFeatures"; }
00371
00372 protected:
00374 void update_dim_feature_space_and_num_vec();
00375
00376 protected:
00378 CList* feature_list;
00379
00381 int32_t num_vectors;
00383 int32_t num_dimensions;
00384 };
00385 }
00386 #endif // _DOTFEATURES_H___