ad4a30c5
David Mayerich
changed grid_data...
|
1
2
|
#ifndef STIM_GRID_H
#define STIM_GRID_H
|
1d08c377
David Mayerich
added grids subdi...
|
3
4
5
6
|
#include <vector>
#include <string>
#include <sstream>
|
8b7be670
David Mayerich
implemented savin...
|
7
|
#include <fstream>
|
ae407376
David Mayerich
added support for...
|
8
|
#include <cstdarg>
|
1d08c377
David Mayerich
added grids subdi...
|
9
|
|
8157c392
David Mayerich
added parser and ...
|
10
|
#include "../math/vector.h"
|
1d08c377
David Mayerich
added grids subdi...
|
11
|
|
1d08c377
David Mayerich
added grids subdi...
|
12
13
|
namespace stim{
|
ae407376
David Mayerich
added support for...
|
14
15
16
17
|
/**This object describes a generic D-dimensional grid containing data of type T.
Functions are provided for saving and loading binary data.
**/
|
1d08c377
David Mayerich
added grids subdi...
|
18
|
template<typename T, unsigned int D = 1>
|
ad4a30c5
David Mayerich
changed grid_data...
|
19
|
class grid{
|
1d08c377
David Mayerich
added grids subdi...
|
20
21
22
|
protected:
|
8b7be670
David Mayerich
implemented savin...
|
23
|
stim::vec<unsigned long, D> R; //elements in each dimension
|
385d2447
Pavel Govyadinov
Checkpoint: Conve...
|
24
|
stim::vec<float, D> S;
|
8157c392
David Mayerich
added parser and ...
|
25
|
T* ptr; //pointer to the data (on the GPU or CPU)
|
8157c392
David Mayerich
added parser and ...
|
26
|
|
ae407376
David Mayerich
added support for...
|
27
|
///Return the total number of values in the binary file
|
8157c392
David Mayerich
added parser and ...
|
28
29
30
31
32
33
34
|
unsigned long samples(){
unsigned long s = 1;
for(unsigned int d = 0; d < D; d++)
s *= R[d];
return s;
|
ae407376
David Mayerich
added support for...
|
35
36
37
38
39
40
41
42
43
44
45
46
47
|
}
///Initializes a grid by allocating the necessary memory and setting all values to zero
void init(){
//calculate the total number of values
unsigned long S = samples();
//allocate memory to store the grid
ptr = (T*)malloc(sizeof(T) * S);
//initialize the memory to zero
memset(ptr, 0, sizeof(T) * S);
|
8157c392
David Mayerich
added parser and ...
|
48
49
50
51
52
|
}
public:
|
72bc805b
David Mayerich
added a default c...
|
53
54
|
///Default constructor doesn't do anything
grid(){}
|
ae407376
David Mayerich
added support for...
|
55
|
|
72bc805b
David Mayerich
added a default c...
|
56
57
|
///Constructor used to specify the grid size as a vector
|
ae407376
David Mayerich
added support for...
|
58
59
60
61
62
63
64
65
66
|
/// @param _R is a vector describing the grid resolution
grid( stim::vec<unsigned long, D> _R){
//set the grid resolution
R = _R;
init();
}
|
385d2447
Pavel Govyadinov
Checkpoint: Conve...
|
67
68
69
70
71
72
|
void
setDim(stim::vec<float, D> s)
{
S = s;
}
|
ae407376
David Mayerich
added support for...
|
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
///Constructor used to specify the grid size as a set of parameters
/// @param X0... is a list of values describing the grid size along each dimension
grid( unsigned long X0, ...){
R[0] = X0;
va_list ap;
va_start(ap, X0);
for(unsigned int d = 1; d<D; d++)
R[d] = va_arg(ap, unsigned long);
va_end(ap);
init();
}
///Writes the binary data to disk
/// @param filename is the name of the binary file to be written
|
8157c392
David Mayerich
added parser and ...
|
93
94
|
void write(std::string filename){
|
8b7be670
David Mayerich
implemented savin...
|
95
96
|
std::fstream file;
|
8157c392
David Mayerich
added parser and ...
|
97
98
99
100
|
//open the file as binary for reading
file.open(filename.c_str(), std::ios::out | std::ios::binary);
//write file to disk
|
8b7be670
David Mayerich
implemented savin...
|
101
|
file.write((char *)ptr, samples() * sizeof(T));
|
8157c392
David Mayerich
added parser and ...
|
102
103
|
}
|
ae407376
David Mayerich
added support for...
|
104
105
106
107
108
|
///Loads a binary file from disk
/// @param filename is the name of the file containing the binary data
/// @param S is the size of the binary file along each dimension
/// @param header is the size of the header in bytes
|
8b7be670
David Mayerich
implemented savin...
|
109
|
void read(std::string filename, stim::vec<unsigned long, D> S, unsigned long header = 0){
|
8157c392
David Mayerich
added parser and ...
|
110
111
112
|
R = S; //set the sample resolution
|
8b7be670
David Mayerich
implemented savin...
|
113
114
|
std::fstream file;
|
8157c392
David Mayerich
added parser and ...
|
115
116
117
118
119
120
121
|
//open the file as binary for writing
file.open(filename.c_str(), std::ios::in | std::ios::binary);
//seek past the header
file.seekg(header, std::ios::beg);
//read the data
|
8b7be670
David Mayerich
implemented savin...
|
122
|
file.read((char *)ptr, samples() * sizeof(T));
|
8157c392
David Mayerich
added parser and ...
|
123
124
|
}
|
ae407376
David Mayerich
added support for...
|
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
///Gets a single value from the grid given a set of coordinates
/// @param x0... is a list of coordinates specifying the desired value
T get(unsigned long x0, ...){
va_list ap;
unsigned long F = 1;
unsigned long p = x0;
va_start(ap, x0);
for(unsigned int d = 1; d<D; d++){
F *= R[d-1];
p += va_arg(ap, unsigned int) * F;
}
va_end(ap);
return ptr[p];
}
///Sets a value in the grid
/// @param value is the grid point value
/// @x0... is the coordinate of the value to be set
void set(T value, unsigned long x0, ...){
va_list ap;
unsigned long F = 1;
unsigned long p = x0;
va_start(ap, x0);
for(unsigned int d = 1; d<D; d++){
F *= R[d-1];
p += va_arg(ap, unsigned int) * F;
}
va_end(ap);
ptr[p] = value;
}
|
385d2447
Pavel Govyadinov
Checkpoint: Conve...
|
166
|
|
ae407376
David Mayerich
added support for...
|
167
168
|
///Outputs grid data as a string
std::string str(){
|
8157c392
David Mayerich
added parser and ...
|
169
|
|
ae407376
David Mayerich
added support for...
|
170
|
std::stringstream result;
|
1d08c377
David Mayerich
added grids subdi...
|
171
|
|
ae407376
David Mayerich
added support for...
|
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
|
result<<"stim::grid structure of size [";
for(unsigned int d = 0; d<D; d++){
if(d!=0) result<<", ";
result<<R[d];
}
result<<"]"<<std::endl;
//calculate the number of values to output
unsigned long nV = min(R[0], (unsigned long)10);
for(unsigned long v = 0; v<nV; v++){
result<<ptr[v];
if(v != nV-1) result<<", ";
}
return result.str();
}
|
1d08c377
David Mayerich
added grids subdi...
|
189
190
191
192
193
|
};
}
|
8b7be670
David Mayerich
implemented savin...
|
194
|
#endif
|