00001
00006 #ifndef GENETIK_GP_GENE
00007 #define GENETIK_GP_GENE
00008
00009
00010 #include <string>
00011
00012 #include "../util/Variant.h"
00013 using namespace std;
00014
00015
00016 namespace genetiK
00017 {
00018 namespace gp
00019 {
00020 class IndividualFactory;
00021
00022
00029 class Gene
00030 {
00031 private:
00032 unsigned int cardinality;
00033 unsigned char height;
00034 unsigned char branchDepth;
00035 unsigned int label;
00036
00037 unsigned char arity;
00038 Gene** argument;
00039
00040 public:
00041
00048 Gene(unsigned char arity);
00053 virtual ~Gene();
00054
00055
00062 virtual util::Variant evaluate()=0;
00063
00064
00069 virtual std::string toString()const;
00070
00076 unsigned char getArity() const
00077 {
00078 return arity;
00079 }
00084 Gene* getArgument(unsigned char i);
00090 void setArgument(unsigned char i, Gene* newArgument);
00091
00098 unsigned int getCardinality() const
00099 {
00100 return cardinality;
00101 }
00108 unsigned int getLabel() const
00109 {
00110 return label;
00111 }
00112
00120 unsigned char getHeight() const
00121 {
00122 return height;
00123 }
00128 void setHeight(unsigned char height)
00129 {
00130 this->height = height;
00131 }
00137 unsigned char getBranchDepth() const
00138 {
00139 return branchDepth;
00140 }
00141
00149 Gene* extract( unsigned int label);
00158 Gene* substituteBranch( unsigned int label, Gene* newSubTree);
00159
00167 unsigned int setLabels(unsigned int label);
00168
00174 virtual Gene* copyBranch() const;
00175
00181 virtual Gene* copy() const=0;
00182
00183 };
00184
00185 }
00186 }
00187
00188 #endif