-
Notifications
You must be signed in to change notification settings - Fork 11
/
min.cc
73 lines (57 loc) · 1.9 KB
/
min.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/*
* This file is part of tindicators, licensed under GNU LGPL v3.
* Author: Ilya Pikulin <ilya.pikulin@gmail.com>, 2019-2021
* Author: Lewis Van Winkle <lv@codeplea.com>, 2016-2018
*/
#include "../indicators.h"
int ti_min_start(TI_REAL const *options) {
return (int)options[0]-1;
}
int ti_min(int size, TI_REAL const *const *inputs, TI_REAL const *options, TI_REAL *const *outputs) {
const TI_REAL *input = inputs[0];
const int period = (int)options[0];
TI_REAL *output = outputs[0];
if (period < 1) return TI_INVALID_OPTION;
if (size <= ti_min_start(options)) return TI_OKAY;
int trail = 0, mini = -1;
TI_REAL min = input[0];
int i, j;
for (i = period-1; i < size; ++i, ++trail) {
TI_REAL bar = input[i];
if (mini < trail) {
mini = trail;
min = input[mini];
j = trail;
while(++j <= i) {
bar = input[j];
if (bar <= min) {
min = bar;
mini = j;
}
}
} else if (bar <= min) {
mini = i;
min = bar;
}
*output++ = min;
}
assert(output - outputs[0] == size - ti_min_start(options));
return TI_OKAY;
}
int ti_min_ref(int size, TI_REAL const *const *inputs, TI_REAL const *options, TI_REAL *const *outputs) {
const TI_REAL *input = inputs[0];
const int period = (int)options[0];
TI_REAL *output = outputs[0];
if (period < 1) return TI_INVALID_OPTION;
if (size <= ti_min_start(options)) return TI_OKAY;
#define MIN(a, b) ((a) < (b) ? (a) : (b))
for (int i = period-1; i < size; ++i) {
TI_REAL min = input[i-period+1];
for (int j = i-period+2; j <= i; ++j) {
min = MIN(min, input[j]);
}
*output++ = min;
}
assert(output - outputs[0] == size - ti_min_start(options));
return TI_OKAY;
}