36 DiscreteProbabilityBase::DiscreteProbabilityBase(0.)
41 DiscreteProbabilityBase::DiscreteProbabilityBase(prob)
63 const Ice::Current&)
const
66 armarx::AbstractObjectSerializerPtr::dynamicCast(serializer);
68 obj->setFloat(
"prob", prob);
76 armarx::AbstractObjectSerializerPtr::dynamicCast(serializer);
78 prob = obj->getFloat(
"prob");
87 this->dimensions = dimensions;
88 this->
mean.resize(dimensions);
92 NormalDistributionBase(
mean.size(),
mean)
98 this->dimensions =
mean.rows();
99 this->mean.resize(dimensions);
104 IceUtil::Shared(other), NormalDistributionBase()
107 this->dimensions = other.dimensions;
108 this->
mean = other.mean;
114 Eigen::VectorXf result =
115 Eigen::Map<const Eigen::VectorXf>(this->
mean.data(), this->dimensions);
122 if (this->dimensions ==
mean.rows())
124 Eigen::Map<Eigen::VectorXf>(this->mean.data(), this->dimensions) =
mean;
139 s <<
"Standard deviation(mm): " << pow(cov.determinant(), 0.5 / dimensions);
144 for (
size_t i = 0; i <
mean.size(); ++i)
146 s <<
mean[i] << ((i !=
mean.size() - 1) ?
", " :
") ");
151 for (
int i = 0; i < dimensions; ++i)
152 for (
int j = 0; j < dimensions; ++j)
155 << ((i != dimensions - 1 || j != dimensions - 1) ?
", " :
")");
163 const Ice::Current&)
const
166 armarx::AbstractObjectSerializerPtr::dynamicCast(serializer);
168 obj->setFloatArray(
"mean",
mean);
176 armarx::AbstractObjectSerializerPtr::dynamicCast(serializer);
178 obj->getFloatArray(
"mean",
mean);
179 dimensions =
mean.size();
187 UnivariateNormalDistributionBase::UnivariateNormalDistributionBase(),
194 UnivariateNormalDistributionBase::UnivariateNormalDistributionBase(),
198 this->mean.push_back(
mean);
204 NormalDistributionBase(),
205 UnivariateNormalDistributionBase(),
208 variance = other.variance;
226 if ((row == 0) && (col == 0))
237 Eigen::MatrixXf result(1, 1);
238 result << this->variance;
245 if (cov.rows() == 1 && cov.cols() == 1)
247 this->variance = cov(1, 1);
257 const Ice::Current&
c)
const
260 armarx::AbstractObjectSerializerPtr::dynamicCast(serializer);
263 obj->setFloat(
"var", variance);
268 const Ice::Current&
c)
271 armarx::AbstractObjectSerializerPtr::dynamicCast(serializer);
274 variance = obj->getFloat(
"var");
284 this->varVector.resize(dimensions);
291 this->varVector = vars;
295 const Eigen::VectorXf& vars) :
298 this->varVector.resize(dimensions);
305 NormalDistributionBase(other),
306 IsotropicNormalDistributionBase(other),
309 this->varVector.assign(other.varVector.begin(), other.varVector.end());
315 return (
size_t)dim < varVector.size() ? varVector[dim] : -1.;
321 if ((
size_t)dim < varVector.size())
323 varVector[dim] = var;
335 return varVector[row];
341 Eigen::MatrixXf result(dimensions, dimensions);
343 for (
int i = 0; i < dimensions; ++i)
345 result(i, i) = varVector[i];
354 if (cov.rows() == 1 && cov.cols() == dimensions)
356 for (
int i = 0; i < dimensions; ++i)
358 varVector[i] = cov(0, i);
361 else if (cov.rows() == dimensions && cov.cols() == dimensions)
363 for (
int i = 0; i < dimensions; ++i)
365 varVector[i] = cov(i, i);
376 const Ice::Current&
c)
const
379 armarx::AbstractObjectSerializerPtr::dynamicCast(serializer);
382 obj->setFloatArray(
"var", varVector);
387 const Ice::Current&
c)
390 armarx::AbstractObjectSerializerPtr::dynamicCast(serializer);
393 obj->getFloatArray(
"var", varVector);
403 this->covMatrix.resize(dimensions * dimensions);
410 this->covMatrix = vars;
414 const Eigen::MatrixXf& vars) :
417 this->covMatrix.resize(dimensions * dimensions);
424 NormalDistributionBase(),
425 MultivariateNormalDistributionBase(),
428 this->covMatrix = other.covMatrix;
434 const int index = row * dimensions + col;
436 if (
index >= 0 && (
size_t)
index < covMatrix.size())
438 return covMatrix[
index];
440 throw armarx::IndexOutOfBoundsException();
449 const int index = row * dimensions + col;
451 if (
index >= 0 && (
size_t)
index < covMatrix.size())
453 covMatrix[
index] = cov;
457 throw armarx::IndexOutOfBoundsException();
467 return pow(cov.determinant(), 0.5 / dimensions);
478 Eigen::MatrixXf result =
479 Eigen::Map<const Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>>(
480 this->covMatrix.data(), this->dimensions, this->dimensions);
487 if (cov.rows() == this->dimensions && cov.cols() == this->dimensions)
489 Eigen::Map<Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>>(
490 this->covMatrix.data(), this->dimensions, this->dimensions) = cov;
501 if (point.rows() != dimensions)
509 -0.5 * (point - m).
transpose() * cov.inverse() * (point - m);
510 float e = expf(inner(0, 0));
512 return pow(2 *
M_PI, -dimensions / 2.0f) * pow(cov.determinant(), -0.5) * e;
517 const Ice::Current&
c)
const
520 armarx::AbstractObjectSerializerPtr::dynamicCast(serializer);
523 obj->setFloatArray(
"cov", covMatrix);
528 const Ice::Current&
c)
531 armarx::AbstractObjectSerializerPtr::dynamicCast(serializer);
534 obj->getFloatArray(
"cov", covMatrix);
542 this->dimensions = 0;
547 IceUtil::Shared(other), GaussianMixtureDistributionBase(other)
551 for (GaussianMixtureComponentList::const_iterator it = other.components.begin();
552 it != other.components.end();
555 GaussianMixtureComponent comp;
556 comp.gaussian = NormalDistributionBasePtr::dynamicCast(it->gaussian->clone());
557 comp.weight = it->weight;
568 GaussianMixtureComponent
571 if (
index >= 0 && (
size_t)
index < components.size())
573 return components[
index];
575 throw armarx::IndexOutOfBoundsException();
578 GaussianMixtureComponent
581 if (components.empty())
583 return GaussianMixtureComponent();
586 GaussianMixtureComponentList::const_iterator res = components.end();
588 for (GaussianMixtureComponentList::const_iterator it = components.begin();
589 it != components.end();
591 if (res == components.end() || it->weight > res->weight)
601 const ::Ice::Current&)
603 if (components.empty())
605 dimensions = component.gaussian->getDimensions();
607 else if (component.gaussian->getDimensions() != dimensions)
612 components.push_back(component);
619 GaussianMixtureComponent comp;
620 comp.gaussian = gaussian;
621 comp.weight = weight;
628 const ::Ice::Current&
c)
635 const GaussianMixtureComponent& component,
636 const ::Ice::Current&)
638 if (
index < 0 && (
size_t)
index >= components.size())
640 throw armarx::IndexOutOfBoundsException();
642 else if (component.gaussian->getDimensions() != dimensions)
648 components[
index] = component;
655 if (
index >= 0 && (
size_t)
index < components.size())
657 components.erase(components.begin() +
index);
661 throw armarx::IndexOutOfBoundsException();
674 return (::
Ice::Int)components.size();
678 GaussianMixtureDistribution::getTotalWeight()
const
682 for (GaussianMixtureComponentList::const_iterator it = components.begin();
683 it != components.end();
686 result += it->weight;
694 const ::Ice::Current&
c)
696 for (
int i = 0; i < other->size(); ++i)
705 for (GaussianMixtureComponentList::iterator it = components.begin(); it != components.end();
708 it->weight *= factor;
715 const float totalWeight = getTotalWeight();
716 GaussianMixtureComponentList::iterator it = components.begin();
718 while (it != components.end())
720 if (it->weight / totalWeight < threshold)
722 it = components.erase(it);
734 const float totalWeight = getTotalWeight();
736 for (GaussianMixtureComponentList::iterator it = components.begin(); it != components.end();
739 it->weight /= totalWeight;
746 const float totalWeight = getTotalWeight();
749 for (GaussianMixtureComponentList::iterator it = components.begin(); it != components.end();
753 result += gaussian->getDensity(point) * it->weight / totalWeight;
761 const ProbabilityMeasureBasePtr& probMeasure)
765 GaussianMixtureDistributionPtr::dynamicCast(probMeasure);
773 NormalDistributionBasePtr gaussian = NormalDistributionBasePtr::dynamicCast(probMeasure);
779 result->addComponent(gaussian, 1.);
792 for (GaussianMixtureComponentList::const_iterator it = components.begin();
793 it != components.end();
796 s <<
"{ gaussian: " << it->gaussian->output() <<
"weight: " << it->weight <<
"} \n";
804 const Ice::Current&
c)
const
807 armarx::AbstractObjectSerializerPtr::dynamicCast(serializer);
811 for (GaussianMixtureComponentList::const_iterator it = components.begin();
812 it != components.end();
816 armarx::AbstractObjectSerializerPtr::dynamicCast(serializer)->createElement();
818 new armarx::Variant(armarx::VariantDataClassPtr::dynamicCast(it->gaussian));
819 compValue->setVariant(
"gaussian", gaussianVar);
820 compValue->setFloat(
"weight", it->weight);
821 obj->append(compValue);
827 const Ice::Current&
c)
830 armarx::AbstractObjectSerializerPtr::dynamicCast(serializer);
834 for (
unsigned int i = 0; i < obj->size(); ++i)
838 GaussianMixtureComponent comp;
840 comp.gaussian = gaussianVar->getClass<NormalDistributionBase>();
841 comp.weight = compValue->getFloat(
"weight");