/* Copyright (c) by respective owners including Yahoo!, Microsoft, and individual contributors. All rights reserved. Released under a BSD (revised) license as described in the file LICENSE. */ #include #include "parse_primitives.h" #include "v_array.h" #include "example.h" #include "simple_label.h" #include "gd.h" #include "global_data.h" #include "memory.h" int compare_feature(const void* p1, const void* p2) { feature* f1 = (feature*) p1; feature* f2 = (feature*) p2; return (f1->weight_index - f2->weight_index); } float collision_cleanup(v_array& feature_map) { int pos = 0; float sum_sq = 0.; for(uint32_t i = 1;i < feature_map.size();i++) { if(feature_map[i].weight_index == feature_map[pos].weight_index) feature_map[pos].x += feature_map[i].x; else { sum_sq += feature_map[pos].x*feature_map[pos].x; feature_map[++pos] = feature_map[i]; } } sum_sq += feature_map[pos].x*feature_map[pos].x; feature_map.end = &(feature_map[pos]); feature_map.end++; return sum_sq; } struct features_and_source { v_array feature_map; //map to store sparse feature vectors uint32_t stride_shift; weight* base; }; void vec_store(features_and_source& p, float fx, float& fw) { feature f = {fx, (uint32_t)(&fw - p.base) >> p.stride_shift}; p.feature_map.push_back(f); } namespace VW { flat_example* flatten_example(vw& all, example *ec) { flat_example* fec = (flat_example*) calloc_or_die(1,sizeof(flat_example)); fec->ld = ec->ld; fec->tag_len = ec->tag.size(); if (fec->tag_len >0) { fec->tag = ec->tag.begin; } fec->example_counter = ec->example_counter; fec->ft_offset = ec->ft_offset; fec->num_features = ec->num_features; features_and_source fs; fs.base = all.reg.weight_vector; fs.stride_shift = all.reg.stride_shift; GD::foreach_feature(all, *ec, fs); qsort(fs.feature_map.begin, fs.feature_map.size(), sizeof(feature), compare_feature); fec->feature_map_len = fs.feature_map.size(); if (fec->feature_map_len > 0) { fec->feature_map = fs.feature_map.begin; } return fec; } void free_flatten_example(flat_example* fec) { if (fec) free(fec); } } example *alloc_examples(size_t label_size, size_t count=1) { example* ec = (example*)calloc_or_die(count, sizeof(example)); if (ec == NULL) return NULL; for (size_t i=0; i