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 mPrimitives_[prim->getName()] = prim;
00023 prim = (PrimitiveP) (new Primitives::Sub);
00024 mPrimitives_[prim->getName()] = prim;
00025 prim = (PrimitiveP) (new Primitives::Mul);
00026 mPrimitives_[prim->getName()] = prim;
00027 prim = (PrimitiveP) (new Primitives::Div);
00028 mPrimitives_[prim->getName()] = prim;
00029 prim = (PrimitiveP) (new Primitives::Sin);
00030 mPrimitives_[prim->getName()] = prim;
00031 prim = (PrimitiveP) (new Primitives::Cos);
00032 mPrimitives_[prim->getName()] = prim;
00033 prim = (PrimitiveP) (new Primitives::Pos);
00034 mPrimitives_[prim->getName()] = prim;
00035 prim = (PrimitiveP) (new Primitives::Neg);
00036 mPrimitives_[prim->getName()] = prim;
00037 prim = (PrimitiveP) (new Primitives::Max);
00038 mPrimitives_[prim->getName()] = prim;
00039 prim = (PrimitiveP) (new Primitives::Min);
00040 mPrimitives_[prim->getName()] = prim;
00041
00042 prim_iter primIter;
00043 for(primIter = mPrimitives_.begin(); primIter != mPrimitives_.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 int rez = state_->getRandomizer()->getRandomInteger((int) functionSet_.size());
00060 return functionSet_[rez];
00061 }
00062
00063
00064 PrimitiveP PrimitiveSet::getRandomTerminal()
00065 {
00066 return terminalSet_[state_->getRandomizer()->getRandomInteger((int) terminalSet_.size())];
00067 }
00068
00069
00070 PrimitiveP PrimitiveSet::getRandomPrimitive()
00071 {
00072 return primitives_[state_->getRandomizer()->getRandomInteger((int) primitives_.size())];
00073 }
00074
00075
00076 PrimitiveP PrimitiveSet::getFunctionByName(std::string name)
00077 {
00078 uint s = (uint) functionSet_.size();
00079 for(uint i = 0; i < s; i++)
00080 if(functionSet_[i]->getName() == name)
00081 return functionSet_[i];
00082
00083 return PrimitiveP();
00084 }
00085
00086
00087 PrimitiveP PrimitiveSet::getTerminalByName(std::string name)
00088 {
00089 uint s = (uint) terminalSet_.size();
00090 for(uint i = 0; i < s; i++)
00091 if(terminalSet_[i]->getName() == name)
00092 return terminalSet_[i];
00093
00094 return PrimitiveP();
00095 }
00096
00097
00098 PrimitiveP PrimitiveSet::getPrimitiveByName(std::string name)
00099 {
00100 uint s = (uint) primitives_.size();
00101 for(uint i = 0; i < s; i++)
00102 if(primitives_[i]->getName() == name)
00103 return primitives_[i];
00104
00105 return PrimitiveP();
00106 }
00107
00108
00113 void PrimitiveSet::addFunction(PrimitiveP functionPrimitive)
00114 {
00115 if(functionPrimitive->getNumberOfArguments() == 0)
00116 terminalSet_.push_back(functionPrimitive);
00117 else
00118 functionSet_.push_back(functionPrimitive);
00119 primitives_.push_back(functionPrimitive);
00120 }
00121
00122
00127 bool PrimitiveSet::addFunction(std::string name)
00128 {
00129 prim_iter iter = mPrimitives_.find(name);
00130 if(iter == mPrimitives_.end())
00131 return false;
00132
00133 if(iter->second->getNumberOfArguments() == 0)
00134 terminalSet_.push_back(iter->second);
00135 else
00136 functionSet_.push_back(iter->second);
00137 primitives_.push_back(iter->second);
00138
00139 return true;
00140 }
00141
00142
00146 void PrimitiveSet::addTerminal(PrimitiveP terminalPrimitive)
00147 {
00148 terminalSet_.push_back(terminalPrimitive);
00149 primitives_.push_back(terminalPrimitive);
00150 }
00151
00152
00153 uint PrimitiveSet::getFunctionSetSize()
00154 {
00155 return (uint) functionSet_.size();
00156 }
00157
00158
00159 uint PrimitiveSet::getTerminalSetSize()
00160 {
00161 return (uint) terminalSet_.size();
00162 }
00163
00164
00165 uint PrimitiveSet::getPrimitivesSize()
00166 {
00167 return (uint) primitives_.size();
00168 }
00169
00170 }