//*************************************************************************
TEST (EssentialMatrixFactor, testData) {
    CHECK(readOK);

    // Check E matrix
    Matrix expected(3, 3);
    expected << 0, 0, 0, 0, 0, -0.1, 0.1, 0, 0;
    Matrix aEb_matrix = skewSymmetric(c1Tc2.x(), c1Tc2.y(), c1Tc2.z())
                        * c1Rc2.matrix();
    EXPECT(assert_equal(expected, aEb_matrix, 1e-8));

    // Check some projections
    EXPECT(assert_equal(Point2(0, 0), pA(0), 1e-8));
    EXPECT(assert_equal(Point2(0, 0.1), pB(0), 1e-8));
    EXPECT(assert_equal(Point2(0, -1), pA(4), 1e-8));
    EXPECT(assert_equal(Point2(-1, 0.2), pB(4), 1e-8));

    // Check homogeneous version
    EXPECT(assert_equal(Vector3(-1, 0.2, 1), vB(4), 1e-8));

    // Check epipolar constraint
    for (size_t i = 0; i < 5; i++)
        EXPECT_DOUBLES_EQUAL(0, vA(i).transpose() * aEb_matrix * vB(i), 1e-8);

    // Check epipolar constraint
    for (size_t i = 0; i < 5; i++)
        EXPECT_DOUBLES_EQUAL(0, trueE.error(vA(i), vB(i)), 1e-7);
}
Пример #2
0
math::Vector<2> CDispRigidBody::bCoef(real_t e, const NewtonCollisionBase & bData) const
{
	const real_t & dt = bData.dData.dt;

	math::Vector<2> r(bData.points.eff - rotationPoint());
	rotateToGlobal(r);

	real_t ax = 1.0 / m() + (r(1) * r(1) / Idisp());
	real_t ay = 1.0 / m() + (r(0) * r(0) / Idisp());

	//compensate permanent forces
	//reaction to permanent force
	real_t bx = resultantForce(0) * dt * ax;
	real_t by = resultantForce(1) * dt * ay;
	//reaction to permanent moment
	real_t resultantMomentx_add = 0.0;
	real_t resultantMomenty_add = 0.0;
	if (r(1) != 0.0)
		resultantMomentx_add = resultantMoment() * dt * ax / r(1);
	if (r(0) != 0.0)
		resultantMomenty_add = resultantMoment() * dt * ay / r(0);
	bx += resultantMomentx_add;
	by -= resultantMomenty_add;

	//momentum addition
	bx += e * pA(0) / m();
	by += e * pA(1) / m();

	//angular momentum addition
	bx += e * LA() * -r(1) / Idisp();
	by += e * LA() * r(0) / Idisp();

	//L translates into force proportional to (rx, ry)
	real_t Lx_coef = std::abs(r(1)) / (std::abs(r(1)) + std::abs(r(0)));
	real_t Ly_coef = std::abs(r(0)) / (std::abs(r(1)) + std::abs(r(0)));
	real_t Lx_add = std::abs(LA() * r(1) / Idisp() + resultantMomentx_add);
	real_t Ly_add = std::abs(LA() * r(0) / Idisp() - resultantMomenty_add);
	real_t px_add = std::abs(pA(0) / m() + resultantForce(0) * dt * ax);
	real_t py_add = std::abs(pA(1) / m() + resultantForce(1) * dt * ay);

	//multiply bx by bx_coef
	if ((Lx_add + px_add) != 0.0)	//do not divide by 0.0 (note: px_add and Lx_add are absolute values)
		bx *= (Lx_coef * Lx_add + px_add) / (Lx_add + px_add);
	//multiply by by by_coef
	if ((Ly_add + py_add) != 0.0)	//do not divide by 0.0 (note: py_add and Ly_add are absolute values)
		by *= (Ly_coef * Ly_add + py_add) / (Ly_add + py_add);

	return math::Vector<2>(bx, by);
}
//*************************************************************************
TEST (EssentialMatrixFactor3, extraTest) {

    // The "true E" in the body frame is
    EssentialMatrix bodyE = cRb.inverse() * trueE;

    for (size_t i = 0; i < 5; i++) {
        EssentialMatrixFactor3 factor(100, i, pA(i), pB(i), cRb, model2, K);

        // Check evaluation
        Point3 P1 = data.tracks[i].p;
        const Point2 pi = camera2.project(P1);
        Point2 reprojectionError(pi - pB(i));
        Vector expected = reprojectionError.vector();

        Matrix Hactual1, Hactual2;
        double d(baseline / P1.z());
        Vector actual = factor.evaluateError(bodyE, d, Hactual1, Hactual2);
        EXPECT(assert_equal(expected, actual, 1e-7));

        // Use numerical derivatives to calculate the expected Jacobian
        Matrix Hexpected1, Hexpected2;
        boost::function<Vector(const EssentialMatrix&, double)> f = boost::bind(
                    &EssentialMatrixFactor3::evaluateError, &factor, _1, _2, boost::none,
                    boost::none);
        Hexpected1 = numericalDerivative21<Vector2, EssentialMatrix, double>(f, bodyE, d);
        Hexpected2 = numericalDerivative22<Vector2, EssentialMatrix, double>(f, bodyE, d);

        // Verify the Jacobian is correct
        EXPECT(assert_equal(Hexpected1, Hactual1, 1e-6));
        EXPECT(assert_equal(Hexpected2, Hactual2, 1e-8));
    }
}
//*************************************************************************
TEST (EssentialMatrixFactor2, extraMinimization) {
    // Additional test with camera moving in positive X direction

    // We start with a factor graph and add constraints to it
    // Noise sigma is 1, assuming pixel measurements
    NonlinearFactorGraph graph;
    for (size_t i = 0; i < data.number_tracks(); i++)
        graph.add(EssentialMatrixFactor2(100, i, pA(i), pB(i), model2, K));

    // Check error at ground truth
    Values truth;
    truth.insert(100, trueE);
    for (size_t i = 0; i < data.number_tracks(); i++) {
        Point3 P1 = data.tracks[i].p;
        truth.insert(i, double(baseline / P1.z()));
    }
    EXPECT_DOUBLES_EQUAL(0, graph.error(truth), 1e-8);

    // Optimize
    LevenbergMarquardtParams parameters;
    // parameters.setVerbosity("ERROR");
    LevenbergMarquardtOptimizer optimizer(graph, truth, parameters);
    Values result = optimizer.optimize();

    // Check result
    EssentialMatrix actual = result.at<EssentialMatrix>(100);
    EXPECT(assert_equal(trueE, actual, 1e-1));
    for (size_t i = 0; i < data.number_tracks(); i++)
        EXPECT_DOUBLES_EQUAL(truth.at<double>(i), result.at<double>(i), 1e-1);

    // Check error at result
    EXPECT_DOUBLES_EQUAL(0, graph.error(result), 1e-4);
}
//*************************************************************************
TEST (EssentialMatrixFactor3, minimization) {

    // As before, we start with a factor graph and add constraints to it
    NonlinearFactorGraph graph;
    for (size_t i = 0; i < 5; i++)
        // but now we specify the rotation bRc
        graph.add(EssentialMatrixFactor3(100, i, pA(i), pB(i), cRb, model2));

    // Check error at ground truth
    Values truth;
    truth.insert(100, bodyE);
    for (size_t i = 0; i < 5; i++) {
        Point3 P1 = data.tracks[i].p;
        truth.insert(i, double(baseline / P1.z()));
    }
    EXPECT_DOUBLES_EQUAL(0, graph.error(truth), 1e-8);

    // Optimize
    LevenbergMarquardtParams parameters;
    // parameters.setVerbosity("ERROR");
    LevenbergMarquardtOptimizer optimizer(graph, truth, parameters);
    Values result = optimizer.optimize();

    // Check result
    EssentialMatrix actual = result.at<EssentialMatrix>(100);
    EXPECT(assert_equal(bodyE, actual, 1e-1));
    for (size_t i = 0; i < 5; i++)
        EXPECT_DOUBLES_EQUAL(truth.at<double>(i), result.at<double>(i), 1e-1);

    // Check error at result
    EXPECT_DOUBLES_EQUAL(0, graph.error(result), 1e-4);
}
//*************************************************************************
TEST (EssentialMatrixFactor2, minimization) {
    // Here we want to optimize for E and inverse depths at the same time

    // We start with a factor graph and add constraints to it
    // Noise sigma is 1cm, assuming metric measurements
    NonlinearFactorGraph graph;
    for (size_t i = 0; i < 5; i++)
        graph.add(EssentialMatrixFactor2(100, i, pA(i), pB(i), model2));

    // Check error at ground truth
    Values truth;
    truth.insert(100, trueE);
    for (size_t i = 0; i < 5; i++) {
        Point3 P1 = data.tracks[i].p;
        truth.insert(i, double(baseline / P1.z()));
    }
    EXPECT_DOUBLES_EQUAL(0, graph.error(truth), 1e-8);

    // Optimize
    LevenbergMarquardtParams parameters;
    // parameters.setVerbosity("ERROR");
    LevenbergMarquardtOptimizer optimizer(graph, truth, parameters);
    Values result = optimizer.optimize();

    // Check result
    EssentialMatrix actual = result.at<EssentialMatrix>(100);
    EXPECT(assert_equal(trueE, actual, 1e-1));
    for (size_t i = 0; i < 5; i++)
        EXPECT_DOUBLES_EQUAL(truth.at<double>(i), result.at<double>(i), 1e-1);

    // Check error at result
    EXPECT_DOUBLES_EQUAL(0, graph.error(result), 1e-4);
}
//*************************************************************************
TEST (EssentialMatrixFactor2, factor) {
    for (size_t i = 0; i < 5; i++) {
        EssentialMatrixFactor2 factor(100, i, pA(i), pB(i), model2);

        // Check evaluation
        Point3 P1 = data.tracks[i].p, P2 = data.cameras[1].pose().transform_to(P1);
        const Point2 pi = PinholeBase::Project(P2);
        Point2 reprojectionError(pi - pB(i));
        Vector expected = reprojectionError.vector();

        Matrix Hactual1, Hactual2;
        double d(baseline / P1.z());
        Vector actual = factor.evaluateError(trueE, d, Hactual1, Hactual2);
        EXPECT(assert_equal(expected, actual, 1e-7));

        // Use numerical derivatives to calculate the expected Jacobian
        Matrix Hexpected1, Hexpected2;
        boost::function<Vector(const EssentialMatrix&, double)> f = boost::bind(
                    &EssentialMatrixFactor2::evaluateError, &factor, _1, _2, boost::none,
                    boost::none);
        Hexpected1 = numericalDerivative21<Vector2, EssentialMatrix, double>(f, trueE, d);
        Hexpected2 = numericalDerivative22<Vector2, EssentialMatrix, double>(f, trueE, d);

        // Verify the Jacobian is correct
        EXPECT(assert_equal(Hexpected1, Hactual1, 1e-8));
        EXPECT(assert_equal(Hexpected2, Hactual2, 1e-8));
    }
}
int tc_libcxx_utilities_util_smartptr_shared_const_shared_ptr_pointer(void)
{
    B::count = 0;
    A::count = 0;
    {
        std::shared_ptr<A> pA(new A);
        TC_ASSERT_EXPR(pA.use_count() == 1);
        {
            B b;
            std::shared_ptr<B> pB(pA, &b);
            TC_ASSERT_EXPR(A::count == 1);
            TC_ASSERT_EXPR(B::count == 2);
            TC_ASSERT_EXPR(pA.use_count() == 2);
            TC_ASSERT_EXPR(pB.use_count() == 2);
            TC_ASSERT_EXPR(pB.get() == &b);
        }
        TC_ASSERT_EXPR(pA.use_count() == 1);
        TC_ASSERT_EXPR(A::count == 1);
        TC_ASSERT_EXPR(B::count == 1);
    }
    TC_ASSERT_EXPR(A::count == 0);
    TC_ASSERT_EXPR(B::count == 0);
    TC_SUCCESS_RESULT();
    return 0;
}
Пример #9
0
int main()
{
    {
        std::shared_ptr<A> pA(new A);
        assert(pA.use_count() == 1);
        assert(A::count == 1);
        {
            std::shared_ptr<A> pA2(pA);
            assert(A::count == 1);
            assert(pA.use_count() == 2);
            assert(pA2.use_count() == 2);
            assert(pA2.get() == pA.get());
        }
        assert(pA.use_count() == 1);
        assert(A::count == 1);
    }
    assert(A::count == 0);
    {
        std::shared_ptr<A> pA;
        assert(pA.use_count() == 0);
        assert(A::count == 0);
        {
            std::shared_ptr<A> pA2(pA);
            assert(A::count == 0);
            assert(pA.use_count() == 0);
            assert(pA2.use_count() == 0);
            assert(pA2.get() == pA.get());
        }
        assert(pA.use_count() == 0);
        assert(A::count == 0);
    }
    assert(A::count == 0);
}
Пример #10
0
int Dense3d_MPI::setup()
{
  //begin
  pA(_srcPos!=NULL && _srcNor!=NULL && _trgPos!=NULL);
  //--------------------------------------------------------------------------
  /* Create a Scatter context - copies all source position values to each processor
	* See http://www-unix.mcs.anl.gov/petsc/petsc-as/snapshots/petsc-current/docs/manualpages/Vec/VecScatterCreateToAll.html */
  {
	 VecScatter ctx;
	 pC( VecScatterCreateToAll(_srcPos, &ctx, &_srcAllPos) );
	 // VecScatterBegin(VecScatter inctx,Vec x,Vec y,InsertMode addv,ScatterMode mode)
	 pC( VecScatterBegin(ctx, _srcPos, _srcAllPos, INSERT_VALUES, SCATTER_FORWARD) );
	 pC( VecScatterEnd(ctx,  _srcPos, _srcAllPos, INSERT_VALUES, SCATTER_FORWARD ) );
	 pC( VecScatterDestroy(ctx) );
  }
  /* Create a Scatter context - copies all source normal values to each processor */
  {
	 VecScatter ctx;
	 pC( VecScatterCreateToAll(_srcNor, &ctx, &_srcAllNor) );
	 pC( VecScatterBegin(ctx, _srcNor, _srcAllNor, INSERT_VALUES, SCATTER_FORWARD) );
	 pC( VecScatterEnd(ctx,  _srcNor, _srcAllNor, INSERT_VALUES, SCATTER_FORWARD) );
	 pC( VecScatterDestroy(ctx) );
  }
  return(0);
}
Пример #11
0
	bool EXPORT_API ProjectPointTriangleConstraintsJB(btVector3* p, btVector3* p0, btVector3* p1, btVector3* p2, float radius, float K1, float K2, btVector3* c, btVector3* c0, btVector3* c1, btVector3* c2, btVector3 *debugOut)
	{

		//btScalar massInv = 1.0f / mass;


		Eigen::Vector3f pp(p->x(), p->y(), p->z());
		Eigen::Vector3f pA(p0->x(), p0->y(), p0->z());
		Eigen::Vector3f pB(p1->x(), p1->y(), p1->z());
		Eigen::Vector3f pC(p2->x(), p2->y(), p2->z());

		Eigen::Vector3f corrA;
		Eigen::Vector3f corrB;
		Eigen::Vector3f corrC;
		Eigen::Vector3f corr;
		Eigen::Vector3f debug;

		const bool res = PBD::PositionBasedDynamics::solveTrianglePointDistConstraint(pp, 1, pA, 1, pB, 1, pC, 1, radius, K1, K2, corr, corrA, corrB, corrC);


			if (res)
			{
				c->setValue(corr.x(), corr.y(), corr.z());
				c0->setValue(corrA.x(), corrA.y(), corrA.z());
				c1->setValue(corrB.x(), corrB.y(), corrB.z());
				c2->setValue(corrC.x(), corrC.y(), corrC.z());
				debugOut->setValue(debug.x(), debug.y(), debug.z());
		
			}

		
			return res;

	}
