source: cpp/f8-to-f1/conv_f8tof1.h @ 26

Last change on this file since 26 was 26, checked in by mwajcht, 15 years ago

Added some comments to converter classes

File size: 8.1 KB
RevLine 
[1]1/*
2 *  conv_f8tof1.h
3 *  L-systemToF1
4 *
5 *  Created by Maciej Wajcht on 08-03-21.
6 *  Copyright 2008 __MyCompanyName__. All rights reserved.
7 *
8 */
9
10#ifndef _CONV_F8_TO_F1_H
11#define _CONV_F8_TO_F1_H
12
13#include <map>
14#include <vector>
15#include <string>
16#include <list>
17#include <iostream>
18#include "genoconv.h"
19#include "model.h"
20
21using std::ostream;
22using std::vector;
23using std::list;
24using std::string;
25using std::map;
26
27enum RelationType {
28        r_greater,
29        r_greaterEqual,
30        r_less,
31        r_lessEqual,
32        r_equal,
33        r_different
34};
35
36class Condition {
37public:
38        RelationType relation;
39        SString parameter;
40        double value;
41       
42        friend ostream& operator<<(ostream& os, const Condition& c);
43};
44
[26]45class ActionP; //only declaration
[1]46
[26]47/// superclass of all actions, e.g. Production, PrimitiveProduction etc.
[1]48class Action {
49public:
[26]50        /// action's name
[1]51        SString name;
[26]52        /// if true action should ignore params passed to it
[1]53        bool ignoreParams;
[26]54        /// gets string representaion of this action in f1 format
[1]55        virtual const SString getF1Genotype(vector<double> params) = 0;
[26]56        /// gets list of actions with double parameters to each of them
57        /// @param params parameters passed to this action
[1]58        virtual const list<ActionP> getActionList(const vector<double> params) = 0;
[26]59        /// gets string representaion of this action in f8 format
[1]60        virtual const SString getF8Representation() = 0;
61        virtual ~Action() {}
62};
63
[26]64/// this class consists of pointer to some action and a list of parameters to that action;
65/// parameters are kept as strings
[1]66class ActionStrP {
67public:
68        Action *action;
69        vector<SString> params;
70};
71
[26]72/// this class consists of pointer to some action and a list of parameters to that action;
73/// parameters are kept as doubles
[1]74class ActionP {
75public:
76        Action *action;
77        vector<double> params;
78};
79
[26]80/// part of production which is used in translation only if all the conditions are met
[1]81class SubProduction {
82public:
[26]83        /// list of conditions necessary to be met
[1]84        vector<Condition> conditions;
[26]85        /// actions with params (as strings)
[1]86        vector<ActionStrP> actions;
87};
88
[26]89/// primitive production; it's directly translated to its f1 equivalent
90/// e.g. X, r, R etc.
[1]91class PrimitiveProduction : public Action {
92public:
93        PrimitiveProduction(const SString command);
94        const SString getF1Genotype(const vector<double> params);
95        const list<ActionP> getActionList(const vector<double> params);
96        const SString getF8Representation();
97protected:
98        SString f1command;
99        SString f8command;
100};
101
[26]102/// param production; all param productions during translation are replaced with the current value of parameter
103/// pointed by this production
[1]104class ParamProduction : public Action {
105public:
106        ParamProduction(const SString paramName);
107        const SString getF1Genotype(const vector<double> params);
108        const list<ActionP> getActionList(const vector<double> params);
109        const SString getF8Representation();
110protected:
111        SString paramName;
112};
113
[26]114/// neuron production; it is directly translated to f1 without any change
[1]115class NeuronProduction : public Action {
116public:
117        NeuronProduction(SString body);
118        const SString getF1Genotype(const vector<double> params);
119        const list<ActionP> getActionList(const vector<double> params);
120        const SString getF8Representation();
121protected:
122        SString body;
123};
124
[26]125/// class which keeps all parameters of a production and enables to access them in convenient way
126/// IMPORTANT! All indices (positions) begins with 1 (not 0)!
[1]127class ParameterCollection {
128public:
[26]129        /// returns parameter's value
130        /// @param position parameter's position (first parameter has an index 1!)
[1]131        const double getValue(int position);
[26]132        /// returns parameter's value
133        /// @param name parameter's name
[1]134        const double getValue(SString name);
[26]135        /// returns parameter's name
136        /// @param position parameter's position (first parameter has an index 1!)
[1]137        const SString getParameterName(int position);
[26]138        /// returns parameter's position (first parameter has an index 1!)
139        /// @param name parameter's name
140        const int getParameterPosition(SString name);
141        /// sets parameter's value
142        /// @param position parameter's position
143        /// @param value parameter's new value
[1]144        void setValue(int position, double value);
[26]145        /// sets parameter's value
146        /// @param name parameter's name
147        /// @param value parameter's new value
[1]148        void setValue(SString name, double value);
[26]149        /// adds parameter
150        /// @param name parameter's name
151        /// @param position desired parameter's position; defualts to -1 which means it will have first available position
152        /// @param value parameter's value; defaults to 0.0
[1]153        void addParameter(SString name, int position = -1, double value = 0.0);
[26]154        /// returns the number of parameters kept in this class
[1]155        const int size();
[26]156        /// removes a parameter
157        /// @param position position of parameter to be deleted
[1]158        void removeParameter(int position);
[26]159        /// removes a parameter
160        /// @param name name of parameter to be deleted
[1]161        void removeParameter(SString name);
[26]162        /// returns true if parameter with given name exists
163        /// @param name parameter's name
[1]164        bool paramExist(SString name);
165protected:
166        vector<string> parameters;
167        map<string, double> paramValues;
168};
169
[26]170/// represents a general rule in L-systems
171/// only "calls" to Production in genotype are replaced in translation procedure
[1]172class Production : public Action {
173public:
[26]174        /// parameters of this production
[1]175        ParameterCollection parameters;
[26]176        /// list of subproductions
[1]177        vector<SubProduction> subproductions;
178       
179        Production();
180        ~Production() {};
181        const SString getF1Genotype(const vector<double> params);
182        const list<ActionP> getActionList(const vector<double> params);
183        const SString getF8Representation();
184};
185
[26]186/// Main class that represents a genotype in f8 format
[1]187class Lsystem {
188public:
[26]189        /// number of iterations in f8->f1 translation procedure
[1]190        int iterations;
[26]191        /// map of parameters of start production; key - parameter's name, value - parameter's value
[1]192        map<string, double> startParams;
[26]193        /// map of productions of L-system; key - productions's name, value - pointer to production
[1]194        map<string, Production*> productions;
[26]195        /// collection of neuron productions held in L-system
[1]196        vector<NeuronProduction*> neuronProductions;
[26]197        /// first production's name
[1]198        string firstProductionName;
199       
200        Lsystem();
201        ~Lsystem();
[26]202        /// returns a primitive production of a given name
203        /// @param name primitive production's name
[1]204        PrimitiveProduction* getPrimitiveProduction(SString name);
[26]205        /// returns a param production of a given name
206        /// @param name param production's name
[1]207        ParamProduction* getParamProduction(SString name);
[26]208        /// gets string representation of this L-system (f8 genotype)
[1]209        SString toString();
[26]210        /// returns all actions
211        /// @param normal if true all normal actions will be included
212        /// @param primitives if true all primitive actions will be included
213        /// @param params if true all param actions will be included
214        /// @param neurons if true all neuron actions will be included
[1]215        vector<Action*> getAllActions(bool normal, bool primitives, bool params, bool neurons);
216protected:
217        map<string, PrimitiveProduction*> primitiveProductions;
218        map<string, ParamProduction*> paramProductions;
219       
220        void removeEmptySubproductionsAndProductions();
221};
222
[26]223/// Converter between f8 and f1 format
[1]224class GenoConv_F8ToF1 : public GenoConverter {
225public:
[26]226        /// Default constructor
[1]227        GenoConv_F8ToF1() {
228                name = "f8 to f1 converter";
229                in_format = '8';
230                out_format = '1';
231                mapsupport = 0;
232                info = "ble";
[25]233                maxF1Length = 500;
[1]234        }
235       
[26]236        /// Constructor with parameter
237        /// @param f1LengthLimit If resulting f1 genotype is longer than f1LengthLimit, converter aborts its job
[25]238        GenoConv_F8ToF1(int f1LengthLimit) {
239                name = "f8 to f1 converter";
240                in_format = '8';
241                out_format = '1';
242                mapsupport = 0;
243                info = "ble";
244                maxF1Length = f1LengthLimit;
245        }
246       
[1]247        ~GenoConv_F8ToF1() {}
248       
249        SString convert(SString &in, MultiMap *map);
[26]250       
251        /// check syntax of given f8 genotype
252        /// @param geno f8 genotype to be checked
[1]253        bool checkSyntax(const char *geno);
[26]254       
255        /// returns names of productions in a given genotype
256        /// @param in f8 genotype
[1]257        vector<SString> readProductionNames(const SString &in);
258        //Lsystem* createLsystem(const SString &in);
[26]259       
260        /// creates Lsystem object based on input genotype
261        /// @param f8 genotype
[1]262        Lsystem* createLsystem(SString in);
263protected:
264        bool parseInput(const char* src, Lsystem* lsys);
[25]265        int maxF1Length;
[1]266};
267
268#endif
Note: See TracBrowser for help on using the repository browser.