00001 /* 00002 * Copyright (C) 2009 Kamil Dudka <xdudka00@stud.fit.vutbr.cz> 00003 * 00004 * This file is part of nucad (Non-Uniform CA Designer). 00005 * 00006 * nucad is free software: you can redistribute it and/or modify 00007 * it under the terms of the GNU General Public License as published by 00008 * the Free Software Foundation, either version 3 of the License, or 00009 * any later version. 00010 * 00011 * nucad is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 * GNU General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU General Public License 00017 * along with nucad. If not, see <http://www.gnu.org/licenses/>. 00018 */ 00019 00025 #ifndef CA_DESIGNER_H 00026 #define CA_DESIGNER_H 00027 00028 #include "Ca.h" 00029 00030 class GABinaryString; 00031 class GAStatistics; 00032 00039 class IObserver { 00040 public: 00041 virtual ~IObserver() { } 00042 00048 virtual void notify() = 0; 00049 }; 00050 00057 class ISubject { 00058 public: 00059 virtual ~ISubject() { } 00060 00068 virtual void addObserver(IObserver *observer) = 0; 00069 }; 00070 00071 00077 class AbstractSubject: public ISubject { 00078 public: 00079 virtual ~AbstractSubject(); 00080 00081 // see ISubject dox 00082 virtual void addObserver(IObserver *); 00083 protected: 00084 AbstractSubject(); 00085 00091 void notify(); 00092 private: 00093 struct Private; 00094 Private *d; 00095 }; 00096 00102 class AbstractProcess: public AbstractSubject { 00103 public: 00104 virtual ~AbstractProcess(); 00105 00110 virtual void start(); 00111 00115 virtual void stop(); 00116 00121 virtual void reset(); 00122 00127 virtual int getStepsCount(); 00128 00129 protected: 00130 AbstractProcess(); 00131 00136 virtual void initialize() = 0; 00137 00142 virtual void doStep() = 0; 00143 00144 private: 00145 struct Private; 00146 Private *d; 00147 }; 00148 00154 class AbstractProcessWatched: public AbstractProcess { 00155 public: 00156 virtual ~AbstractProcessWatched(); 00157 virtual void start(); 00158 virtual void stop(); 00159 virtual void reset(); 00160 00165 virtual long getTimeElapsed(); 00166 00167 protected: 00168 AbstractProcessWatched(); 00169 00170 private: 00171 struct Private; 00172 Private *d; 00173 }; 00174 00180 class GaCaRules: public ICaRules { 00181 public: 00185 GaCaRules(const std::string &); 00186 00192 GaCaRules(size_t size, const GABinaryString &bs); 00193 virtual ~GaCaRules(); 00194 virtual GaCaRules* clone() const; 00195 virtual void getRuleAtPos(Pos, TRule5N &) const; 00196 00200 size_t size() const; 00201 00206 bool operator[] (unsigned index) const; 00207 00208 protected: 00209 GaCaRules(); 00210 GaCaRules(const GaCaRules &); 00211 00212 private: 00213 struct Private; 00214 Private *d; 00215 }; 00216 00222 std::ostream& operator<< (std::ostream &str, const GaCaRules &rules); 00223 00229 class GaCaRulesSet { 00230 public: 00231 GaCaRulesSet(); 00232 ~GaCaRulesSet(); 00233 00237 size_t size() const; 00238 00246 void add(GaCaRules *rules); 00247 00248 //GaCaRulesVector* createVector(); 00249 00253 void clear(); 00254 00255 private: 00256 struct Private; 00257 Private *d; 00258 }; 00259 00265 class CaDesigner: public AbstractProcessWatched 00266 { 00267 public: 00268 virtual ~CaDesigner(); 00269 00276 static CaDesigner* create(CaEvaluator *evaluator); 00277 00281 const GAStatistics& getStatistics() const; 00282 00286 int getSolutionsCount(); 00287 00291 int stopAtGeneration() const; 00292 00293 float minFitness(); 00294 float avgFitness(); 00295 float maxFitness(); 00296 00297 protected: 00301 CaDesigner (CaEvaluator *evaluator); 00302 00303 virtual void initialize(); 00304 virtual void doStep(); 00305 00306 private: 00307 struct Private; 00308 Private *d; 00309 }; 00310 00315 class TimedStop: public IObserver { 00316 public: 00321 TimedStop(AbstractProcessWatched *process, long msec); 00322 virtual ~TimedStop(); 00323 virtual void notify(); 00324 00325 private: 00326 struct Private; 00327 Private *d; 00328 }; 00329 00334 class ProgressWatch: public IObserver { 00335 public: 00341 ProgressWatch( 00342 AbstractProcess *process, 00343 int stepsTotal, 00344 std::ostream &streamTo); 00345 00346 virtual ~ProgressWatch(); 00347 virtual void notify(); 00348 00349 private: 00350 struct Private; 00351 Private *d; 00352 }; 00353 00359 class SolutionsCountStop: public IObserver { 00360 public: 00365 SolutionsCountStop(CaDesigner *solver, int minCountOfSolutions); 00366 virtual ~SolutionsCountStop(); 00367 virtual void notify(); 00368 00369 private: 00370 struct Private; 00371 Private *d; 00372 }; 00373 00378 class FitnessWatch: public IObserver { 00379 public: 00384 FitnessWatch(CaDesigner *solver, std::ostream &streamTo); 00385 virtual ~FitnessWatch(); 00386 virtual void notify(); 00387 void reset(); 00388 00389 private: 00390 struct Private; 00391 Private *d; 00392 }; 00393 00398 class ResultsWatch: public IObserver { 00399 public: 00404 ResultsWatch(CaDesigner *solver, std::ostream &streamTo); 00405 virtual ~ResultsWatch(); 00406 virtual void notify(); 00407 00408 private: 00409 struct Private; 00410 Private *d; 00411 }; 00412 00413 #endif // CA_DESIGNER_H 00414