ECF 1.7
PrimitiveSet.cpp
1#include "../ECF_base.h"
2#include "Tree.h"
3
4
5namespace Tree
6{
7
8PrimitiveSet::PrimitiveSet()
9{ }
10
11
12PrimitiveSet::~PrimitiveSet()
13{ }
14
15
16bool PrimitiveSet::initialize(StateP state)
17{
18 state_ = state;
19
20 // register existing primitives
21 PrimitiveP prim = (PrimitiveP) (new Primitives::Add);
22 mAllPrimitives_[prim->getName()] = prim;
23 prim = (PrimitiveP) (new Primitives::Sub);
24 mAllPrimitives_[prim->getName()] = prim;
25 prim = (PrimitiveP) (new Primitives::Mul);
26 mAllPrimitives_[prim->getName()] = prim;
27 prim = (PrimitiveP) (new Primitives::Div);
28 mAllPrimitives_[prim->getName()] = prim;
29 prim = (PrimitiveP) (new Primitives::Sin);
30 mAllPrimitives_[prim->getName()] = prim;
31 prim = (PrimitiveP) (new Primitives::Cos);
32 mAllPrimitives_[prim->getName()] = prim;
33 prim = (PrimitiveP) (new Primitives::Pos);
34 mAllPrimitives_[prim->getName()] = prim;
35 prim = (PrimitiveP) (new Primitives::Neg);
36 mAllPrimitives_[prim->getName()] = prim;
37 prim = (PrimitiveP) (new Primitives::Max);
38 mAllPrimitives_[prim->getName()] = prim;
39 prim = (PrimitiveP) (new Primitives::Min);
40 mAllPrimitives_[prim->getName()] = prim;
41 prim = (PrimitiveP)(new Primitives::Sqrt);
42 mAllPrimitives_[prim->getName()] = prim;
43 prim = (PrimitiveP)(new Primitives::Log);
44 mAllPrimitives_[prim->getName()] = prim;
45 prim = (PrimitiveP)(new Primitives::Avg);
46 mAllPrimitives_[prim->getName()] = prim;
47
48 prim_iter primIter;
49 for(primIter = mAllPrimitives_.begin(); primIter != mAllPrimitives_.end(); ++primIter)
50 primIter->second->initialize(state);
51
52 // register terminal types
53 mTypeNames_.insert(std::pair<std::string, Primitives::terminal_type>("DOUBLE", Primitives::Double));
54 mTypeNames_.insert(std::pair<std::string, Primitives::terminal_type>("INT", Primitives::Int));
55 mTypeNames_.insert(std::pair<std::string, Primitives::terminal_type>("BOOL", Primitives::Bool));
56 mTypeNames_.insert(std::pair<std::string, Primitives::terminal_type>("CHAR", Primitives::Char));
57 mTypeNames_.insert(std::pair<std::string, Primitives::terminal_type>("STRING", Primitives::String));
58
59 return true;
60}
61
62
65{
66 return functionSet_[state_->getRandomizer()->getRandomInteger((int) functionSet_.size())];
67}
68
69
72{
73 return terminalSet_[state_->getRandomizer()->getRandomInteger((int) terminalSet_.size())];
74}
75
76
79{
80 return primitives_[state_->getRandomizer()->getRandomInteger((int) primitives_.size())];
81}
82
83
85PrimitiveP PrimitiveSet::getFunctionByName(std::string name)
86{
87 prim_iter iter = mFunctionSet_.find(name);
88 if(iter == mFunctionSet_.end())
89 return PrimitiveP();
90
91 return iter->second;
92}
93
94
96PrimitiveP PrimitiveSet::getTerminalByName(std::string name)
97{
98 prim_iter iter = mTerminalSet_.find(name);
99 if(iter == mTerminalSet_.end())
100 return PrimitiveP();
101
102 return iter->second;
103}
104
105
107PrimitiveP PrimitiveSet::getPrimitiveByName(std::string name)
108{
109 prim_iter iter = mPrimitiveSet_.find(name);
110 if(iter == mPrimitiveSet_.end())
111 return PrimitiveP();
112
113 return iter->second;
114}
115
116
117//void PrimitiveSet::addFunction(PrimitiveP functionPrimitive)
118//{
119// if(functionPrimitive->getNumberOfArguments() == 0) {
120// terminalSet_.push_back(functionPrimitive);
121// mTerminalSet_[functionPrimitive->getName()] = functionPrimitive;
122// }
123// else {
124// functionSet_.push_back(functionPrimitive);
125// mFunctionSet_[functionPrimitive->getName()] = functionPrimitive;
126// }
127//
128// primitives_.push_back(functionPrimitive);
129// mPrimitives_[functionPrimitive->getName()] = functionPrimitive;
130//}
131
132
137bool PrimitiveSet::addFunction(std::string name)
138{
139 prim_iter iter = mAllPrimitives_.find(name);
140 if(iter == mAllPrimitives_.end())
141 return false;
142
143 if(iter->second->getNumberOfArguments() == 0) {
144 terminalSet_.push_back(iter->second);
145 mTerminalSet_[iter->first] = iter->second;
146 }
147 else {
148 functionSet_.push_back(iter->second);
149 mFunctionSet_[iter->first] = iter->second;
150 }
151
152 primitives_.push_back(iter->second);
153 mPrimitiveSet_[iter->first] = iter->second;
154
155 return true;
156}
157
158
162void PrimitiveSet::addTerminal(PrimitiveP terminalPrimitive)
163{
164 terminalSet_.push_back(terminalPrimitive);
165 mTerminalSet_[terminalPrimitive->getName()] = terminalPrimitive;
166
167 primitives_.push_back(terminalPrimitive);
168 mPrimitiveSet_[terminalPrimitive->getName()] = terminalPrimitive;
169}
170
171
174{
175 return (uint) functionSet_.size();
176}
177
178
181{
182 return (uint) terminalSet_.size();
183}
184
185
188{
189 return (uint) primitives_.size();
190}
191
192}
PrimitiveP getRandomFunction()
Get random function from the set of active functions.
uint getPrimitivesSize()
Get the number of active primitives (functions and terminals).
std::vector< PrimitiveP > primitives_
vector of active (actual used) primitives
PrimitiveP getTerminalByName(std::string name)
Access terminal by name (active terminals only).
std::map< std::string, PrimitiveP > mTerminalSet_
map of active (actual used) terminals
void addTerminal(PrimitiveP terminalPrimitive)
Add a terminal primitive to the set of active primitives.
PrimitiveP getRandomPrimitive()
Get random primitive (function or terminal) from the set of active primitives.
std::map< std::string, PrimitiveP > mPrimitiveSet_
map of active (actual used) primitives
uint getTerminalSetSize()
Get the number of active terminals.
uint getFunctionSetSize()
Get the number of active functions.
std::map< std::string, PrimitiveP > mFunctionSet_
map of active (actual used) functions
bool addFunction(std::string name)
Add a function primitive to the set of active primitives - if found by name in collection of all prim...
PrimitiveP getPrimitiveByName(std::string name)
Access primitive by name (active functions or terminals only).
std::vector< PrimitiveP > terminalSet_
vector of active (actual used) terminals
PrimitiveP getFunctionByName(std::string name)
Access function by name (active functions only).
std::vector< PrimitiveP > functionSet_
vector of active (actual used) functions
std::map< std::string, PrimitiveP > mAllPrimitives_
map of all registered primitive functions
PrimitiveP getRandomTerminal()
Get random terminal from the set of active terminals.