• Main Page
  • Classes
  • Files
  • File List

D:/Radagast_D/Projekt/ECF_trunk/ECF/tree/Terminal.h

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 // default type is double:
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         // ime se treba postaviti u Tree::initialize zbog prefiksa po tipu
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         // shallow copy - the values_ vector is not copied
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         // shallow copy - the values_ are not copied
00208         ERCD *erc = new ERCD(*this);
00209 
00210         // generate a random value in the interval
00211         if(useInterval_) {
00212             double r = state_->getRandomizer()->getRandomDouble();
00213             erc->value_ = (*values_)[0] + r * ((*values_)[1] - (*values_)[0]);
00214         }
00215         // or choose a random predefined value
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

Generated on Wed Sep 1 2010 14:31:21 for ECF by  doxygen 1.7.1