blob: a388ec105ab140239e8fc44feecc0dcbc73dcef4 [file] [log] [blame]
kdanylov aka kodercdfcdaf2017-04-29 10:03:39 +03001#include <algorithm>
2#include <cstdint>
3#include <cstdio>
4
kdanylov aka kodercdfcdaf2017-04-29 10:03:39 +03005
kdanylov aka koder45183182017-04-30 23:55:40 +03006extern "C" void interpolate_ts_on_seconds_border(unsigned int input_size,
7 unsigned int output_size,
8 const uint64_t * times,
9 const uint64_t * values,
10 unsigned int time_step,
11 uint64_t * output)
kdanylov aka kodercdfcdaf2017-04-29 10:03:39 +030012{
13 auto output_end = (*times / time_step) * time_step;
14 auto output_begin = output_end - time_step;
15 auto output_cell = output;
16
17 auto input_cell = values;
18 auto input_time = times;
19 auto input_val = *input_cell;
20 auto input_begin = *input_time - time_step;
21 auto input_end = *input_time;
22 auto rate = ((double)*input_cell) / (input_end - input_begin);
23
24 // output array mush fully cover input array
25 while(output_cell < output + output_size) {
26 // check if cells intersect
27 auto intersection = ((int64_t)std::min(output_end, input_end)) - std::max(output_begin, input_begin);
28
29 // add intersection slice to output array
30 if(intersection > 0) {
31 auto slice = (uint64_t)(intersection * rate);
32 *output_cell += slice;
33 input_val -= slice;
34 }
35
36 // switch to next input or output cell
37 if (output_end >= input_end){
38 *output_cell += input_val;
39
40 ++input_cell;
41 ++input_time;
42
43 if(input_time == times + input_size)
44 return;
45
46 input_val = *input_cell;
47 input_begin = input_end;
48 input_end = *input_time;
49 rate = ((double)*input_cell) / (input_end - input_begin);
50 } else {
51 ++output_cell;
52 output_begin = output_end;
53 output_end += time_step;
54 }
55 }
kdanylov aka koder45183182017-04-30 23:55:40 +030056}
57
58
59extern "C" unsigned int interpolate_ts_on_seconds_border_qd(unsigned int input_size,
60 unsigned int output_size,
61 const uint64_t * times,
62 const uint64_t * values,
63 unsigned int time_step,
64 uint64_t * output)
65{
66 auto input_end = times + input_size;
67 auto curr_output_tm = *times - time_step / 2;
68
69 for(auto output_cell = output; output_cell < output + output_size; ++output_cell) {
70 while (curr_output_tm > *times) {
71 if (++times >= input_end)
72 return output_cell - output;
73 ++values;
74 }
75 *output_cell = *values;
76 curr_output_tm += time_step;
77 }
78
79 return output_size;
80}