diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/engine/Evolver.cpp | 24 | ||||
-rw-r--r-- | src/engine/machina/Evolver.hpp | 27 |
2 files changed, 40 insertions, 11 deletions
diff --git a/src/engine/Evolver.cpp b/src/engine/Evolver.cpp index 906e888..973c9c8 100644 --- a/src/engine/Evolver.cpp +++ b/src/engine/Evolver.cpp @@ -33,8 +33,10 @@ namespace machina { Evolver::Evolver(TimeUnit unit, const string& target_midi, SPtr<Machine> seed) - : _problem(new Problem(unit, target_midi, seed)) + : _rng(0) + , _problem(new Problem(unit, target_midi, seed)) , _seed_fitness(-FLT_MAX) + , _exit_flag(false) { SPtr<eugene::HybridMutation<Machine> > m(new HybridMutation<Machine>()); @@ -75,6 +77,24 @@ Evolver::Evolver(TimeUnit unit, } void +Evolver::start() +{ + if (!_thread) { + _thread = std::unique_ptr<std::thread>( + new std::thread(&Evolver::run, this)); + } +} + +void +Evolver::join() +{ + if (_thread && _thread->joinable()) { + _exit_flag = true; + _thread->join(); + } +} + +void Evolver::seed(SPtr<Machine> parent) { /*_best = SPtr<Machine>(new Machine(*parent.get())); @@ -84,7 +104,7 @@ Evolver::seed(SPtr<Machine> parent) } void -Evolver::_run() +Evolver::run() { float old_best = _ga->best_fitness(); diff --git a/src/engine/machina/Evolver.hpp b/src/engine/machina/Evolver.hpp index e14fc4a..400c177 100644 --- a/src/engine/machina/Evolver.hpp +++ b/src/engine/machina/Evolver.hpp @@ -1,6 +1,6 @@ /* This file is part of Machina. - Copyright 2007-2013 David Robillard <http://drobilla.net> + Copyright 2007-2017 David Robillard <http://drobilla.net> Machina is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -17,10 +17,13 @@ #ifndef MACHINA_EVOLVER_HPP #define MACHINA_EVOLVER_HPP +#include <atomic> +#include <memory> +#include <thread> + #include "eugene/GA.hpp" #include "eugene/Random.hpp" #include "machina/types.hpp" -#include "raul/Thread.hpp" #include "raul/TimeStamp.hpp" #include "Machine.hpp" @@ -34,7 +37,7 @@ namespace machina { class Problem; -class Evolver : public Raul::Thread +class Evolver { public: Evolver(Raul::TimeUnit unit, @@ -44,18 +47,24 @@ public: void seed(SPtr<Machine> parent); bool improvement() { return _improvement; } + void start(); + void join(); + const Machine& best() { return _ga->best(); } typedef eugene::GA<Machine> MachinaGA; private: - void _run(); + void run(); + + eugene::Random _rng; + SPtr<MachinaGA> _ga; + SPtr<Problem> _problem; + float _seed_fitness; + Schrodinbit _improvement; + std::atomic<bool> _exit_flag; - eugene::Random _rng; - SPtr<MachinaGA> _ga; - SPtr<Problem> _problem; - float _seed_fitness; - Schrodinbit _improvement; + std::unique_ptr<std::thread> _thread; }; } // namespace machina |