aboutsummaryrefslogtreecommitdiffstats
path: root/src/engine/Problem.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-12-07 03:05:20 +0000
committerDavid Robillard <d@drobilla.net>2007-12-07 03:05:20 +0000
commitffb37e6de2934aa227c3483f8a00118e3604b5e5 (patch)
tree8c40493f8de562677e1e54cc4b26a1fbbb493d26 /src/engine/Problem.cpp
parent33e9991326a1cd90a4956f3221f5a48d03d5af89 (diff)
downloadmachina-ffb37e6de2934aa227c3483f8a00118e3604b5e5.tar.gz
machina-ffb37e6de2934aa227c3483f8a00118e3604b5e5.tar.bz2
machina-ffb37e6de2934aa227c3483f8a00118e3604b5e5.zip
It's evolution, baby.
git-svn-id: http://svn.drobilla.net/lad/machina@958 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/engine/Problem.cpp')
-rw-r--r--src/engine/Problem.cpp45
1 files changed, 33 insertions, 12 deletions
diff --git a/src/engine/Problem.cpp b/src/engine/Problem.cpp
index f57aa15..654d0a3 100644
--- a/src/engine/Problem.cpp
+++ b/src/engine/Problem.cpp
@@ -20,14 +20,16 @@
#include <machina/Machine.hpp>
#include <raul/SMFReader.hpp>
#include <raul/midi_events.h>
+#include <eugene/core/Problem.hpp>
using namespace std;
namespace Machina {
-Problem::Problem(const std::string& target_midi)
+Problem::Problem(const std::string& target_midi, SharedPtr<Machine> seed)
: _target(*this)
+ , _seed(new Machine(*seed.get()))
{
Raul::SMFReader smf;
const bool opened = smf.open(target_midi);
@@ -51,33 +53,40 @@ Problem::Problem(const std::string& target_midi)
float
-Problem::fitness(Machine& machine)
+Problem::fitness(const Machine& const_machine) const
{
+ // kluuudge
+ Machine& machine = const_cast<Machine&>(const_machine);
+
SharedPtr<Evaluator> eval(new Evaluator(*this));
machine.reset(0.0f);
+ machine.deactivate();
+ machine.activate();
machine.set_sink(eval);
// FIXME: timing stuff here isn't right at all...
- unsigned ppqn = 19200;
- Raul::TimeSlice time(ppqn, 120);
+ static const unsigned ppqn = 19200;
+ Raul::TimeSlice time(1.0/(double)ppqn, 120);
time.set_start(0);
- time.set_length(ppqn);
+ time.set_length(2*ppqn);
while (time.start_ticks() < _target._n_notes * ppqn) {
machine.run(time);
- time.set_start(time.start_ticks() + ppqn);
+ time.set_start(time.start_ticks() + 2*ppqn);
}
eval->compute();
float f = 0;
- // Punish for frequency differences.
- // Optimal fitness = 0 (max)
- for (uint8_t i=0; i < 128; ++i)
- f -= fabs(_target._note_frequency[i] - eval->_note_frequency[i]);
+ for (uint8_t i=0; i < 128; ++i) {
+ if (eval->_note_frequency[i] <= _target._note_frequency[i])
+ f += eval->_note_frequency[i];
+ else
+ f -= _target._note_frequency[i] - eval->_note_frequency[i];
+ }
return f;
}
@@ -99,12 +108,24 @@ Problem::Evaluator::write_event(Raul::BeatTime time,
void
Problem::Evaluator::compute()
{
- for (uint8_t i=0; i < 128; ++i) {
+ /*for (uint8_t i=0; i < 128; ++i) {
if (_note_frequency[i] > 0) {
_note_frequency[i] /= (float)_n_notes;
//cout << (int)i << ":\t" << _note_frequency[i] << endl;
}
- }
+ }*/
+}
+
+
+boost::shared_ptr<Problem::Population>
+Problem::initial_population(size_t gene_size, size_t pop_size) const
+{
+ boost::shared_ptr<Population> ret(new std::vector<Machine>());
+
+ for (size_t i = 0; i < pop_size; ++i)
+ ret->push_back(Machine(*_seed.get()));
+
+ return ret;
}