00001 #ifndef _COLORING_MCMC_HPP 00002 #define _COLORING_MCMC_HPP 00003 00004 #include "properties.hpp" 00005 #include "random.hpp" 00006 #include "coloring.hpp" 00007 #include "arak.hpp" 00008 #include "mcmc.hpp" 00009 00010 namespace Arak { 00011 00015 class ColoringMove { 00016 00017 public: 00018 00026 virtual void execute(Coloring& c) = 0; 00027 00038 virtual void undo(Coloring& c) = 0; 00039 00043 virtual ~ColoringMove() {} 00044 00045 }; 00046 00050 class NullColoringMove : public ColoringMove { 00051 00052 public: 00053 00054 NullColoringMove() { } 00055 void execute(Coloring& c) { } 00056 void undo(Coloring& c) { } 00057 ~NullColoringMove() {} 00058 00062 static const NullColoringMove instance; 00063 00064 }; 00065 00076 class ColoringProposal { 00077 00078 public: 00079 00083 virtual ~ColoringProposal() {} 00084 00093 virtual void sample(const Coloring& state, 00094 Arak::Util::Random& random, 00095 bool reversible = true) = 0; 00096 00104 virtual ColoringMove& move() = 0; 00105 00111 virtual double ll(const Coloring& c) = 0; 00112 00120 virtual double rll(const Coloring& c) = 0; 00121 00126 virtual void result(bool accepted) = 0; 00127 }; 00128 00132 struct ArakMarkovChainTraits { 00133 typedef ArakProcess DistributionType; 00134 typedef Coloring StateType; 00135 typedef ColoringMove MoveType; 00136 typedef ColoringProposal ProposalType; 00137 }; 00138 00143 typedef MarkovChain<ArakMarkovChainTraits> ArakMarkovChain; 00144 00149 typedef AnnealedMarkovChain<ArakMarkovChainTraits> AnnealedArakMarkovChain; 00150 00155 typedef StochasticHillClimber<ArakMarkovChainTraits> HillClimbingArakMarkovChain; 00156 } 00157 00158 #endif