コード例 #1
0
void Manifold::getIdentityOnTxM(RefMat out, const ConstRefVec& x) const
{
  mnf_assert(out.rows() == tangentDim_);
  mnf_assert(out.cols() == tangentDim_);
  mnf_assert(x.size() == representationDim());
  getIdentityOnTxM_(out, x);
}
コード例 #2
0
void Manifold::setTangentDimension(Index td)
{
  mnf_assert(isValid() || seeMessageAbove());
  mnf_assert(td >= 0 && "Negative dimension not accepted");
  testLock();
  tangentDim_ = td;
}
コード例 #3
0
void Manifold::setRepresentationDimension(Index rd)
{
  mnf_assert(isValid() || seeMessageAbove());
  mnf_assert(rd >= 0 && "Negative dimension not accepted");
  testLock();
  representationDim_ = rd;
}
コード例 #4
0
void Manifold::forceOnM(RefVec out, const ConstRefVec& in) const
{
  mnf_assert(isValid() || seeMessageAbove());
  mnf_assert(out.size() == representationDim());
  mnf_assert(in.size() == representationDim());
  return forceOnM_(out, in);
}
コード例 #5
0
void Manifold::setDimension(Index d)
{
  mnf_assert(isValid() || seeMessageAbove());
  mnf_assert(d >= 0 && "Negative dimension not accepted");
  testLock();
  dimension_ = d;
}
コード例 #6
0
bool Manifold::isInTxM(const ConstRefVec& x, const ConstRefVec& v,
                       const double& prec) const
{
  mnf_assert(isValid() || seeMessageAbove());
  mnf_assert(v.size() == tangentDim_);
  mnf_assert(x.size() == representationDim());
  return isInTxM_(x, v, prec);
}
コード例 #7
0
void Manifold::tangentConstraint(RefMat out, const ConstRefVec& x) const
{
  mnf_assert(isValid() || seeMessageAbove());
  mnf_assert(out.rows() == tangentDim_ - dimension_);
  mnf_assert(out.cols() == tangentDim_);
  mnf_assert(x.size() == representationDim());
  tangentConstraint_(out, x);
}
コード例 #8
0
void Manifold::forceOnTxM(RefVec out, const ConstRefVec& in,
                          const ConstRefVec& x) const
{
  mnf_assert(isValid() || seeMessageAbove());
  mnf_assert(out.size() == tangentDim_);
  mnf_assert(x.size() == representationDim());
  mnf_assert(in.size() == tangentDim_);
  forceOnTxM_(out, in, x);
}
コード例 #9
0
void Manifold::pseudoLog(RefVec out, const ConstRefVec& x,
                         const ConstRefVec& y) const
{
  mnf_assert(isValid() || seeMessageAbove());
  mnf_assert(out.size() == tangentDim_);
  mnf_assert(x.size() == representationDim_);
  mnf_assert(y.size() == representationDim_);
  pseudoLog_(out, x, y);
}
コード例 #10
0
void Manifold::applyDiffPseudoLog0(RefMat out, const ConstRefMat& in,
                                   const ConstRefVec& x) const
{
  mnf_assert(isValid() || seeMessageAbove());
  mnf_assert(out.cols() == representationDim_);
  mnf_assert(in.cols() == tangentDim_);
  mnf_assert(in.rows() == out.rows());
  mnf_assert(x.size() == representationDim_);
  applyDiffPseudoLog0_(out, in, x);
}
コード例 #11
0
void Manifold::retractation(RefVec out, const ConstRefVec& x,
                            const ConstRefVec& v) const
{
  mnf_assert(isValid() || seeMessageAbove());
  mnf_assert(out.size() == representationDim_);
  mnf_assert(x.size() == representationDim_);
  mnf_assert(v.size() == tangentDim_);
  mnf_assert(isInTxM(x, v) && "Wrong tangent vector provided to retractation");
  retractation_(out, x, v);
}
コード例 #12
0
Manifold::Manifold(Index dimension, Index tangentDimension,
                   Index representationDimension)
    : dimension_(dimension),
      tangentDim_(tangentDimension),
      representationDim_(representationDimension),
      lock_(false)
{
  mnf_assert(0 <= dimension && "Negative dimension not accepted");
  mnf_assert(dimension <= tangentDimension);
  mnf_assert(tangentDimension <= representationDimension);
  this->instanceId_ = manifoldCounter_++;
}
コード例 #13
0
Point Manifold::getZero() const
{
  mnf_assert(isValid() || seeMessageAbove());
  lock();
  Eigen::VectorXd id(representationDim_);
  setZero(id);
  return Point(*this, id);
}
コード例 #14
0
Point Manifold::createRandomPoint(double coeff) const
{
  mnf_assert(isValid() || seeMessageAbove());
  lock();
  Eigen::VectorXd val(representationDim_);
  createRandomPoint(val, coeff);
  return Point(*this, val);
}
コード例 #15
0
 void ExpMapQuaternion::applyDiffPseudoLog0_(
     RefMat out, const ConstRefMat& in, const ConstRefVec& x, ReusableTemporaryMap& m)
 {
   mnf_assert(in.cols() == InputDim_ && "Dimensions mismatch" );
   Eigen::Map<Eigen::MatrixXd, Eigen::Aligned> a = m.getMap(in.rows(),OutputDim_);
   a.noalias() = in*diffPseudoLog0_(x);
   out = a;
 }
