00001 /* 00002 * Copyright (C) 2008 Kamil Dudka <xdudka00@stud.fit.vutbr.cz> 00003 * 00004 * This file is part of fss (Fast SAT Solver). 00005 * 00006 * fss 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 * fss 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 fss. If not, see <http://www.gnu.org/licenses/>. 00018 */ 00019 00020 #ifndef SATSOLVER_H 00021 #define SATSOLVER_H 00022 00031 #include <iostream> 00032 00033 namespace FastSatSolver { 00034 class SatProblem; 00035 00042 class ISatItem 00043 { 00044 public: 00045 virtual ~ISatItem() { } 00046 00051 virtual ISatItem* clone() const = 0; 00052 00057 virtual int getLength ( ) const = 0; 00058 00063 virtual bool getBit (int index ) const = 0; 00064 }; 00065 00072 class IObserver { 00073 public: 00074 virtual ~IObserver() { } 00075 00081 virtual void notify() = 0; 00082 }; 00083 00090 class ISubject { 00091 public: 00092 virtual ~ISubject() { } 00093 00101 virtual void addObserver(IObserver *observer) = 0; 00102 }; 00103 00104 00110 class AbstractSubject: public ISubject { 00111 public: 00112 virtual ~AbstractSubject(); 00113 00114 // see ISubject dox 00115 virtual void addObserver(IObserver *); 00116 protected: 00117 AbstractSubject(); 00118 00124 void notify(); 00125 private: 00126 struct Private; 00127 Private *d; 00128 }; 00129 00135 class IProcess { 00136 public: 00137 virtual ~IProcess() { } 00138 00143 virtual void start() = 0; 00144 00148 virtual void stop() = 0; 00149 00154 virtual void reset() = 0; 00155 }; 00156 00162 class AbstractProcess: 00163 public AbstractSubject, 00164 public IProcess 00165 { 00166 public: 00167 virtual ~AbstractProcess(); 00168 virtual void start(); 00169 virtual void stop(); 00170 virtual void reset(); 00171 00176 virtual int getStepsCount(); 00177 protected: 00178 AbstractProcess(); 00179 00184 virtual void initialize() = 0; 00185 00190 virtual void doStep() = 0; 00191 private: 00192 struct Private; 00193 Private *d; 00194 }; 00195 00201 class IStopWatch { 00202 public: 00203 virtual ~IStopWatch() { } 00204 00209 virtual long getTimeElapsed() = 0; 00210 }; 00211 00217 class AbstractProcessWatched: 00218 public AbstractProcess, 00219 public IStopWatch 00220 { 00221 public: 00222 virtual ~AbstractProcessWatched(); 00223 virtual void start(); 00224 virtual void stop(); 00225 virtual void reset(); 00226 virtual long getTimeElapsed(); 00227 protected: 00228 AbstractProcessWatched(); 00229 private: 00230 struct Private; 00231 Private *d; 00232 }; 00233 00240 class SatItemVector { 00241 public: 00242 SatItemVector(); 00243 SatItemVector(const SatItemVector &); 00244 ~SatItemVector(); 00245 00249 int getLength() const; 00250 00256 ISatItem* getItem(int index) const; 00257 00264 void addItem(ISatItem *item); 00265 00269 void clear(); 00270 00277 void writeOut(SatProblem *, std::ostream &streamTo) const; 00278 private: 00279 struct Private; 00280 Private *d; 00281 }; 00282 00289 class SatItemSet { 00290 public: 00291 SatItemSet(); 00292 ~SatItemSet(); 00293 00297 int getLength(); 00298 00305 void addItem(ISatItem *item); 00306 00311 SatItemVector* createVector(); 00312 00316 void clear(); 00317 private: 00318 struct Private; 00319 Private *d; 00320 }; 00321 00328 class AbstractSatSolver: public AbstractProcessWatched 00329 { 00330 public: 00331 virtual ~AbstractSatSolver(); 00332 00337 virtual SatProblem* getProblem() = 0; 00338 00343 virtual int getSolutionsCount() = 0; 00344 00350 virtual SatItemVector* getSolutionVector() = 0; 00351 00355 virtual float minFitness() = 0; 00356 00360 virtual float avgFitness() = 0; 00361 00366 virtual float maxFitness() = 0; 00367 00368 protected: 00369 AbstractSatSolver(); 00370 00371 private: 00372 struct Private; 00373 Private *d; 00374 }; 00375 00376 } // namespace FastSatSolver 00377 00378 #endif // SATSOLVER_H
1.5.4