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 #ifndef _CSP_HEURISTICS_VALUE_MinDomain_H
00026 #define _CSP_HEURISTICS_VALUE_MinDomain_H
00027
00028
00029 #include "../../caches/MinDomainSizes.h"
00030
00031
00032 CSP_NAMESPACE_BEGIN(csp);
00033 CSP_NAMESPACE_BEGIN(heuristics);
00034 CSP_NAMESPACE_BEGIN(values);
00035
00036
00037 class MinDomainSizeLT :
00038 public StrictWeakValueOrdering
00039 {
00040 public:
00041 MinDomainSizeLT(caches::MinDomainSizes& minDomainSizes) :
00042 m_minDomainSizes(minDomainSizes) {}
00043
00044 bool operator()(const Value* value0, const Value* value1)
00045 {
00046 return
00047 m_minDomainSizes.minDomainSize(*value0) <
00048 m_minDomainSizes.minDomainSize(*value1);
00049 }
00050
00051 private:
00052 caches::MinDomainSizes& m_minDomainSizes;
00053 };
00054
00055
00056 class MinDomainSizeGT :
00057 public StrictWeakValueOrdering
00058 {
00059 public:
00060 MinDomainSizeGT(caches::MinDomainSizes& minDomainSizes) :
00061 m_minDomainSizes(minDomainSizes) {}
00062
00063 bool operator()(const Value* value0, const Value* value1)
00064 {
00065 return
00066 m_minDomainSizes.minDomainSize(*value0) >
00067 m_minDomainSizes.minDomainSize(*value1);
00068 }
00069
00070 private:
00071 caches::MinDomainSizes& m_minDomainSizes;
00072 };
00073
00074
00075 class MinDomainSizeEQ :
00076 public StrictWeakValueOrdering
00077 {
00078 public:
00079 MinDomainSizeEQ(caches::MinDomainSizes& minDomainSizes) :
00080 m_minDomainSizes(minDomainSizes),
00081 m_previousValue0(0),
00082 m_previousValue1(0),
00083 m_previousMinDomainSize0(0),
00084 m_previousMinDomainSize1(0) {}
00085
00086 bool operator()(const Value* value0, const Value* value1);
00087
00088 void reset()
00089 {
00090 m_previousValue0 = 0;
00091 m_previousValue1 = 0;
00092 m_previousMinDomainSize0 = 0;
00093 m_previousMinDomainSize1 = 0;
00094 }
00095
00096 private:
00097 caches::MinDomainSizes& m_minDomainSizes;
00098
00099 const Value* m_previousValue0;
00100 const Value* m_previousValue1;
00101
00102 size_t m_previousMinDomainSize0;
00103 size_t m_previousMinDomainSize1;
00104 };
00105
00106
00113 class CSP_API MinDomain :
00114 public ValueOH
00115 {
00116 public:
00117 enum Preference
00118 {
00120 Minimum,
00121
00123 Maximum
00124 };
00125
00139 MinDomain(
00140 Decomposition& decomposition,
00141 const vector<pair<double, double> >& intervals,
00142 double quality = 1,
00143 Preference preference = Maximum,
00144 bool analysis = false);
00145
00153 virtual void dynamicInit(Variable& variable, Domain& selectable);
00154
00161 virtual void dynamicDone(Variable& variable);
00162
00171 virtual void select(
00172 Domain& selectable,
00173 Domain& selected,
00174 Variable& variable);
00175
00184 virtual bool better(const Value& value0, const Value& value1);
00185
00193 virtual bool equal(const Value& value0, const Value& value1);
00194
00199 virtual void sort(
00200 Domain& original,
00201 Domain& sorted,
00202 Variable& variable);
00203
00215 virtual long double score(Variable& variable, const Value& value);
00216
00217 private:
00219 MinDomain(const MinDomain&);
00220
00222 MinDomain& operator=(const MinDomain&);
00223
00225 Preference m_preference;
00226
00228 caches::MinDomainSizes m_minDomainSizes;
00229
00232 MinDomainSizeLT m_compareLT;
00233
00236 MinDomainSizeGT m_compareGT;
00237
00240 MinDomainSizeEQ m_compareEQ;
00241 };
00242
00243
00244 CSP_NAMESPACE_END(values);
00245 CSP_NAMESPACE_END(heuristics);
00246 CSP_NAMESPACE_END(csp);
00247
00248
00249 #endif // _CSP_HEURISTICS_VALUE_MinDomain_H
00250
00251
00252
00253