Пример #12
0
	void EXPORT_API ComputeInternalConstraintsJB(btVector3* predictedPositions, float* invMasses, bool* posLocks, Link* links, int linksCount, float Ks_prime, float mass)
	{
		for (int i = 0; i < linksCount; i++)
		{
			Link link = links[i];
			if ((link.type == -1) || (posLocks[link.idA] && posLocks[link.idB]))
				continue;

			btScalar wA = posLocks[link.idA] ? 0.0f : invMasses[link.idA];
			btScalar wB = posLocks[link.idB] ? 0.0f : invMasses[link.idB];

			btVector3 predPosA = predictedPositions[link.idA];
			btVector3 predPosB = predictedPositions[link.idB];

			Eigen::Vector3f pA(predPosA.x(), predPosA.y(), predPosA.z());
			Eigen::Vector3f pB(predPosB.x(), predPosB.y(), predPosB.z());

			Eigen::Vector3f corrA;
			Eigen::Vector3f corrB;
			const bool res = PBD::PositionBasedDynamics::solveDistanceConstraint(pA, wA, pB, wB, link.restLength, Ks_prime, Ks_prime, corrA, corrB);

			if (res)
			{
				if (wA != 0.0f)
					predictedPositions[link.idA] += btVector3(corrA.x(), corrA.y(), corrA.z());
				
				if (wB != 0.0f)
					predictedPositions[link.idB] += btVector3(corrB.x(), corrB.y(), corrB.z());
			}


		}


	}
