aboutsummaryrefslogtreecommitdiffstats
path: root/src/gui/MachinaGUI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/MachinaGUI.cpp')
-rw-r--r--src/gui/MachinaGUI.cpp156
1 files changed, 84 insertions, 72 deletions
diff --git a/src/gui/MachinaGUI.cpp b/src/gui/MachinaGUI.cpp
index 8e0b68a..42cb4ce 100644
--- a/src/gui/MachinaGUI.cpp
+++ b/src/gui/MachinaGUI.cpp
@@ -36,9 +36,10 @@ using namespace Machina;
MachinaGUI::MachinaGUI(SharedPtr<Machina::Engine> engine)
-: _refresh(false),
- _engine(engine),
- _maid(new Raul::Maid(32))
+ : _refresh(false)
+ , _evolve(false)
+ , _engine(engine)
+ , _maid(new Raul::Maid(32))
{
_canvas = boost::shared_ptr<MachinaCanvas>(new MachinaCanvas(this, 1600*2, 1200*2));
@@ -71,6 +72,7 @@ MachinaGUI::MachinaGUI(SharedPtr<Machina::Engine> engine)
xml->get_widget("zoom_normal_but", _zoom_normal_button);
xml->get_widget("zoom_full_but", _zoom_full_button);
xml->get_widget("arrange_but", _arrange_button);
+ xml->get_widget("evolve_but", _evolve_button);
xml->get_widget("mutate_but", _mutate_button);
xml->get_widget("compress_but", _compress_button);
xml->get_widget("add_node_but", _add_node_button);
@@ -128,22 +130,24 @@ MachinaGUI::MachinaGUI(SharedPtr<Machina::Engine> engine)
_quantize_spinbutton->signal_changed().connect(
sigc::mem_fun(this, &MachinaGUI::quantize_changed));
- _mutate_button->signal_clicked().connect(
- sigc::mem_fun(this, &MachinaGUI::mutate));
- _compress_button->signal_clicked().connect(
- sigc::mem_fun(this, &MachinaGUI::compress));
- _add_node_button->signal_clicked().connect(
- sigc::mem_fun(this, &MachinaGUI::add_node));
- _remove_node_button->signal_clicked().connect(
- sigc::mem_fun(this, &MachinaGUI::remove_node));
- _adjust_node_button->signal_clicked().connect(
- sigc::mem_fun(this, &MachinaGUI::adjust_node));
- _add_edge_button->signal_clicked().connect(
- sigc::mem_fun(this, &MachinaGUI::add_edge));
- _remove_edge_button->signal_clicked().connect(
- sigc::mem_fun(this, &MachinaGUI::remove_edge));
- _adjust_edge_button->signal_clicked().connect(
- sigc::mem_fun(this, &MachinaGUI::adjust_edge));
+ _evolve_button->signal_clicked().connect(
+ sigc::mem_fun(this, &MachinaGUI::evolve));
+ _mutate_button->signal_clicked().connect(sigc::bind(
+ sigc::mem_fun(this, &MachinaGUI::random_mutation), SharedPtr<Machine>()));
+ _compress_button->signal_clicked().connect(sigc::hide_return(sigc::bind(
+ sigc::mem_fun(this, &MachinaGUI::mutate), SharedPtr<Machine>(), 0)));
+ _add_node_button->signal_clicked().connect(sigc::bind(
+ sigc::mem_fun(this, &MachinaGUI::mutate), SharedPtr<Machine>(), 1));
+ _remove_node_button->signal_clicked().connect(sigc::bind(
+ sigc::mem_fun(this, &MachinaGUI::mutate), SharedPtr<Machine>(), 2));
+ _adjust_node_button->signal_clicked().connect(sigc::bind(
+ sigc::mem_fun(this, &MachinaGUI::mutate), SharedPtr<Machine>(), 3));
+ _add_edge_button->signal_clicked().connect(sigc::bind(
+ sigc::mem_fun(this, &MachinaGUI::mutate), SharedPtr<Machine>(), 4));
+ _remove_edge_button->signal_clicked().connect(sigc::bind(
+ sigc::mem_fun(this, &MachinaGUI::mutate), SharedPtr<Machine>(), 5));
+ _adjust_edge_button->signal_clicked().connect(sigc::bind(
+ sigc::mem_fun(this, &MachinaGUI::mutate), SharedPtr<Machine>(), 6));
connect_widgets();
@@ -165,6 +169,9 @@ MachinaGUI::MachinaGUI(SharedPtr<Machina::Engine> engine)
// Idle callback to update node states
Glib::signal_timeout().connect(sigc::mem_fun(this, &MachinaGUI::idle_callback), 100);
+ // Periodic mutation callback (FIXME: temporary kludge, thread this)
+ Glib::signal_timeout().connect(sigc::mem_fun(this, &MachinaGUI::evolve_callback), 1000);
+
_canvas->build(engine->machine());
}
@@ -175,6 +182,20 @@ MachinaGUI::~MachinaGUI()
bool
+MachinaGUI::evolve_callback()
+{
+ if (_evolve) {
+ // Single greedy mutation
+ SharedPtr<Machine> copy(new Machine(*_engine->machine().get()));
+ random_mutation(copy);
+ _canvas->build(copy);
+ }
+
+ return true;
+}
+
+
+bool
MachinaGUI::idle_callback()
{
const bool show_labels = _menu_view_labels->get_active();
@@ -223,73 +244,64 @@ MachinaGUI::arrange()
void
-MachinaGUI::mutate()
+MachinaGUI::evolve()
{
- switch (rand() % 7) {
- case 0: compress(); break;
- case 1: add_node(); break;
- case 2: remove_node(); break;
- case 3: adjust_node(); break;
- case 4: add_edge(); break;
- case 5: remove_edge(); break;
- case 6: adjust_edge(); default: break;
- }
+ if (_evolve_button->get_active())
+ _evolve = true;
+ else
+ _evolve = false;
}
void
-MachinaGUI::compress()
+MachinaGUI::random_mutation(SharedPtr<Machine> machine)
{
- Mutation::Compress::mutate(*_engine->machine().get());
- _canvas->build(_engine->machine());
-}
-
+ if (!machine)
+ machine = _engine->machine();
-void
-MachinaGUI::add_node()
-{
- Mutation::AddNode::mutate(*_engine->machine().get());
- _canvas->build(_engine->machine());
+ mutate(machine, rand() % 7);
}
void
-MachinaGUI::remove_node()
+MachinaGUI::mutate(SharedPtr<Machine> machine, unsigned mutation)
{
- Mutation::RemoveNode::mutate(*_engine->machine().get());
- _canvas->build(_engine->machine());
-}
+ if (!machine)
+ machine = _engine->machine();
-
-void
-MachinaGUI::adjust_node()
-{
- Mutation::AdjustNode::mutate(*_engine->machine().get());
- idle_callback(); // update nodes
-}
+ using namespace Mutation;
-
-void
-MachinaGUI::add_edge()
-{
- Mutation::AddEdge::mutate(*_engine->machine().get());
- _canvas->build(_engine->machine());
-}
-
-
-void
-MachinaGUI::remove_edge()
-{
- Mutation::RemoveEdge::mutate(*_engine->machine().get());
- _canvas->build(_engine->machine());
-}
-
-
-void
-MachinaGUI::adjust_edge()
-{
- Mutation::AdjustEdge::mutate(*_engine->machine().get());
- _canvas->update_edges();
+ switch (mutation) {
+ case 0:
+ Compress::mutate(*machine.get());
+ _canvas->build(machine);
+ break;
+ case 1:
+ AddNode::mutate(*machine.get());
+ _canvas->build(machine);
+ break;
+ case 2:
+ RemoveNode::mutate(*machine.get());
+ _canvas->build(machine);
+ break;
+ case 3:
+ AdjustNode::mutate(*machine.get());
+ idle_callback(); // update nodes
+ break;
+ case 4:
+ AddEdge::mutate(*machine.get());
+ _canvas->build(machine);
+ break;
+ case 5:
+ RemoveEdge::mutate(*machine.get());
+ _canvas->build(machine);
+ break;
+ case 6:
+ AdjustEdge::mutate(*machine.get());
+ _canvas->update_edges();
+ break;
+ default: throw;
+ }
}