ECF 1.5
PrimitiveSetAP.cpp
1#include "PrimitiveSetAP.h"
2#include "../tree/Tree.h"
3#include "../tree/Primitive.h"
4
5
6namespace Tree
7{
8
9 PrimitiveSetAP::PrimitiveSetAP()
10 { }
11
12
13 PrimitiveSetAP::~PrimitiveSetAP()
14 { }
15
16
17 bool PrimitiveSetAP::initialize(StateP state)
18 {
19 state_ = state;
20
21 // register existing primitives
22 PrimitiveP prim = (PrimitiveP)(new Primitives::Add);
23 mAllPrimitives_[prim->getName()] = prim;
24 prim = (PrimitiveP)(new Primitives::Sub);
25 mAllPrimitives_[prim->getName()] = prim;
26 prim = (PrimitiveP)(new Primitives::Mul);
27 mAllPrimitives_[prim->getName()] = prim;
28 prim = (PrimitiveP)(new Primitives::Div);
29 mAllPrimitives_[prim->getName()] = prim;
30 prim = (PrimitiveP)(new Primitives::Sin);
31 mAllPrimitives_[prim->getName()] = prim;
32 prim = (PrimitiveP)(new Primitives::Cos);
33 mAllPrimitives_[prim->getName()] = prim;
34 prim = (PrimitiveP)(new Primitives::Pos);
35 mAllPrimitives_[prim->getName()] = prim;
36 prim = (PrimitiveP)(new Primitives::Neg);
37 mAllPrimitives_[prim->getName()] = prim;
38 prim = (PrimitiveP)(new Primitives::Max);
39 mAllPrimitives_[prim->getName()] = prim;
40 prim = (PrimitiveP)(new Primitives::Min);
41 mAllPrimitives_[prim->getName()] = prim;
42
43 prim_iter primIter;
44 for (primIter = mAllPrimitives_.begin(); primIter != mAllPrimitives_.end(); ++primIter)
45 primIter->second->initialize(state);
46
47 // register terminal types
48 mTypeNames_.insert(std::pair<std::string, Primitives::terminal_type>("DOUBLE", Primitives::Double));
49 mTypeNames_.insert(std::pair<std::string, Primitives::terminal_type>("INT", Primitives::Int));
50 mTypeNames_.insert(std::pair<std::string, Primitives::terminal_type>("BOOL", Primitives::Bool));
51 mTypeNames_.insert(std::pair<std::string, Primitives::terminal_type>("CHAR", Primitives::Char));
52 mTypeNames_.insert(std::pair<std::string, Primitives::terminal_type>("STRING", Primitives::String));
53
54 return true;
55 }
56
57
59 PrimitiveP PrimitiveSetAP::getGFSOneByName(std::string name)
60 {
61 prim_iter iter = mGFSOneSet_.find(name);
62 if (iter == mGFSOneSet_.end())
63 return PrimitiveP();
64
65 return iter->second;
66 }
67
69 PrimitiveP PrimitiveSetAP::getGFSTwoByName(std::string name)
70 {
71 prim_iter iter = mGFSTwoSet_.find(name);
72 if (iter == mGFSTwoSet_.end())
73 return PrimitiveP();
74
75 return iter->second;
76 }
77
78
80 PrimitiveP PrimitiveSetAP::getTerminalByName(std::string name)
81 {
82 prim_iter iter = mTerminalSet_.find(name);
83 if (iter == mTerminalSet_.end())
84 return PrimitiveP();
85
86 return iter->second;
87 }
88
89
91 PrimitiveP PrimitiveSetAP::getPrimitiveByName(std::string name)
92 {
93 prim_iter iter = mPrimitiveSet_.find(name);
94 if (iter == mPrimitiveSet_.end())
95 return PrimitiveP();
96
97 return iter->second;
98 }
99
100 PrimitiveP PrimitiveSetAP::getTerminalByIndex(uint index) {
101 return terminalSet_[index % terminalSet_.size()];
102 }
103
104 PrimitiveP PrimitiveSetAP::getGFSOneByIndex(uint index) {
105 return GFSOneSet_[index % GFSOneSet_.size()];
106 }
107
108 PrimitiveP PrimitiveSetAP::getGFSTwoByIndex(uint index) {
109 return GFSTwoSet_[index % GFSTwoSet_.size()];
110 }
111
112 PrimitiveP PrimitiveSetAP::getPrimitiveByIndex(uint index) {
113 return primitives_[index % primitives_.size()];
114 }
115
116
121 bool PrimitiveSetAP::addFunction(std::string name)
122 {
123 prim_iter iter = mAllPrimitives_.find(name);
124 if (iter == mAllPrimitives_.end())
125 return false;
126
127 int argNum = iter->second->getNumberOfArguments();
128
129 if (argNum == 0) {
130 terminalSet_.push_back(iter->second);
131 mTerminalSet_[iter->first] = iter->second;
132 }
133 else if (argNum == 1) {
134 GFSOneSet_.push_back(iter->second);
135 mGFSOneSet_[iter->first] = iter->second;
136 }
137 else if (argNum == 2) {
138 GFSTwoSet_.push_back(iter->second);
139 mGFSTwoSet_[iter->first] = iter->second;
140 }
141
142 primitives_.push_back(iter->second);
143 mPrimitiveSet_[iter->first] = iter->second;
144
145 return true;
146 }
147
148
152 void PrimitiveSetAP::addTerminal(PrimitiveP terminalPrimitive)
153 {
154 terminalSet_.push_back(terminalPrimitive);
155 mTerminalSet_[terminalPrimitive->getName()] = terminalPrimitive;
156
157 primitives_.push_back(terminalPrimitive);
158 mPrimitiveSet_[terminalPrimitive->getName()] = terminalPrimitive;
159 }
160
161
162 uint PrimitiveSetAP::getFunctionSetSize()
163 {
164 return getGFSOneSetSize() + getGFSTwoSetSize();
165 }
166
167 uint PrimitiveSetAP::getGFSOneSetSize()
168 {
169 return (uint)GFSOneSet_.size();
170 }
171
172 uint PrimitiveSetAP::getGFSTwoSetSize()
173 {
174 return (uint)GFSTwoSet_.size();
175 }
176
179 {
180 return (uint)terminalSet_.size();
181 }
182
185 {
186 return (uint)primitives_.size();
187 }
188
189}
std::vector< PrimitiveP > GFSOneSet_
vector of active (actual used) functions
PrimitiveP getTerminalByName(std::string name)
Access terminal by name (active terminals only).
std::map< std::string, PrimitiveP > mAllPrimitives_
map of all registered primitive functions
std::vector< PrimitiveP > primitives_
vector of active (actual used) primitives
void addTerminal(PrimitiveP terminalPrimitive)
Add a terminal primitive to the set of active primitives.
std::vector< PrimitiveP > GFSTwoSet_
vector of active (actual used) functions
uint getTerminalSetSize()
Get the number of active terminals.
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).
PrimitiveP getGFSTwoByName(std::string name)
Access function by name (active functions only).
std::map< std::string, PrimitiveP > mPrimitiveSet_
map of active (actual used) primitives
uint getPrimitivesSize()
Get the number of active primitives (functions and terminals).
std::vector< PrimitiveP > terminalSet_
vector of active (actual used) terminals
std::map< std::string, PrimitiveP > mGFSTwoSet_
map of active (actual used) functions
std::map< std::string, PrimitiveP > mTerminalSet_
map of active (actual used) terminals
PrimitiveP getGFSOneByName(std::string name)
Access function by name (active functions only).
std::map< std::string, PrimitiveP > mGFSOneSet_
map of active (actual used) functions