Пример #13
0
int main()
{
    static_assert(( std::is_convertible<std::shared_ptr<A>, std::shared_ptr<B> >::value), "");
    static_assert((!std::is_convertible<std::shared_ptr<B>, std::shared_ptr<A> >::value), "");
    static_assert((!std::is_convertible<std::shared_ptr<A>, std::shared_ptr<C> >::value), "");
    {
        std::shared_ptr<A> pA(new A);
        assert(pA.use_count() == 1);
        assert(B::count == 1);
        assert(A::count == 1);
        {
            B* p = pA.get();
            std::shared_ptr<B> pB(std::move(pA));
            assert(B::count == 1);
            assert(A::count == 1);
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
            assert(pB.use_count() == 1);
            assert(pA.use_count() == 0);
#else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
            assert(pB.use_count() == 2);
            assert(pA.use_count() == 2);
#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
            assert(p == pB.get());
        }
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
        assert(pA.use_count() == 0);
        assert(B::count == 0);
        assert(A::count == 0);
#else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
        assert(pA.use_count() == 1);
        assert(B::count == 1);
        assert(A::count == 1);
#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
    }
    assert(B::count == 0);
    assert(A::count == 0);
    {
        std::shared_ptr<A> pA;
        assert(pA.use_count() == 0);
        assert(B::count == 0);
        assert(A::count == 0);
        {
            std::shared_ptr<B> pB(pA);
            assert(B::count == 0);
            assert(A::count == 0);
            assert(pB.use_count() == 0);
            assert(pA.use_count() == 0);
            assert(pA.get() == pB.get());
        }
        assert(pA.use_count() == 0);
        assert(B::count == 0);
        assert(A::count == 0);
    }
    assert(B::count == 0);
    assert(A::count == 0);
}
Пример #14
0
/* 任意のレジスターの値をスタックにプッシュする。
 * 事前に stack_socket に値をセットせずに、ダイレクトで指定できるので、ソースが小さくなる
 */
