#ifndef __mrpc_h__ #define __mrpc_h__ typedef struct { float min; float max; } pair_t; class mrpc { private: float *vec; // array start int elements; // array length int top_level; // the finest level in the hierarchy, (level == log2 of subsampling factor) int bottom_level; // the coarsest level int blocks; // nb of blocks per level. for each level, the block contains half of it's parents pairs int nb_top_pairs; // nb of pairs in top level blocks (bottom level blocks contains 1 pair) int total_nb_pairs; // total number of pairs over all levels and block (cache size upper bound) int samples_per_block; // each block contains info for this many samples pair_t *multi; // the multires array. [ top_level_blocks ... bottom_level_blocks ] int nb_pairs(int level); // get nb pairs at level pair_t *level(int level); // get first cache block at level int in_vector(float *f); // check if a certain sample is in the vector void scan_bound(float *f, int elemenets, int stride, pair_t *pair); // scan a part of a vector -> pair array void refine(int block); // compute all lower levels from toplevel for block void build_top(int block); // build toplevel cache block void build(int block_start, int block_endx); // (re)build part of the cache void peaks_direct(pair_t *p, int nb_pairs, double fpoint, double fsamples_per_pixel); void peaks_multires(pair_t *p, int nb_pairs, double fpoint, double fsamples_per_pixel, int level); public: mrpc(float *vec, int elements, int top_level, int bottom_level); ~mrpc(); void peaks(int start, int endx, pair_t *p, int nb_pairs); // fill a peak array void update(int start, int endx); // update cache for region }; #endif