Mercurial > hg > svcore
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 } |