From 19fcbf7b74c68529fe24f40f1c0fa923a3d22bce Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 16 Dec 2017 12:27:22 +0100 Subject: Use std::thread in evolution code --- src/engine/Evolver.cpp | 24 ++++++++++++++++++++++-- src/engine/machina/Evolver.hpp | 27 ++++++++++++++++++--------- 2 files changed, 40 insertions(+), 11 deletions(-) (limited to 'src/engine') 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 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 > m(new HybridMutation()); @@ -74,6 +76,24 @@ Evolver::Evolver(TimeUnit unit, 0.0)); } +void +Evolver::start() +{ + if (!_thread) { + _thread = std::unique_ptr( + new std::thread(&Evolver::run, this)); + } +} + +void +Evolver::join() +{ + if (_thread && _thread->joinable()) { + _exit_flag = true; + _thread->join(); + } +} + void Evolver::seed(SPtr parent) { @@ -84,7 +104,7 @@ Evolver::seed(SPtr 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 + Copyright 2007-2017 David Robillard 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 +#include +#include + #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 parent); bool improvement() { return _improvement; } + void start(); + void join(); + const Machine& best() { return _ga->best(); } typedef eugene::GA MachinaGA; private: - void _run(); + void run(); + + eugene::Random _rng; + SPtr _ga; + SPtr _problem; + float _seed_fitness; + Schrodinbit _improvement; + std::atomic _exit_flag; - eugene::Random _rng; - SPtr _ga; - SPtr _problem; - float _seed_fitness; - Schrodinbit _improvement; + std::unique_ptr _thread; }; } // namespace machina -- cgit v1.2.1