aboutsummaryrefslogtreecommitdiffstats
path: root/src/engine
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2017-12-16 12:27:22 +0100
committerDavid Robillard <d@drobilla.net>2017-12-16 13:58:31 +0100
commit19fcbf7b74c68529fe24f40f1c0fa923a3d22bce (patch)
treef3e821517e5822fec536858c6593a4ac8ee480bd /src/engine
parent74da09be5f48e21db158e7969af54f3f440b74f1 (diff)
downloadmachina-19fcbf7b74c68529fe24f40f1c0fa923a3d22bce.tar.gz
machina-19fcbf7b74c68529fe24f40f1c0fa923a3d22bce.tar.bz2
machina-19fcbf7b74c68529fe24f40f1c0fa923a3d22bce.zip
Use std::thread in evolution code
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/Evolver.cpp24
-rw-r--r--src/engine/machina/Evolver.hpp27
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