Main Page | Modules | Namespace List | Class Hierarchy | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

point_obs.cpp

Go to the documentation of this file.
00001 #include <fstream>
00002 #include <CGAL/IO/Qt_widget.h>
00003 #include "point_obs.hpp"
00004 #include "query_point.hpp"
00005 
00006 using namespace Arak;
00007 using namespace Arak::Geometry;
00008 
00009 ArakPosteriorGaussianObs::ArakPosteriorGaussianObs(const ArakProcess& prior,
00010                const Arak::Util::PropertyMap& props) 
00011   : ArakProcess(prior.getColoring()), prior(prior), lp(0.0) {
00012   using namespace Arak::Util;
00013   assert(parse(getp(props, "arak.gaussian_obs.white_mean"), whiteMean));
00014   assert(parse(getp(props, "arak.gaussian_obs.white_var"), whiteVar));
00015   assert(parse(getp(props, "arak.gaussian_obs.black_mean"), blackMean));
00016   assert(parse(getp(props, "arak.gaussian_obs.black_var"), blackVar));
00017   const std::string& datafile_path = 
00018     getp(props, "arak.gaussian_obs.data_file");
00019   std::ifstream in(datafile_path.data());
00020   assert(in.good());
00021   int n;
00022   in >> n;
00023   std::vector<Geometry::Point> pts;
00024   points.reserve(n);
00025   obs.reserve(n);
00026   potentials.reserve(n);
00027   for (int i = 0; i < n; i++) {
00028     Geometry::Point p;
00029     double o;
00030     in >> p;
00031     in >> o;
00032     points.push_back(p);
00033     obs.push_back(o);
00034     double blackPotential = 
00035       (o - blackMean) * (o - blackMean) / 2.0 * blackVar;
00036     double whitePotential = 
00037       (o - whiteMean) * (o - whiteMean) / 2.0 * whiteVar;
00038     potentials.push_back(new QueryPointPotential(lp,
00039              blackPotential,
00040              whitePotential));
00041   }
00042   assert(!in.bad());
00043   QueryPointIndex index(points, potentials);
00044   assert(lp == 0.0);
00045   c.addQueryPoints(index);
00046 }
00047 
00048 double ArakPosteriorGaussianObs::logMeasure() const {
00049   return prior.logMeasure();
00050 }
00051 
00052 double ArakPosteriorGaussianObs::potential() const {
00053   return prior.potential() + lp;
00054 }
00055 
00056 ArakPosteriorGaussianObs::~ArakPosteriorGaussianObs() { 
00057   for (int i = 0; i < int(potentials.size()); i++)
00058     delete potentials[i];
00059 }
00060 
00061 void ArakPosteriorGaussianObs::visualize(CGAL::Qt_widget& widget) const {
00062   // Compute the mapping from observations to colors.
00063   double white = std::min<double>(blackMean - 3.0 * sqrt(blackVar),
00064           whiteMean - 3.0 * sqrt(whiteVar));
00065   double black = std::max<double>(blackMean + 3.0 * sqrt(blackVar),
00066           whiteMean + 3.0 * sqrt(whiteVar));
00067   for (int i = 0; i < int(points.size()); i++) {
00068     CGAL::Color c;
00069     if (obs[i] <= white)
00070       c = CGAL::WHITE;
00071     else if (obs[i] >= black) 
00072       c = CGAL::BLACK;
00073     else {
00074       double w = (obs[i] - white) / (black - white);
00075       int v = 255 - int(w * 255.0);
00076       c = CGAL::Color(v, v, v);
00077     }
00078     widget << c << points[i];
00079   }
00080 }
00081 
00082 ArakPosteriorBernoulliObs::ArakPosteriorBernoulliObs(const ArakProcess& prior,
00083                  const Arak::Util::PropertyMap& props) 
00084   : ArakProcess(prior.getColoring()), prior(prior), lp(0.0) {
00085   using namespace Arak::Util;
00086   assert(parse(getp(props, "arak.bernoulli_obs.white_prob"), whiteProb));
00087   assert(parse(getp(props, "arak.bernoulli_obs.black_prob"), blackProb));
00088   const std::string& datafile_path = 
00089     getp(props, "arak.bernoulli_obs.data_file");
00090   std::ifstream in(datafile_path.data());
00091   assert(in.good());
00092   int n;
00093   in >> n;
00094   points.reserve(n);
00095   obs.reserve(n);
00096   potentials.reserve(n);
00097   for (int i = 0; i < n; i++) {
00098     Geometry::Point p;
00099     int o;
00100     in >> p;
00101     in >> o;
00102     points.push_back(p);
00103     obs.push_back(o == 0);
00104     double blackPotential = (o == 0) ? -ln(1.0 - blackProb) : -ln(blackProb);
00105     double whitePotential = (o == 0) ? -ln(whiteProb) : -ln(1.0 - whiteProb);
00106     potentials.push_back(new QueryPointPotential(lp,
00107              blackPotential,
00108              whitePotential));
00109   }
00110   assert(!in.bad());
00111   QueryPointIndex index(points, potentials);
00112   c.addQueryPoints(index);
00113 }
00114 
00115 double ArakPosteriorBernoulliObs::logMeasure() const {
00116   return prior.logMeasure();
00117 }
00118 
00119 double ArakPosteriorBernoulliObs::potential() const {
00120   return prior.potential() + lp;
00121 }
00122 
00123 ArakPosteriorBernoulliObs::~ArakPosteriorBernoulliObs() { 
00124   for (int i = 0; i < int(potentials.size()); i++)
00125     delete potentials[i];
00126 }
00127 
00128 void ArakPosteriorBernoulliObs::visualize(CGAL::Qt_widget& widget) const {
00129   for (int i = 0; i < int(points.size()); i++) {
00130     CGAL::Color c;
00131     if (obs[i])
00132       c = CGAL::BLACK;
00133     else 
00134       c = CGAL::RED;
00135     widget << c << points[i];
00136   }
00137 }

Generated on Wed May 25 14:39:18 2005 for Arak by doxygen 1.3.6