3 #ifndef SE2EZ_CORE_KDE_ 4 #define SE2EZ_CORE_KDE_ 6 #include <ompl/datastructures/PDF.h> 7 #include <ompl/datastructures/Grid.h> 8 #include <ompl/datastructures/NearestNeighborsGNAT.h> 24 virtual ~Distribution() =
default;
26 virtual double pdf(
const Eigen::Ref<const Eigen::VectorXd> &x) = 0;
27 virtual void sample(Eigen::Ref<Eigen::VectorXd> sample) = 0;
29 void addPoint(
const Eigen::Ref<const Eigen::VectorXd> &x)
31 if (x.size() != dimension_)
33 x.size(), dimension_));
35 auto entry =
new Eigen::VectorXd(dimension_);
38 data_.emplace_back(entry);
44 data_.reserve(data_.size() + xs.
size());
45 for (
const auto &x : xs)
62 const Eigen::Ref<const Eigen::VectorXd> &min,
const Eigen::Ref<const Eigen::VectorXd> &max,
90 Bins::CellArray cells;
92 for (
const auto &cell : cells)
96 double pdf(
const Eigen::Ref<const Eigen::VectorXd> &x)
override 105 return bin->data->points.size() /
data_.
size();
115 const Index &index = data->bin->coord;
120 double u = l + width_[i];
133 unsigned int size = 30;
134 for (
unsigned int i = 0; i <
cells_; ++i)
140 unsigned int v = (bin) ? bin->data->points.size() : 0;
146 for (; j < size; ++j)
149 out <<
" : " << (double)v /
data_.
size();
156 const char ramp[11] =
" .:-=+*#%@";
157 for (
unsigned int i = 0; i <
cells_; ++i)
159 for (
unsigned int j = 0; j <
cells_; ++j)
166 unsigned int v = (bin) ? bin->data->points.size() : 0;
181 bin->data->points.emplace_back(x);
183 unsigned int points = bin->data->points.size();
184 pdf_.update(bin->data->element, points);
192 using Bins = ompl::Grid<Data *>;
195 using PDF = ompl::PDF<Data *>;
221 bin->data =
new Data;
223 bin->data->element =
pdf_.add(bin->data, 0.);
245 KDE(
unsigned int dimension)
247 ,
min_(Eigen::VectorXd::Zero(dimension))
248 ,
max_(Eigen::VectorXd::Zero(dimension))
249 , mean_(Eigen::VectorXd::Zero(dimension))
250 , sqMean_(Eigen::VectorXd::Zero(dimension))
251 , H_(Eigen::VectorXd::Zero(dimension))
253 neighbors_.setDistanceFunction([](
const auto &a,
const auto &b) {
return (*a - *b).norm(); });
256 double pdf(
const Eigen::Ref<const Eigen::VectorXd> &x)
override 270 const Eigen::VectorXd &v = x;
271 neighbors_.nearestK(&v, NEIGHBORS, entries);
280 for (
const auto &entry : entries)
284 a *= kernel(x[i], (*entry)[i], H_[i]) / H_[i];
290 return pdf / entries.size();
303 sample[i] = generate(sample[i], H_[i]);
307 const Eigen::Ref<const Eigen::VectorXd> &max,
unsigned int resolution)
314 unsigned int size = 30;
315 double width = (max[0] - min[0]) / resolution;
316 double map[resolution];
319 for (
unsigned int i = 0; i < resolution; ++i)
321 Eigen::VectorXd s(1);
322 s[0] = min[0] + i * width;
325 m = (m < map[i]) ? map[i] : m;
328 for (
unsigned int i = 0; i < resolution; ++i)
330 unsigned int ch =
math::remap(0, m, map[i], 0, size);
334 for (; j < size; ++j)
337 out <<
" : " << map[i];
345 const char ramp[11] =
" .:-=+*#%@";
347 Eigen::VectorXd width = (max - min) / resolution;
348 double map[resolution][resolution];
351 for (
unsigned int i = 0; i < resolution; ++i)
353 Eigen::VectorXd s(2);
354 s[0] = min[0] + i * width[0];
355 for (
unsigned int j = 0; j < resolution; ++j)
357 s[1] = min[1] + j * width[1];
360 m = (m < map[i][j]) ? map[i][j] : m;
364 for (
unsigned int i = 0; i < resolution; ++i)
366 for (
unsigned int j = 0; j < resolution; ++j)
368 unsigned int ch =
math::remap(0, m, map[i][j], 0, 10);
369 ch = (ch == 10) ? 9 : ch;
385 sqMean_ += (*x).cwiseProduct(*x);
390 virtual double kernel(
double x,
double m,
double s) = 0;
391 virtual double generate(
double m,
double s) = 0;
402 double mean = mean_[i] / num;
403 double sqMean = sqMean_[i] / num;
405 double sigma =
std::sqrt(sqMean - mean * mean);
406 H_[i] =
std::pow(4. / (dimension_ + 2), 1. / (dimension_ + 4))
407 *
std::pow(num, -1. / (dimension_ + 4))
422 ompl::NearestNeighborsGNAT<const Eigen::VectorXd *>
neighbors_;
424 const unsigned int NEIGHBORS = 1000;
435 double kernel(
double x,
double m,
double s)
override 437 double z = (x - m) / s;
double gaussianReal(double mean, double std)
Return a random number sampled from a gaussain with given std and mean.
double pdf(const Eigen::Ref< const Eigen::VectorXd > &x) override
Bin * getCell(const Eigen::Ref< const Eigen::VectorXd > &x)
void addPoints(const tf::EigenVector< Eigen::VectorXd > &xs)
ompl::Grid< Data * > Bins
Distribution(unsigned int dimension)
const Eigen::VectorXd max_
virtual void addedPoint(const Eigen::VectorXd *)
double uniformReal(double lower, double upper)
Return a uniform random number between lower and upper.
std::vector< const Eigen::VectorXd * > points
const unsigned int cells_
const Eigen::VectorXd width_
GaussianKDE(unsigned int dimension)
void toString(std::ostream &out, const Eigen::Ref< const Eigen::VectorXd > &min, const Eigen::Ref< const Eigen::VectorXd > &max, unsigned int resolution)
void addedPoint(const Eigen::VectorXd *x) override
KDE(unsigned int dimension)
void sample(Eigen::Ref< Eigen::VectorXd > sample) override
double kernel(double x, double m, double s) override
void addedPoint(const Eigen::VectorXd *x) override
Histogram(unsigned int dimension, const Eigen::Ref< const Eigen::VectorXd > &min, const Eigen::Ref< const Eigen::VectorXd > &max, unsigned int cells)
Index getIndex(const Eigen::Ref< const Eigen::VectorXd > &x)
void sample(Eigen::Ref< Eigen::VectorXd > sample) override
std::string format(const std::string &fmt, Args &&... args)
void addPoint(const Eigen::Ref< const Eigen::VectorXd > &x)
const Eigen::VectorXd min_
ompl::NearestNeighborsGNAT< const Eigen::VectorXd * > neighbors_
int uniformInteger(int lower, int upper)
Return a uniform random integer between lower and upper (inclusive).
double generate(double m, double s) override
void toString(std::ostream &out)
double remap(double a1, double a2, double av, double b1, double b2)
Remap a value av in the interval a1, a2 to the interval b1, b2.
double pdf(const Eigen::Ref< const Eigen::VectorXd > &x) override
std::vector< const Eigen::VectorXd * > data_
#define SE2EZ_CLASS_FORWARD(C)