ProbabilityMeasures.h
Go to the documentation of this file.
1/*
2* This file is part of ArmarX.
3*
4* ArmarX is free software; you can redistribute it and/or modify
5* it under the terms of the GNU General Public License version 2 as
6* published by the Free Software Foundation.
7*
8* ArmarX is distributed in the hope that it will be useful, but
9* WITHOUT ANY WARRANTY; without even the implied warranty of
10* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11* GNU General Public License for more details.
12*
13* You should have received a copy of the GNU General Public License
14* along with this program. If not, see <http://www.gnu.org/licenses/>.
15*
16* @package MemoryX::Core
17* @author Alexey Kozlov ( kozlov at kit dot edu)
18* @date 2012
19* @copyright http://www.gnu.org/licenses/gpl-2.0.txt
20* GNU General Public License
21*/
22
23#pragma once
24
25#include <Eigen/Core>
26
28
29#include <MemoryX/interface/core/ProbabilityMeasures.h>
30
31namespace armarx::VariantType
32{
33 // variant types
35 armarx::Variant::addTypeName("::memoryx::DiscreteProbabilityBase");
37 armarx::Variant::addTypeName("::memoryx::UnivariateNormalDistributionBase");
39 armarx::Variant::addTypeName("::memoryx::IsotropicNormalDistributionBase");
41 armarx::Variant::addTypeName("::memoryx::MultivariateNormalDistributionBase");
43 armarx::Variant::addTypeName("::memoryx::GaussianMixtureDistributionBase");
44} // namespace armarx::VariantType
45
46namespace memoryx
47{
48 /**
49 * @brief The DiscreteProbability class
50 * @ingroup VariantsGrp
51 */
52 class DiscreteProbability : virtual public memoryx::DiscreteProbabilityBase
53 {
54 public:
56 DiscreteProbability(::Ice::Float var);
57 ~DiscreteProbability() override;
58
59 ::Ice::Float getProbability(const ::Ice::Current& = Ice::emptyCurrent) const override;
60 void setProbability(::Ice::Float, const ::Ice::Current& = Ice::emptyCurrent) override;
61
62 // inherited from VariantDataClass
63 Ice::ObjectPtr
64 ice_clone() const override
65 {
66 return this->clone();
67 }
68
69 armarx::VariantDataClassPtr
70 clone(const Ice::Current& c = Ice::emptyCurrent) const override
71 {
72 return new DiscreteProbability(this->prob);
73 }
74
75 std::string
76 output(const Ice::Current& c = Ice::emptyCurrent) const override
77 {
78 std::stringstream s;
79 s << prob;
80 return s.str();
81 }
82
84 getType(const Ice::Current& c = Ice::emptyCurrent) const override
85 {
87 }
88
89 bool
90 validate(const Ice::Current& c = Ice::emptyCurrent) override
91 {
92 return true;
93 }
94
95 public: // serialization
96 void serialize(const armarx::ObjectSerializerBasePtr& serializer,
97 const ::Ice::Current& = Ice::emptyCurrent) const override;
98 void deserialize(const armarx::ObjectSerializerBasePtr& serializer,
99 const ::Ice::Current& = Ice::emptyCurrent) override;
100 };
101
102 class NormalDistribution : virtual public memoryx::NormalDistributionBase
103 {
104 public:
105 int
106 getDimensions(const ::Ice::Current& = Ice::emptyCurrent) const override
107 {
108 return dimensions;
109 }
110
111 FloatVector
112 getMean(const ::Ice::Current& = Ice::emptyCurrent) const override
113 {
114 return mean;
115 }
116
117 void
118 setMean(const FloatVector& mean, const ::Ice::Current& = Ice::emptyCurrent) override
119 {
120 this->mean = mean;
121 }
122
123 float getCovariance(int row,
124 int col,
125 const ::Ice::Current& = Ice::emptyCurrent) const override = 0;
126
127 Eigen::VectorXf toEigenMean() const;
128 void fromEigenMean(const Eigen::VectorXf& mean);
129
130 virtual Eigen::MatrixXf toEigenCovariance() const = 0;
131 virtual void fromEigenCovariance(const Eigen::MatrixXf& cov) = 0;
132 virtual float getDensity(const Eigen::VectorXf& p) = 0;
133
134 std::string output(const Ice::Current& c = Ice::emptyCurrent) const override;
135
136 protected:
137 NormalDistribution(int dimensions);
138 NormalDistribution(const FloatVector& mean);
139 NormalDistribution(const Eigen::VectorXf& mean);
141
142 protected: // serialization
143 void serialize(const armarx::ObjectSerializerBasePtr& serializer,
144 const ::Ice::Current& = Ice::emptyCurrent) const override;
145 void deserialize(const armarx::ObjectSerializerBasePtr& serializer,
146 const ::Ice::Current& = Ice::emptyCurrent) override;
147 };
148
150
151 /**
152 * @brief The UnivariateNormalDistribution class
153 * @ingroup VariantsGrp
154 */
156 virtual public memoryx::UnivariateNormalDistributionBase,
157 virtual public memoryx::NormalDistribution
158 {
159 public:
161 UnivariateNormalDistribution(float mean, float var);
163
164 ::Ice::Float getVariance(const ::Ice::Current& = Ice::emptyCurrent) const override;
165 void setVariance(::Ice::Float, const ::Ice::Current& = Ice::emptyCurrent) override;
166
167 float
168 getCovariance(int row, int col, const ::Ice::Current& = Ice::emptyCurrent) const override;
169 Eigen::MatrixXf toEigenCovariance() const override;
170 void fromEigenCovariance(const Eigen::MatrixXf& cov) override;
171
172 float
173 getDensity(const Eigen::VectorXf& p) override
174 {
175 return 0.;
176 }
177
178 // inherited from VariantDataClass
179 Ice::ObjectPtr
180 ice_clone() const override
181 {
182 return this->clone();
183 }
184
185 armarx::VariantDataClassPtr
186 clone(const Ice::Current& c = Ice::emptyCurrent) const override
187 {
188 return new UnivariateNormalDistribution(*this);
189 }
190
191 // std::string output(const Ice::Current& c = Ice::emptyCurrent) const { std::stringstream s; s << variance; return s.str(); };
193 getType(const Ice::Current& c = Ice::emptyCurrent) const override
194 {
196 }
197
198 bool
199 validate(const Ice::Current& c = Ice::emptyCurrent) override
200 {
201 return true;
202 }
203
204 public: // serialization
205 void serialize(const armarx::ObjectSerializerBasePtr& serializer,
206 const ::Ice::Current& = Ice::emptyCurrent) const override;
207 void deserialize(const armarx::ObjectSerializerBasePtr& serializer,
208 const ::Ice::Current& = Ice::emptyCurrent) override;
209 };
210
212
213 /**
214 * @brief The IsotropicNormalDistribution class
215 * @ingroup VariantsGrp
216 */
218 virtual public memoryx::IsotropicNormalDistributionBase,
219 virtual public memoryx::NormalDistribution
220 {
221 public:
222 IsotropicNormalDistribution(int dimensions = 0);
223 IsotropicNormalDistribution(const FloatVector& mean, const FloatVector& vars);
224 IsotropicNormalDistribution(const Eigen::VectorXf& mean, const Eigen::VectorXf& vars);
226
227 ::Ice::Float getVariance(::Ice::Int dim,
228 const ::Ice::Current& = Ice::emptyCurrent) const override;
229 void setVariance(::Ice::Int dim,
230 ::Ice::Float,
231 const ::Ice::Current& = Ice::emptyCurrent) override;
232
233 float
234 getCovariance(int row, int col, const ::Ice::Current& = Ice::emptyCurrent) const override;
235 Eigen::MatrixXf toEigenCovariance() const override;
236 void fromEigenCovariance(const Eigen::MatrixXf& cov) override;
237
238 float
239 getDensity(const Eigen::VectorXf& p) override
240 {
241 return 0.;
242 }
243
244 // inherited from VariantDataClass
245 Ice::ObjectPtr
246 ice_clone() const override
247 {
248 return this->clone();
249 }
250
251 armarx::VariantDataClassPtr
252 clone(const Ice::Current& c = Ice::emptyCurrent) const override
253 {
254 return new IsotropicNormalDistribution(*this);
255 }
256
258 getType(const Ice::Current& c = Ice::emptyCurrent) const override
259 {
261 }
262
263 bool
264 validate(const Ice::Current& c = Ice::emptyCurrent) override
265 {
266 return true;
267 }
268
269 public: // serialization
270 void serialize(const armarx::ObjectSerializerBasePtr& serializer,
271 const ::Ice::Current& = Ice::emptyCurrent) const override;
272 void deserialize(const armarx::ObjectSerializerBasePtr& serializer,
273 const ::Ice::Current& = Ice::emptyCurrent) override;
274 };
275
277
280
281 /**
282 * @brief The MultivariateNormalDistribution class
283 * @ingroup VariantsGrp
284 */
286 virtual public memoryx::MultivariateNormalDistributionBase,
287 virtual public memoryx::NormalDistribution
288 {
289 public:
290 MultivariateNormalDistribution(int dimensions = 0);
291 MultivariateNormalDistribution(const FloatVector& mean, const FloatVector& vars);
292 MultivariateNormalDistribution(const Eigen::VectorXf& mean, const Eigen::MatrixXf& vars);
294
295 /*!
296 * \brief Create a distribution with uncertainty of variance in all directions (default: variance = 10000, i.e. standard deviation is 100 mm)
297 * \param variance
298 * \return
299 */
301 CreateDefaultDistribution(float variance = 10000)
302 {
303 Eigen::Matrix3f covar = variance * Eigen::Matrix3f::Identity();
304 Eigen::Vector3f mean = Eigen::Vector3f::Zero();
306 new MultivariateNormalDistribution(mean, covar));
307 }
308
309 float
310 getCovariance(int row, int col, const ::Ice::Current& = Ice::emptyCurrent) const override;
311 void setCovariance(::Ice::Int row,
312 ::Ice::Int col,
313 ::Ice::Float cov,
314 const ::Ice::Current& = Ice::emptyCurrent) override;
315 float getVarianceScalar(const ::Ice::Current& = Ice::emptyCurrent) const override;
316
317 Eigen::MatrixXf toEigenCovariance() const override;
318 void fromEigenCovariance(const Eigen::MatrixXf& cov) override;
319 float getDensity(const Eigen::VectorXf& point) override;
320
321 // inherited from VariantDataClass
322 Ice::ObjectPtr
323 ice_clone() const override
324 {
325 return this->clone();
326 }
327
328 armarx::VariantDataClassPtr
329 clone(const Ice::Current& c = Ice::emptyCurrent) const override
330 {
331 return new MultivariateNormalDistribution(*this);
332 }
333
335 getType(const Ice::Current& c = Ice::emptyCurrent) const override
336 {
338 }
339
340 bool
341 validate(const Ice::Current& c = Ice::emptyCurrent) override
342 {
343 return true;
344 }
345
346 public: // serialization
347 void serialize(const armarx::ObjectSerializerBasePtr& serializer,
348 const ::Ice::Current& = Ice::emptyCurrent) const override;
349 void deserialize(const armarx::ObjectSerializerBasePtr& serializer,
350 const ::Ice::Current& = Ice::emptyCurrent) override;
351 };
352
353
354 class GaussianMixtureDistribution;
355
357
358 /**
359 * @brief The GaussianMixtureDistribution class
360 * @ingroup VariantsGrp
361 */
362 class GaussianMixtureDistribution : virtual public GaussianMixtureDistributionBase
363 {
364 public:
367
368 void clear(const ::Ice::Current& = Ice::emptyCurrent) override;
369 ::Ice::Int size(const ::Ice::Current& = Ice::emptyCurrent) const override;
370
371 ::Ice::Int getDimensions(const ::Ice::Current& = Ice::emptyCurrent) const override;
372 GaussianMixtureComponent
373 getComponent(::Ice::Int index, const ::Ice::Current& = Ice::emptyCurrent) const override;
374 GaussianMixtureComponent
375 getModalComponent(const ::Ice::Current& = Ice::emptyCurrent) const override;
376 void addComponent(const GaussianMixtureComponent& component,
377 const ::Ice::Current& = Ice::emptyCurrent) override;
378 void addComponent(const NormalDistributionBasePtr& gaussian, float weight);
379 void addGaussian(const NormalDistributionBasePtr& gaussian,
380 float weight,
381 const ::Ice::Current& = Ice::emptyCurrent) override;
382 void setComponent(::Ice::Int index,
383 const GaussianMixtureComponent& component,
384 const ::Ice::Current& = Ice::emptyCurrent) override;
385 void removeComponent(::Ice::Int index, const ::Ice::Current& = Ice::emptyCurrent) override;
386
387 /**
388 * Multiply weight of each GM component with a given constant
389 *
390 * @param factor constant to multiply with (scaling factor)
391 */
392 void addComponents(const GaussianMixtureDistributionBasePtr& other,
393 const ::Ice::Current& = Ice::emptyCurrent) override;
394
395 /**
396 * Multiply weight of each GM component with a given constant
397 *
398 * @param factor constant to multiply with (scaling factor)
399 */
400 void scaleComponents(::Ice::Float factor,
401 const ::Ice::Current& = Ice::emptyCurrent) override;
402
403 /**
404 * Remove all components with weights lower than threshold value
405 *
406 * @param threshold
407 */
408 void pruneComponents(::Ice::Float threshold,
409 const ::Ice::Current& = Ice::emptyCurrent) override;
410
411 /**
412 * Normalize components weights (i.e. sum of weights = 1.0)
413 */
414 void normalize(const ::Ice::Current& = Ice::emptyCurrent) override;
415
416 virtual float getDensity(const Eigen::VectorXf& point);
417
418
419 /**
420 * Convert or approximate given ProbabilityMeasure to a gaussian mixture. To special cases implemented so far:
421 * probMeasure is a gaussian (NormalDistibution) -> create GM with a single component probMeasure
422 * probMeasure is a gaussian mixture -> just return probMeasure itself
423 *
424 * probMeasure probability measure to approximate/convert
425 */
427 FromProbabilityMeasure(const ProbabilityMeasureBasePtr& probMeasure);
428
429 // inherited from VariantDataClass
430 Ice::ObjectPtr
431 ice_clone() const override
432 {
433 return this->clone();
434 }
435
436 armarx::VariantDataClassPtr
437 clone(const Ice::Current& c = Ice::emptyCurrent) const override
438 {
439 return new GaussianMixtureDistribution(*this);
440 }
441
443 getType(const Ice::Current& c = Ice::emptyCurrent) const override
444 {
446 }
447
448 bool
449 validate(const Ice::Current& c = Ice::emptyCurrent) override
450 {
451 return true;
452 }
453
454 std::string output(const Ice::Current& c = Ice::emptyCurrent) const override;
455
456 public: // serialization
457 void serialize(const armarx::ObjectSerializerBasePtr& serializer,
458 const ::Ice::Current& = Ice::emptyCurrent) const override;
459 void deserialize(const armarx::ObjectSerializerBasePtr& serializer,
460 const ::Ice::Current& = Ice::emptyCurrent) override;
461
462 private:
463 float getTotalWeight() const;
464 };
465
466} // namespace memoryx
uint8_t index
constexpr T c
static VariantTypeId addTypeName(const std::string &typeName)
Register a new type for the use in a Variant.
Definition Variant.cpp:869
std::string output(const Ice::Current &c=Ice::emptyCurrent) const override
::Ice::Float getProbability(const ::Ice::Current &=Ice::emptyCurrent) const override
void setProbability(::Ice::Float, const ::Ice::Current &=Ice::emptyCurrent) override
bool validate(const Ice::Current &c=Ice::emptyCurrent) override
void deserialize(const armarx::ObjectSerializerBasePtr &serializer, const ::Ice::Current &=Ice::emptyCurrent) override
armarx::VariantDataClassPtr clone(const Ice::Current &c=Ice::emptyCurrent) const override
armarx::VariantTypeId getType(const Ice::Current &c=Ice::emptyCurrent) const override
Ice::ObjectPtr ice_clone() const override
void serialize(const armarx::ObjectSerializerBasePtr &serializer, const ::Ice::Current &=Ice::emptyCurrent) const override
void addComponents(const GaussianMixtureDistributionBasePtr &other, const ::Ice::Current &=Ice::emptyCurrent) override
Multiply weight of each GM component with a given constant.
void clear(const ::Ice::Current &=Ice::emptyCurrent) override
std::string output(const Ice::Current &c=Ice::emptyCurrent) const override
GaussianMixtureDistribution()
GaussianMixtureDistribution implementation.
void removeComponent(::Ice::Int index, const ::Ice::Current &=Ice::emptyCurrent) override
GaussianMixtureComponent getModalComponent(const ::Ice::Current &=Ice::emptyCurrent) const override
void pruneComponents(::Ice::Float threshold, const ::Ice::Current &=Ice::emptyCurrent) override
Remove all components with weights lower than threshold value.
GaussianMixtureComponent getComponent(::Ice::Int index, const ::Ice::Current &=Ice::emptyCurrent) const override
bool validate(const Ice::Current &c=Ice::emptyCurrent) override
void deserialize(const armarx::ObjectSerializerBasePtr &serializer, const ::Ice::Current &=Ice::emptyCurrent) override
void scaleComponents(::Ice::Float factor, const ::Ice::Current &=Ice::emptyCurrent) override
Multiply weight of each GM component with a given constant.
armarx::VariantDataClassPtr clone(const Ice::Current &c=Ice::emptyCurrent) const override
armarx::VariantTypeId getType(const Ice::Current &c=Ice::emptyCurrent) const override
Ice::ObjectPtr ice_clone() const override
virtual float getDensity(const Eigen::VectorXf &point)
void addComponent(const GaussianMixtureComponent &component, const ::Ice::Current &=Ice::emptyCurrent) override
static GaussianMixtureDistributionPtr FromProbabilityMeasure(const ProbabilityMeasureBasePtr &probMeasure)
Convert or approximate given ProbabilityMeasure to a gaussian mixture.
::Ice::Int getDimensions(const ::Ice::Current &=Ice::emptyCurrent) const override
void serialize(const armarx::ObjectSerializerBasePtr &serializer, const ::Ice::Current &=Ice::emptyCurrent) const override
void normalize(const ::Ice::Current &=Ice::emptyCurrent) override
Normalize components weights (i.e.
void addGaussian(const NormalDistributionBasePtr &gaussian, float weight, const ::Ice::Current &=Ice::emptyCurrent) override
::Ice::Int size(const ::Ice::Current &=Ice::emptyCurrent) const override
void setComponent(::Ice::Int index, const GaussianMixtureComponent &component, const ::Ice::Current &=Ice::emptyCurrent) override
void fromEigenCovariance(const Eigen::MatrixXf &cov) override
bool validate(const Ice::Current &c=Ice::emptyCurrent) override
float getDensity(const Eigen::VectorXf &p) override
void deserialize(const armarx::ObjectSerializerBasePtr &serializer, const ::Ice::Current &=Ice::emptyCurrent) override
armarx::VariantDataClassPtr clone(const Ice::Current &c=Ice::emptyCurrent) const override
::Ice::Float getVariance(::Ice::Int dim, const ::Ice::Current &=Ice::emptyCurrent) const override
float getCovariance(int row, int col, const ::Ice::Current &=Ice::emptyCurrent) const override
armarx::VariantTypeId getType(const Ice::Current &c=Ice::emptyCurrent) const override
Ice::ObjectPtr ice_clone() const override
void serialize(const armarx::ObjectSerializerBasePtr &serializer, const ::Ice::Current &=Ice::emptyCurrent) const override
Eigen::MatrixXf toEigenCovariance() const override
void setVariance(::Ice::Int dim, ::Ice::Float, const ::Ice::Current &=Ice::emptyCurrent) override
The MultivariateNormalDistribution class.
void fromEigenCovariance(const Eigen::MatrixXf &cov) override
bool validate(const Ice::Current &c=Ice::emptyCurrent) override
void setCovariance(::Ice::Int row, ::Ice::Int col, ::Ice::Float cov, const ::Ice::Current &=Ice::emptyCurrent) override
float getCovariance(int row, int col, const ::Ice::Current &=Ice::emptyCurrent) const override
void deserialize(const armarx::ObjectSerializerBasePtr &serializer, const ::Ice::Current &=Ice::emptyCurrent) override
armarx::VariantDataClassPtr clone(const Ice::Current &c=Ice::emptyCurrent) const override
float getDensity(const Eigen::VectorXf &point) override
armarx::VariantTypeId getType(const Ice::Current &c=Ice::emptyCurrent) const override
Ice::ObjectPtr ice_clone() const override
void serialize(const armarx::ObjectSerializerBasePtr &serializer, const ::Ice::Current &=Ice::emptyCurrent) const override
static MultivariateNormalDistributionPtr CreateDefaultDistribution(float variance=10000)
Create a distribution with uncertainty of variance in all directions (default: variance = 10000,...
Eigen::MatrixXf toEigenCovariance() const override
float getVarianceScalar(const ::Ice::Current &=Ice::emptyCurrent) const override
std::string output(const Ice::Current &c=Ice::emptyCurrent) const override
void fromEigenMean(const Eigen::VectorXf &mean)
float getCovariance(int row, int col, const ::Ice::Current &=Ice::emptyCurrent) const override=0
Eigen::VectorXf toEigenMean() const
FloatVector getMean(const ::Ice::Current &=Ice::emptyCurrent) const override
void deserialize(const armarx::ObjectSerializerBasePtr &serializer, const ::Ice::Current &=Ice::emptyCurrent) override
virtual void fromEigenCovariance(const Eigen::MatrixXf &cov)=0
virtual float getDensity(const Eigen::VectorXf &p)=0
int getDimensions(const ::Ice::Current &=Ice::emptyCurrent) const override
virtual Eigen::MatrixXf toEigenCovariance() const =0
void serialize(const armarx::ObjectSerializerBasePtr &serializer, const ::Ice::Current &=Ice::emptyCurrent) const override
void setMean(const FloatVector &mean, const ::Ice::Current &=Ice::emptyCurrent) override
::Ice::Float getVariance(const ::Ice::Current &=Ice::emptyCurrent) const override
void setVariance(::Ice::Float, const ::Ice::Current &=Ice::emptyCurrent) override
void fromEigenCovariance(const Eigen::MatrixXf &cov) override
bool validate(const Ice::Current &c=Ice::emptyCurrent) override
float getDensity(const Eigen::VectorXf &p) override
void deserialize(const armarx::ObjectSerializerBasePtr &serializer, const ::Ice::Current &=Ice::emptyCurrent) override
armarx::VariantDataClassPtr clone(const Ice::Current &c=Ice::emptyCurrent) const override
float getCovariance(int row, int col, const ::Ice::Current &=Ice::emptyCurrent) const override
armarx::VariantTypeId getType(const Ice::Current &c=Ice::emptyCurrent) const override
Ice::ObjectPtr ice_clone() const override
void serialize(const armarx::ObjectSerializerBasePtr &serializer, const ::Ice::Current &=Ice::emptyCurrent) const override
Eigen::MatrixXf toEigenCovariance() const override
const armarx::VariantTypeId DiscreteProbability
const armarx::VariantTypeId IsotropicNormalDistribution
const armarx::VariantTypeId MultivariateNormalDistribution
const armarx::VariantTypeId GaussianMixtureDistribution
const armarx::VariantTypeId UnivariateNormalDistribution
Ice::Int VariantTypeId
Definition Variant.h:43
VirtualRobot headers.
IceInternal::Handle< NormalDistribution > NormalDistributionPtr
IceInternal::Handle< GaussianMixtureDistribution > GaussianMixtureDistributionPtr
IceInternal::Handle< UnivariateNormalDistribution > UnivariateNormalDistributionPtr
IceInternal::Handle< IsotropicNormalDistribution > IsotropicNormalDistributionPtr
IceInternal::Handle< MultivariateNormalDistribution > MultivariateNormalDistributionPtr