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 #ifndef _CSP_KERNEL_Filter_H
00030 #define _CSP_KERNEL_Filter_H
00031
00032
00033 CSP_NAMESPACE_BEGIN(csp);
00034
00035
00036 class CSP_API Retraction;
00037
00038
00042 class CSP_API Filter
00043 {
00044 public:
00052 Filter(
00053 const wstring& fullName,
00054 const wstring& shortName,
00055 Problem& problem,
00056 Retraction& retraction) :
00057 m_fullName(fullName),
00058 m_shortName(shortName),
00059 m_problem(problem),
00060 m_retraction(retraction) {}
00061
00062 virtual ~Filter() {}
00063
00065 const wstring name() const {
00066 return m_fullName + L" (" + m_shortName + L")"; }
00067
00069 const wstring& fullName() const { return m_fullName; }
00070
00072 const wstring& shortName() const { return m_shortName; }
00073
00075 const Problem& problem() const { return m_problem; }
00076
00078 Problem& problem() { return m_problem; }
00079
00084 const Retraction& retraction() const { return m_retraction; }
00085
00090 Retraction& retraction() { return m_retraction; }
00091
00098 void recordDomainChange(
00099 Variable& victim,
00100 Variable& aggressor);
00101
00110 void recordFailure(
00111 Constraint& constraint,
00112 Variable& victim,
00113 Variable& aggressor);
00114
00123 void updateValueFailures(Domain& diffs);
00124
00168 virtual bool restoresArcConsistency() const = 0;
00169
00177 bool subProblemIsArcConsistent(bool debugging) const;
00178
00184 virtual bool isDummy() const { return false; }
00185
00236 virtual bool propagate(
00237 const vlist_type& uninstantiatedVariables,
00238 const vlist_type& modifiedVariables,
00239 const bool keepChanges = true) = 0;
00240
00248 const hash_set<const Variable*>& prunedVariables() const
00249 {
00250 return m_prunedVariables;
00251 }
00252
00264 virtual bool init(
00265 const vlist_type& ,
00266 bool = true)
00267 {
00268 return true;
00269 }
00270
00277 virtual void done() {}
00278
00287 virtual void restrict(const vlist_type& ) {}
00288
00293 virtual void unrestrict() {}
00294
00301 virtual wostream& print(wostream& wos) const
00302 {
00303 return wos << L"Filter: " << name() << endl;
00304 }
00305
00306 friend CSP_API wostream& operator<<(wostream& wos, const Filter& filter)
00307 {
00308 return filter.print(wos);
00309 }
00310
00319 static void saveState(const list<Variable*>& variables);
00320
00329 static void restoreState(const list<Variable*>& variables);
00330
00339 static void postponeState(const list<Variable*>& variables);
00340
00341 private:
00343 const wstring m_fullName;
00344
00346 const wstring m_shortName;
00347
00348 protected:
00350 Problem& m_problem;
00351
00353 Retraction& m_retraction;
00354
00356 void clearPrunedVariables() { m_prunedVariables.clear(); }
00357
00358 private:
00360 Filter(const Filter&);
00361
00363 Filter& operator=(const Filter&);
00364
00369 hash_set<const Variable*> m_prunedVariables;
00370 };
00371
00372
00373 CSP_NAMESPACE_END(csp);
00374
00375
00376 #endif // _CSP_KERNEL_Filter_H
00377
00378
00379
00380