Пример #1
0
void test(Env& $)
{
  namespace bs = boost::simd;
  using p_t = bs::pack<T, N>;

  T a1[N], b[N];
  for(std::size_t i = 0; i < N; ++i)
  {
    a1[i] = (i%2) ? T(i) : T(-i);
    b[i] = bs::frac(a1[i]) ;
  }
  p_t aa1(&a1[0], &a1[N]);
  p_t bb (&b[0], &b[N]);
  STF_IEEE_EQUAL(bs::frac(aa1), bb);
}
Пример #2
0
void test(Env& $)
{
  namespace bs = boost::simd;
  using p_t = bs::pack<T, N>;

  T a1[N], a2[N], b[N];
  for(int i = 0; i < N; ++i)
  {
     a1[i] = (i%2) ? T(1) : T(0);
     a2[i] = (i%2) ? T(i+N) : T(-(i+N));
     b[i] = bs::negifnot(a1[i], a2[i]);
   }
  p_t aa1(&a1[0], &a1[N]);
  p_t aa2(&a2[0], &a2[N]);
  p_t bb(&b[0], &b[N]);
  STF_IEEE_EQUAL(bs::negifnot(aa1, aa2), bb);
}
Пример #3
0
void test(Env& $)
{
  namespace bs = boost::simd;
  using p_t = bs::pack<T, N>;


  T a1[N], a2[N], b[N];
  for(std::size_t i = 0; i < N; ++i)
  {
     a1[i] = (i%2) ? T(i) : T(2*i);
     a2[i] = (i%2) ? T(i+N) : T(1);
     b[i] = bs::bitwise_andnot(a1[i], a2[i]);
   }
  p_t aa1(&a1[0], &a1[N]);
  p_t aa2(&a2[0], &a2[N]);
  p_t bb(&b[0], &b[N]);
  STF_IEEE_EQUAL(bs::bitwise_andnot(aa1, aa2), bb);
}
Пример #4
0
void test(Env& $)
{
  namespace bs = boost::simd;
  using lT =  bs::logical<T>;
  using p_t = bs::pack<T, N>;
  using pl_t = bs::pack<lT, N>;

  T a1[N];
  lT b[N];
  for(std::size_t i = 0; i < N; ++i)
  {
     a1[i] = (i%2) ? T(i) : T(-i);
     b[i] = bs::is_denormal(a1[i]);
   }
  p_t aa1(&a1[0], &a1[N]);
  pl_t bb(&b[0], &b[N]);
  STF_IEEE_EQUAL(bs::is_denormal(aa1), bb);
}
Пример #5
0
void test(Env& $)
{
  namespace bs = boost::simd;
  using p_t = bs::pack<T, N>;

  namespace bs = boost::simd;
  namespace bd = boost::dispatch;

  T a1[N],  b[N];
  bd::as_integer_t<T> a2 =  2;
  for(std::size_t i = 0; i < N; ++i)
  {
     a1[i] = (i%2) ? T(i) : T(-i);
     b[i] = bs::pow2(a1[i], a2);
   }
  p_t aa1(&a1[0], &a1[N]);
  p_t bb(&b[0], &b[N]);//logical
  STF_IEEE_EQUAL(bs::pow2(aa1, a2), bb);
}
Пример #6
0
void test(Env& $)
{
  namespace bs = boost::simd;
  namespace bd = boost::dispatch;
  using p_t = bs::pack<T, N>;
  using iT =  bd::as_integer_t<T>;
  using pi_t = bs::pack<iT, N>;

  T a1[N];
  iT b[N];
  for(std::size_t i = 0; i < N; ++i)
  {
     a1[i] = T(i+1);
     b[i] = bs::firstbitset(a1[i]);
   }
  p_t aa1(&a1[0], &a1[N]);
  pi_t bb(&b[0], &b[N]);
  STF_EQUAL(bs::firstbitset(aa1), bb);
}
Пример #7
0
void test(Env& $)
{
  namespace bs = boost::simd;
  using p_t = bs::pack<T, N>;
  using pl_t = bs::pack<bs::logical<T>, N>;

  T a1[N], a2[N];
  bs::logical<T> b[N];
  for(std::size_t i = 0; i < N; ++i)
  {
     a1[i] = (i%2) ? T(i) : T(2*i);
     a2[i] = (i%2) ? T(i) : T(2*i+1);
     b[i] = bs::is_less(a1[i], a2[i]);
   }
  p_t aa1(&a1[0], &a1[0]+N);
  p_t aa2(&a2[0], &a2[0]+N);
  pl_t bb(&b[0], &b[0]+N);
  STF_EQUAL(bs::is_less(aa1, aa2), bb);
}
Пример #8
0
void test(Env& $)
{
  namespace bs = boost::simd;
  using p_t = bs::pack<T, N>;

  namespace bs = boost::simd;
  namespace bd = boost::dispatch;

  T a1[N], a2[N], b[N];
  for(std::size_t i = 0; i < N; ++i)
  {
     a1[i] = (i%2) ? T(i) : T(-i);
     a2[i] = (i%2) ? T(i+N) : T(-(i+N));
     b[i] = bs::nextafter(a1[i], a2[i]);
   }
  p_t aa1(&a1[0], &a1[N]);
  p_t aa2(&a2[0], &a2[N]);
  p_t bb(&b[0], &b[N]);
  STF_IEEE_EQUAL(bs::nextafter(aa1, aa2), bb);
}
Пример #9
0
void test(Env& $)
{
  namespace bs = boost::simd;
  using p_t = bs::pack<T, N>;

  namespace bs = boost::simd;
  namespace bd = boost::dispatch;

  T a1[N], a2[N];
  bool b = true; ;
  for(std::size_t i = 0; i < N; ++i)
  {
     a1[i] = (i%2) ? T(i) : T(-i);
     a2[i] = (i%2) ? T(i+N) : T(-(i+N));
     b = b && bs::is_included_c(a1[i], a2[i]);
   }
  p_t aa1(&a1[0], &a1[N]);
  p_t aa2(&a2[0], &a2[N]);
  STF_IEEE_EQUAL(bs::is_included_c(aa1, aa2), b);
}
Пример #10
0
void test(Env& $)
{
  namespace bs = boost::simd;
  using p_t = bs::pack<T, N>;

  T a1[N], a2[N];
  bs::logical<T> b = true,  c = true;
  for(std::size_t i = 0; i < N; ++i)
  {
    a1[i] = (i%2) ? T(i) : T(-i);
    a2[i] = (i%2) ? T(i+1) : T(-i);
    b = b && a1[i]!= 0;
    c = c && a2[i]!= 0;
  }
  p_t aa1(&a1[0], &a1[N]);
  p_t aa2(&a2[0], &a2[N]);

  STF_EQUAL(bs::all(aa1), b);
  STF_EQUAL(bs::all(aa2), c);
}
Пример #11
0
void test(Env& $)
{
  namespace bs = boost::simd;
  using p_t = bs::pack<T, N>;

  namespace bs = boost::simd;
  namespace bd = boost::dispatch;

  T a1[N], b[N];
  for(std::size_t i = 0; i < N; ++i)
  {
    a1[i] = T(N-i-1);
    b[i] =  T(i);
  }
  p_t aa1(&a1[0], &a1[N]);
  p_t bb (&b[0], &b[N]);
  std::cout << aa1 << std::endl;
  std::cout << bb  << std::endl;
  std::cout << bs::sort(aa1) << std::endl;
  STF_IEEE_EQUAL(bs::sort(aa1), bb);
}
Пример #12
0
void test(Env& $)
{
  namespace bs = boost::simd;
  namespace bd = boost::dispatch;

  using p_t = bs::pack<T, N>;
  using fT = bd::as_floating_t<T>;
  using f_t =bs::pack<fT, N>;


  T a1[N];
  fT b[N];
  for(int i = 0; i < N; ++i)
  {
    a1[i] = (i%2) ? T(i) : T(-i);
    b[i] = bs::bitfloating(a1[i]) ;
  }
  p_t aa1(&a1[0], &a1[N]);
  f_t bb (&b[0], &b[N]);
  STF_IEEE_EQUAL(bs::bitfloating(aa1), bb);
}
Пример #13
0
void test(Env& $)
{

  namespace bs = boost::simd;
  namespace bd = boost::dispatch;

  using p_t = bs::pack<T, N>;
  using iT = bd::as_integer_t<T>;
  using i_t =  bs::pack<iT, N>;
  T a1[N],  b[N];
  iT a2[N];
  for(std::size_t i = 0; i < N; ++i)
  {
     a1[i] = (i%2) ? T(i) : T(-i);
     a2[i] = i;
     b[i] = bs::predecessor(a1[i], a2[i]);
   }
  p_t aa1(&a1[0], &a1[N]);
  i_t aa2(&a2[0], &a2[N]);
  p_t bb(&b[0], &b[N]);//logical
  STF_IEEE_EQUAL(bs::predecessor(aa1, aa2), bb);
}
Пример #14
0
void test(Env& $)
{
  namespace bs = boost::simd;
  namespace bd = boost::dispatch;

  using p_t = bs::pack<T, N>;
  using iT  = bd::as_integer_t<T, unsigned>;
  using i_t = bs::pack<iT, N>;

  T a1[N];
  iT b[N];
  for(std::size_t i = 0; i < N; ++i)
  {
    a1[i] = T(N+i+1);
     b[i] = bs::hi(a1[i]);
   }
  p_t aa1(&a1[0], &a1[N]);
  i_t bb(&b[0], &b[N]);
  std::cout << aa1 << std::endl;
  std::cout << bb << std::endl;
  STF_EQUAL(bs::hi(aa1), bb);
}
Пример #15
0
void test(Env& $)
{
  namespace bs = boost::simd;
  using p_t = bs::pack<T, N>;

  namespace bs = boost::simd;
  namespace bd = boost::dispatch;

  T a1[N], a2[N], b[N];
  for(int i = 0; i < N; ++i)
  {
     a1[i] = (i%2) ? T(i) : T(-i);
     a2[i] = (i%2) ? T(i+N) : T(-(i+N));
  }
  for(int i = 0; i < N; ++i)
  {
    b[i]  = (i%2) ? a1[i] : a2[i-1];
  }
  p_t aa1(&a1[0], &a1[N]);
  p_t aa2(&a2[0], &a2[N]);
  p_t bb(&b[0], &b[N]);
  STF_IEEE_EQUAL(bs::interleave_even(aa1, aa2), bb);
}
Пример #16
0
/** Incomplete beta function for variable objects.
    Evaluates the continued fraction for imcomplete beta function.
    \param _a \f$a\f$
    \param _b \f$b\f$
    \param _x \f$x\f$
    \param MAXIT Maximum number of iterations for the continued fraction approximation in betacf.
    \return Incomplete beta function \f$I_x(a,b)\f$

    \n\n The implementation of this algorithm was inspired by
    "Numerical Recipes in C", 2nd edition,
    Press, Teukolsky, Vetterling, Flannery, chapter 2
*/
dvariable betacf(const dvariable& _a, const dvariable& _b, const dvariable& _x,
  int MAXIT)
{
  double qab,qam,qap;
  double a=value(_a);
  double b=value(_b);
  double x=value(_x);

  qab=a+b;
  qap=a+1.0;
  qam=a-1.0;
  dvector c1(0,MAXIT);
  dvector c(1,MAXIT);
  dvector d1(0,MAXIT);
  dvector d(1,MAXIT);
  dvector del(1,MAXIT);
  dvector h1(0,MAXIT);
  dvector h(1,MAXIT);
  dvector aa(1,MAXIT);
  dvector aa1(1,MAXIT);
  c1(0)=1.0;
  d1(0)=1.0/(1.0-qab*x/qap);
  h1(0)=d1(0);

  int m = 1;
  for (; m <= MAXIT; m++)
  {
    int i=m;
    int m2=2*m;
    aa(i)=m*(b-m)*x/((qam+m2)*(a+m2));
    d(i)=1.0/(1.0+aa(i)*d1(i-1));
    c(i)=1.0+aa(i)/c1(i-1);
    h(i) = h1(i-1)*d(i)*c(i);
    aa1(i) = -(a+m)*(qab+m)*x/((a+m2)*(qap+m2));
    d1(i)=1.0/(1.0+aa1(i)*d(i));
    c1(i)=1.0+aa1(i)/c(i);
    del(i)=d1(i)*c1(i);
    h1(i) = h(i)*del(i);
    if (fabs(del(i)-1.0) < EPS) break;
  }
  if (m > MAXIT)
  {
    cerr << "a or b too big, or MAXIT too small in cumulative beta function"
      " routine" << endl;
    m=MAXIT;
  }
  int mmax=m;
  dvariable hh;
  value(hh)=h1(mmax);


  dvector dfc1(0,MAXIT);
  dvector dfc(1,MAXIT);
  dvector dfd1(0,MAXIT);
  dvector dfd(1,MAXIT);
  dvector dfh1(0,MAXIT);
  dvector dfh(1,MAXIT);
  dvector dfaa(1,MAXIT);
  dvector dfaa1(1,MAXIT);
  dvector dfdel(1,MAXIT);

  dfc1.initialize();
  dfc.initialize();
  dfaa1.initialize();
  dfaa.initialize();
  dfd1.initialize();
  dfd.initialize();
  dfh1.initialize();
  dfh.initialize();
  dfdel.initialize();
  dfh1(mmax)=1.0;
  double dfqab=0.0;
  double dfqam=0.0;
  double dfqap=0.0;
  double dfa=0.0;
  double dfb=0.0;
  double dfx=0.0;

  for (m=mmax;m>=1;m--)
  {
   /*
    int i=m;
    m2=2*m;
    aa(i)=m*(b-m)*x/((qam+m2)*(a+m2));
    d(i)=1.0/(1.0+aa(i)*d1(i-1));
    c(i)=1.0+aa(i)/c1(i-1);
    h(i) = h1(i-1)*d(i)*c(i);
    aa1(i) = -(a+m)*(qab+m)*x/((a+m2)*(qap+m2));
    d1(i)=1.0/(1.0+aa1(i)*d(i));
    c1(i)=1.0+aa1(i)/c(i);
    del(i)=d1(i)*c1(i);
    h1(i) = h(i)*del(i);
   */

    int i=m;
    int m2=2*m;

    //h1(i) = h(i)*del(i);

    dfh(i)+=dfh1(i)*del(i);
    dfdel(i)+=dfh1(i)*h(i);
    dfh1(i)=0.0;

    //del(i)=d1(i)*c1(i);

    dfd1(i)+=dfdel(i)*c1(i);
    dfc1(i)+=dfdel(i)*d1(i);
    dfdel(i)=0.0;

    //c1(i)=1.0+aa1(i)/c(i);

    dfaa1(i)+=dfc1(i)/c(i);
    dfc(i)-=dfc1(i)*aa1(i)/(c(i)*c(i));
    dfc1(i)=0.0;

    //d1(i)=1.0/(1.0+aa1(i)*d(i));
    double sq=square(d1(i));
    dfaa1(i)-=dfd1(i)*sq*d(i);
    dfd(i)-=dfd1(i)*sq*aa1(i);
    dfd1(i)=0.0;

    //aa1(i) = -(a+m)*(qab+m)*x/((a+m2)*(qap+m2));
    dfx -= dfaa1(i) *
     (a+m)*(qab+m)/((a+m2)*(qap+m2));

    dfa += dfaa1(i) * aa1(i)* (1.0/(a+m) - 1.0/(a+m2));
    dfqab += dfaa1(i) * aa1(i)/(qab+m);
    dfqap += dfaa1(i) * aa1(i)* (-1.0/(qap+m2));
    dfaa1(i)=0.0;


    //h(i) = h1(i-1)*d(i)*c(i);
    dfh1(i-1)+=dfh(i)*d(i)*c(i);
    dfd(i)+=dfh(i)*h1(i-1)*c(i);
    dfc(i)+=dfh(i)*h1(i-1)*d(i);
    dfh(i)=0.0;

    //c(i)=1.0+aa(i)/c1(i-1);
    dfaa(i)+=dfc(i)/c1(i-1);
    dfc1(i-1)-=dfc(i)*aa(i)/square(c1(i-1));
    dfc(i)=0.0;


    //d(i)=1.0/(1.0+aa(i)*d1(i-1));
    dfaa(i)-=dfd(i)*square(d(i))*d1(i-1);
    dfd1(i-1)-=dfd(i)*square(d(i))*aa(i);
    dfd(i)=0.0;

    //aa(i)=m*(b-m)*x/((qam+m2)*(a+m2));
    dfx+=dfaa(i)*
      m*(b-m)/((qam+m2)*(a+m2));

    dfb+=dfaa(i)*
      m*x/((qam+m2)*(a+m2));


    dfa-=dfaa(i)*aa(i)/(a+m2);
    dfqam-=dfaa(i)*aa(i)/(qam+m2);
    dfaa(i)=0.0;
  }
  /*
  c1(0)=1.0;
  d1(0)=1.0/(1.0-qab*x/qap);
  h1(0)=d1(0);
 */

  //h1(0)=d1(0);
  dfd1(0)+=dfh1(0);
  dfh1(0)=0.0;

  //d1(0)=1.0/(1.0-qab*x/qap);
  double sq1=square(d1(0))/qap;
  dfx+=dfd1(0)*sq1*qab;
  dfqab+=dfd1(0)*sq1*x;
  dfqap-=dfd1(0)*sq1*qab*x/qap;
  dfd1(0)=0.0;

  /*
  qab=a+b;
  qap=a+1.0;
  qam=a-1.0;
 */

  //qam=a-1.0;
  dfa+=dfqam;

  //qap=a+1.0;
  dfa+=dfqap;

  //qab=a+b;
  dfa+=dfqab;
  dfb+=dfqab;


  gradient_structure::GRAD_STACK1->set_gradient_stack(default_evaluation3ind,
    &(value(hh)) ,&(value(_a)),dfa ,&(value(_b)),dfb ,&(value(_x)),dfx);


  return hh;
}
void
ExtendedHandEyeCalibration::solve(const std::vector<Eigen::Matrix4d, Eigen::aligned_allocator<Eigen::Matrix4d> >& H1,
                                  const std::vector<Eigen::Matrix4d, Eigen::aligned_allocator<Eigen::Matrix4d> >& H2,
                                  Eigen::Matrix4d& H_12,
                                  double& s) const
{
    int motionCount = H1.size();

    Eigen::MatrixXd T(motionCount * 6, 8);
    T.setZero();
    for (int i = 0; i < motionCount; ++i)
    {
        Eigen::AngleAxisd aa1(H1.at(i).block<3,3>(0,0));
        Eigen::Vector3d rvec1 = aa1.angle() * aa1.axis();
        Eigen::Vector3d tvec1 = H1.at(i).block<3,1>(0,3);

        Eigen::AngleAxisd aa2(H2.at(i).block<3,3>(0,0));
        Eigen::Vector3d rvec2 = aa2.angle() * aa2.axis();
        Eigen::Vector3d tvec2 = H2.at(i).block<3,1>(0,3);

        double theta1, d1;
        Eigen::Vector3d l1, m1;
        AngleAxisAndTranslationToScrew(rvec1, tvec1, theta1, d1, l1, m1);

        double theta2, d2;
        Eigen::Vector3d l2, m2;
        AngleAxisAndTranslationToScrew(rvec2, tvec2, theta2, d2, l2, m2);

        Eigen::Vector3d a = l1;
        Eigen::Vector3d a_prime = m1;
        Eigen::Vector3d b = l2;
        Eigen::Vector3d b_prime = m2;

        T.block<3,1>(i * 6, 0) = a - b;
        T.block<3,3>(i * 6, 1) = skew(Eigen::Vector3d(a + b));
        T.block<3,1>(i * 6 + 3, 0) = a_prime - b_prime;
        T.block<3,3>(i * 6 + 3, 1) = skew(Eigen::Vector3d(a_prime + b_prime));
        T.block<3,1>(i * 6 + 3, 4) = a - b;
        T.block<3,3>(i * 6 + 3, 5) = skew(Eigen::Vector3d(a + b));
    }

    Eigen::JacobiSVD<Eigen::MatrixXd> svd(T, Eigen::ComputeFullU | Eigen::ComputeFullV);

    // v7 and v8 span the null space of T, v6 may also be one
    // if rank = 5. 
    Eigen::Matrix<double, 8, 1> v6 = svd.matrixV().block<8,1>(0, 5);
    Eigen::Matrix<double, 8, 1> v7 = svd.matrixV().block<8,1>(0,6);
    Eigen::Matrix<double, 8, 1> v8 = svd.matrixV().block<8,1>(0,7);

    Eigen::Vector4d u1 = v7.block<4,1>(0,0);
    Eigen::Vector4d v1 = v7.block<4,1>(4,0);
    Eigen::Vector4d u2 = v8.block<4,1>(0,0);
    Eigen::Vector4d v2 = v8.block<4,1>(4,0);

    double lambda1 = 0;
    double lambda2 = 0.0;

    if (u1.dot(v1) == 0.0)
    {
        std::swap(u1, u2); 
        std::swap(v1, v2); 
    }
    if (u1.dot(v1) != 0.0)
    {
        double s[2];
        solveQuadraticEquation(u1.dot(v1), u1.dot(v2) + u2.dot(v1), u2.dot(v2), s[0], s[1]);

        // find better solution for s
        double t[2];
        for (int i = 0; i < 2; ++i)
        {
            t[i] = s[i] * s[i] * u1.dot(u1) + 2 * s[i] * u1.dot(u2) + u2.dot(u2);
        }

        int idx;
        if (t[0] > t[1])
        {
            idx = 0;
        }
        else
        {
            idx = 1;
        }

        lambda2 = sqrt(1.0 / t[idx]);
        lambda1 = s[idx] * lambda2;
    }
    else 
    {
        if (u1.norm() == 0.0 && u2.norm() > 0.0) 
        {
            lambda1 = 0.0;
            lambda2 = 1.0 / u2.norm();
        }
        else if (u2.norm() == 0.0 && u1.norm() > 0.0)
        {
            lambda1 = 1.0 / u1.norm();
            lambda2 = 0.0;
        }
    }

    // rotation
    Eigen::Vector4d q_coeffs = lambda1 * u1 + lambda2 * u2;
    Eigen::Vector4d q_prime_coeffs = lambda1 * v1 + lambda2 * v2;

    Eigen::Quaterniond q(q_coeffs(0), q_coeffs(1), q_coeffs(2), q_coeffs(3));
    Eigen::Quaterniond d(q_prime_coeffs(0), q_prime_coeffs(1), q_prime_coeffs(2), q_prime_coeffs(3));

    DualQuaterniond dq(q, d);

    H_12 = dq.toMatrix().inverse();

    s = 1.0;
    refine(H1, H2, H_12, s);
}