void read_tile_samples(KVS &store, int uid, std::string full_channel_name, TileIndex requested_index, TileIndex client_tile_index, std::vector<DataSample<T> > &samples, bool &binned) { Channel ch(store, uid, full_channel_name); Tile tile; TileIndex actual_index; bool success = ch.read_tile_or_closest_ancestor(requested_index, actual_index, tile); if (!success) { log_f("gettile: no tile found for %s", requested_index.to_string().c_str()); } else { log_f("gettile: requested %s: found %s", requested_index.to_string().c_str(), actual_index.to_string().c_str()); for (unsigned i = 0; i < tile.get_samples<T>().size(); i++) { DataSample<T> &sample=tile.get_samples<T>()[i]; if (client_tile_index.contains_time(sample.time)) samples.push_back(sample); } } if (samples.size() <= 512) { binned = false; } else { // Bin binned = true; std::vector<DataAccumulator<T> > bins(512); for (unsigned i = 0; i < samples.size(); i++) { DataSample<T> &sample=samples[i]; bins[(int)floor(client_tile_index.position(sample.time)*512)] += sample; } samples.clear(); for (unsigned i = 0; i < bins.size(); i++) { if (bins[i].weight > 0) samples.push_back(bins[i].get_sample()); } } }
void combine_samples(unsigned int n_samples, TileIndex parent_index, std::vector<DataSample<T> > &parent, const std::vector<DataSample<T> > &left_child, const std::vector<DataSample<T> > &right_child) { std::vector<DataAccumulator<T> > bins(n_samples); const std::vector<DataSample<T> > *children[2]; children[0]=&left_child; children[1]=&right_child; int n=0; for (unsigned j = 0; j < 2; j++) { const std::vector<DataSample<T> > &child = *children[j]; for (unsigned i = 0; i < child.size(); i++) { // Version 1: bin samples into correct bin // Version 2: try gaussian or lanczos(1) or 1/4 3/4 3/4 1/4 const DataSample<T> &sample = child[i]; assert(parent_index.contains_time(sample.time)); unsigned bin = (unsigned) floor(parent_index.position(sample.time) * n_samples); assert(bin < n_samples); n++; bins[bin] += sample; assert(bins[bin].weight>0); } } n = 0; int m=0; parent.clear(); for (unsigned i = 0; i < bins.size(); i++) { if (bins[i].weight > 0) { parent.push_back(bins[i].get_sample()); assert(parent.size()); n++; } else { m++; } } if (left_child.size() || right_child.size()) assert(parent.size()); }