00001 00020 #ifndef _RUNNABLE_H 00021 #define _RUNNABLE_H 1 00022 00023 #include "signal.h" 00024 #include "define.h" 00025 #include <ctime> 00026 #include <stdexcept> 00027 00028 using namespace std; 00029 00040 #define MINIMIZE minimize 00041 #define MAXIMIZE maximize 00042 00043 namespace realea { 00044 00045 00046 struct OptimeCriterion { 00047 public: 00048 00055 OptimeCriterion(double optime, double dif); 00060 void setThreshold(double dif); 00061 00065 inline double getThreshold(void); 00066 00073 bool isOptime(double fitness); 00074 00078 void setMinimize(void) { 00079 m_minimize = true; 00080 } 00084 void setMaximize(void) { 00085 m_minimize = false; 00086 } 00087 00088 bool minimize(void) { 00089 return m_minimize; 00090 } 00091 00092 bool maximize(void) { 00093 return !m_minimize; 00094 } 00095 00096 00104 bool isBetter(double value1, double value2) { 00105 if (m_minimize) { 00106 return (value1 < value2); 00107 } 00108 else { 00109 return (value1 > value2); 00110 } 00111 00112 } 00113 00114 double getOptime(void) { 00115 return m_optime; 00116 } 00117 00118 private: 00119 double m_optime; 00120 double m_threshold; 00121 double m_minimize; 00122 }; 00123 00124 class RunningException : public runtime_error { 00125 public: 00126 RunningException(string msg) : runtime_error(msg), m_msg(msg) { 00127 } 00128 00129 const char *what(void) { 00130 return m_msg.c_str(); 00131 } 00132 00133 ~RunningException(void) throw () {} 00134 private: 00135 string m_msg; 00136 }; 00137 00146 class Running : public IReset, public IFinish { 00147 public: 00151 void increm(void); 00152 00153 00154 void notify(double fitness); 00155 00159 void reset(void); 00160 00165 Running(OptimeCriterion *isOptime); 00171 void setMaxEval(unsigned int maxEval); 00172 00173 virtual ~Running(void); 00174 00182 Running*getSubRunning(unsigned submaxeval); 00183 00187 unsigned int maxEval(void); 00192 bool isFinish(void); 00193 00199 double ratio(); 00200 00207 bool isOptime(double fitness); 00208 00213 void setThreshold(double dif); 00214 00215 void setMaxTime(unsigned seconds); 00216 00220 unsigned int numEval(void); 00221 00225 double getThreshold(void); 00226 00230 unsigned pending(void) { 00231 return (m_maxeval-m_neval); 00232 } 00233 00239 void notifyEval(double fit); 00243 bool hasFoundOptime(void) { 00244 return m_optimized; 00245 } 00246 00247 bool isBetter(double fit1, double fit2) { 00248 return m_checkOptime->isBetter(fit1,fit2); 00249 } 00250 00251 private: 00252 unsigned int m_neval; 00254 unsigned int m_maxeval; 00256 unsigned int m_maxmsecs; 00257 clock_t m_timeInit; 00258 00259 OptimeCriterion *m_checkOptime; 00261 bool m_optimized; 00263 Running *m_parent; 00264 list<Running*> m_children; 00265 00266 double m_best; 00267 }; 00268 00269 typedef Running* RunningPtr; 00270 } 00271 00272 #endif