From 098ee72f0c0092cfed11c0e7e1ac82849b4915de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Nusser?= Date: Sat, 16 Mar 2019 14:03:41 +0100 Subject: Some fixes for the new sample algorithm. --- src/powerlist.cc | 3 +++ src/sample_selection.cc | 19 +++++++++---------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/powerlist.cc b/src/powerlist.cc index 87d6e9f..a0510ad 100644 --- a/src/powerlist.cc +++ b/src/powerlist.cc @@ -26,6 +26,7 @@ */ #include "powerlist.h" +#include #include #include @@ -197,6 +198,8 @@ void PowerList::finalise() DEBUG(rand, " - power: %f\n", item.power); } + + std::sort(samples.begin(), samples.end()); } const PowerListItems& PowerList::getPowerListItems() const diff --git a/src/sample_selection.cc b/src/sample_selection.cc index 8319017..8f751b3 100644 --- a/src/sample_selection.cc +++ b/src/sample_selection.cc @@ -51,7 +51,7 @@ float pow2(float f) } // end anonymous namespace SampleSelection::SampleSelection(Settings& settings, Random& rand, const PowerList& powerlist) - : settings(settings), rand(rand), powerlist(powerlist), alg(SelectionAlg::Old) + : settings(settings), rand(rand), powerlist(powerlist), alg(SelectionAlg::Objective) { } @@ -178,7 +178,7 @@ const Sample* SampleSelection::getObjective(level_t level, std::size_t pos) std::size_t index_opt = 0; float power_opt{0.f}; float value_opt{std::numeric_limits::max()}; - // TODO: those are mostly for debugging at the moment + // the following three values are mostly for debugging float random_opt = 0.; float distance_opt = 0.; float recent_opt = 0.; @@ -196,20 +196,19 @@ const Sample* SampleSelection::getObjective(level_t level, std::size_t pos) "power_min: %f, power_max: %f)\n", level, lvl, mean, stddev, mean_stepwidth, power_min, power_max); - // TODO: expose parameters to GUI float alpha = 2.0; float beta = 1.0; - float gamma = .5; + float gamma = .05; - // TODO: start with most promising power value and then stop when reaching far values + // start with most promising power value and then stop when reaching far values // which cannot become opt anymore - // TODO: can we expect the powerlist to be sorted? If not, add to finalise of powerlist. - // TODO: clean up this mess - auto closest_it = std::lower_bound(samples.begin(), samples.end(), level); + auto closest_it = std::lower_bound(samples.begin(), samples.end(), lvl); std::size_t up_index = std::distance(samples.begin(), closest_it); std::size_t down_index = (up_index == 0 ? 0 : up_index - 1); float up_value_lb = (up_index < samples.size() ? alpha*pow2(samples[up_index].power-lvl) : std::numeric_limits::max()); float down_value_lb = (up_index != 0 ? alpha*pow2(samples[down_index].power-lvl) : std::numeric_limits::max()); + + std::size_t count = 0; do { std::size_t current_index; @@ -254,11 +253,11 @@ const Sample* SampleSelection::getObjective(level_t level, std::size_t pos) distance_opt = distance; recent_opt = recent; } - --current_index; + ++count; } while (up_value_lb <= value_opt || down_value_lb <= value_opt); - DEBUG(rand, "Chose sample with index: %d, value: %f, power %f, random: %f, distance: %f, recent: %f", (int)index_opt, value_opt, power_opt, random_opt, distance_opt, recent_opt); + DEBUG(rand, "Chose sample with index: %d, value: %f, power %f, random: %f, distance: %f, recent: %f, count: %d", (int)index_opt, value_opt, power_opt, random_opt, distance_opt, recent_opt, (int)count); last[index_opt] = pos; return samples[index_opt].sample; -- cgit v1.2.3