void push_stack(const char* regname_data)
{
        write_mem(regname_data, "stack_head");
        pA("stack_head++;");

#ifdef DEBUG_STACK
        pA_mes("push_stack(): ");
        pA_reg("stack_head");
        pA_mes("\\n");
#endif /* DEBUG_STACK */
}
Пример #15
0
/* スタックから任意のレジスターへ値をポップする。
 * 事前に stack_socket に値をセットせずに、ダイレクトで指定できるので、ソースが小さくなる
 */
void pop_stack(const char* regname_data)
{
        pA("stack_head--;");
        read_mem(regname_data, "stack_head");

#ifdef DEBUG_STACK
        pA_mes("pop_stack(): ");
        pA_reg("stack_head");
        pA_mes("\\n");
#endif /* DEBUG_STACK */
}
Пример #16
0
void pA()
{
	switch (ch) {
	case 'a':
		pa(); pA();
		break;
	case 'b':
		pb(); pB();
		break;
	default:
		error();
	}
}
Пример #17
0
int main()
{
    boost::shared_ptr<A> pA(new A);

    std::cout << pA.get() << std::endl;

    boost::shared_ptr<A> pB(pA);

    std::cout << pA.get() << std::endl;
    std::cout << pB.get() << std::endl;

    return 0;
}
Пример #18
0
/* 任意のレジスターの値へコールスタックからポップする
 */
