Main Page | Class Hierarchy | Class List | File List | Class Members

values/SolutionProbability.h

00001 // SolutionProbability.h -- The `maximum/minimum solution probability'
00002 // value ordering heuristic interface.
00003 
00004 /*
00005  * Copyright (C) 2004 Tudor Hulubei <tudor@hulubei.net>.
00006  *
00007  * This library is free software; you can redistribute it and/or modify
00008  * it under the terms of the GNU Lesser General Public License as
00009  * published by the Free Software Foundation; either version 2, or (at
00010  * your option) any later version.
00011  *
00012  * This library is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015  * GNU Lesser General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Lesser General Public
00018  * License along with this library; if not, write to the Free Software
00019  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA,
00020  * 02111-1307, USA.
00021  */
00022 
00023 // $Id: values_2SolutionProbability_8h-source.html,v 1.1 2005/05/25 12:37:18 tudor Exp $
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 //#define SP_VAL_LOOK_AROUND 1
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 // Local Variables:
00411 // mode: C++
00412 // End:

Generated on Wed May 25 12:21:15 2005 for csp.kdevelop by  doxygen 1.3.9.1