Mercurial > hg > gpsynth
diff src/synth_graph.hpp @ 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/synth_graph.hpp Thu Aug 25 11:05:55 2011 +0100 @@ -0,0 +1,139 @@ +// 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/. + +// The main synth graph classes + +#pragma once + +#include "boost/graph/adjacency_list.hpp" + +#include <string> +#include <vector> + +namespace synth_graph { + +enum NodeType { + kUnknown = -1, + kCommand, + kSpecial, + kConstant, + kParameter +}; + +enum CommandRate { + kAudioRate, + kControlRate +}; + +// Node, attached to each vertex +struct Node { + int id_; + NodeType type_; + CommandRate rate_; + double constant_value_; + + Node() + : id_(-1), + type_(kUnknown), + rate_(kAudioRate), + constant_value_(0) + {} + + Node(int id, + NodeType type, + CommandRate rate = kControlRate) + : id_(id), + type_(type), + rate_(rate), + constant_value_(0) + {} + + Node(double constant_value) + : id_(-1), + type_(kConstant), + rate_(kControlRate), + constant_value_(constant_value) + {} +}; + +// Connection, attached to each edge +struct Connection { + // input that the edge is connected to + int input_; + double weight_; + double offset_; + + Connection(int input = -1, double weight = 1, double offset = 0) + : input_(input), + weight_(weight), + offset_(offset) + {} + + // constructor for connection input is irrelevant + Connection(double weight, double offset = 0) + : input_(0), + weight_(weight), + offset_(offset) + {} + + bool IsActive() const { + return (weight_ != 1) || (offset_ != 0); + } +}; + +enum { + kFitnessUnrated = -1 +}; + +// Properties stored with the graph +struct GraphProperties { + // parameter values + std::vector<double> parameters_; + // graph id + int id_; + // measured fitness + double fitness_; + // rendered output path + std::string render_path_; + // converted graphviz path + std::string dot_path_; + + GraphProperties() + : parameters_(0), + fitness_(kFitnessUnrated), + id_(0) + {} +}; + +// defined as bidirectional to allow access to in_edges of a vertex +// we need to use vecS for storage for to_graphviz +typedef boost::adjacency_list<boost::vecS, + boost::vecS, + boost::bidirectionalS, + Node, + Connection, + GraphProperties> Graph; + +typedef boost::graph_traits<Graph>::vertex_descriptor Vertex; +typedef boost::graph_traits<Graph>::vertex_iterator VertexIterator; +typedef boost::graph_traits<Graph>::edge_descriptor Edge; +typedef boost::graph_traits<Graph>::edge_iterator EdgeIterator; +typedef boost::graph_traits<Graph>::in_edge_iterator InEdgeIterator; + +} // synth_graph namespace +namespace sg = synth_graph;