void pop_callstack(const char* register_name)
{
        pA("callstack_head--;");
        read_mem(register_name, "callstack_head");

#ifdef DEBUG_CALLSTACK
        pA_mes("pop_callstack(): ");
        pA_reg(register_name);
        pA_mes(", ");
        pA_reg("callstack_head");
        pA_mes("\\n");
#endif /* DEBUG_CALLSTACK */
}
Пример #19
0
/* 任意のレジスターの値をコールスタックへプッシュする
 */
void push_callstack(const char* register_name)
{
        write_mem(register_name, "callstack_head");
        pA("callstack_head++;");

#ifdef DEBUG_CALLSTACK
        pA_mes("push_callstack(): ");
        pA_reg(register_name);
        pA_mes(", ");
        pA_reg("callstack_head");
        pA_mes("\\n");
#endif /* DEBUG_CALLSTACK */
}
Пример #20
0
Eigen::Matrix<T, Eigen::Dynamic, 1> VCLtoVecSEXP(SEXP A)
{
    Rcpp::XPtr<viennacl::vector<T> > pA(A);
    
    int M = pA->size();
    std::cout << M << std::endl;
    
    Eigen::Matrix<T, Eigen::Dynamic, 1> Am(M);
    std::cout << Am << std::endl;
    
    viennacl::copy(*pA, Am); 
    
    return Am;
}
Пример #21
0
    DocumentSource::GetDepsReturn DocumentSourceGroup::getDependencies(set<string>& deps) const {
        // add the _id
        pIdExpression->addDependencies(deps);

        // add the rest
        const size_t n = vFieldName.size();
        for(size_t i = 0; i < n; ++i) {
            intrusive_ptr<Accumulator> pA((*vpAccumulatorFactory[i])(pExpCtx));
            pA->addOperand(vpExpression[i]);
            pA->addDependencies(deps);
        }

        return EXHAUSTIVE;
    }
