00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __CSPPP_H
00022 #define __CSPPP_H
00023
00024 #ifndef __CSPPP_CPP
00025 #error "csp++-def.h must not be included directly - include csp++.h instead"
00026 #endif
00027
00028 #define __CSPPP_VERSION "0.1"
00029
00030 #include <vector>
00031 #include <exception>
00032
00037 template<class T>
00038 struct CSPvariable {
00040 int index;
00041
00043 bool fixed;
00044
00046 T value;
00047
00049 std::vector<T> domain;
00050 };
00051
00056 class CSPexception : public std::exception {
00057 const char* message;
00058
00059 public:
00064 CSPexception (const char *m) {
00065 message = m;
00066 }
00067
00071 virtual const char* what() {
00072 return message;
00073 }
00074 };
00075
00080 template<class T>
00081 class CSP {
00082 private:
00083 template<class TT>
00084 struct arc {
00085 CSPvariable<TT> var[2];
00086 TT value[2];
00087 };
00088
00089 std::vector< CSPvariable<T> > variables;
00090 std::vector< bool (*)(std::vector< CSPvariable<T> >) > constraints;
00091 #define constraint constraints[0]
00092
00093 std::vector< std::vector<T> > __default_domains;
00094 T __default_value;
00095 bool __has_default_value;
00096 static bool __default_constraint ( std::vector< CSPvariable<T> > v ) { return true; }
00097 void __init ( int n, bool (*c)(std::vector< CSPvariable<T> >) );
00098 void restoreDomains ( void );
00099
00100 public:
00105 CSP() {}
00106
00116 CSP ( int n, bool (*c)(std::vector< CSPvariable<T> >) = __default_constraint );
00117
00131 CSP ( int n, T default_value, bool set_variables = false, bool (*c)(std::vector< CSPvariable<T> >) = __default_constraint );
00132
00138 void setDomain ( size_t index, std::vector<T> domain );
00139
00146 void setDomain ( size_t index, T domain[], int size );
00147
00152 void setConstraint ( bool (*c)(std::vector< CSPvariable<T> >) );
00153
00159 void setConstraint ( std::vector< bool(*)(std::vector< CSPvariable<T> >) > c );
00160
00165 void dropConstraint ( size_t index );
00166
00171 void appendConstraint ( bool (*c)(std::vector< CSPvariable<T> >) );
00172
00178 void refreshDomains ( void );
00179
00184 void solve ( size_t maxIterations = 0 );
00185
00191 std::vector<T> domain ( size_t index );
00192
00197 size_t size ( void );
00198
00204 void setValue ( size_t index, T value );
00205
00213 void unsetValue ( size_t index );
00214
00219 bool isSatisfiable ( void );
00220
00227 bool hasUniqueSolution ( void );
00228
00234 void assignUniqueDomains ( void );
00240 bool isSet ( size_t i );
00241
00251 T value ( size_t i );
00252 };
00253
00254 #endif
00255