コード例 #16
0
 void ExpMapQuaternion::exponential(OutputType& q, const ConstRefVec& v)
 {
   mnf_assert(v.size() == 3 && "Increment for expMap must be of size 3");
   double n2 = v.squaredNorm(); // (theta)^2 (in Grassia)
   mnf_assert(sqrt(n2) < M_PI && "Increment for expMap must be of norm at most pi");
   double s; // sin(theta/2)/theta in Grassia
   if (n2 < prec)
   {
     toQuat(q.data()).w() = 1 + (-1 + n2 / 48)*(n2/8);// cos(theta/2) in Grassia
     s = (1+(-1+0.0125*n2)*n2/24)/2;
   }
   else
   {
     double t = sqrt(n2); // theta (in Grassia)
     toQuat(q.data()).w() = cos(0.5*t);
     s = sin(0.5*t) / t;
   }
   toQuat(q.data()).vec() = s*v;
 }
コード例 #17
0
Point Manifold::createPoint(const ConstRefVec& val) const
{
  mnf_assert(isValid() || seeMessageAbove());
  if (isInM(val))
  {
    lock();
    return Point(*this, val);
  }
  else
  {
    throw std::runtime_error("Bad Point Initialization");
  }
}
コード例 #18
0
void Manifold::applyTransport(RefMat out, const ConstRefMat& in,
                              const ConstRefVec& x, const ConstRefVec& v) const
{
  mnf_assert(isValid() || seeMessageAbove());
  mnf_assert(in.rows() == tangentDim_);
  mnf_assert(out.rows() == tangentDim_);
  mnf_assert(in.cols() == out.cols());
  mnf_assert(x.size() == representationDim());
  mnf_assert(v.size() == tangentDim_);
  mnf_assert(isInTxM(x, v));

  applyTransport_(out, in, x, v);
}
コード例 #19
0
Index Manifold::dim() const
{
  mnf_assert(isValid() || seeMessageAbove());
  return dimension_;
}
コード例 #20
0
Index Manifold::representationDim() const
{
  mnf_assert(isValid() || seeMessageAbove());
  return representationDim_;
}
コード例 #21
0
void Manifold::createRandomPoint(RefVec out, double coeff) const
{
  mnf_assert(out.size() == representationDim_ &&
             "wrong dimension in Manifold::createRandomPoint");
  createRandomPoint_(out, coeff);
}
コード例 #22
0
void Manifold::pseudoLog0(RefVec out, const ConstRefVec& x) const
{
  mnf_assert(out.size() == tangentDim_);
  mnf_assert(x.size() == representationDim_);
  pseudoLog0_(out, x);
}
コード例 #23
0
Eigen::MatrixXd Manifold::diffPseudoLog0(const ConstRefVec& x) const
{
  mnf_assert(isValid() || seeMessageAbove());
  mnf_assert(x.size() == representationDim_);
  return diffPseudoLog0_(x);
}
コード例 #24
0
bool Manifold::isInM(const Eigen::VectorXd& val, double prec) const
{
  mnf_assert(isValid() || seeMessageAbove());
  mnf_assert(val.size() == representationDim());
  return isInM_(val, prec);
}
コード例 #25
0
Point Manifold::createPoint() const
{
  mnf_assert(isValid() || seeMessageAbove());
  lock();
  return Point(*this);
}
コード例 #26
0
void Manifold::getTrustMagnitude(RefVec out) const
{
  mnf_assert(out.size() == tangentDim_);
  getTrustMagnitude_(out);
}
コード例 #27
0
void Manifold::limitMap(RefVec out) const
{
  mnf_assert(out.size() == tangentDim_);
  limitMap_(out);
}
コード例 #28
0
void Manifold::setZero(RefVec out) const
{
  mnf_assert(isValid() || seeMessageAbove());
  mnf_assert(out.size() == representationDim_);
  setZero_(out);
}
コード例 #29
0
Index Manifold::tangentDim() const
{
  mnf_assert(isValid() || seeMessageAbove());
  return tangentDim_;
}