00001 #ifndef _ARAK_HPP
00002 #define _ARAK_HPP
00003
00004 #include "properties.hpp"
00005 #include "coloring.hpp"
00006
00007 namespace CGAL {
00008 class Qt_widget;
00009 }
00010
00011 namespace Arak {
00012
00051 class ArakProcess {
00052
00053 protected:
00054
00060 const Coloring& c;
00061
00062 public:
00063
00072 ArakProcess(const Coloring& c) : c(c) { }
00073
00077 virtual ~ArakProcess() { }
00078
00083 const Coloring& getColoring() const { return c; }
00084
00088 virtual double scale() const = 0;
00089
00098 virtual double logMeasure() const = 0;
00099
00111 virtual double potential() const = 0;
00112
00119 double logLikelihood(double temp = 1.0) const {
00120 return logMeasure() - potential() / temp;
00121 }
00122
00131 double logLikelihood(Coloring& c, double temp = 1.0) const {
00132 assert(c == this->c);
00133 return logLikelihood(temp);
00134 }
00135
00144 virtual void visualize(CGAL::Qt_widget& widget) const { }
00145 };
00146
00155 inline CGAL::Qt_widget&
00156 operator<<(CGAL::Qt_widget& widget, const ArakProcess& p) {
00157 p.visualize(widget);
00158 return widget;
00159 }
00160
00171 class ArakPrior : public ArakProcess, public Coloring::Listener {
00172
00173 protected:
00174
00180 double p;
00181
00194 double sumLogLengths;
00195
00212 double sumLogSines;
00213
00226 double sumLengths;
00227
00231 void initialize();
00232
00233 public:
00234
00244 ArakPrior(Coloring& c, double p = 1.0) : ArakProcess(c), p(p) {
00245 initialize();
00246 }
00247
00258 ArakPrior(Coloring& c, const Arak::Util::PropertyMap& props) :
00259 ArakProcess(c), p(1.0) {
00260 using namespace Arak::Util;
00261 assert(parse(getp(props, "arak.scale"), p));
00262 initialize();
00263 }
00264
00268 virtual ~ArakPrior() { }
00269
00273 virtual double scale() const { return p; }
00274
00284 virtual double logMeasure() const;
00285
00297 virtual double potential() const {
00298 return 2.0 * p * sumLengths;
00299 }
00300
00309 virtual void recolored(const Geometry::Point& a,
00310 const Geometry::Point& b,
00311 const Geometry::Point& c) { }
00312
00325 virtual void recolored(const Geometry::Point& a,
00326 const Geometry::Point& b,
00327 const Geometry::Point& c,
00328 const Geometry::Point& d) { }
00329
00336 virtual void vertexHasBeenAdded(Coloring::VertexHandle vh);
00337
00344 virtual void vertexWillBeRemoved(Coloring::VertexHandle vh);
00345
00352 virtual void edgeHasBeenAdded(Coloring::IntEdgeHandle eh);
00353
00360 virtual void edgeWillBeRemoved(Coloring::IntEdgeHandle eh);
00361
00370 virtual void visualize(CGAL::Qt_widget& widget) const { }
00371 };
00372
00373 }
00374
00375 #endif