00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef _CSP_KERNEL_Constraint_H
00031 #define _CSP_KERNEL_Constraint_H
00032
00033
00034 CSP_NAMESPACE_BEGIN(csp);
00035
00036
00040 class CSP_API Constraint
00041 {
00042 public:
00043 typedef FastVector<Variable*>::const_iterator variable_iterator;
00044
00048 Constraint();
00049
00051 virtual ~Constraint();
00052
00054 variable_iterator add(Variable& variable)
00055 {
00056 return m_variables.insert(&variable);
00057 }
00058
00060 void remove(Variable& variable, bool recursive = false);
00061
00063 void setId(id_t id) { m_id = id; }
00064
00066 id_t id() const { return m_id; }
00067
00075 virtual wstring name() const;
00076
00083 virtual wstring color() const { return L"black"; }
00084
00091 virtual wstring textColor() const { return L"black"; }
00092
00098 bool isActive() const { return m_active; }
00099
00101 void activate() { assert(!isActive()); m_active = true; }
00102
00104 void deactivate() { assert(isActive()); m_active = false; }
00105
00112 bool isComplete() const
00113 {
00114 return m_instantiatedVariables == m_variables.size();
00115 }
00116
00125 bool involves(const Variable& variable) const
00126 {
00127 return find(m_variables.begin(), m_variables.end(), &variable) !=
00128 m_variables.end();
00129 }
00130
00138 Variable& pair(const Variable& variable) const
00139 {
00140 assert(variables() == 2);
00141 assert(m_variables[0]);
00142 assert(m_variables[1]);
00143 assert(m_variables[0] != m_variables[1]);
00144 assert(&variable == m_variables[0] || &variable == m_variables[1]);
00145 return (&variable == m_variables[0]) ?
00146 *m_variables[1] : *m_variables[0];
00147 }
00148
00154 size_t variables() const { return m_variables.size(); }
00155
00157 size_t order() const { return variables(); }
00158
00160 const variable_iterator beginVariables() const
00161 {
00162 return m_variables.begin();
00163 }
00164
00166 const variable_iterator endVariables() const
00167 {
00168 return m_variables.end();
00169 }
00170
00178 const variable_iterator secondVariable() const
00179 {
00180 assert(order() >= 2);
00181 variable_iterator first = m_variables.begin();
00182 return ++first;
00183 }
00184
00194 Variable& findVariable(bool instantiated = false) const;
00195
00207 bool isSatisfied() const
00208 {
00209 if (!g_debugging) m_checks++;
00210 if (check()) return true;
00211 if (!g_debugging) m_failures++;
00212 return false;
00213 }
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225 virtual bool check() const = 0;
00226
00238 virtual bool propagate(Variable& ) { return true; }
00239
00244 bool tryOut(
00245 Variable& variable0,
00246 Value& value0,
00247 Variable& variable1,
00248 Value& value1) const;
00249
00253 virtual ulonglong validTuples() const;
00254
00260 ulonglong maxTuples() const;
00261
00265 long double tightness() const
00266 {
00267 return 1 - static_cast<long double>(validTuples()) / maxTuples();
00268 }
00269
00274 bool isLoose() const;
00275
00279 virtual ulonglong invalidTuples() const
00280 {
00281 return maxTuples() - validTuples();
00282 }
00283
00285 ulonglong checks() const { return m_checks; }
00286
00288 ulonglong failures() const { return m_failures; }
00289
00295 virtual void init() { m_checks = 0; m_failures = 0; m_weight = 0; }
00296
00298 virtual void done() {}
00299
00304 size_t instantiatedVariables() const { return m_instantiatedVariables; }
00305
00310 size_t uninstantiatedVariables() const
00311 {
00312 return variables() - m_instantiatedVariables;
00313 }
00314
00316 void inc() { m_instantiatedVariables++; }
00317
00319 void dec() { m_instantiatedVariables--; }
00320
00322 void incrementWeight() { m_weight++; }
00323
00325 ulonglong weight() const { return m_weight; }
00326
00333 virtual wostream& print(wostream& wos) const;
00334
00336 friend CSP_API wostream& operator<<(
00337 wostream& wos, const Constraint& constraint)
00338 {
00339 return constraint.print(wos);
00340 }
00341
00342 private:
00344 Constraint(const Constraint&);
00345
00347 Constraint& operator=(const Constraint&);
00348
00349
00350 int m_id;
00351
00352
00353 bool m_active;
00354
00355
00356 FastVector<Variable*> m_variables;
00357
00358
00359 size_t m_instantiatedVariables;
00360
00367 mutable ulonglong m_checks;
00368
00375 mutable ulonglong m_failures;
00376
00384 ulonglong m_weight;
00385 };
00386
00387
00388 CSP_NAMESPACE_END(csp);
00389
00390
00391 #endif // _CSP_KERNEL_Constraint_H
00392
00393
00394
00395