00001 #include "../ECF_base.h"
00002 #include "Tree.h"
00003
00004
00005 namespace Tree
00006 {
00007
00008 PrimitiveSet::PrimitiveSet()
00009 { }
00010
00011
00012 PrimitiveSet::~PrimitiveSet()
00013 { }
00014
00015
00016 bool PrimitiveSet::initialize(StateP state)
00017 {
00018 state_ = state;
00019
00020
00021 PrimitiveP prim = (PrimitiveP) (new Primitives::Add);
00022 mAllPrimitives_[prim->getName()] = prim;
00023 prim = (PrimitiveP) (new Primitives::Sub);
00024 mAllPrimitives_[prim->getName()] = prim;
00025 prim = (PrimitiveP) (new Primitives::Mul);
00026 mAllPrimitives_[prim->getName()] = prim;
00027 prim = (PrimitiveP) (new Primitives::Div);
00028 mAllPrimitives_[prim->getName()] = prim;
00029 prim = (PrimitiveP) (new Primitives::Sin);
00030 mAllPrimitives_[prim->getName()] = prim;
00031 prim = (PrimitiveP) (new Primitives::Cos);
00032 mAllPrimitives_[prim->getName()] = prim;
00033 prim = (PrimitiveP) (new Primitives::Pos);
00034 mAllPrimitives_[prim->getName()] = prim;
00035 prim = (PrimitiveP) (new Primitives::Neg);
00036 mAllPrimitives_[prim->getName()] = prim;
00037 prim = (PrimitiveP) (new Primitives::Max);
00038 mAllPrimitives_[prim->getName()] = prim;
00039 prim = (PrimitiveP) (new Primitives::Min);
00040 mAllPrimitives_[prim->getName()] = prim;
00041
00042 prim_iter primIter;
00043 for(primIter = mAllPrimitives_.begin(); primIter != mAllPrimitives_.end(); primIter++)
00044 primIter->second->initialize(state);
00045
00046
00047 mTypeNames_.insert(std::pair<std::string, Primitives::terminal_type>("DOUBLE", Primitives::Double));
00048 mTypeNames_.insert(std::pair<std::string, Primitives::terminal_type>("INT", Primitives::Int));
00049 mTypeNames_.insert(std::pair<std::string, Primitives::terminal_type>("BOOL", Primitives::Bool));
00050 mTypeNames_.insert(std::pair<std::string, Primitives::terminal_type>("CHAR", Primitives::Char));
00051 mTypeNames_.insert(std::pair<std::string, Primitives::terminal_type>("STRING", Primitives::String));
00052
00053 return true;
00054 }
00055
00056
00057 PrimitiveP PrimitiveSet::getRandomFunction()
00058 {
00059 return functionSet_[state_->getRandomizer()->getRandomInteger((int) functionSet_.size())];
00060 }
00061
00062
00063 PrimitiveP PrimitiveSet::getRandomTerminal()
00064 {
00065 return terminalSet_[state_->getRandomizer()->getRandomInteger((int) terminalSet_.size())];
00066 }
00067
00068
00069 PrimitiveP PrimitiveSet::getRandomPrimitive()
00070 {
00071 return primitives_[state_->getRandomizer()->getRandomInteger((int) primitives_.size())];
00072 }
00073
00074
00075 PrimitiveP PrimitiveSet::getFunctionByName(std::string name)
00076 {
00077 prim_iter iter = mTerminalSet_.find(name);
00078 if(iter == mTerminalSet_.end())
00079 return PrimitiveP();
00080
00081 return iter->second;
00082 }
00083
00084
00085 PrimitiveP PrimitiveSet::getTerminalByName(std::string name)
00086 {
00087 prim_iter iter = mTerminalSet_.find(name);
00088 if(iter == mTerminalSet_.end())
00089 return PrimitiveP();
00090
00091 return iter->second;
00092 }
00093
00094
00095 PrimitiveP PrimitiveSet::getPrimitiveByName(std::string name)
00096 {
00097 prim_iter iter = mPrimitiveSet_.find(name);
00098 if(iter == mPrimitiveSet_.end())
00099 return PrimitiveP();
00100
00101 return iter->second;
00102 }
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00125 bool PrimitiveSet::addFunction(std::string name)
00126 {
00127 prim_iter iter = mAllPrimitives_.find(name);
00128 if(iter == mAllPrimitives_.end())
00129 return false;
00130
00131 if(iter->second->getNumberOfArguments() == 0) {
00132 terminalSet_.push_back(iter->second);
00133 mTerminalSet_[iter->first] = iter->second;
00134 }
00135 else {
00136 functionSet_.push_back(iter->second);
00137 mFunctionSet_[iter->first] = iter->second;
00138 }
00139
00140 primitives_.push_back(iter->second);
00141 mPrimitiveSet_[iter->first] = iter->second;
00142
00143 return true;
00144 }
00145
00146
00150 void PrimitiveSet::addTerminal(PrimitiveP terminalPrimitive)
00151 {
00152 terminalSet_.push_back(terminalPrimitive);
00153 mTerminalSet_[terminalPrimitive->getName()] = terminalPrimitive;
00154
00155 primitives_.push_back(terminalPrimitive);
00156 mPrimitiveSet_[terminalPrimitive->getName()] = terminalPrimitive;
00157 }
00158
00159
00160 uint PrimitiveSet::getFunctionSetSize()
00161 {
00162 return (uint) functionSet_.size();
00163 }
00164
00165
00166 uint PrimitiveSet::getTerminalSetSize()
00167 {
00168 return (uint) terminalSet_.size();
00169 }
00170
00171
00172 uint PrimitiveSet::getPrimitivesSize()
00173 {
00174 return (uint) primitives_.size();
00175 }
00176
00177 }