diff options
-rw-r--r-- | src/powerlist.cc | 55 |
1 files changed, 31 insertions, 24 deletions
diff --git a/src/powerlist.cc b/src/powerlist.cc index a555051..0ffcb14 100644 --- a/src/powerlist.cc +++ b/src/powerlist.cc @@ -215,8 +215,6 @@ Sample* PowerList::get(level_t level) return nullptr; // No samples to choose from. } - int retry = settings.sample_selection_retry_count.load(); - Sample* sample{nullptr}; float power_span = power_max - power_min; @@ -234,40 +232,49 @@ Sample* PowerList::get(level_t level) float mean = level * (power_span - mean_stepwidth) + (mean_stepwidth / 2.0); float stddev = settings.enable_velocity_modifier.load() ? velocity_stddev * mean_stepwidth : 0.; + std::size_t index; float power{0.f}; + float obj_function_value{std::numeric_limits<float>::max()}; - // note: loop is executed once + #retry - do - { - --retry; + // Select normal distributed value between + // (stddev/2) and (power_span-stddev/2) + float lvl = rand.normalDistribution(mean, stddev); + + // Adjust this value to be in range + // (power_min+stddev/2) and (power_max-stddev/2) + lvl += power_min; + + DEBUG(rand, "level: %f, lvl: %f (mean: %.2f, stddev: %.2f, mean_stepwidth: %f, + power_min: %f, power_max: %f)\n", level, lvl, mean, stddev, mean_stepwidth, + power_min, power_max); - // Select normal distributed value between - // (stddev/2) and (power_span-stddev/2) - float lvl = rand.normalDistribution(mean, stddev); + float alpha = 10.0; + float beta = 1000.0; + float gamma = 0.0; - // Adjust this value to be in range - // (power_min+stddev/2) and (power_max-stddev/2) - lvl += power_min; + for (std::size_t i = 0; i < samples.size(); ++i) + { + auto const& item = samples[i]; - DEBUG(rand, - "level: %f, lvl: %f (mean: %.2f, stddev: %.2f, mean_stepwidth: %f, power_min: %f, power_max: %f)\n", - level, lvl, mean, stddev, mean_stepwidth, power_min, power_max); + // compute objective function value + auto r = rand.floatInRange(0.,1.); + auto value = + alpha*pow2(item.power - power) + beta*pow2(1./(current - last[index])) + gamma*r; - for (auto& item: samples) + if (value < obj_function_value) { - if (sample == nullptr || std::fabs(item.power - lvl) < std::fabs(power - lvl)) - { - sample = item.sample; - power = item.power; - } + index = i; + power = item.power; + obj_function_value = value; } - } while (lastsample == sample && retry >= 0); + } DEBUG(rand, "Found sample with power %f\n", power); - lastsample = sample; + // FIXME + lastsample = samples[index].sample; - return sample; + return samples[index].sample; } float PowerList::getMaxPower() const |