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
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 }