15 #include <sys/types.h> 17 #define ssize_t int64_t 29 feature(
float _x, uint64_t _index) : x(_x), weight_index(_index) {}
44 return (
int)(((T*)first)->weight_index - ((T*)second)->weight_index);
45 else if (((T*)first)->
x > ((T*)second)->
x)
137 template <
typename T>
141 _begin_index += index;
145 template <
typename T>
151 template <
typename T>
155 _begin_index -= index;
170 swap(static_cast<features_value_iterator&>(lhs), static_cast<features_value_iterator&>(rhs));
202 template <
typename T>
206 _begin_audit += index;
210 template <
typename T>
216 template <
typename T>
220 _begin_audit += index;
235 swap(static_cast<features_value_index_iterator&>(lhs), static_cast<features_value_index_iterator&>(rhs));
271 values = v_init<feature_value>();
272 indicies = v_init<feature_index>();
273 space_names = v_init<audit_strings_ptr>();
280 inline size_t size()
const {
return values.
size(); }
294 iterator
end() {
return iterator(values.
end(), indicies.
end()); }
308 if (indicies.
end() != indicies.
begin())
309 indicies.
end() = indicies.
begin() + i;
310 if (space_names.
begin() != space_names.
end())
312 free_space_names((
size_t)i);
313 space_names.
end() = space_names.
begin() + i;
320 if (indicies.
end() != indicies.
begin())
321 indicies.
end() = indicies.
begin() + i;
322 if (space_names.
begin() != space_names.
end())
325 space_names.
end() = space_names.
begin() + i;
340 sum_feat_sq += v * v;
345 if (indicies.
empty())
348 if (!space_names.
empty())
351 for (
size_t i = 0; i < indicies.
size(); i++)
353 feature_slice temp = {values[i], indicies[i] & parse_mask, *space_names[i].get()};
357 for (
size_t i = 0; i < slice.
size(); i++)
359 values[i] = slice[i].x;
360 indicies[i] = slice[i].weight_index;
361 *space_names[i].get() = slice[i].space_name;
368 for (
size_t i = 0; i < indicies.
size(); i++)
370 feature temp = {values[i], indicies[i] & parse_mask};
373 qsort(slice.
begin(), slice.
size(),
sizeof(
feature), order_features<feature>);
374 for (
size_t i = 0; i < slice.
size(); i++)
376 values[i] = slice[i].x;
377 indicies[i] = slice[i].weight_index;
feature_index * _begin_index
features_value_index_iterator & operator+=(T index)
features_value_iterator & operator*()
features_value_index_iterator & operator++()
features_value_index_audit_iterator & operator=(const features_value_index_audit_iterator &other)
bool operator!=(const features_value_iterator &rhs)
void deep_copy_from(const features &src)
audit_strings_ptr * _begin_audit
void push_back(feature_value v, feature_index i)
features_value_index_iterator(feature_value *begin, feature_index *begin_index)
features_value_index_iterator & operator-=(T index)
std::shared_ptr< audit_strings > audit_strings_ptr
void copy_array(v_array< T > &dst, const v_array< T > &src)
v_array< feature_index > indicies
friend void swap(features_value_index_audit_iterator &lhs, features_value_index_audit_iterator &rhs)
void free_space_names(size_t i)
features_value_iterator & operator=(const features_value_iterator &other)
void truncate_to(size_t i)
features_value_index_audit_range values_indices_audit()
features_value_index_audit_iterator(const features_value_index_audit_iterator &other)
the core definition of a set of features.
features_value_index_audit_iterator & operator-=(T index)
features_value_index_audit_iterator & operator+=(T index)
features_value_index_audit_iterator & operator++()
bool operator==(const features_value_iterator &rhs)
v_array< feature_value > values
features_value_index_iterator(const features_value_index_iterator &other)
features_value_iterator(const features_value_iterator &other)
features_value_iterator & operator-=(T index)
void truncate_to(const features_value_iterator &pos)
features_value_index_iterator iterator
features_value_index_audit_iterator(feature_value *begin, feature_index *begin_index, audit_strings_ptr *begin_audit)
void copy_array_no_memcpy(v_array< T > &dst, const v_array< T > &src)
void push_back(const T &new_ele)
iterator over feature values only
feature_index weight_index
defines a "range" usable by C++ 11 for loops
features_value_index_audit_range(features *outer)
iterator over values, indicies and audit space names
bool sort(uint64_t parse_mask)
friend void swap(features_value_iterator &lhs, features_value_iterator &rhs)
audit_strings_ptr & audit()
features_value_index_iterator & operator=(const features_value_index_iterator &other)
iterator over values and indicies
v_array< audit_strings_ptr > space_names
features_value_iterator operator+(T index)
features_value_index_audit_iterator iterator_all
features_value_index_audit_iterator & operator*()
features_value_iterator(feature_value *begin)
features_value_iterator & operator+=(T index)
features_value_iterator & operator++()
features_value_index_iterator operator+(T index)
int order_features(const void *first, const void *second)
feature(float _x, uint64_t _index)
features_value_index_audit_iterator operator+(T index)
friend void swap(features_value_index_iterator &lhs, features_value_index_iterator &rhs)
features_value_index_iterator & operator*()
features_value_iterator iterator_value
std::pair< std::string, std::string > audit_strings