00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __CSPPP_H
00021 #define __CSPPP_H
00022
00023 #ifndef __CSPPP_CPP
00024 #error "csp++-def.h must not be included directly - include csp++.h instead"
00025 #endif
00026
00027 #include <vector>
00028 #include <exception>
00029
00034 template<class T>
00035 struct CSPvariable {
00037 int index;
00038
00040 bool fixed;
00041
00043 T value;
00044
00046 std::vector<T> domain;
00047 };
00048
00053 class CSPexception : public std::exception {
00054 const char* message;
00055
00056 public:
00061 CSPexception (const char *m) {
00062 message = m;
00063 }
00064
00068 virtual const char* what() {
00069 return message;
00070 }
00071 };
00072
00077 template<class T>
00078 class CSP {
00079 private:
00080 template<class TT>
00081 struct arc {
00082 CSPvariable<TT> var[2];
00083 TT value[2];
00084 };
00085
00086 std::vector< CSPvariable<T> > variables;
00087 std::vector< bool (*)(std::vector< CSPvariable<T> >) > constraints;
00088 #define constraint constraints[0]
00089
00090 std::vector< std::vector<T> > __default_domains;
00091 T __default_value;
00092 bool __has_default_value;
00093 static bool __default_constraint ( std::vector< CSPvariable<T> > v ) { return true; }
00094 void __init ( int n, bool (*c)(std::vector< CSPvariable<T> >) );
00095 void restoreDomains ( void );
00096
00097 public:
00102 CSP() {}
00103
00113 CSP ( int n, bool (*c)(std::vector< CSPvariable<T> >) = __default_constraint );
00114
00128 CSP ( int n, T default_value, bool set_variables = false, bool (*c)(std::vector< CSPvariable<T> >) = __default_constraint );
00129
00135 void setDomain ( size_t index, std::vector<T> domain );
00136
00143 void setDomain ( size_t index, T domain[], int size );
00144
00149 void setConstraint ( bool (*c)(std::vector< CSPvariable<T> >) );
00150
00156 void setConstraint ( std::vector< bool(*)(std::vector< CSPvariable<T> >) > c );
00157
00162 void dropConstraint ( size_t index );
00163
00168 void appendConstraint ( bool (*c)(std::vector< CSPvariable<T> >) );
00169
00173 void refreshDomains( void );
00174
00180 std::vector<T> getDomain ( size_t index );
00181
00186 size_t getSize ( void );
00187
00193 void setValue ( size_t index, T value );
00194
00202 void unsetValue ( size_t index );
00203
00208 bool isSatisfiable ( void );
00209
00216 bool hasUniqueSolution ( void );
00217
00223 void assignUniqueDomains ( void );
00229 bool isSet ( size_t i );
00230
00240 T value ( size_t i );
00241 };
00242
00243 #endif
00244