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
00058 PrimitiveP PrimitiveSet::getRandomFunction()
00059 {
00060 return functionSet_[state_->getRandomizer()->getRandomInteger((int) functionSet_.size())];
00061 }
00062
00063
00065 PrimitiveP PrimitiveSet::getRandomTerminal()
00066 {
00067 return terminalSet_[state_->getRandomizer()->getRandomInteger((int) terminalSet_.size())];
00068 }
00069
00070
00072 PrimitiveP PrimitiveSet::getRandomPrimitive()
00073 {
00074 return primitives_[state_->getRandomizer()->getRandomInteger((int) primitives_.size())];
00075 }
00076
00077
00079 PrimitiveP PrimitiveSet::getFunctionByName(std::string name)
00080 {
00081 prim_iter iter = mFunctionSet_.find(name);
00082 if(iter == mFunctionSet_.end())
00083 return PrimitiveP();
00084
00085 return iter->second;
00086 }
00087
00088
00090 PrimitiveP PrimitiveSet::getTerminalByName(std::string name)
00091 {
00092 prim_iter iter = mTerminalSet_.find(name);
00093 if(iter == mTerminalSet_.end())
00094 return PrimitiveP();
00095
00096 return iter->second;
00097 }
00098
00099
00101 PrimitiveP PrimitiveSet::getPrimitiveByName(std::string name)
00102 {
00103 prim_iter iter = mPrimitiveSet_.find(name);
00104 if(iter == mPrimitiveSet_.end())
00105 return PrimitiveP();
00106
00107 return iter->second;
00108 }
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00131 bool PrimitiveSet::addFunction(std::string name)
00132 {
00133 prim_iter iter = mAllPrimitives_.find(name);
00134 if(iter == mAllPrimitives_.end())
00135 return false;
00136
00137 if(iter->second->getNumberOfArguments() == 0) {
00138 terminalSet_.push_back(iter->second);
00139 mTerminalSet_[iter->first] = iter->second;
00140 }
00141 else {
00142 functionSet_.push_back(iter->second);
00143 mFunctionSet_[iter->first] = iter->second;
00144 }
00145
00146 primitives_.push_back(iter->second);
00147 mPrimitiveSet_[iter->first] = iter->second;
00148
00149 return true;
00150 }
00151
00152
00156 void PrimitiveSet::addTerminal(PrimitiveP terminalPrimitive)
00157 {
00158 terminalSet_.push_back(terminalPrimitive);
00159 mTerminalSet_[terminalPrimitive->getName()] = terminalPrimitive;
00160
00161 primitives_.push_back(terminalPrimitive);
00162 mPrimitiveSet_[terminalPrimitive->getName()] = terminalPrimitive;
00163 }
00164
00165
00167 uint PrimitiveSet::getFunctionSetSize()
00168 {
00169 return (uint) functionSet_.size();
00170 }
00171
00172
00174 uint PrimitiveSet::getTerminalSetSize()
00175 {
00176 return (uint) terminalSet_.size();
00177 }
00178
00179
00181 uint PrimitiveSet::getPrimitivesSize()
00182 {
00183 return (uint) primitives_.size();
00184 }
00185
00186 }