* @brief Writes either the raw samples or a fixed-budget decimated series. */
| 441 | * @brief Writes either the raw samples or a fixed-budget decimated series. |
| 442 | */ |
| 443 | static void writeReportSamples(const DSP::AxisData& x, |
| 444 | const DSP::AxisData& y, |
| 445 | std::size_t count, |
| 446 | int maxSamples, |
| 447 | Sessions::DatasetSeries& series) |
| 448 | { |
| 449 | Q_ASSERT(count > 0); |
| 450 | Q_ASSERT(maxSamples >= 2); |
| 451 | Q_ASSERT(count <= x.size() && count <= y.size()); |
| 452 | |
| 453 | const std::size_t budget = static_cast<std::size_t>(maxSamples); |
| 454 | if (count <= budget) { |
| 455 | std::vector<std::size_t> indices; |
| 456 | indices.reserve(count); |
| 457 | for (std::size_t i = 0; i < count; ++i) |
| 458 | indices.push_back(i); |
| 459 | |
| 460 | writeSelectedSamples(x, y, indices, series); |
| 461 | return; |
| 462 | } |
| 463 | |
| 464 | const std::size_t bucketCount = std::max<std::size_t>(1, budget / 4); |
| 465 | const std::size_t baseTarget = budget / bucketCount; |
| 466 | const std::size_t remainder = budget % bucketCount; |
| 467 | Q_ASSERT(bucketCount > 0); |
| 468 | Q_ASSERT(baseTarget > 0); |
| 469 | |
| 470 | std::vector<std::size_t> indices; |
| 471 | indices.reserve(budget); |
| 472 | |
| 473 | for (std::size_t bucket = 0; bucket < bucketCount; ++bucket) { |
| 474 | const std::size_t begin = (bucket * count) / bucketCount; |
| 475 | const std::size_t end = ((bucket + 1) * count) / bucketCount; |
| 476 | if (begin >= end) |
| 477 | continue; |
| 478 | |
| 479 | const int target = static_cast<int>(baseTarget + (bucket < remainder ? 1 : 0)); |
| 480 | appendBucketSamples(y, begin, end, target, indices); |
| 481 | } |
| 482 | |
| 483 | if (indices.size() < budget) |
| 484 | appendBudgetFillSamples(count, budget, indices); |
| 485 | |
| 486 | std::sort(indices.begin(), indices.end()); |
| 487 | writeSelectedSamples(x, y, indices, series); |
| 488 | } |
| 489 | |
| 490 | /** |
| 491 | * @brief Enumerates numeric parameters for @p sessionId in column order. |
no test coverage detected