76 m_subset_stack->remove_all_subsets();
77 free_feature_matrix();
83 m_subset_stack->remove_all_subsets();
92 int32_t real_num=m_subset_stack->subset_idx_conversion(num);
96 if (feature_matrix.matrix)
99 return &feature_matrix.matrix[real_num * int64_t(num_features)];
107 feat = feature_cache->lock_entry(real_num);
112 feat = feature_cache->set_entry(real_num);
117 feat = compute_feature_vector(num, len, feat);
119 if (get_num_preprocessors())
121 int32_t tmp_len = len;
122 ST* tmp_feat_before = feat;
123 ST* tmp_feat_after = NULL;
125 for (int32_t i = 0; i < get_num_preprocessors(); i++)
132 tmp_feat_after = applied.
vector;
136 SG_FREE(tmp_feat_before);
137 tmp_feat_before = tmp_feat_after;
143 memcpy(feat, tmp_feat_after,
sizeof(ST) * tmp_len);
144 SG_FREE(tmp_feat_after);
155 int32_t real_num=m_subset_stack->subset_idx_conversion(num);
157 if (num>=get_num_vectors())
159 SG_ERROR(
"Index out of bounds (number of vectors %d, you "
160 "requested %d)\n", get_num_vectors(), num);
163 if (!feature_matrix.matrix)
164 SG_ERROR(
"Requires a in-memory feature matrix\n")
166 if (vector.
vlen != num_features)
168 "Vector not of length %d (has %d)\n", num_features, vector.
vlen);
170 memcpy(&feature_matrix.matrix[real_num * int64_t(num_features)], vector.
vector,
171 int64_t(num_features) *
sizeof(ST));
177 int32_t real_num=m_subset_stack->subset_idx_conversion(num);
179 if (num >= get_num_vectors())
181 SG_ERROR(
"Index out of bounds (number of vectors %d, you "
182 "requested %d)\n", get_num_vectors(), real_num);
187 ST* vector= get_feature_vector(num, vlen, do_free);
194 feature_cache->unlock_entry(m_subset_stack->subset_idx_conversion(num));
202 free_feature_vector(vec.
vector, num,
false);
208 if (m_subset_stack->has_subsets())
209 SG_ERROR(
"A subset is set, cannot call vector_subset\n")
211 ASSERT(feature_matrix.matrix)
212 ASSERT(idx_len<=num_vectors)
214 int32_t num_vec = num_vectors;
215 num_vectors = idx_len;
219 for (int32_t i = 0; i < idx_len; i++)
224 if (ii < 0 || ii >= num_vec)
225 SG_ERROR(
"Index out of range: should be 0<%d<%d\n", ii, num_vec)
230 memcpy(&feature_matrix.matrix[int64_t(num_features) * i],
231 &feature_matrix.matrix[int64_t(num_features) * ii],
232 num_features *
sizeof(ST));
239 if (m_subset_stack->has_subsets())
240 SG_ERROR(
"A subset is set, cannot call feature_subset\n")
242 ASSERT(feature_matrix.matrix)
243 ASSERT(idx_len<=num_features)
244 int32_t num_feat = num_features;
245 num_features = idx_len;
247 for (int32_t i = 0; i < num_vectors; i++)
249 ST* src = &feature_matrix.matrix[int64_t(num_feat) * i];
250 ST* dst = &feature_matrix.matrix[int64_t(num_features) * i];
253 for (int32_t j = 0; j < idx_len; j++)
257 if (jj < 0 || jj >= num_feat)
259 "Index out of range: should be 0<%d<%d\n", jj, num_feat);
269 if (!m_subset_stack->has_subsets())
270 return feature_matrix;
272 SGMatrix<ST> submatrix(num_features, get_num_vectors());
275 for (int32_t i=0; i<submatrix.
num_cols; ++i)
277 int32_t real_i = m_subset_stack->subset_idx_conversion(i);
278 memcpy(&submatrix.
matrix[i*int64_t(num_features)],
279 &feature_matrix.matrix[real_i * int64_t(num_features)],
280 num_features *
sizeof(ST));
289 m_subset_stack->remove_all_subsets();
291 clean_preprocessors();
292 free_feature_matrix();
293 return st_feature_matrix;
298 m_subset_stack->remove_all_subsets();
299 free_feature_matrix();
300 feature_matrix = matrix;
307 num_feat = num_features;
308 num_vec = num_vectors;
309 return feature_matrix.
matrix;
316 ST* fm = get_transposed(num_feat, num_vec);
323 num_feat = get_num_vectors();
324 num_vec = num_features;
326 int32_t old_num_vec=get_num_vectors();
328 ST* fm = SG_MALLOC(ST, int64_t(num_feat) * num_vec);
330 for (int32_t i=0; i<old_num_vec; i++)
334 for (int32_t j=0; j<vec.
vlen; j++)
335 fm[j*int64_t(old_num_vec)+i]=vec.
vector[j];
337 free_feature_vector(vec, i);
345 if (m_subset_stack->has_subsets())
346 SG_ERROR(
"A subset is set, cannot call copy_feature_matrix\n")
348 free_feature_matrix();
349 feature_matrix = src.
clone();
357 m_subset_stack->remove_all_subsets();
362 ASSERT(num_feat>0 && num_vec>0)
364 free_feature_matrix();
367 for (int32_t i = 0; i < num_vec; i++)
372 for (int32_t j = 0; j < num_feat; j++)
373 feature_matrix.matrix[i * int64_t(num_feat) + j] = (ST) v.
vector[j];
375 num_features = num_feat;
376 num_vectors = num_vec;
381 if (m_subset_stack->has_subsets())
382 SG_ERROR(
"A subset is set, cannot call apply_preproc\n")
384 SG_DEBUG(
"force: %d\n", force_preprocessing)
386 if (feature_matrix.matrix && get_num_preprocessors())
388 for (int32_t i = 0; i < get_num_preprocessors(); i++)
390 if ((!is_preprocessed(i) || force_preprocessing))
411 if (!feature_matrix.matrix)
414 if (!get_num_preprocessors())
415 SG_ERROR(
"no preprocessors available\n")
423 return m_subset_stack->has_subsets() ? m_subset_stack->get_size() : num_vectors;
436 if (m_subset_stack->has_subsets())
437 SG_ERROR(
"A subset is set, cannot call set_num_vectors\n")
445 if (m_subset_stack->has_subsets())
446 SG_ERROR(
"A subset is set, cannot call initialize_cache\n")
448 if (num_features && num_vectors)
451 feature_cache =
new CCache<ST>(get_cache_size(), num_features,
461 if (m_subset_stack->has_subsets())
462 SG_ERROR(
"A subset is set, cannot call reshape\n")
464 if (p_num_features * p_num_vectors
465 == this->num_features * this->num_vectors)
467 num_features = p_num_features;
468 num_vectors = p_num_vectors;
487 ST* vec1 = get_feature_vector(vec_idx1, len1, free1);
488 ST* vec2 = sf->get_feature_vector(vec_idx2, len2, free2);
492 free_feature_vector(vec1, vec_idx1, free1);
493 sf->free_feature_vector(vec2, vec_idx2, free2);
499 float64_t* vec2, int32_t vec2_len,
bool abs_val)
501 ASSERT(vec2_len == num_features)
505 ST* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
507 ASSERT(vlen == num_features)
511 for (int32_t i = 0; i < num_features; i++)
516 for (int32_t i = 0; i < num_features; i++)
517 vec2[i] += alpha * vec1[i];
520 free_feature_vector(vec1, vec_idx1, vfree);
525 float64_t* vec2, int32_t vec2_len,
bool abs_val)
527 ASSERT(vec2_len == num_features)
531 float64_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
533 ASSERT(vlen == num_features)
537 for (int32_t i = 0; i < num_features; i++)
538 vec2[i] += alpha * CMath::abs(vec1[i]);
545 free_feature_vector(vec1, vec_idx1, vfree);
555 if (vector_index>=get_num_vectors())
557 SG_ERROR(
"Index out of bounds (number of vectors %d, you "
558 "requested %d)\n", get_num_vectors(), vector_index);
561 dense_feature_iterator* iterator = SG_MALLOC(dense_feature_iterator, 1);
562 iterator->vec = get_feature_vector(vector_index, iterator->vlen,
564 iterator->vidx = vector_index;
572 dense_feature_iterator* it = (dense_feature_iterator*) iterator;
573 if (!it || it->index >= it->vlen)
587 dense_feature_iterator* it = (dense_feature_iterator*) iterator;
588 free_feature_vector(it->vec, it->vidx, it->vfree);
598 index_t real_idx=m_subset_stack->subset_idx_conversion(indices.
vector[i]);
599 memcpy(&feature_matrix_copy.
matrix[i*num_features],
600 &feature_matrix.matrix[real_idx*num_features],
601 num_features*
sizeof(ST));
617 REQUIRE(max<num_features && min>=0,
618 "Provided dimensions is in the range [%d, %d] but they "
619 "have to be within [0, %d]! But it \n", min, max, num_features);
625 for (
index_t j=0; j<get_num_vectors(); ++j)
627 index_t real_idx=m_subset_stack->subset_idx_conversion(j);
628 feature_matrix_copy(i, j)=feature_matrix(dims[i], real_idx);
653 feature_cache = NULL;
660 SG_ADD(&feature_matrix,
"feature_matrix",
664 #define GET_FEATURE_TYPE(f_type, sg_type) \
665 template<> EFeatureType CDenseFeatures<sg_type>::get_feature_type() const \
683 #undef GET_FEATURE_TYPE
688 ASSERT(vec2_len == num_features)
692 bool* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
694 ASSERT(vlen == num_features)
697 for (int32_t i = 0; i < num_features; i++)
698 result += vec1[i] ? vec2[i] : 0;
700 free_feature_vector(vec1, vec_idx1, vfree);
708 ASSERT(vec2_len == num_features)
712 char* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
714 ASSERT(vlen == num_features)
717 for (int32_t i = 0; i < num_features; i++)
718 result += vec1[i] * vec2[i];
720 free_feature_vector(vec1, vec_idx1, vfree);
728 ASSERT(vec2_len == num_features)
732 int8_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
734 ASSERT(vlen == num_features)
737 for (int32_t i = 0; i < num_features; i++)
738 result += vec1[i] * vec2[i];
740 free_feature_vector(vec1, vec_idx1, vfree);
746 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
748 ASSERT(vec2_len == num_features)
752 uint8_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
754 ASSERT(vlen == num_features)
757 for (int32_t i = 0; i < num_features; i++)
758 result += vec1[i] * vec2[i];
760 free_feature_vector(vec1, vec_idx1, vfree);
766 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
768 ASSERT(vec2_len == num_features)
772 int16_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
774 ASSERT(vlen == num_features)
777 for (int32_t i = 0; i < num_features; i++)
778 result += vec1[i] * vec2[i];
780 free_feature_vector(vec1, vec_idx1, vfree);
786 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
788 ASSERT(vec2_len == num_features)
792 uint16_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
794 ASSERT(vlen == num_features)
797 for (int32_t i = 0; i < num_features; i++)
798 result += vec1[i] * vec2[i];
800 free_feature_vector(vec1, vec_idx1, vfree);
806 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
808 ASSERT(vec2_len == num_features)
812 int32_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
814 ASSERT(vlen == num_features)
817 for (int32_t i = 0; i < num_features; i++)
818 result += vec1[i] * vec2[i];
820 free_feature_vector(vec1, vec_idx1, vfree);
826 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
828 ASSERT(vec2_len == num_features)
832 uint32_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
834 ASSERT(vlen == num_features)
837 for (int32_t i = 0; i < num_features; i++)
838 result += vec1[i] * vec2[i];
840 free_feature_vector(vec1, vec_idx1, vfree);
846 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
848 ASSERT(vec2_len == num_features)
852 int64_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
854 ASSERT(vlen == num_features)
857 for (int32_t i = 0; i < num_features; i++)
858 result += vec1[i] * vec2[i];
860 free_feature_vector(vec1, vec_idx1, vfree);
866 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
868 ASSERT(vec2_len == num_features)
872 uint64_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
874 ASSERT(vlen == num_features)
877 for (int32_t i = 0; i < num_features; i++)
878 result += vec1[i] * vec2[i];
880 free_feature_vector(vec1, vec_idx1, vfree);
886 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
888 ASSERT(vec2_len == num_features)
892 float32_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
894 ASSERT(vlen == num_features)
897 for (int32_t i = 0; i < num_features; i++)
898 result += vec1[i] * vec2[i];
900 free_feature_vector(vec1, vec_idx1, vfree);
906 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
908 ASSERT(vec2_len == num_features)
912 float64_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
914 ASSERT(vlen == num_features)
917 free_feature_vector(vec1, vec_idx1, vfree);
923 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
925 ASSERT(vec2_len == num_features)
929 floatmax_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
931 ASSERT(vlen == num_features)
934 for (int32_t i = 0; i < num_features; i++)
935 result += vec1[i] * vec2[i];
937 free_feature_vector(vec1, vec_idx1, vfree);
949 int32_t v1len, v2len;
950 bool v1free, v2free, stop =
false;
952 for (int32_t i = 0; i < num_vectors; i++)
954 vec1 = get_feature_vector(i, v1len, v1free);
960 for (int32_t j=0; j<v1len; j++)
962 if (vec1[j]!=vec2[j])
966 free_feature_vector(vec1, i, v1free);
967 free_feature_vector(vec2, i, v2free);
979 SG_DEBUG(
"entering %s::create_merged_copy()\n", get_name());
986 index_t num_vectors_merged=num_vectors;
993 SG_ERROR(
"%s::create_merged_copy(): Could not cast object of %s to "
994 "same type as %s\n",get_name(), other->
get_name(), get_name());
999 strcmp(get_name(), casted->
get_name()))
1001 SG_ERROR(
"%s::create_merged_copy(): Features are of different type!\n",
1007 SG_ERROR(
"%s::create_merged_copy(): Provided feature object has "
1008 "different dimension than this one\n");
1023 SG_DEBUG(
"copying matrix of this instance\n")
1024 memcpy(data.
matrix, feature_matrix.matrix,
1025 num_features*num_vectors*
sizeof(ST));
1028 index_t num_processed=num_vectors;
1037 SG_DEBUG(
"copying matrix of provided instance\n")
1038 memcpy(&(data.
matrix[num_processed*num_features]),
1054 SG_DEBUG(
"leaving %s::create_merged_copy()\n", get_name());
1061 SG_DEBUG(
"entering %s::create_merged_copy()\n", get_name());
1066 CFeatures* result=create_merged_copy(list);
1069 SG_DEBUG(
"leaving %s::create_merged_copy()\n", get_name());
1077 matrix.
load(loader);
1078 set_feature_matrix(matrix);
1084 feature_matrix.
save(writer);
1090 "base_features must be of dynamic type CDenseFeatures\n")
virtual const char * get_name() const =0
CSubsetStack * m_subset_stack
void set_feature_vector(SGVector< ST > vector, int32_t num)
virtual int32_t get_dim_feature_space() const
CSGObject * get_next_element()
The class DenseFeatures implements dense feature matrices.
virtual void load(CFile *loader)
virtual void copy_feature_matrix(SGMatrix< ST > src)
ST * get_feature_vector(int32_t num, int32_t &len, bool &dofree)
int32_t get_num_features() const
CDenseFeatures(int32_t size=0)
Vector::Scalar dot(Vector a, Vector b)
virtual CFeatures * duplicate() const
SGMatrix< ST > get_feature_matrix()
void set_feature_matrix(SGMatrix< ST > matrix)
virtual int32_t get_num_vectors() const =0
#define SG_NOTIMPLEMENTED
void vector_subset(int32_t *idx, int32_t idx_len)
Features that support dot products among other operations.
int32_t num_features
number of features in cache
EFeatureClass
shogun feature class
class to add subset support to another class. A CSubsetStackStack instance should be added and wrappe...
virtual int32_t get_dim_feature_space() const =0
virtual void save(CFile *saver)
CSGObject * get_first_element()
Class SGObject is the base class of all shogun objects.
virtual int32_t get_num_vectors() const
Template class DensePreprocessor, base class for preprocessors (cf. CPreprocessor) that apply to CDen...
void set_num_vectors(int32_t num)
virtual float64_t dot(int32_t vec_idx1, CDotFeatures *df, int32_t vec_idx2)
A File access base class.
CDenseFeatures< ST > * get_transposed()
virtual EFeatureClass get_feature_class() const =0
void set_num_features(int32_t num)
SGMatrix< ST > feature_matrix
static float64_t dot(const bool *v1, const bool *v2, int32_t n)
Compute dot product between v1 and v2 (blas optimized)
void feature_subset(int32_t *idx, int32_t idx_len)
all of classes and functions are contained in the shogun namespace
void free_feature_vector(ST *feat_vec, int32_t num, bool dofree)
virtual bool reshape(int32_t p_num_features, int32_t p_num_vectors)
virtual EFeatureClass get_feature_class() const
The class Features is the base class of all feature objects.
virtual ~CDenseFeatures()
virtual SGMatrix< ST > apply_to_feature_matrix(CFeatures *features)=0
bool append_element(CSGObject *data)
void obtain_from_dot(CDotFeatures *df)
int32_t num_vectors
number of vectors in cache
SGVector< float64_t > get_computed_dot_feature_vector(int32_t num)
virtual EFeatureType get_feature_type() const
virtual bool apply_preprocessor(bool force_preprocessing=false)
Matrix::Scalar max(Matrix m)
void free_feature_matrix()
SGMatrix< ST > steal_feature_matrix()
virtual SGVector< ST > apply_to_feature_vector(SGVector< ST > vector)=0
virtual const char * get_name() const
virtual void add_to_dense_vec(float64_t alpha, int32_t vec_idx1, float64_t *vec2, int32_t vec2_len, bool abs_val=false)
virtual EFeatureType get_feature_type() const =0
Class List implements a doubly connected list for low-level-objects.
#define GET_FEATURE_TYPE(f_type, sg_type)