00001 #include "geometry.hpp" 00002 #include "arak.hpp" 00003 00004 using namespace Arak; 00005 using namespace Arak::Geometry; 00006 00007 const double NEGATIVE_INFINITY = -1e10; 00008 00009 void ArakPrior::initialize() { 00010 c.addListener(*this); 00011 sumLengths = 0.0; 00012 sumLogLengths = 0.0; 00013 sumLogSines = 0.0; 00014 for (int i = 0; i < c.numVertices(Coloring::Vertex::INTERIOR); i++) 00015 vertexHasBeenAdded(c.getVertex(Coloring::Vertex::INTERIOR, i)); 00016 for (int i = 0; i < c.numVertices(Coloring::Vertex::BOUNDARY); i++) 00017 vertexHasBeenAdded(c.getVertex(Coloring::Vertex::BOUNDARY, i)); 00018 for (int i = 0; i < c.numInteriorEdges(); i++) 00019 edgeHasBeenAdded(c.getInteriorEdge(i)); 00020 } 00021 00022 void ArakPrior::vertexHasBeenAdded(Coloring::VertexHandle vh) { 00023 sumLogSines += std::max(NEGATIVE_INFINITY, vh->logSine()); 00024 } 00025 00026 void ArakPrior::vertexWillBeRemoved(Coloring::VertexHandle vh) { 00027 sumLogSines -= std::max(NEGATIVE_INFINITY, vh->logSine()); 00028 } 00029 00030 void ArakPrior::edgeHasBeenAdded(Coloring::IntEdgeHandle eh) { 00031 // TODO: deal with numerical instability 00032 double length = eh->length(); 00033 sumLengths += length; 00034 sumLogLengths += std::max(NEGATIVE_INFINITY, ln(length)); 00035 } 00036 00037 void ArakPrior::edgeWillBeRemoved(Coloring::IntEdgeHandle eh) { 00038 // std::cerr << sumLogSines << " " << sumLogLengths << std::endl; 00039 // TODO: deal with numerical instability 00040 double length = eh->length(); 00041 sumLengths -= length; 00042 sumLogLengths -= std::max(NEGATIVE_INFINITY, ln(length)); 00043 } 00044 00045 double ArakPrior::logMeasure() const { 00046 return (c.numInteriorEdges() * ln(p) 00047 - sumLogLengths 00048 + sumLogSines); 00049 } 00050 00051 00052 00053