54 free_feature_matrix();
62 feature_matrix = NULL;
63 feature_matrix_num_features = num_features;
64 feature_matrix_num_vectors = num_vectors;
72 int32_t real_num=subset_idx_conversion(num);
79 return &feature_matrix[real_num * int64_t(num_features)];
87 feat = feature_cache->lock_entry(num);
92 feat = feature_cache->set_entry(real_num);
97 feat = compute_feature_vector(num, len, feat);
99 if (get_num_preprocessors())
101 int32_t tmp_len = len;
102 ST* tmp_feat_before = feat;
103 ST* tmp_feat_after = NULL;
105 for (int32_t i = 0; i < get_num_preprocessors(); i++)
112 tmp_feat_after = applied.
vector;
117 tmp_feat_before = tmp_feat_after;
120 memcpy(feat, tmp_feat_after,
sizeof(ST) * tmp_len);
131 int32_t real_num=subset_idx_conversion(num);
133 if (num>=get_num_vectors())
135 SG_ERROR(
"Index out of bounds (number of vectors %d, you "
136 "requested %d)\n", get_num_vectors(), num);
140 SG_ERROR(
"Requires a in-memory feature matrix\n");
142 if (vector.
vlen != num_features)
144 "Vector not of length %d (has %d)\n", num_features, vector.
vlen);
146 memcpy(&feature_matrix[real_num * int64_t(num_features)], vector.
vector,
147 int64_t(num_features) *
sizeof(ST));
153 int32_t real_num=subset_idx_conversion(num);
155 if (num >= get_num_vectors())
157 SG_ERROR(
"Index out of bounds (number of vectors %d, you "
158 "requested %d)\n", get_num_vectors(), real_num);
169 feature_cache->unlock_entry(subset_idx_conversion(num));
183 SG_ERROR(
"A subset is set, cannot call vector_subset\n");
186 ASSERT(idx_len<=num_vectors);
188 int32_t num_vec = num_vectors;
189 num_vectors = idx_len;
193 for (int32_t i = 0; i < idx_len; i++)
198 if (ii < 0 || ii >= num_vec)
199 SG_ERROR(
"Index out of range: should be 0<%d<%d\n", ii, num_vec);
204 memcpy(&feature_matrix[int64_t(num_features) * i],
205 &feature_matrix[int64_t(num_features) * ii],
206 num_features *
sizeof(ST));
214 SG_ERROR(
"A subset is set, cannot call feature_subset\n");
217 ASSERT(idx_len<=num_features);
218 int32_t num_feat = num_features;
219 num_features = idx_len;
221 for (int32_t i = 0; i < num_vectors; i++)
223 ST* src = &feature_matrix[int64_t(num_feat) * i];
224 ST* dst = &feature_matrix[int64_t(num_features) * i];
227 for (int32_t j = 0; j < idx_len; j++)
231 if (jj < 0 || jj >= num_feat)
233 "Index out of range: should be 0<%d<%d\n", jj, num_feat);
245 int64_t num = int64_t(num_features) * get_num_vectors();
246 *num_feat = num_features;
247 *num_vec = get_num_vectors();
254 for (int32_t i = 0; i < *num_vec; ++i)
256 int32_t real_i = m_subset->subset_idx_conversion(i);
257 memcpy(*dst, &feature_matrix[real_i * int64_t(num_features)],
258 num_features *
sizeof(ST));
264 memcpy(*dst, feature_matrix, num *
sizeof(ST));
270 return SGMatrix<ST>(feature_matrix, num_features, num_vectors);
275 SGMatrix<ST> st_feature_matrix(feature_matrix, num_features, num_vectors);
278 clean_preprocessors();
280 feature_matrix = NULL;
281 feature_matrix_num_vectors = 0;
282 feature_matrix_num_features = 0;
285 return st_feature_matrix;
291 free_feature_matrix();
292 feature_matrix = matrix.
matrix;
295 feature_matrix_num_vectors = num_vectors;
296 feature_matrix_num_features = num_features;
301 num_feat = num_features;
302 num_vec = num_vectors;
303 return feature_matrix;
310 ST* fm = get_transposed(num_feat, num_vec);
317 num_feat = get_num_vectors();
318 num_vec = num_features;
320 int32_t old_num_vec=get_num_vectors();
322 ST* fm =
SG_MALLOC(ST, int64_t(num_feat) * num_vec);
324 for (int32_t i=0; i<old_num_vec; i++)
328 for (int32_t j=0; j<vec.
vlen; j++)
329 fm[j*int64_t(old_num_vec)+i]=vec.
vector[j];
331 free_feature_vector(vec, i);
340 SG_ERROR(
"A subset is set, cannot call set_feature_matrix\n");
342 free_feature_matrix();
344 feature_matrix_num_features = num_feat;
345 feature_matrix_num_vectors = num_vec;
347 num_features = num_feat;
348 num_vectors = num_vec;
355 SG_ERROR(
"A subset is set, cannot call copy_feature_matrix\n");
357 free_feature_matrix();
360 feature_matrix =
SG_MALLOC(ST, ((int64_t) num_feat) * num_vec);
361 feature_matrix_num_features = num_feat;
362 feature_matrix_num_vectors = num_vec;
364 memcpy(feature_matrix, src.
matrix,
365 (
sizeof(ST) * ((int64_t) num_feat) * num_vec));
367 num_features = num_feat;
368 num_vectors = num_vec;
379 ASSERT(num_feat>0 && num_vec>0);
381 free_feature_matrix();
382 feature_matrix =
SG_MALLOC(ST, ((int64_t) num_feat) * num_vec);
383 feature_matrix_num_features = num_feat;
384 feature_matrix_num_vectors = num_vec;
386 for (int32_t i = 0; i < num_vec; i++)
391 for (int32_t j = 0; j < num_feat; j++)
392 feature_matrix[i * int64_t(num_feat) + j] = (ST) v.
vector[j];
396 num_features = num_feat;
397 num_vectors = num_vec;
403 SG_ERROR(
"A subset is set, cannot call apply_preproc\n");
405 SG_DEBUG(
"force: %d\n", force_preprocessing);
407 if (feature_matrix && get_num_preprocessors())
409 for (int32_t i = 0; i < get_num_preprocessors(); i++)
411 if ((!is_preprocessed(i) || force_preprocessing))
434 if (!get_num_preprocessors())
435 SG_ERROR(
"no preprocessors available\n");
445 return m_subset ? m_subset->get_size() : num_vectors;
459 SG_ERROR(
"A subset is set, cannot call set_num_vectors\n");
468 SG_ERROR(
"A subset is set, cannot call initialize_cache\n");
470 if (num_features && num_vectors)
473 feature_cache =
new CCache<ST>(get_cache_size(), num_features,
484 SG_ERROR(
"A subset is set, cannot call reshape\n");
486 if (p_num_features * p_num_vectors
487 == this->num_features * this->num_vectors)
489 num_features = p_num_features;
490 num_vectors = p_num_vectors;
509 ST* vec1 = get_feature_vector(vec_idx1, len1, free1);
510 ST* vec2 = sf->get_feature_vector(vec_idx2, len2, free2);
514 free_feature_vector(vec1, vec_idx1, free1);
515 sf->free_feature_vector(vec2, vec_idx2, free2);
521 float64_t* vec2, int32_t vec2_len,
bool abs_val)
523 ASSERT(vec2_len == num_features);
527 ST* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
529 ASSERT(vlen == num_features);
533 for (int32_t i = 0; i < num_features; i++)
538 for (int32_t i = 0; i < num_features; i++)
539 vec2[i] += alpha * vec1[i];
542 free_feature_vector(vec1, vec_idx1, vfree);
559 if (vector_index>=get_num_vectors())
561 SG_ERROR(
"Index out of bounds (number of vectors %d, you "
562 "requested %d)\n", get_num_vectors(), vector_index);
565 simple_feature_iterator* iterator =
SG_MALLOC(simple_feature_iterator, 1);
566 iterator->vec = get_feature_vector(vector_index, iterator->vlen,
568 iterator->vidx = vector_index;
576 simple_feature_iterator* it = (simple_feature_iterator*) iterator;
577 if (!it || it->index >= it->vlen)
591 simple_feature_iterator* it = (simple_feature_iterator*) iterator;
592 free_feature_vector(it->vec, it->vidx, it->vfree);
603 memcpy(&feature_matrix_copy.
matrix[i*num_features],
604 &feature_matrix[real_idx*num_features],
605 num_features*
sizeof(ST));
624 feature_matrix = NULL;
625 feature_matrix_num_vectors = 0;
626 feature_matrix_num_features = 0;
628 feature_cache = NULL;
632 m_parameters->add(&num_vectors,
"num_vectors",
633 "Number of vectors.");
634 m_parameters->add(&num_features,
"num_features",
"Number of features.");
635 m_parameters->add_matrix(&feature_matrix, &feature_matrix_num_features,
636 &feature_matrix_num_vectors,
"feature_matrix",
637 "Matrix of feature vectors / 1 vector per column.");
640 #define GET_FEATURE_TYPE(f_type, sg_type) \
641 template<> EFeatureType CSimpleFeatures<sg_type>::get_feature_type() \
659 #undef GET_FEATURE_TYPE
705 ASSERT(vec2_len == num_features);
709 bool* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
711 ASSERT(vlen == num_features);
714 for (int32_t i = 0; i < num_features; i++)
715 result += vec1[i] ? vec2[i] : 0;
717 free_feature_vector(vec1, vec_idx1, vfree);
725 ASSERT(vec2_len == num_features);
729 char* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
731 ASSERT(vlen == num_features);
734 for (int32_t i = 0; i < num_features; i++)
735 result += vec1[i] * vec2[i];
737 free_feature_vector(vec1, vec_idx1, vfree);
745 ASSERT(vec2_len == num_features);
749 int8_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
751 ASSERT(vlen == num_features);
754 for (int32_t i = 0; i < num_features; i++)
755 result += vec1[i] * vec2[i];
757 free_feature_vector(vec1, vec_idx1, vfree);
763 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
765 ASSERT(vec2_len == num_features);
769 uint8_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
771 ASSERT(vlen == num_features);
774 for (int32_t i = 0; i < num_features; i++)
775 result += vec1[i] * vec2[i];
777 free_feature_vector(vec1, vec_idx1, vfree);
783 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
785 ASSERT(vec2_len == num_features);
789 int16_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
791 ASSERT(vlen == num_features);
794 for (int32_t i = 0; i < num_features; i++)
795 result += vec1[i] * vec2[i];
797 free_feature_vector(vec1, vec_idx1, vfree);
803 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
805 ASSERT(vec2_len == num_features);
809 uint16_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
811 ASSERT(vlen == num_features);
814 for (int32_t i = 0; i < num_features; i++)
815 result += vec1[i] * vec2[i];
817 free_feature_vector(vec1, vec_idx1, vfree);
823 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
825 ASSERT(vec2_len == num_features);
829 int32_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
831 ASSERT(vlen == num_features);
834 for (int32_t i = 0; i < num_features; i++)
835 result += vec1[i] * vec2[i];
837 free_feature_vector(vec1, vec_idx1, vfree);
843 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
845 ASSERT(vec2_len == num_features);
849 uint32_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
851 ASSERT(vlen == num_features);
854 for (int32_t i = 0; i < num_features; i++)
855 result += vec1[i] * vec2[i];
857 free_feature_vector(vec1, vec_idx1, vfree);
863 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
865 ASSERT(vec2_len == num_features);
869 int64_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
871 ASSERT(vlen == num_features);
874 for (int32_t i = 0; i < num_features; i++)
875 result += vec1[i] * vec2[i];
877 free_feature_vector(vec1, vec_idx1, vfree);
883 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
885 ASSERT(vec2_len == num_features);
889 uint64_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
891 ASSERT(vlen == num_features);
894 for (int32_t i = 0; i < num_features; i++)
895 result += vec1[i] * vec2[i];
897 free_feature_vector(vec1, vec_idx1, vfree);
903 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
905 ASSERT(vec2_len == num_features);
909 float32_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
911 ASSERT(vlen == num_features);
914 for (int32_t i = 0; i < num_features; i++)
915 result += vec1[i] * vec2[i];
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 float64_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
931 ASSERT(vlen == num_features);
932 float64_t result = CMath::dot(vec1, vec2, num_features);
934 free_feature_vector(vec1, vec_idx1, vfree);
940 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
942 ASSERT(vec2_len == num_features);
946 floatmax_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
948 ASSERT(vlen == num_features);
951 for (int32_t i = 0; i < num_features; i++)
952 result += vec1[i] * vec2[i];
954 free_feature_vector(vec1, vec_idx1, vfree);
959 #define LOAD(f_load, sg_type) \
960 template<> void CSimpleFeatures<sg_type>::load(CFile* loader) \
967 loader->f_load(matrix, num_feat, num_vec); \
968 set_feature_matrix(matrix, num_feat, num_vec); \
972 LOAD(get_matrix,
bool)
973 LOAD(get_matrix,
char)
974 LOAD(get_int8_matrix, int8_t)
975 LOAD(get_matrix, uint8_t)
976 LOAD(get_matrix, int16_t)
977 LOAD(get_matrix, uint16_t)
978 LOAD(get_matrix, int32_t)
979 LOAD(get_uint_matrix, uint32_t)
980 LOAD(get_long_matrix, int64_t)
981 LOAD(get_ulong_matrix, uint64_t)
987 #define SAVE(f_write, sg_type) \
988 template<> void CSimpleFeatures<sg_type>::save(CFile* writer) \
992 writer->f_write(feature_matrix, num_features, num_vectors); \
996 SAVE(set_matrix,
bool)
997 SAVE(set_matrix,
char)
998 SAVE(set_int8_matrix, int8_t)
999 SAVE(set_matrix, uint8_t)
1000 SAVE(set_matrix, int16_t)
1001 SAVE(set_matrix, uint16_t)
1002 SAVE(set_matrix, int32_t)
1003 SAVE(set_uint_matrix, uint32_t)
1004 SAVE(set_long_matrix, int64_t)
1005 SAVE(set_ulong_matrix, uint64_t)
1011 template class CSimpleFeatures<bool>;
1012 template class CSimpleFeatures<char>;
1013 template class CSimpleFeatures<int8_t>;
1014 template class CSimpleFeatures<uint8_t>;
1015 template class CSimpleFeatures<int16_t>;
1016 template class CSimpleFeatures<uint16_t>;
1017 template class CSimpleFeatures<int32_t>;
1018 template class CSimpleFeatures<uint32_t>;
1019 template class CSimpleFeatures<int64_t>;
1020 template class CSimpleFeatures<uint64_t>;
1021 template class CSimpleFeatures<float32_t>;
1022 template class CSimpleFeatures<float64_t>;
1023 template class CSimpleFeatures<floatmax_t>;