Пример #22
0
    void DocumentSourceGroup::sourceToBson(BSONObjBuilder *pBuilder) const {
	BSONObjBuilder insides;

	/* add the _id */
	pIdExpression->addToBsonObj(&insides, Document::idName.c_str(), 0);

	/* add the remaining fields */
	const size_t n = vFieldName.size();
	for(size_t i = 0; i < n; ++i) {
	    intrusive_ptr<Accumulator> pA((*vpAccumulatorFactory[i])(pCtx));
	    pA->addOperand(vpExpression[i]);
	    pA->addToBsonObj(&insides, vFieldName[i], 0);
	}

	pBuilder->append(groupName, insides.done());
    }
Пример #23
0
int tc_libcxx_utilities_util_smartptr_shared_const_shared_ptr_rv(void)
{
    A::count = 0;
    {
        std::shared_ptr<A> pA(new A);
        TC_ASSERT_EXPR(pA.use_count() == 1);
        TC_ASSERT_EXPR(A::count == 1);
        {
            A* p = pA.get();
            std::shared_ptr<A> pA2(std::move(pA));
            TC_ASSERT_EXPR(A::count == 1);
#if TEST_STD_VER >= 11
            TC_ASSERT_EXPR(pA.use_count() == 0);
            TC_ASSERT_EXPR(pA2.use_count() == 1);
#else
            TC_ASSERT_EXPR(pA.use_count() == 2);
            TC_ASSERT_EXPR(pA2.use_count() == 2);
#endif
            TC_ASSERT_EXPR(pA2.get() == p);
        }
#if TEST_STD_VER >= 11
        TC_ASSERT_EXPR(pA.use_count() == 0);
        TC_ASSERT_EXPR(A::count == 0);
#else
        TC_ASSERT_EXPR(pA.use_count() == 1);
        TC_ASSERT_EXPR(A::count == 1);
#endif
    }
    TC_ASSERT_EXPR(A::count == 0);
    {
        std::shared_ptr<A> pA;
        TC_ASSERT_EXPR(pA.use_count() == 0);
        TC_ASSERT_EXPR(A::count == 0);
        {
            std::shared_ptr<A> pA2(std::move(pA));
            TC_ASSERT_EXPR(A::count == 0);
            TC_ASSERT_EXPR(pA.use_count() == 0);
            TC_ASSERT_EXPR(pA2.use_count() == 0);
            TC_ASSERT_EXPR(pA2.get() == pA.get());
        }
        TC_ASSERT_EXPR(pA.use_count() == 0);
        TC_ASSERT_EXPR(A::count == 0);
    }
    TC_ASSERT_EXPR(A::count == 0);
    TC_SUCCESS_RESULT();
    return 0;
}
//*************************************************************************
TEST (EssentialMatrixFactor, minimization) {
    // Here we want to optimize directly on essential matrix constraints
    // Yi Ma's algorithm (Ma01ijcv) is a bit cumbersome to implement,
    // but GTSAM does the equivalent anyway, provided we give the right
    // factors. In this case, the factors are the constraints.

    // We start with a factor graph and add constraints to it
    // Noise sigma is 1cm, assuming metric measurements
    NonlinearFactorGraph graph;
    for (size_t i = 0; i < 5; i++)
        graph.add(EssentialMatrixFactor(1, pA(i), pB(i), model1));

    // Check error at ground truth
    Values truth;
    truth.insert(1, trueE);
    EXPECT_DOUBLES_EQUAL(0, graph.error(truth), 1e-8);

    // Check error at initial estimate
    Values initial;
    EssentialMatrix initialE = trueE.retract(
                                   (Vector(5) << 0.1, -0.1, 0.1, 0.1, -0.1).finished());
    initial.insert(1, initialE);
#if defined(GTSAM_ROT3_EXPMAP) || defined(GTSAM_USE_QUATERNIONS)
    EXPECT_DOUBLES_EQUAL(643.26, graph.error(initial), 1e-2);
#else
    EXPECT_DOUBLES_EQUAL(639.84, graph.error(initial), 1e-2);
#endif

    // Optimize
    LevenbergMarquardtParams parameters;
    LevenbergMarquardtOptimizer optimizer(graph, initial, parameters);
    Values result = optimizer.optimize();

    // Check result
    EssentialMatrix actual = result.at<EssentialMatrix>(1);
    EXPECT(assert_equal(trueE, actual, 1e-1));

    // Check error at result
    EXPECT_DOUBLES_EQUAL(0, graph.error(result), 1e-4);

    // Check errors individually
    for (size_t i = 0; i < 5; i++)
        EXPECT_DOUBLES_EQUAL(0, actual.error(vA(i), vB(i)), 1e-6);

}
Пример #25
0
 /** @brief Constructor
 * @param A matrix whose approximate inverse is calculated. Must be quadratic.
 * @param tag SPAI configuration tag
 */
 fspai_precond(const MatrixType & A,
               const fspai_tag & tag) : tag_(tag), L(viennacl::traits::context(A)), L_trans(viennacl::traits::context(A)), temp_apply_vec_(A.size1(), viennacl::traits::context(A))
 {
     //UBLASSparseMatrixType ubls_A;
     UBLASSparseMatrixType ublas_A(A.size1(), A.size2());
     UBLASSparseMatrixType pA(A.size1(), A.size2());
     UBLASSparseMatrixType ublas_L(A.size1(), A.size2());
     UBLASSparseMatrixType ublas_L_trans(A.size1(), A.size2());
     viennacl::copy(A, ublas_A);
     //viennacl::copy(ubls_A, vcl_A);
     //vcl_At = viennacl::linalg::prod(vcl_A, vcl_A);
     //vcl_pA = viennacl::linalg::prod(vcl_A, vcl_At);
     //viennacl::copy(vcl_pA, pA);
     pA = ublas_A;
     //execute SPAI with ublas matrix types
     viennacl::linalg::detail::spai::computeFSPAI(ublas_A, pA, ublas_L, ublas_L_trans, tag_);
     //copy back to GPU
     viennacl::copy(ublas_L, L);
     viennacl::copy(ublas_L_trans, L_trans);
 }
