comparison data/model/EditableDenseThreeDimensionalModel.cpp @ 1365:3382d914e110

Merge from branch 3.0-integration
author Chris Cannam
date Fri, 13 Jan 2017 10:29:44 +0000
parents 2ff5e411151d
children 667e369cfeab
comparison
equal deleted inserted replaced
1272:6a7ea3bd0e10 1365:3382d914e110
94 } 94 }
95 95
96 int 96 int
97 EditableDenseThreeDimensionalModel::getWidth() const 97 EditableDenseThreeDimensionalModel::getWidth() const
98 { 98 {
99 return m_data.size(); 99 return int(m_data.size());
100 } 100 }
101 101
102 int 102 int
103 EditableDenseThreeDimensionalModel::getHeight() const 103 EditableDenseThreeDimensionalModel::getHeight() const
104 { 104 {
137 137
138 EditableDenseThreeDimensionalModel::Column 138 EditableDenseThreeDimensionalModel::Column
139 EditableDenseThreeDimensionalModel::getColumn(int index) const 139 EditableDenseThreeDimensionalModel::getColumn(int index) const
140 { 140 {
141 QReadLocker locker(&m_lock); 141 QReadLocker locker(&m_lock);
142 if (index < 0 || index >= m_data.size()) return Column(); 142 if (in_range_for(m_data, index)) return expandAndRetrieve(index);
143 return expandAndRetrieve(index); 143 else return Column();
144 } 144 }
145 145
146 float 146 float
147 EditableDenseThreeDimensionalModel::getValueAt(int index, int n) const 147 EditableDenseThreeDimensionalModel::getValueAt(int index, int n) const
148 { 148 {
149 Column c = getColumn(index); 149 Column c = getColumn(index);
150 if (int(n) < c.size()) return c.at(n); 150 if (in_range_for(c, n)) return c.at(n);
151 return m_minimum; 151 return m_minimum;
152 } 152 }
153 153
154 //static int given = 0, stored = 0; 154 //static int given = 0, stored = 0;
155 155
156 void 156 void
157 EditableDenseThreeDimensionalModel::truncateAndStore(int index, 157 EditableDenseThreeDimensionalModel::truncateAndStore(int index,
158 const Column &values) 158 const Column &values)
159 { 159 {
160 assert(int(index) < m_data.size()); 160 assert(in_range_for(m_data, index));
161 161
162 //cout << "truncateAndStore(" << index << ", " << values.size() << ")" << endl; 162 //cout << "truncateAndStore(" << index << ", " << values.size() << ")" << endl;
163 163
164 // The default case is to store the entire column at m_data[index] 164 // The default case is to store the entire column at m_data[index]
165 // and place 0 at m_trunc[index] to indicate that it has not been 165 // and place 0 at m_trunc[index] to indicate that it has not been
167 // tests works out. 167 // tests works out.
168 168
169 m_trunc[index] = 0; 169 m_trunc[index] = 0;
170 if (index == 0 || 170 if (index == 0 ||
171 m_compression == NoCompression || 171 m_compression == NoCompression ||
172 values.size() != int(m_yBinCount)) { 172 int(values.size()) != m_yBinCount) {
173 // given += values.size(); 173 // given += values.size();
174 // stored += values.size(); 174 // stored += values.size();
175 m_data[index] = values; 175 m_data[index] = values;
176 return; 176 return;
177 } 177 }
204 } 204 }
205 205
206 Column p = expandAndRetrieve(index - tdist); 206 Column p = expandAndRetrieve(index - tdist);
207 int h = m_yBinCount; 207 int h = m_yBinCount;
208 208
209 if (p.size() == h && tdist <= maxdist) { 209 if (int(p.size()) == h && tdist <= maxdist) {
210 210
211 int bcount = 0, tcount = 0; 211 int bcount = 0, tcount = 0;
212 if (!known || !top) { 212 if (!known || !top) {
213 // count how many identical values there are at the bottom 213 // count how many identical values there are at the bottom
214 for (int i = 0; i < h; ++i) { 214 for (int i = 0; i < h; ++i) {
263 m_data[index] = values; 263 m_data[index] = values;
264 return; 264 return;
265 } 265 }
266 266
267 EditableDenseThreeDimensionalModel::Column 267 EditableDenseThreeDimensionalModel::Column
268 EditableDenseThreeDimensionalModel::rightHeight(const Column &c) const
269 {
270 if (int(c.size()) == m_yBinCount) return c;
271 else {
272 Column cc(c);
273 cc.resize(m_yBinCount, 0.0);
274 return cc;
275 }
276 }
277
278 EditableDenseThreeDimensionalModel::Column
268 EditableDenseThreeDimensionalModel::expandAndRetrieve(int index) const 279 EditableDenseThreeDimensionalModel::expandAndRetrieve(int index) const
269 { 280 {
270 // See comment above m_trunc declaration in header 281 // See comment above m_trunc declaration in header
271 282
272 assert(index >= 0 && index < int(m_data.size())); 283 assert(index >= 0 && index < int(m_data.size()));
273 Column c = m_data.at(index); 284 Column c = m_data.at(index);
274 if (index == 0) { 285 if (index == 0) {
275 return c; 286 return rightHeight(c);
276 } 287 }
277 int trunc = (int)m_trunc[index]; 288 int trunc = (int)m_trunc[index];
278 if (trunc == 0) { 289 if (trunc == 0) {
279 return c; 290 return rightHeight(c);
280 } 291 }
281 bool top = true; 292 bool top = true;
282 int tdist = trunc; 293 int tdist = trunc;
283 if (trunc < 0) { top = false; tdist = -trunc; } 294 if (trunc < 0) { top = false; tdist = -trunc; }
284 Column p = expandAndRetrieve(index - tdist); 295 Column p = expandAndRetrieve(index - tdist);
285 int psize = p.size(), csize = c.size(); 296 int psize = int(p.size()), csize = int(c.size());
286 if (psize != m_yBinCount) { 297 if (psize != m_yBinCount) {
287 cerr << "WARNING: EditableDenseThreeDimensionalModel::expandAndRetrieve: Trying to expand from incorrectly sized column" << endl; 298 cerr << "WARNING: EditableDenseThreeDimensionalModel::expandAndRetrieve: Trying to expand from incorrectly sized column" << endl;
288 } 299 }
289 if (top) { 300 if (top) {
290 for (int i = csize; i < psize; ++i) { 301 for (int i = csize; i < psize; ++i) {
291 c.push_back(p.at(i)); 302 c.push_back(p.at(i));
292 } 303 }
293 } else { 304 } else {
294 // push_front is very slow on QVector -- but not enough to
295 // make it desirable to choose a different container, since
296 // QVector has all the other advantages for us. easier to
297 // write the whole array out to a new vector
298 Column cc(psize); 305 Column cc(psize);
299 for (int i = 0; i < psize - csize; ++i) { 306 for (int i = 0; i < psize - csize; ++i) {
300 cc[i] = p.at(i); 307 cc[i] = p.at(i);
301 } 308 }
302 for (int i = 0; i < csize; ++i) { 309 for (int i = 0; i < csize; ++i) {
311 EditableDenseThreeDimensionalModel::setColumn(int index, 318 EditableDenseThreeDimensionalModel::setColumn(int index,
312 const Column &values) 319 const Column &values)
313 { 320 {
314 QWriteLocker locker(&m_lock); 321 QWriteLocker locker(&m_lock);
315 322
316 while (int(index) >= m_data.size()) { 323 while (index >= int(m_data.size())) {
317 m_data.push_back(Column()); 324 m_data.push_back(Column());
318 m_trunc.push_back(0); 325 m_trunc.push_back(0);
319 } 326 }
320 327
321 bool allChange = false; 328 bool allChange = false;
322 329
323 // if (values.size() > m_yBinCount) m_yBinCount = values.size(); 330 for (int i = 0; in_range_for(values, i); ++i) {
324
325 for (int i = 0; i < values.size(); ++i) {
326 float value = values[i]; 331 float value = values[i];
327 if (ISNAN(value) || ISINF(value)) { 332 if (ISNAN(value) || ISINF(value)) {
328 continue; 333 continue;
329 } 334 }
330 if (!m_haveExtents || value < m_minimum) { 335 if (!m_haveExtents || value < m_minimum) {
430 vector<double> sample; 435 vector<double> sample;
431 vector<int> n; 436 vector<int> n;
432 437
433 for (int i = 0; i < 10; ++i) { 438 for (int i = 0; i < 10; ++i) {
434 int index = i * 10; 439 int index = i * 10;
435 if (index < m_data.size()) { 440 if (in_range_for(m_data, index)) {
436 const Column &c = m_data.at(index); 441 const Column &c = m_data.at(index);
437 while (c.size() > int(sample.size())) { 442 while (c.size() > sample.size()) {
438 sample.push_back(0.0); 443 sample.push_back(0.0);
439 n.push_back(0); 444 n.push_back(0);
440 } 445 }
441 for (int j = 0; j < c.size(); ++j) { 446 for (int j = 0; in_range_for(c, j); ++j) {
442 sample[j] += c.at(j); 447 sample[j] += c.at(j);
443 ++n[j]; 448 ++n[j];
444 } 449 }
445 } 450 }
446 } 451 }
484 QString 489 QString
485 EditableDenseThreeDimensionalModel::toDelimitedDataString(QString delimiter) const 490 EditableDenseThreeDimensionalModel::toDelimitedDataString(QString delimiter) const
486 { 491 {
487 QReadLocker locker(&m_lock); 492 QReadLocker locker(&m_lock);
488 QString s; 493 QString s;
489 for (int i = 0; i < m_data.size(); ++i) { 494 for (int i = 0; in_range_for(m_data, i); ++i) {
490 QStringList list; 495 QStringList list;
491 for (int j = 0; j < m_data.at(i).size(); ++j) { 496 for (int j = 0; in_range_for(m_data.at(i), j); ++j) {
492 list << QString("%1").arg(m_data.at(i).at(j)); 497 list << QString("%1").arg(m_data.at(i).at(j));
493 } 498 }
494 s += list.join(delimiter) + "\n"; 499 s += list.join(delimiter) + "\n";
495 } 500 }
496 return s; 501 return s;
499 QString 504 QString
500 EditableDenseThreeDimensionalModel::toDelimitedDataStringSubset(QString delimiter, sv_frame_t f0, sv_frame_t f1) const 505 EditableDenseThreeDimensionalModel::toDelimitedDataStringSubset(QString delimiter, sv_frame_t f0, sv_frame_t f1) const
501 { 506 {
502 QReadLocker locker(&m_lock); 507 QReadLocker locker(&m_lock);
503 QString s; 508 QString s;
504 for (int i = 0; i < m_data.size(); ++i) { 509 for (int i = 0; in_range_for(m_data, i); ++i) {
505 sv_frame_t fr = m_startFrame + i * m_resolution; 510 sv_frame_t fr = m_startFrame + i * m_resolution;
506 if (fr >= f0 && fr < f1) { 511 if (fr >= f0 && fr < f1) {
507 QStringList list; 512 QStringList list;
508 for (int j = 0; j < m_data.at(i).size(); ++j) { 513 for (int j = 0; in_range_for(m_data.at(i), j); ++j) {
509 list << QString("%1").arg(m_data.at(i).at(j)); 514 list << QString("%1").arg(m_data.at(i).at(j));
510 } 515 }
511 s += list.join(delimiter) + "\n"; 516 s += list.join(delimiter) + "\n";
512 } 517 }
513 } 518 }