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));
623 feature_cache = NULL;
630 SG_ADD(&feature_matrix,
"feature_matrix",
634 #define GET_FEATURE_TYPE(f_type, sg_type) \
635 template<> EFeatureType CDenseFeatures<sg_type>::get_feature_type() const \
653 #undef GET_FEATURE_TYPE
658 ASSERT(vec2_len == num_features)
662 bool* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
664 ASSERT(vlen == num_features)
667 for (int32_t i = 0; i < num_features; i++)
668 result += vec1[i] ? vec2[i] : 0;
670 free_feature_vector(vec1, vec_idx1, vfree);
678 ASSERT(vec2_len == num_features)
682 char* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
684 ASSERT(vlen == num_features)
687 for (int32_t i = 0; i < num_features; i++)
688 result += vec1[i] * vec2[i];
690 free_feature_vector(vec1, vec_idx1, vfree);
698 ASSERT(vec2_len == num_features)
702 int8_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
704 ASSERT(vlen == num_features)
707 for (int32_t i = 0; i < num_features; i++)
708 result += vec1[i] * vec2[i];
710 free_feature_vector(vec1, vec_idx1, vfree);
716 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
718 ASSERT(vec2_len == num_features)
722 uint8_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
724 ASSERT(vlen == num_features)
727 for (int32_t i = 0; i < num_features; i++)
728 result += vec1[i] * vec2[i];
730 free_feature_vector(vec1, vec_idx1, vfree);
736 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
738 ASSERT(vec2_len == num_features)
742 int16_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
744 ASSERT(vlen == num_features)
747 for (int32_t i = 0; i < num_features; i++)
748 result += vec1[i] * vec2[i];
750 free_feature_vector(vec1, vec_idx1, vfree);
756 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
758 ASSERT(vec2_len == num_features)
762 uint16_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
764 ASSERT(vlen == num_features)
767 for (int32_t i = 0; i < num_features; i++)
768 result += vec1[i] * vec2[i];
770 free_feature_vector(vec1, vec_idx1, vfree);
776 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
778 ASSERT(vec2_len == num_features)
782 int32_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
784 ASSERT(vlen == num_features)
787 for (int32_t i = 0; i < num_features; i++)
788 result += vec1[i] * vec2[i];
790 free_feature_vector(vec1, vec_idx1, vfree);
796 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
798 ASSERT(vec2_len == num_features)
802 uint32_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
804 ASSERT(vlen == num_features)
807 for (int32_t i = 0; i < num_features; i++)
808 result += vec1[i] * vec2[i];
810 free_feature_vector(vec1, vec_idx1, vfree);
816 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
818 ASSERT(vec2_len == num_features)
822 int64_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
824 ASSERT(vlen == num_features)
827 for (int32_t i = 0; i < num_features; i++)
828 result += vec1[i] * vec2[i];
830 free_feature_vector(vec1, vec_idx1, vfree);
836 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
838 ASSERT(vec2_len == num_features)
842 uint64_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
844 ASSERT(vlen == num_features)
847 for (int32_t i = 0; i < num_features; i++)
848 result += vec1[i] * vec2[i];
850 free_feature_vector(vec1, vec_idx1, vfree);
856 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
858 ASSERT(vec2_len == num_features)
862 float32_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
864 ASSERT(vlen == num_features)
867 for (int32_t i = 0; i < num_features; i++)
868 result += vec1[i] * vec2[i];
870 free_feature_vector(vec1, vec_idx1, vfree);
876 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
878 ASSERT(vec2_len == num_features)
882 float64_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
884 ASSERT(vlen == num_features)
887 free_feature_vector(vec1, vec_idx1, vfree);
893 int32_t vec_idx1,
const float64_t* vec2, int32_t vec2_len)
895 ASSERT(vec2_len == num_features)
899 floatmax_t* vec1 = get_feature_vector(vec_idx1, vlen, vfree);
901 ASSERT(vlen == num_features)
904 for (int32_t i = 0; i < num_features; i++)
905 result += vec1[i] * vec2[i];
907 free_feature_vector(vec1, vec_idx1, vfree);
919 int32_t v1len, v2len;
920 bool v1free, v2free, stop =
false;
922 for (int32_t i = 0; i < num_vectors; i++)
924 vec1 = get_feature_vector(i, v1len, v1free);
930 for (int32_t j=0; j<v1len; j++)
932 if (vec1[j]!=vec2[j])
936 free_feature_vector(vec1, i, v1free);
937 free_feature_vector(vec2, i, v2free);
949 SG_DEBUG(
"entering %s::create_merged_copy()\n", get_name());
956 index_t num_vectors_merged=num_vectors;
963 SG_ERROR(
"%s::create_merged_copy(): Could not cast object of %s to "
964 "same type as %s\n",get_name(), other->
get_name(), get_name());
969 strcmp(get_name(), casted->
get_name()))
971 SG_ERROR(
"%s::create_merged_copy(): Features are of different type!\n",
977 SG_ERROR(
"%s::create_merged_copy(): Provided feature object has "
978 "different dimension than this one\n");
993 SG_DEBUG(
"copying matrix of this instance\n")
994 memcpy(data.
matrix, feature_matrix.matrix,
995 num_features*num_vectors*
sizeof(ST));
998 index_t num_processed=num_vectors;
1007 SG_DEBUG(
"copying matrix of provided instance\n")
1008 memcpy(&(data.
matrix[num_processed*num_features]),
1024 SG_DEBUG(
"leaving %s::create_merged_copy()\n", get_name());
1031 SG_DEBUG(
"entering %s::create_merged_copy()\n", get_name());
1036 CFeatures* result=create_merged_copy(list);
1039 SG_DEBUG(
"leaving %s::create_merged_copy()\n", get_name());
1047 matrix.
load(loader);
1048 set_feature_matrix(matrix);
1054 feature_matrix.
save(writer);
1060 "base_features must be of dynamic type CDenseFeatures\n")