From 25e048080555c74d15159b10b8c32662bdb12ce5 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Fri, 15 Jan 2021 22:37:53 +0300 Subject: [PATCH] Remove obsolete 'optimize' mode from neural animation example --- examples/animation_2d.cpp | 78 ++------------------------------------- 1 file changed, 3 insertions(+), 75 deletions(-) diff --git a/examples/animation_2d.cpp b/examples/animation_2d.cpp index f96a5236..811c6dcc 100644 --- a/examples/animation_2d.cpp +++ b/examples/animation_2d.cpp @@ -669,13 +669,12 @@ struct animation_2d_app enum class mode { train, - optimize, test, } mode = mode::train; std::vector population; - std::size_t const population_size = 256; - std::size_t const max_train_frames = 60.f / physics.dt; + std::size_t const population_size = 16; + std::size_t const max_train_frames = 10.f / physics.dt; std::size_t const max_train_variations = 1; float const position_variation_amplitude = 0.f; float const angle_variation_amplitude = 0.f; @@ -686,10 +685,6 @@ struct animation_2d_app static constexpr auto mutation_amplitude = [](float t){ return 10.f * geom::lerp(1.f, 0.01f, t); }; // static constexpr auto mutation_amplitude = [](float){ return 0.00001f; }; - std::size_t optimize_iterations = 0; - std::size_t const max_optimize_iterations = 1; - float const optimize_amplitude = 0.1f; - float best_score = 0.f; bool const warm_start = false; bool const enable_testing = true; @@ -820,18 +815,6 @@ void animation_2d_app::update() { do_train(); if (train_iterations >= max_train_iterations) - { - mode = mode::optimize; - } - else if (train_iterations >= max_train_iterations / 2 && best_score < -1000.f) - { -// train_iterations = 0; - } - } - else if (mode == mode::optimize) - { - do_optimize(); - if (optimize_iterations >= max_optimize_iterations) { mode = mode::test; frame_clock.restart(); @@ -1243,61 +1226,6 @@ void animation_2d_app::do_train() best_score = scores.front().first; } -void animation_2d_app::do_optimize() -{ - auto & c = population[0]; - - auto rng = this->rng; - - float current_score = eval_score(c, rng); - - float eps = 0.1f; - - std::vector scores(c.param_count, 0.f); - std::atomic dispatched{0}; - for (std::size_t i = 0; i < c.param_count; ++i) - { - bg.dispatch([&, i, rng = rng]() mutable { - controller cc = c; - cc.params()[i] += eps; - scores[i] = eval_score(cc, rng); - ++dispatched; - }); - } -// bg.wait(); - while (dispatched.load() < scores.size()); - - for (auto & s : scores) - s = (s - current_score) / eps; - - float m = 0.f; - for (auto s : scores) - m = std::max(m, std::abs(s)); - - log::info() << "Max gradient: " << m; - - for (std::size_t k = 0; k < 30; ++k) - { - auto cc = c; - for (std::size_t i = 0; i < c.param_count; ++i) - cc.params()[i] += optimize_amplitude * scores[i]; - float new_score = eval_score(cc, rng); - - if (new_score > current_score) - { - log::info() << "k = " << k; - log::info() << "Score change: " << current_score << " -> " << new_score; - c = cc; - break; - } - - for (auto & s : scores) - s /= 2.f; - } - - ++optimize_iterations; -} - void animation_2d_app::do_test() { std::optional> m; @@ -1466,7 +1394,7 @@ void animation_2d_app::present() opts.x = gfx::painter::x_align::left; opts.y = gfx::painter::y_align::top; opts.scale = 2.f; - painter.text({40.f, 40.f}, util::to_string(train_iterations, "/", max_train_iterations, " ", optimize_iterations, "/", max_optimize_iterations), opts); + painter.text({40.f, 40.f}, util::to_string(train_iterations, "/", max_train_iterations), opts); painter.text({40.f, 64.f}, util::to_string("Best score: ", std::setprecision(10), best_score), opts); painter.text({40.f, 88.f}, util::to_string("Model: ", test_id, "/", population.size(), ", gen ", population[test_id].generation), opts); painter.text({40.f, 112.f}, util::to_string(util::pretty(test_clock.duration(), std::chrono::milliseconds{1})), opts);