diff src/main.cpp @ 0:add35537fdbb tip

Initial import
author irh <ian.r.hobson@gmail.com>
date Thu, 25 Aug 2011 11:05:55 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main.cpp	Thu Aug 25 11:05:55 2011 +0100
@@ -0,0 +1,162 @@
+//  Copyright 2011, Ian Hobson.
+//
+//  This file is part of gpsynth.
+//
+//  gpsynth 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 Foundation, either version 3 of the License, or
+//  (at your option) any later version.
+//
+//  gpsynth is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with gpsynth in the file COPYING. 
+//  If not, see http://www.gnu.org/licenses/.
+
+#include "file_comparer.hpp"
+#include "graph_helpers.hpp"
+#include "logger.hpp"
+#include "population.hpp"
+#include "program_options.hpp"
+#include "sc_converter.hpp"
+#include "sc_default_grammar.hpp"
+#include "sc_evaluator.hpp"
+#include "sc_grammar.hpp"
+
+#include "boost/filesystem.hpp"
+#include "boost/shared_array.hpp"
+
+#include <algorithm>
+#include <ctime>
+#include <fstream>
+#include <iostream>
+#include <sstream>
+
+const std::string g_test_grammar_path = "/tmp/sc.json";
+
+template<typename T>
+void SaveToFile(const T& value, const std::string& file_path) {
+  std::ofstream file(file_path.c_str());
+  file << value;
+}
+
+void TestCrossover() {
+  sc::Grammar grammar(g_test_grammar_path);
+  sc::Converter converter(grammar);
+  sg::Graph parent_1;
+  sg::Graph parent_2;
+  grammar.SetMaximumDepth(2);
+  grammar.RandomGraph(parent_1);
+  grammar.RandomGraph(parent_2);
+  sg::Vertex crossover_1;
+  sg::Vertex crossover_2;
+  grammar.PickCrossoverNodes(parent_1, parent_2, &crossover_1, &crossover_2);
+  // swap the subtrees
+  sg::Graph child_1;
+  sg::Graph child_2;
+  SwapSubTrees(crossover_1, crossover_2, parent_1, parent_2, child_1, child_2);
+  SaveToFile(converter.ToDOT(parent_1), "/tmp/parent1.dot");
+  SaveToFile(converter.ToDOT(parent_2), "/tmp/parent2.dot");
+  SaveToFile(converter.ToDOT(child_1), "/tmp/child1.dot");
+  SaveToFile(converter.ToDOT(child_2), "/tmp/child2.dot");
+}
+
+void TestMutationReplaceSubtree() {
+  sc::Grammar grammar(g_test_grammar_path);
+  sc::Converter converter(grammar);
+  sg::Graph graph;
+  grammar.RandomGraph(graph);
+  SaveToFile(converter.ToDOT(graph), "/tmp/mutation_str_before.dot");
+  grammar.MutationReplaceSubTree(graph);
+  SaveToFile(converter.ToDOT(graph), "/tmp/mutation_str_after.dot");
+}
+
+void TestMutationReplaceCommand() {
+  sc::Grammar grammar(g_test_grammar_path);
+  sc::Converter converter(grammar);
+  sg::Graph graph;
+  grammar.SetMaximumDepth(3);
+  grammar.RandomGraph(graph);
+  SaveToFile(converter.ToDOT(graph), "/tmp/mutation_str_before.dot");
+  SaveToFile(converter.ToSynthDef(graph, "before"),
+             "/tmp/mutation_str_before.sc");
+  grammar.MutationReplaceCommand(graph);
+  SaveToFile(converter.ToDOT(graph), "/tmp/mutation_str_after.dot");
+  SaveToFile(converter.ToSynthDef(graph, "after"),
+             "/tmp/mutation_str_after.sc");
+}
+
+void TestMutationInsertCommand() {
+  sc::Grammar grammar(g_test_grammar_path);
+  sc::Converter converter(grammar);
+  sg::Graph graph;
+  grammar.SetMaximumDepth(4);
+  grammar.RandomGraph(graph);
+  SaveToFile(converter.ToDOT(graph), "/tmp/mutation_str_before.dot");
+  SaveToFile(converter.ToSynthDef(graph, "before"),
+             "/tmp/mutation_str_before.sc");
+  grammar.MutationInsertCommand(graph);
+  SaveToFile(converter.ToDOT(graph), "/tmp/mutation_str_after.dot");
+  SaveToFile(converter.ToSynthDef(graph, "after"),
+             "/tmp/mutation_str_after.sc");
+}
+
+void DoEvolution(const ProgramOptions& settings) {
+  // prepare the file comparer
+  dsp::FileComparer target(settings.fitness_features_,
+                           static_cast<int>(settings.analysis_window_size_),
+                           static_cast<int>(settings.analysis_hop_size_));
+  target.SetTargetFile(settings.target_path_);
+  // prepare the supercollider objects
+  std::string grammar_json;
+  if (settings.grammar_path_.empty()) {
+    grammar_json.assign(sc::g_default_grammar);
+  } else {
+    grammar_json = stdx::LoadFile(settings.grammar_path_);
+  }
+  sc::Grammar grammar(grammar_json);
+  grammar.SetMaximumDepth(static_cast<int>(settings.maximum_tree_depth_));
+  sc::Evaluator evaluator(grammar,
+                          settings.sc_app_path_,
+                          target,
+                          static_cast<int>(settings.core_limit_));
+  sc::Converter converter(grammar);
+  // set up the population
+  Population population(&grammar, &converter, &evaluator);
+  population.SetWorkFolder(settings.work_folder_);
+  population.SetFitnessThreshold(settings.fitness_threshold_);
+  population.SetCrossoverRate(settings.crossover_rate_);
+  population.SetMutationRate(settings.mutation_rate_);
+  population.SetTournamentSize(static_cast<int>(settings.tournament_size_));
+  population.SetReproduceBest(settings.reproduce_best_individual_);
+  population.InitializePopulation(settings.population_size_);
+  population.SetKeepTempFolders(settings.keep_temp_folders_);
+  // run the evolution loop
+  population.Evolve(static_cast<int>(settings.generations_));
+}
+
+int main(int argument_count, const char* arguments[])
+{
+  srand(static_cast<unsigned int>(time(NULL)));
+  try {
+    // parse the command line options
+    ProgramOptions settings;
+    ParseCommandLine(argument_count, arguments, &settings);
+    DoEvolution(settings);
+    
+    //TestCrossover();
+    //TestMutationReplaceSubtree();
+    //TestMutationInsertCommand();
+    //TestMutationReplaceCommand();
+  } catch (const std::exception& e) {
+    std::stringstream message;
+    message << "Exception: " << e.what() << '\n';
+    logger::Log(message.str());
+    logger::Flush();
+    return -1;
+  }
+  logger::Flush();
+}