//*************************************************************************************
void CConsoleAlarmAlertSession::SetAlarmL(const RMessage2& aMessage)
	{
	TPckg<TASShdAlarm> pA(iAlarm);
	aMessage.ReadL(KSlot0, pA);
	if	(iAlarm.HasAssociatedData())
		{
		iAlarmAssociatedDataSize = aMessage.GetDesLength(2);
		TPckg<TAgnAlarmInfo> pB(iAlarmData);
		aMessage.ReadL(KSlot2, pB);

		//Storing the data in the server for the test session to read..
		HBufC8* data = HBufC8::NewLC(iAlarmAssociatedDataSize);
		TPtr8 pData(data->Des());
		aMessage.ReadL(KSlot2, pData);
		iServer->SetAttachment(data);  //Server takes an ownership
		CleanupStack::Pop(data);
		}
	else
		iAlarmAssociatedDataSize = 0;
	}
//*************************************************************************
TEST (EssentialMatrixFactor, extraMinimization) {
    // Additional test with camera moving in positive X direction

    NonlinearFactorGraph graph;
    for (size_t i = 0; i < 5; i++)
        graph.add(EssentialMatrixFactor(1, pA(i), pB(i), model1, K));

    // Check error at ground truth
    Values truth;
    truth.insert(1, trueE);
    EXPECT_DOUBLES_EQUAL(0, graph.error(truth), 1e-8);

    // Check error at initial estimate
    Values initial;
    EssentialMatrix initialE = trueE.retract(
                                   (Vector(5) << 0.1, -0.1, 0.1, 0.1, -0.1).finished());
    initial.insert(1, initialE);

#if defined(GTSAM_ROT3_EXPMAP) || defined(GTSAM_USE_QUATERNIONS)
    EXPECT_DOUBLES_EQUAL(643.26, graph.error(initial), 1e-2);
#else
    EXPECT_DOUBLES_EQUAL(639.84, graph.error(initial), 1e-2);
#endif

    // Optimize
    LevenbergMarquardtParams parameters;
    LevenbergMarquardtOptimizer optimizer(graph, initial, parameters);
    Values result = optimizer.optimize();

    // Check result
    EssentialMatrix actual = result.at<EssentialMatrix>(1);
    EXPECT(assert_equal(trueE, actual, 1e-1));

    // Check error at result
    EXPECT_DOUBLES_EQUAL(0, graph.error(result), 1e-4);

    // Check errors individually
    for (size_t i = 0; i < 5; i++)
        EXPECT_DOUBLES_EQUAL(0, actual.error(vA(i), vB(i)), 1e-6);

}
Пример #28
0
            /** @brief Constructor
             * @param A matrix whose approximate inverse is calculated. Must be quadratic.
             * @param tag spai tag
             */
            spai_precond(const MatrixType& A,
                         const spai_tag& tag): tag_(tag){

                //VCLMatrixType vcl_Ap((unsigned int)A.size2(), (unsigned int)A.size1()), vcl_A((unsigned int)A.size1(), (unsigned int)A.size2()),
                //vcl_At((unsigned int)A.size1(), (unsigned int)A.size2());
                //UBLASDenseMatrixType dA = A;
                MatrixType pA(A.size1(), A.size2());
                MatrixType At;
                //std::cout<<A<<std::endl;
                if(!tag_.getIsRight()){
                    viennacl::linalg::detail::spai::sparse_transpose(A, At);
                }else{
                    At = A;
                }
                pA = At;
                viennacl::linalg::detail::spai::initPreconditioner(pA, spai_m_);
                viennacl::linalg::detail::spai::computeSPAI(At, spai_m_, tag_);
                //(At, pA, tag_.getIsRight(), tag_.getIsStatic(), (ScalarType)_tag.getResidualNormThreshold(), (unsigned int)_tag.getIterationLimit(),
                 //_spai_m);

            }
