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_SolutionProbability_H
00026 #define _CSP_HEURISTICS_VALUE_SolutionProbability_H
00027
00028
00029 #include "../../caches/DomainSizes.h"
00030
00031
00032
00033
00034
00035 #ifdef SP_VAL_LOOK_AROUND
00036 #include <gmpxx.h>
00037 #endif
00038
00039
00040 CSP_NAMESPACE_BEGIN(csp);
00041 CSP_NAMESPACE_BEGIN(heuristics);
00042 CSP_NAMESPACE_BEGIN(values);
00043
00044
00045 class SolutionProbability;
00046
00047
00048 class SolutionProbabilityLT :
00049 public StrictWeakValueOrdering
00050 {
00051 public:
00052 SolutionProbabilityLT() :
00053 m_variable(0),
00054 m_heuristic(0),
00055 m_avs(0),
00056 m_acs(0) {}
00057
00058 bool operator()(const Value* value0, const Value* value1);
00059
00060 void init(
00061 Variable& variable,
00062 SolutionProbability& heuristic,
00063 const Decomposition::ActiveVariablesSet& avs,
00064 const Decomposition::ActiveConstraintsSet& acs)
00065 {
00066 m_variable = &variable;
00067 m_heuristic = &heuristic;
00068 m_avs = &avs;
00069 m_acs = &acs;
00070 }
00071
00072 private:
00073 Variable* m_variable;
00074 SolutionProbability* m_heuristic;
00075 const Decomposition::ActiveVariablesSet* m_avs;
00076 const Decomposition::ActiveConstraintsSet* m_acs;
00077 };
00078
00079
00080 class SolutionProbabilityGT :
00081 public StrictWeakValueOrdering
00082 {
00083 public:
00084 SolutionProbabilityGT() :
00085 m_variable(0),
00086 m_heuristic(0),
00087 m_avs(0),
00088 m_acs(0) {}
00089
00090 bool operator()(const Value* value0, const Value* value1);
00091
00092 void init(
00093 Variable& variable,
00094 SolutionProbability& heuristic,
00095 const Decomposition::ActiveVariablesSet& avs,
00096 const Decomposition::ActiveConstraintsSet& acs)
00097 {
00098 m_variable = &variable;
00099 m_heuristic = &heuristic;
00100 m_avs = &avs;
00101 m_acs = &acs;
00102 }
00103
00104 private:
00105 Variable* m_variable;
00106 SolutionProbability* m_heuristic;
00107 const Decomposition::ActiveVariablesSet* m_avs;
00108 const Decomposition::ActiveConstraintsSet* m_acs;
00109 };
00110
00111
00112 class SolutionProbabilityEQ :
00113 public StrictWeakValueOrdering
00114 {
00115 public:
00116 SolutionProbabilityEQ() :
00117 m_variable(0),
00118 m_heuristic(0),
00119 m_avs(0),
00120 m_acs(0),
00121 m_previousValue0(0),
00122 m_previousValue1(0),
00123 m_previousSolutionProbability0(0),
00124 m_previousSolutionProbability1(0) {}
00125
00126 bool operator()(const Value* value0, const Value* value1);
00127
00128 void init(
00129 Variable& variable,
00130 SolutionProbability& heuristic,
00131 const Decomposition::ActiveVariablesSet& avs,
00132 const Decomposition::ActiveConstraintsSet& acs)
00133 {
00134 m_variable = &variable;
00135 m_heuristic = &heuristic;
00136 m_avs = &avs;
00137 m_acs = &acs;
00138 }
00139
00140 void reset()
00141 {
00142 m_previousValue0 = 0;
00143 m_previousValue1 = 0;
00144 m_previousSolutionProbability0 = 0;
00145 m_previousSolutionProbability1 = 0;
00146 }
00147
00148 private:
00149 #ifdef SP_VAL_LOOK_AROUND
00150 typedef mpf_class Real;
00151 #else
00152 typedef long double Real;
00153 #endif
00154
00155 Variable* m_variable;
00156 SolutionProbability* m_heuristic;
00157 const Decomposition::ActiveVariablesSet* m_avs;
00158 const Decomposition::ActiveConstraintsSet* m_acs;
00159
00160 const Value* m_previousValue0;
00161 const Value* m_previousValue1;
00162
00163 Real m_previousSolutionProbability0;
00164 Real m_previousSolutionProbability1;
00165 };
00166
00167
00175 class CSP_API SolutionProbability :
00176 public ValueOH
00177 {
00178 public:
00179 #ifdef SP_VAL_LOOK_AROUND
00180 typedef mpf_class Real;
00181 #else
00182 typedef long double Real;
00183 #endif
00184
00185 enum Preference
00186 {
00188 Minimum,
00189
00191 Maximum
00192 };
00193
00204 SolutionProbability(
00205 Decomposition& decomposition,
00206 const vector<pair<double, double> >& intervals,
00207 double quality = 1,
00208 Preference preference = Maximum,
00209 bool analysis = false);
00210
00219 virtual void select(
00220 Domain& selectable,
00221 Domain& selected,
00222 Variable& variable);
00223
00232 virtual bool better(const Value& value0, const Value& value1);
00233
00241 virtual bool equal(const Value& value0, const Value& value1);
00242
00247 virtual void sort(
00248 Domain& original,
00249 Domain& sorted,
00250 Variable& variable);
00251
00263 virtual long double score(Variable& variable, const Value& value);
00264
00265 private:
00267 SolutionProbability(const SolutionProbability&);
00268
00270 SolutionProbability& operator=(const SolutionProbability&);
00271
00279 ulonglong maxTuples(const Constraint& constraint) const;
00280
00287 Real constraintProbability(const Constraint& constraint) const;
00288
00296 void computeProbabilities(
00297 const Decomposition::ActiveConstraintsSet& acs,
00298 const Decomposition::ActiveVariablesSet& avs);
00299
00305 void computeMaxTuples(
00306 const Decomposition::ActiveConstraintsSet& acs);
00307
00314 void computeValueProbabilities(
00315 const Decomposition::ActiveVariablesSet& avs);
00316
00318 void clearCaches();
00319
00327 Real subproblemSolutionProbability(
00328 const Decomposition::ActiveConstraintsSet& acs) const;
00329
00342 Real valueSubproblemSolutionProbability(
00343 Variable& variable,
00344 Value& value,
00345 const Decomposition::ActiveVariablesSet& avs,
00346 const Decomposition::ActiveConstraintsSet& acs);
00347
00349 typedef hash_map<const Constraint*, Real> cp_type;
00350
00352 typedef hash_map<const Constraint*, ulonglong> mt_type;
00353
00355 typedef hash_map<const Value*, Real> vp_type;
00356
00358 typedef hash_map<const Variable*, vp_type*> vs_type;
00359
00361 cp_type m_constraintProbabilities;
00362
00364 mt_type m_maxTuples;
00365
00367 vs_type m_valueProbabilities;
00368
00370 mutable caches::DomainSizes m_values;
00371
00373 Preference m_preference;
00374
00380 Real m_precision;
00381
00384 SolutionProbabilityLT m_compareLT;
00385
00388 SolutionProbabilityGT m_compareGT;
00389
00392 SolutionProbabilityEQ m_compareEQ;
00393
00394 friend bool SolutionProbabilityLT::operator()(
00395 const Value* value0, const Value* value1);
00396 friend bool SolutionProbabilityGT::operator()(
00397 const Value* value0, const Value* value1);
00398 friend bool SolutionProbabilityEQ::operator()(
00399 const Value* value0, const Value* value1);
00400 };
00401
00402
00403 CSP_NAMESPACE_END(values);
00404 CSP_NAMESPACE_END(heuristics);
00405 CSP_NAMESPACE_END(csp);
00406
00407
00408 #endif // _CSP_HEURISTICS_VALUE_SolutionProbability_H
00409
00410
00411
00412