00001 #ifndef Terminal_h
00002 #define Terminal_h
00003 #include "Primitive.h"
00004
00005 namespace Tree {
00006 namespace Primitives {
00007
00013 template <class T>
00014 class TerminalT : public Primitive
00015 {
00016 public:
00017 TerminalT();
00018 T value_;
00019 void execute(void* result, Tree& tree);
00020 void setValue(void* value);
00021 void getValue(void* value);
00022 ~TerminalT();
00023 };
00024
00025 typedef TerminalT<double> Terminal;
00026
00027
00028 template <class T>
00029 TerminalT<T>::TerminalT()
00030 {
00031 nArguments_ = 0;
00032 }
00033
00034
00035 template <class T>
00036 TerminalT<T>::~TerminalT(void)
00037 { }
00038
00039
00044 template <class T>
00045 void TerminalT<T>::setValue(void* value)
00046 {
00047 value_ = *(T*)value;
00048 }
00049
00050
00055 template <class T>
00056 void TerminalT<T>::getValue(void* value)
00057 {
00058 *(T*)value = value_;
00059 }
00060
00061
00062 template <class T>
00063 void TerminalT<T>::execute(void* result, Tree& tree)
00064 {
00065 T& res = *(T*)result;
00066 res = value_;
00067 }
00068
00069
00070
00079 template <class T>
00080 class ERC : public Primitive
00081 {
00082 public:
00083 std::string baseName_;
00084 T value_;
00085
00086 ERC()
00087 {
00088 nArguments_ = 0;
00089 name_ = "ERC";
00090
00091 }
00092
00093
00098 bool initialize(StateP state)
00099 {
00100 state_ = state;
00101 values_ = new std::vector<T>;
00102
00103 name_.erase(name_.end() - 1);
00104 std::stringstream ss;
00105 ss << name_;
00106 ss >> name_;
00107 char bracket;
00108 ss >> bracket;
00109
00110 T datum;
00111 while(ss >> datum) {
00112 values_->push_back(datum);
00113 }
00114
00115 return true;
00116 }
00117
00118
00119 void execute(void *result, Tree& tree)
00120 {
00121 T& res = *(T*)result;
00122 res = value_;
00123 }
00124
00125
00130 void setValue(void* value)
00131 {
00132 value_ = *(T*)value;
00133 }
00134
00135
00140 void getValue(void* value)
00141 {
00142 *(T*)value = value_;
00143 }
00144
00145
00146 PrimitiveP copyWithNode(PrimitiveP primitive)
00147 {
00148 return (PrimitiveP) new ERC<T>(*this);
00149 }
00150
00155 PrimitiveP assignToNode(PrimitiveP primitive)
00156 {
00157
00158 ERC<T> *erc = new ERC<T>(*this);
00159
00160 uint iData = state_->getRandomizer()->getRandomInteger((int)values_->size());
00161 erc->value_ = values_->at(iData);
00162 std::ostringstream ss;
00163 ss << values_->at(iData);
00164 erc->setName(name_ + ss.str());
00165 return (PrimitiveP) erc;
00166 }
00167
00168 protected:
00169 std::vector<T> *values_;
00170 };
00171
00172
00173
00179 class ERCD : public ERC<double>
00180 {
00181 public:
00182 bool initialize(StateP state)
00183 {
00184 useInterval_ = true;
00185 state_ = state;
00186 values_ = new std::vector<double>;
00187
00188 if(name_[name_.size() - 1] == '}')
00189 useInterval_ = false;
00190 name_.erase(name_.end() - 1);
00191 std::stringstream ss;
00192 ss << name_;
00193 ss >> name_;
00194 char bracket;
00195 ss >> bracket;
00196
00197 double datum;
00198 while(ss >> datum) {
00199 values_->push_back(datum);
00200 }
00201
00202 return true;
00203 }
00204
00205 PrimitiveP assignToNode(PrimitiveP primitive)
00206 {
00207
00208 ERCD *erc = new ERCD(*this);
00209
00210
00211 if(useInterval_) {
00212 double r = state_->getRandomizer()->getRandomDouble();
00213 erc->value_ = (*values_)[0] + r * ((*values_)[1] - (*values_)[0]);
00214 }
00215
00216 else {
00217 uint iData = state_->getRandomizer()->getRandomInteger((int)values_->size());
00218 erc->value_ = values_->at(iData);
00219 }
00220 std::ostringstream ss;
00221 ss << erc->value_;
00222 erc->setName(name_ + ss.str());
00223 return (PrimitiveP) erc;
00224 }
00225
00226 protected:
00227 bool useInterval_;
00228 };
00229
00230 }
00231 }
00232
00233 #endif