-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathdvec2.cc
116 lines (104 loc) · 2.56 KB
/
dvec2.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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/* Copyright (C) 2015, Gabriele Facciolo <[email protected]>,
* Carlo de Franchis <[email protected]>,
* Enric Meinhardt <[email protected]>*/
#ifndef DVEC_H_
#define DVEC_H_
#include <stdio.h>
#include <math.h>
struct Dvec
{
float *data;
int min,max;
float minval; // minimum value cache
inline int init(int min, int max, float *dataptr)
{
assert(min<max);
this->min = min;
this->max = max;
this->data = dataptr;
this->minval = INFINITY; // by default cache is invalid
return 0;
}
// inline int init(int min, int max)
// {
// assert(min<max);
// this->min = min;
// this->max = max;
// this->data = std::vector<float >(max-min+1,0);
// this->minval=INFINITY; // by default cache is invalid
// return 0;
// }
//
//
// Dvec(int min, int max)
// {
// init(min,max);
// }
//
// Dvec(int Numel)
// {
// init(0,Numel);
// }
//
// Dvec()
// {
// }
inline float get_minvalue() {
if (minval == INFINITY)
for(int o=min;o<=max;o++)
if (this->operator[](o) < minval)
minval=this->operator[](o);
return minval;
}
inline void set(int i, float value) {
if (i>=this->min && i<=this->max)
{
int idx = i-this->min;
#pragma omp critical
data[idx]=value;
minval=INFINITY; // invalidate minval cache
}
}
inline void increment(int i, float value) {
if (i>=this->min && i<=this->max)
{
int idx = i-this->min;
#pragma omp critical
data[idx]+=value;
minval=INFINITY; // invalidate minval cache
}
}
inline void set_nolock(int i, float value) {
if (i>=this->min && i<=this->max)
{
int idx = i-this->min;
data[idx]=value;
minval=INFINITY; // invalidate minval cache
}
}
inline void increment_nolock(int i, float value) {
if (i>=this->min && i<=this->max)
{
int idx = i-this->min;
data[idx]+=value;
minval=INFINITY; // invalidate minval cache
}
}
inline float operator[](int i) {
if (i>=this->min && i<=this->max)
return data[i-this->min];
else return INFINITY;
}
};
//int main(){
// struct Dvec a(10);
// struct Dvec b(10,20);
// for(int i=0;i<10;i++){
// a[0]= i;
// b[10]= i;
// }
// printf("%f\n", a[0]);
// printf("%f\n", a[13]);
// printf("%f\n", b[15]);
//}
#endif //DVEC_H_