//*************************************************************************
TEST (EssentialMatrixFactor, factor) {
    for (size_t i = 0; i < 5; i++) {
        EssentialMatrixFactor factor(1, pA(i), pB(i), model1);

        // Check evaluation
        Vector expected(1);
        expected << 0;
        Matrix Hactual;
        Vector actual = factor.evaluateError(trueE, Hactual);
        EXPECT(assert_equal(expected, actual, 1e-7));

        // Use numerical derivatives to calculate the expected Jacobian
        Matrix Hexpected;
        typedef Eigen::Matrix<double,1,1> Vector1;
        Hexpected = numericalDerivative11<Vector1, EssentialMatrix>(
                        boost::bind(&EssentialMatrixFactor::evaluateError, &factor, _1,
                                    boost::none), trueE);

        // Verify the Jacobian is correct
        EXPECT(assert_equal(Hexpected, Hactual, 1e-8));
    }
}
static SCE_PFX_FORCE_INLINE
bool pfxContactTriangleConvex(PfxContactCache &contacts,PfxUInt32 facetId,
							const PfxVector3 &normal,const PfxVector3 &p0,const PfxVector3 &p1,const PfxVector3 &p2,
							const PfxFloat thickness,const PfxFloat angle0,const PfxFloat angle1,const PfxFloat angle2,
							PfxUInt32 edgeChk,
							const PfxConvexMesh &convex)
{
	PfxVector3 facetPnts[6] = {
		p0,p1,p2,p0-thickness*normal,p1-thickness*normal,p2-thickness*normal
	};
	

	PfxPoint3 pA(0.0f),pB(0.0f);
	PfxVector3 nml(0.0f);
	PfxGjkSolver gjk;

	gjk.setup((void*)facetPnts,(void*)&convex,pfxGetSupportVertexTriangleWithThickness,pfxGetSupportVertexConvex);
	PfxFloat d = gjk.collide(nml,pA,pB,PfxTransform3::identity(),PfxTransform3::identity(),SCE_PFX_FLT_MAX);
	if(d >= 0.0f) return false;
	
	PfxVector3 pointsOnTriangle = PfxVector3(pA);
	PfxVector3 pointsOnConvex = PfxVector3(pB);
	PfxVector3 axis = nml;
	
	// 面上の最近接点が凸エッジ上でない場合は法線を変える
	if( ((edgeChk&0x01)&&pfxPointOnLine(pointsOnTriangle,p0,p1)) ||
		((edgeChk&0x02)&&pfxPointOnLine(pointsOnTriangle,p1,p2)) ||
		((edgeChk&0x04)&&pfxPointOnLine(pointsOnTriangle,p2,p0)) ) {
		axis=-normal;
	}
	
	PfxSubData subData;
	subData.setFacetId(facetId);
	contacts.addContactPoint(-length(pointsOnTriangle-pointsOnConvex),axis,pA,pB,subData);
	
	return true;
}