00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <vector>
00020 #include <exception>
00021
00022 template<class T>
00023 struct CSPvariable {
00024 int index;
00025 T value;
00026 std::vector<T> domain;
00027 };
00028
00033 class CSPexception : public std::exception {
00034 const char* message;
00035
00036 public:
00037 CSPexception (const char *m) {
00038 message = m;
00039 }
00040
00041 virtual const char* what() {
00042 return message;
00043 }
00044 };
00045
00050 template<class T>
00051 class CSP {
00052 private:
00053 template<class TT>
00054 struct arc {
00055 CSPvariable<TT> var[2];
00056 TT value[2];
00057 };
00058
00059 std::vector<bool> fixed;
00060 std::vector< CSPvariable<T> > variables;
00061 std::vector< bool (*)(std::vector< CSPvariable<T> >) > constraints;
00062 #define constraint constraints[0]
00063
00064 std::vector< std::vector<T> > __default_domains;
00065 T __default_value;
00066 bool __has_default_value;
00067 static bool __default_constraint ( std::vector< CSPvariable<T> > v ) { return true; }
00068 void __init ( int n, bool (*c)(std::vector< CSPvariable<T> >) );
00069 void restoreDomains ( void );
00070
00071 public:
00081 CSP ( int n, bool (*c)(std::vector< CSPvariable<T> >) = __default_constraint );
00082
00096 CSP ( int n, T default_value, bool set_variables = false, bool (*c)(std::vector< CSPvariable<T> >) = __default_constraint );
00097
00104 void setDomain ( size_t index, std::vector<T> domain );
00105
00113 void setDomain ( size_t index, T domain[], int size );
00114
00120 void setConstraint ( bool (*c)(std::vector< CSPvariable<T> >) );
00121
00128 void setConstraint ( std::vector< bool(*)(std::vector< CSPvariable<T> >) > c );
00129
00135 void dropConstraint ( size_t index );
00136
00142 void appendConstraint ( bool (*c)(std::vector< CSPvariable<T> >) );
00143
00148 void refreshDomains( void );
00149
00156 std::vector<T> getDomain ( size_t index );
00157
00163 size_t getSize ( void );
00164
00171 void setValue ( size_t index, T value );
00172
00181 void unsetValue ( size_t index );
00182
00188 bool isSatisfiable ( void );
00189
00190
00198 bool hasUniqueSolution ( void );
00199 };
00200