diff --git a/.cproject b/.cproject
index 857a2d913..99b0743fe 100644
--- a/.cproject
+++ b/.cproject
@@ -380,6 +380,14 @@
true
true
+
+ make
+ -j2
+ testGaussianFactor.run
+ true
+ true
+ true
+
make
-j2
@@ -406,7 +414,6 @@
make
-
tests/testBayesTree.run
true
false
@@ -414,7 +421,6 @@
make
-
testBinaryBayesNet.run
true
false
@@ -462,7 +468,6 @@
make
-
testSymbolicBayesNet.run
true
false
@@ -470,7 +475,6 @@
make
-
tests/testSymbolicFactor.run
true
false
@@ -478,7 +482,6 @@
make
-
testSymbolicFactorGraph.run
true
false
@@ -494,20 +497,11 @@
make
-
tests/testBayesTree
true
false
true
-
- make
- -j2
- testGaussianFactor.run
- true
- true
- true
-
make
-j2
@@ -534,6 +528,7 @@
make
+
testGraph.run
true
false
@@ -605,6 +600,7 @@
make
+
testInference.run
true
false
@@ -612,6 +608,7 @@
make
+
testGaussianFactor.run
true
false
@@ -619,6 +616,7 @@
make
+
testJunctionTree.run
true
false
@@ -626,6 +624,7 @@
make
+
testSymbolicBayesNet.run
true
false
@@ -633,6 +632,7 @@
make
+
testSymbolicFactorGraph.run
true
false
@@ -702,22 +702,6 @@
false
true
-
- make
- -j2
- tests/testPose2.run
- true
- true
- true
-
-
- make
- -j2
- tests/testPose3.run
- true
- true
- true
-
make
-j2
@@ -734,6 +718,22 @@
true
true
+
+ make
+ -j2
+ tests/testPose2.run
+ true
+ true
+ true
+
+
+ make
+ -j2
+ tests/testPose3.run
+ true
+ true
+ true
+
make
-j2
@@ -758,15 +758,7 @@
true
true
-
- make
- -j2
- all
- true
- true
- true
-
-
+
make
-j2
check
@@ -774,14 +766,6 @@
true
true
-
- make
- -j2
- clean
- true
- true
- true
-
make
-j2
@@ -822,7 +806,15 @@
true
true
-
+
+ make
+ -j2
+ all
+ true
+ true
+ true
+
+
make
-j2
check
@@ -830,6 +822,14 @@
true
true
+
+ make
+ -j2
+ clean
+ true
+ true
+ true
+
make
-j2
@@ -1152,7 +1152,6 @@
make
-
testErrors.run
true
false
@@ -1560,6 +1559,7 @@
make
+
testSimulated2DOriented.run
true
false
@@ -1599,6 +1599,7 @@
make
+
testSimulated2D.run
true
false
@@ -1606,6 +1607,7 @@
make
+
testSimulated3D.run
true
false
@@ -1619,6 +1621,85 @@
true
true
+
+ cmake
+ ..
+ true
+ false
+ true
+
+
+ make
+ -j2 VERBOSE=1
+ all
+ true
+ false
+ true
+
+
+ make
+ -j5 VERBOSE=1
+ all
+ true
+ false
+ true
+
+
+ make
+ -j2
+ clean
+ true
+ true
+ true
+
+
+ make
+ -j2
+ test
+ true
+ true
+ true
+
+
+ make
+ -j2
+ testSimulated2D.run
+ true
+ true
+ true
+
+
+ make
+ -j2
+ wrap_testWrap.run
+ true
+ true
+ true
+
+
+ make
+ -j2
+ check
+ true
+ true
+ true
+
+
+ make
+ -j5
+ check
+ true
+ false
+ true
+
+
+ make
+ -j2
+ install
+ true
+ true
+ true
+
make
-j2
@@ -1853,6 +1934,7 @@
make
+
tests/testGaussianISAM2
true
false
@@ -1874,46 +1956,6 @@
true
true
-
- make
- -j2
- install
- true
- true
- true
-
-
- make
- -j2
- clean
- true
- true
- true
-
-
- make
- -j2
- check
- true
- true
- true
-
-
- make
- -j2
- all
- true
- true
- true
-
-
- make
- -j2
- dist
- true
- true
- true
-
make
-j2
@@ -2010,6 +2052,94 @@
true
true
+
+ make
+ -j2
+ install
+ true
+ true
+ true
+
+
+ make
+ -j2
+ clean
+ true
+ true
+ true
+
+
+ make
+ -j2
+ check
+ true
+ true
+ true
+
+
+ make
+ -j2
+ all
+ true
+ true
+ true
+
+
+ make
+ -j2
+ dist
+ true
+ true
+ true
+
+
+ make
+ -j2
+ check
+ true
+ true
+ true
+
+
+ make
+ -j2
+ install
+ true
+ true
+ true
+
+
+ make
+ -j2
+ tests/testSpirit.run
+ true
+ true
+ true
+
+
+ make
+ -j2
+ tests/testWrap.run
+ true
+ true
+ true
+
+
+ make
+ -j2
+ clean
+ true
+ true
+ true
+
+
+ make
+ -j2
+ all
+ true
+ true
+ true
+
make
-j2
@@ -2066,54 +2196,6 @@
false
true
-
- make
- -j2
- check
- true
- true
- true
-
-
- make
- -j2
- install
- true
- true
- true
-
-
- make
- -j2
- tests/testSpirit.run
- true
- true
- true
-
-
- make
- -j2
- tests/testWrap.run
- true
- true
- true
-
-
- make
- -j2
- clean
- true
- true
- true
-
-
- make
- -j2
- all
- true
- true
- true
-
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 000000000..094fcd59a
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,72 @@
+project(GTSAM CXX C)
+cmake_minimum_required(VERSION 2.6)
+
+# Set the version number for the libarary
+set (GTSAM_VERSION_MAJOR 0)
+set (GTSAM_VERSION_MINOR 9)
+set (GTSAM_VERSION_PATCH 3)
+
+# guard against in-source builds
+if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
+ message(FATAL_ERROR "In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there. You may need to remove CMakeCache.txt. ")
+endif()
+
+# guard against bad build-type strings
+if (NOT CMAKE_BUILD_TYPE)
+ set(CMAKE_BUILD_TYPE "Debug")
+endif()
+
+string(TOLOWER "${CMAKE_BUILD_TYPE}" cmake_build_type_tolower)
+if( NOT cmake_build_type_tolower STREQUAL "debug"
+ AND NOT cmake_build_type_tolower STREQUAL "release"
+ AND NOT cmake_build_type_tolower STREQUAL "relwithdebinfo")
+ message(FATAL_ERROR "Unknown build type \"${CMAKE_BUILD_TYPE}\". Allowed values are Debug, Release, RelWithDebInfo (case-insensitive).")
+endif()
+
+# Turn off function inlining when debugging
+set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -fno-inline -Wall")
+set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-inline -Wall")
+# No optimization in relwithdebinfo
+set(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -fno-inline -Wall")
+set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-g -fno-inline -Wall")
+# Eigen no debug in release mode
+set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DEIGEN_NO_DEBUG")
+set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DEIGEN_NO_DEBUG")
+
+# Configurable Options
+
+
+# Pull in tests
+enable_testing()
+include(Dart)
+include(CTest)
+
+# Enable make check (http://www.cmake.org/Wiki/CMakeEmulateMakeCheck)
+add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
+
+# Find boost
+find_package(Boost 1.40 REQUIRED)
+
+# General build settings
+include_directories(
+ gtsam/3rdparty/UFconfig
+ gtsam/3rdparty/CCOLAMD/Include
+ ${CMAKE_SOURCE_DIR}
+ CppUnitLite
+ ${BOOST_INCLUDE_DIR})
+link_directories(${Boost_LIBRARY_DIRS})
+
+# Build GTSAM library
+add_subdirectory(gtsam)
+
+# Build CppUnitLite
+add_subdirectory(CppUnitLite)
+
+# Build Tests
+add_subdirectory(tests)
+
+# Build wrap
+add_subdirectory(wrap)
+
+# Build examples
+add_subdirectory(examples)
\ No newline at end of file
diff --git a/CppUnitLite/CMakeLists.txt b/CppUnitLite/CMakeLists.txt
new file mode 100644
index 000000000..6fba22eac
--- /dev/null
+++ b/CppUnitLite/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Build/install CppUnitLite
+
+FILE(GLOB cppunitlite_headers "*.h")
+FILE(GLOB cppunitlite_src "*.cpp")
+
+ADD_LIBRARY(CppUnitLite STATIC ${cppunitlite_src})
+
+install(FILES ${cppunitlite_headers} DESTINATION include/CppUnitLite)
+install(TARGETS CppUnitLite ARCHIVE DESTINATION lib)
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
new file mode 100644
index 000000000..c2c4113f6
--- /dev/null
+++ b/examples/CMakeLists.txt
@@ -0,0 +1,14 @@
+# Build example executables
+FILE(GLOB example_srcs "*.cpp")
+foreach(example_src ${example_srcs} )
+ get_filename_component(example_base ${example_src} NAME_WE)
+ set( example_bin ${example_base} )
+ add_executable(${example_bin} ${example_src})
+ target_link_libraries(${example_bin} gtsam)
+endforeach(example_src)
+
+add_subdirectory(vSLAMexample)
+
+
+
+
diff --git a/examples/vSLAMexample/CMakeLists.txt b/examples/vSLAMexample/CMakeLists.txt
new file mode 100644
index 000000000..0297159af
--- /dev/null
+++ b/examples/vSLAMexample/CMakeLists.txt
@@ -0,0 +1,17 @@
+# Build vSLAMexample
+
+set ( srcs
+ Feature2D.cpp
+ vSLAMutils.cpp
+)
+add_library(vSLAMexample ${srcs})
+
+add_executable(vISAMexample vISAMexample.cpp)
+target_link_libraries(vISAMexample vSLAMexample gtsam)
+
+add_executable(vSFMexample vSFMexample.cpp)
+target_link_libraries(vSFMexample vSLAMexample gtsam)
+
+
+
+
diff --git a/gtsam/3rdparty/CMakeLists.txt b/gtsam/3rdparty/CMakeLists.txt
new file mode 100644
index 000000000..ece7bace8
--- /dev/null
+++ b/gtsam/3rdparty/CMakeLists.txt
@@ -0,0 +1,15 @@
+# install CCOLAMD headers
+install(FILES CCOLAMD/Include/ccolamd.h DESTINATION ${CMAKE_INSTALL_PREFIX}/include/gtsam/3rdparty/CCOLAMD)
+install(FILES UFconfig/UFconfig.h DESTINATION ${CMAKE_INSTALL_PREFIX}/include/gtsam/3rdparty/UFconfig)
+
+# install Eigen - only the headers
+install(DIRECTORY Eigen/Eigen
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/include/gtsam/3rdparty/Eigen
+ FILES_MATCHING PATTERN "*.h")
+file(GLOB eigen_dir_headers_all "Eigen/Eigen/*")
+foreach(eigen_dir ${eigen_dir_headers_all})
+ get_filename_component(filename ${eigen_dir} NAME)
+ if (NOT ((${filename} MATCHES "CMakeLists.txt") OR (${filename} MATCHES "src") OR (${filename} MATCHES ".svn")))
+ install(FILES Eigen/Eigen/${filename} DESTINATION ${CMAKE_INSTALL_PREFIX}/include/gtsam/3rdparty/Eigen/Eigen)
+ endif()
+endforeach(eigen_dir)
diff --git a/gtsam/3rdparty/Eigen/CMakeLists.txt b/gtsam/3rdparty/Eigen/CMakeLists.txt
index c66a14e0e..4a6a849e9 100644
--- a/gtsam/3rdparty/Eigen/CMakeLists.txt
+++ b/gtsam/3rdparty/Eigen/CMakeLists.txt
@@ -283,11 +283,17 @@ if(EIGEN_BUILD_PKGCONFIG)
STRING(REPLACE ${path_separator} ";" pkg_config_libdir_search "$ENV{PKG_CONFIG_LIBDIR}")
message(STATUS "searching for 'pkgconfig' directory in PKG_CONFIG_LIBDIR ( $ENV{PKG_CONFIG_LIBDIR} ), ${CMAKE_INSTALL_PREFIX}/share, and ${CMAKE_INSTALL_PREFIX}/lib")
FIND_PATH(pkg_config_libdir pkgconfig ${pkg_config_libdir_search} ${CMAKE_INSTALL_PREFIX}/share ${CMAKE_INSTALL_PREFIX}/lib ${pkg_config_libdir_search})
- message(STATUS "found ${pkg_config_libdir}/pkgconfig" )
+ if(pkg_config_libdir)
+ SET(pkg_config_install_dir ${pkg_config_libdir})
+ message(STATUS "found ${pkg_config_libdir}/pkgconfig" )
+ else(pkg_config_libdir)
+ SET(pkg_config_install_dir ${CMAKE_INSTALL_PREFIX}/share)
+ message(STATUS "pkgconfig not found; installing in ${pkg_config_install_dir}" )
+ endif(pkg_config_libdir)
configure_file(eigen3.pc.in eigen3.pc)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/eigen3.pc
- DESTINATION ${pkg_config_libdir}/pkgconfig
+ DESTINATION ${pkg_config_install_dir}/pkgconfig
)
endif(EIGEN_BUILD_PKGCONFIG)
diff --git a/gtsam/3rdparty/Eigen/Eigen/Core b/gtsam/3rdparty/Eigen/Eigen/Core
index 6e855427c..a5025e37e 100644
--- a/gtsam/3rdparty/Eigen/Eigen/Core
+++ b/gtsam/3rdparty/Eigen/Eigen/Core
@@ -167,7 +167,7 @@
#include
#endif
-#if (defined(_CPPUNWIND) || defined(__EXCEPTIONS)) && !defined(EIGEN_NO_EXCEPTIONS)
+#if defined(_CPPUNWIND) || defined(__EXCEPTIONS)
#define EIGEN_EXCEPTIONS
#endif
diff --git a/gtsam/3rdparty/Eigen/Eigen/src/Core/Array.h b/gtsam/3rdparty/Eigen/Eigen/src/Core/Array.h
index a3a2167ad..a11fb1b53 100644
--- a/gtsam/3rdparty/Eigen/Eigen/src/Core/Array.h
+++ b/gtsam/3rdparty/Eigen/Eigen/src/Core/Array.h
@@ -68,10 +68,8 @@ class Array
friend struct internal::conservative_resize_like_impl;
using Base::m_storage;
+
public:
- enum { NeedsToAlign = (!(Options&DontAlign))
- && SizeAtCompileTime!=Dynamic && ((static_cast(sizeof(Scalar))*SizeAtCompileTime)%16)==0 };
- EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)
using Base::base;
using Base::coeff;
diff --git a/gtsam/3rdparty/Eigen/Eigen/src/Core/Block.h b/gtsam/3rdparty/Eigen/Eigen/src/Core/Block.h
index 2b251bc2c..fe3e449bf 100644
--- a/gtsam/3rdparty/Eigen/Eigen/src/Core/Block.h
+++ b/gtsam/3rdparty/Eigen/Eigen/src/Core/Block.h
@@ -94,7 +94,7 @@ struct traits
MaskPacketAccessBit = (InnerSize == Dynamic || (InnerSize % packet_traits::size) == 0)
&& (InnerStrideAtCompileTime == 1)
? PacketAccessBit : 0,
- MaskAlignedBit = (InnerPanel && (OuterStrideAtCompileTime!=Dynamic) && ((OuterStrideAtCompileTime % packet_traits::size) == 0)) ? AlignedBit : 0,
+ MaskAlignedBit = (InnerPanel && (OuterStrideAtCompileTime!=Dynamic) && (((OuterStrideAtCompileTime * sizeof(Scalar)) % 16) == 0)) ? AlignedBit : 0,
FlagsLinearAccessBit = (RowsAtCompileTime == 1 || ColsAtCompileTime == 1) ? LinearAccessBit : 0,
FlagsLvalueBit = is_lvalue::value ? LvalueBit : 0,
FlagsRowMajorBit = IsRowMajor ? RowMajorBit : 0,
diff --git a/gtsam/3rdparty/Eigen/Eigen/src/Core/MapBase.h b/gtsam/3rdparty/Eigen/Eigen/src/Core/MapBase.h
index c23bcbfdc..9426e2d24 100644
--- a/gtsam/3rdparty/Eigen/Eigen/src/Core/MapBase.h
+++ b/gtsam/3rdparty/Eigen/Eigen/src/Core/MapBase.h
@@ -170,8 +170,8 @@ template class MapBase
EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(internal::traits::Flags&PacketAccessBit,
internal::inner_stride_at_compile_time::ret==1),
PACKET_ACCESS_REQUIRES_TO_HAVE_INNER_STRIDE_FIXED_TO_1);
- eigen_assert(EIGEN_IMPLIES(internal::traits::Flags&AlignedBit, (size_t(m_data) % (sizeof(Scalar)*internal::packet_traits::size)) == 0)
- && "data is not aligned");
+ eigen_assert(EIGEN_IMPLIES(internal::traits::Flags&AlignedBit, (size_t(m_data) % 16) == 0)
+ && "data is not aligned");
}
PointerType m_data;
diff --git a/gtsam/3rdparty/Eigen/Eigen/src/Core/Matrix.h b/gtsam/3rdparty/Eigen/Eigen/src/Core/Matrix.h
index 44de22cb4..982c9256a 100644
--- a/gtsam/3rdparty/Eigen/Eigen/src/Core/Matrix.h
+++ b/gtsam/3rdparty/Eigen/Eigen/src/Core/Matrix.h
@@ -153,10 +153,6 @@ class Matrix
typedef typename Base::PlainObject PlainObject;
- enum { NeedsToAlign = (!(Options&DontAlign))
- && SizeAtCompileTime!=Dynamic && ((static_cast(sizeof(Scalar))*SizeAtCompileTime)%16)==0 };
- EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)
-
using Base::base;
using Base::coeffRef;
diff --git a/gtsam/3rdparty/Eigen/Eigen/src/Core/PlainObjectBase.h b/gtsam/3rdparty/Eigen/Eigen/src/Core/PlainObjectBase.h
index c70db9247..612254e9d 100644
--- a/gtsam/3rdparty/Eigen/Eigen/src/Core/PlainObjectBase.h
+++ b/gtsam/3rdparty/Eigen/Eigen/src/Core/PlainObjectBase.h
@@ -34,6 +34,19 @@
namespace internal {
+template
+EIGEN_ALWAYS_INLINE void check_rows_cols_for_overflow(Index rows, Index cols)
+{
+ // http://hg.mozilla.org/mozilla-central/file/6c8a909977d3/xpcom/ds/CheckedInt.h#l242
+ // we assume Index is signed
+ Index max_index = (size_t(1) << (8 * sizeof(Index) - 1)) - 1; // assume Index is signed
+ bool error = (rows < 0 || cols < 0) ? true
+ : (rows == 0 || cols == 0) ? false
+ : (rows > max_index / cols);
+ if (error)
+ throw_std_bad_alloc();
+}
+
template (Derived::IsVectorAtCompileTime)> struct conservative_resize_like_impl;
template struct matrix_swap_impl;
@@ -84,14 +97,12 @@ class PlainObjectBase : public internal::dense_xpr_base::type
template struct StridedConstMapType { typedef Eigen::Map type; };
template struct StridedAlignedMapType { typedef Eigen::Map type; };
template struct StridedConstAlignedMapType { typedef Eigen::Map type; };
-
protected:
DenseStorage m_storage;
public:
- enum { NeedsToAlign = (!(Options&DontAlign))
- && SizeAtCompileTime!=Dynamic && ((static_cast(sizeof(Scalar))*SizeAtCompileTime)%16)==0 };
+ enum { NeedsToAlign = SizeAtCompileTime != Dynamic && (internal::traits::Flags & AlignedBit) != 0 };
EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)
Base& base() { return *static_cast(this); }
@@ -200,11 +211,13 @@ class PlainObjectBase : public internal::dense_xpr_base::type
EIGEN_STRONG_INLINE void resize(Index rows, Index cols)
{
#ifdef EIGEN_INITIALIZE_MATRICES_BY_ZERO
+ internal::check_rows_cols_for_overflow(rows, cols);
Index size = rows*cols;
bool size_changed = size != this->size();
m_storage.resize(size, rows, cols);
if(size_changed) EIGEN_INITIALIZE_BY_ZERO_IF_THAT_OPTION_IS_ENABLED
#else
+ internal::check_rows_cols_for_overflow(rows, cols);
m_storage.resize(rows*cols, rows, cols);
#endif
}
@@ -273,6 +286,7 @@ class PlainObjectBase : public internal::dense_xpr_base::type
EIGEN_STRONG_INLINE void resizeLike(const EigenBase& _other)
{
const OtherDerived& other = _other.derived();
+ internal::check_rows_cols_for_overflow(other.rows(), other.cols());
const Index othersize = other.rows()*other.cols();
if(RowsAtCompileTime == 1)
{
@@ -417,6 +431,7 @@ class PlainObjectBase : public internal::dense_xpr_base::type
: m_storage(other.derived().rows() * other.derived().cols(), other.derived().rows(), other.derived().cols())
{
_check_template_params();
+ internal::check_rows_cols_for_overflow(other.derived().rows(), other.derived().cols());
Base::operator=(other.derived());
}
@@ -581,6 +596,7 @@ class PlainObjectBase : public internal::dense_xpr_base::type
{
eigen_assert(rows >= 0 && (RowsAtCompileTime == Dynamic || RowsAtCompileTime == rows)
&& cols >= 0 && (ColsAtCompileTime == Dynamic || ColsAtCompileTime == cols));
+ internal::check_rows_cols_for_overflow(rows, cols);
m_storage.resize(rows*cols,rows,cols);
EIGEN_INITIALIZE_BY_ZERO_IF_THAT_OPTION_IS_ENABLED
}
@@ -638,6 +654,7 @@ struct internal::conservative_resize_like_impl
if ( ( Derived::IsRowMajor && _this.cols() == cols) || // row-major and we change only the number of rows
(!Derived::IsRowMajor && _this.rows() == rows) ) // column-major and we change only the number of columns
{
+ internal::check_rows_cols_for_overflow(rows, cols);
_this.derived().m_storage.conservativeResize(rows*cols,rows,cols);
}
else
diff --git a/gtsam/3rdparty/Eigen/Eigen/src/Core/arch/NEON/Complex.h b/gtsam/3rdparty/Eigen/Eigen/src/Core/arch/NEON/Complex.h
index 8e55548c9..212887184 100644
--- a/gtsam/3rdparty/Eigen/Eigen/src/Core/arch/NEON/Complex.h
+++ b/gtsam/3rdparty/Eigen/Eigen/src/Core/arch/NEON/Complex.h
@@ -27,8 +27,8 @@
namespace internal {
-static uint32x4_t p4ui_CONJ_XOR = { 0x00000000, 0x80000000, 0x00000000, 0x80000000 };
-static uint32x2_t p2ui_CONJ_XOR = { 0x00000000, 0x80000000 };
+static uint32x4_t p4ui_CONJ_XOR = EIGEN_INIT_NEON_PACKET4(0x00000000, 0x80000000, 0x00000000, 0x80000000);
+static uint32x2_t p2ui_CONJ_XOR = EIGEN_INIT_NEON_PACKET2(0x00000000, 0x80000000);
//---------- float ----------
struct Packet2cf
diff --git a/gtsam/3rdparty/Eigen/Eigen/src/Core/arch/NEON/PacketMath.h b/gtsam/3rdparty/Eigen/Eigen/src/Core/arch/NEON/PacketMath.h
index 478ef8038..6c7cd1590 100644
--- a/gtsam/3rdparty/Eigen/Eigen/src/Core/arch/NEON/PacketMath.h
+++ b/gtsam/3rdparty/Eigen/Eigen/src/Core/arch/NEON/PacketMath.h
@@ -52,6 +52,16 @@ typedef uint32x4_t Packet4ui;
#define _EIGEN_DECLARE_CONST_Packet4i(NAME,X) \
const Packet4i p4i_##NAME = pset1(X)
+#if defined(__llvm__) && !defined(__clang__)
+ //Special treatment for Apple's llvm-gcc, its NEON packet types are unions
+ #define EIGEN_INIT_NEON_PACKET2(X, Y) {{X, Y}}
+ #define EIGEN_INIT_NEON_PACKET4(X, Y, Z, W) {{X, Y, Z, W}}
+#else
+ //Default initializer for packets
+ #define EIGEN_INIT_NEON_PACKET2(X, Y) {X, Y}
+ #define EIGEN_INIT_NEON_PACKET4(X, Y, Z, W) {X, Y, Z, W}
+#endif
+
#ifndef __pld
#define __pld(x) asm volatile ( " pld [%[addr]]\n" :: [addr] "r" (x) : "cc" );
#endif
@@ -84,7 +94,7 @@ template<> struct packet_traits : default_packet_traits
};
};
-#if EIGEN_GNUC_AT_MOST(4,4)
+#if EIGEN_GNUC_AT_MOST(4,4) && !defined(__llvm__)
// workaround gcc 4.2, 4.3 and 4.4 compilatin issue
EIGEN_STRONG_INLINE float32x4_t vld1q_f32(const float* x) { return ::vld1q_f32((const float32_t*)x); }
EIGEN_STRONG_INLINE float32x2_t vld1_f32 (const float* x) { return ::vld1_f32 ((const float32_t*)x); }
@@ -100,12 +110,12 @@ template<> EIGEN_STRONG_INLINE Packet4i pset1(const int& from) {
template<> EIGEN_STRONG_INLINE Packet4f plset(const float& a)
{
- Packet4f countdown = { 0, 1, 2, 3 };
+ Packet4f countdown = EIGEN_INIT_NEON_PACKET4(0, 1, 2, 3);
return vaddq_f32(pset1(a), countdown);
}
template<> EIGEN_STRONG_INLINE Packet4i plset(const int& a)
{
- Packet4i countdown = { 0, 1, 2, 3 };
+ Packet4i countdown = EIGEN_INIT_NEON_PACKET4(0, 1, 2, 3);
return vaddq_s32(pset1(a), countdown);
}
@@ -395,25 +405,29 @@ template<> EIGEN_STRONG_INLINE int predux_max(const Packet4i& a)
return s[0];
}
-template
-struct palign_impl
-{
- EIGEN_STRONG_INLINE static void run(Packet4f& first, const Packet4f& second)
- {
- if (Offset!=0)
- first = vextq_f32(first, second, Offset);
- }
-};
+// this PALIGN_NEON business is to work around a bug in LLVM Clang 3.0 causing incorrect compilation errors,
+// see bug 347 and this LLVM bug: http://llvm.org/bugs/show_bug.cgi?id=11074
+#define PALIGN_NEON(Offset,Type,Command) \
+template<>\
+struct palign_impl\
+{\
+ EIGEN_STRONG_INLINE static void run(Type& first, const Type& second)\
+ {\
+ if (Offset!=0)\
+ first = Command(first, second, Offset);\
+ }\
+};\
-template
-struct palign_impl
-{
- EIGEN_STRONG_INLINE static void run(Packet4i& first, const Packet4i& second)
- {
- if (Offset!=0)
- first = vextq_s32(first, second, Offset);
- }
-};
+PALIGN_NEON(0,Packet4f,vextq_f32)
+PALIGN_NEON(1,Packet4f,vextq_f32)
+PALIGN_NEON(2,Packet4f,vextq_f32)
+PALIGN_NEON(3,Packet4f,vextq_f32)
+PALIGN_NEON(0,Packet4i,vextq_s32)
+PALIGN_NEON(1,Packet4i,vextq_s32)
+PALIGN_NEON(2,Packet4i,vextq_s32)
+PALIGN_NEON(3,Packet4i,vextq_s32)
+
+#undef PALIGN_NEON
} // end namespace internal
diff --git a/gtsam/3rdparty/Eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h b/gtsam/3rdparty/Eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h
index 6f3f27170..c601f4771 100644
--- a/gtsam/3rdparty/Eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h
+++ b/gtsam/3rdparty/Eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h
@@ -118,14 +118,14 @@ inline void computeProductBlockingSizes(std::ptrdiff_t& k, std::ptrdiff_t& m, st
// FIXME (a bit overkill maybe ?)
template struct gebp_madd_selector {
- EIGEN_STRONG_INLINE EIGEN_ALWAYS_INLINE_ATTRIB static void run(const CJ& cj, A& a, B& b, C& c, T& /*t*/)
+ EIGEN_ALWAYS_INLINE static void run(const CJ& cj, A& a, B& b, C& c, T& /*t*/)
{
c = cj.pmadd(a,b,c);
}
};
template struct gebp_madd_selector {
- EIGEN_STRONG_INLINE EIGEN_ALWAYS_INLINE_ATTRIB static void run(const CJ& cj, T& a, T& b, T& c, T& t)
+ EIGEN_ALWAYS_INLINE static void run(const CJ& cj, T& a, T& b, T& c, T& t)
{
t = b; t = cj.pmul(a,t); c = padd(c,t);
}
diff --git a/gtsam/3rdparty/Eigen/Eigen/src/Core/util/Macros.h b/gtsam/3rdparty/Eigen/Eigen/src/Core/util/Macros.h
index 2a647cfda..e6c5ef425 100644
--- a/gtsam/3rdparty/Eigen/Eigen/src/Core/util/Macros.h
+++ b/gtsam/3rdparty/Eigen/Eigen/src/Core/util/Macros.h
@@ -28,7 +28,7 @@
#define EIGEN_WORLD_VERSION 3
#define EIGEN_MAJOR_VERSION 0
-#define EIGEN_MINOR_VERSION 3
+#define EIGEN_MINOR_VERSION 4
#define EIGEN_VERSION_AT_LEAST(x,y,z) (EIGEN_WORLD_VERSION>x || (EIGEN_WORLD_VERSION>=x && \
(EIGEN_MAJOR_VERSION>y || (EIGEN_MAJOR_VERSION>=y && \
@@ -45,7 +45,7 @@
#define EIGEN_GNUC_AT_MOST(x,y) 0
#endif
-#if EIGEN_GNUC_AT_MOST(4,3)
+#if EIGEN_GNUC_AT_MOST(4,3) && !defined(__clang__)
// see bug 89
#define EIGEN_SAFE_TO_USE_STANDARD_ASSERT_MACRO 0
#else
@@ -130,31 +130,34 @@
#define EIGEN_MAKESTRING2(a) #a
#define EIGEN_MAKESTRING(a) EIGEN_MAKESTRING2(a)
-// EIGEN_ALWAYS_INLINE_ATTRIB should be use in the declaration of function
-// which should be inlined even in debug mode.
-// FIXME with the always_inline attribute,
-// gcc 3.4.x reports the following compilation error:
-// Eval.h:91: sorry, unimplemented: inlining failed in call to 'const Eigen::Eval Eigen::MatrixBase::eval() const'
-// : function body not available
-#if EIGEN_GNUC_AT_LEAST(4,0)
-#define EIGEN_ALWAYS_INLINE_ATTRIB __attribute__((always_inline))
-#else
-#define EIGEN_ALWAYS_INLINE_ATTRIB
-#endif
-
#if EIGEN_GNUC_AT_LEAST(4,1) && !defined(__clang__) && !defined(__INTEL_COMPILER)
#define EIGEN_FLATTEN_ATTRIB __attribute__((flatten))
#else
#define EIGEN_FLATTEN_ATTRIB
#endif
-// EIGEN_FORCE_INLINE means "inline as much as possible"
+// EIGEN_STRONG_INLINE is a stronger version of the inline, using __forceinline on MSVC,
+// but it still doesn't use GCC's always_inline. This is useful in (common) situations where MSVC needs forceinline
+// but GCC is still doing fine with just inline.
#if (defined _MSC_VER) || (defined __INTEL_COMPILER)
#define EIGEN_STRONG_INLINE __forceinline
#else
#define EIGEN_STRONG_INLINE inline
#endif
+// EIGEN_ALWAYS_INLINE is the stronget, it has the effect of making the function inline and adding every possible
+// attribute to maximize inlining. This should only be used when really necessary: in particular,
+// it uses __attribute__((always_inline)) on GCC, which most of the time is useless and can severely harm compile times.
+// FIXME with the always_inline attribute,
+// gcc 3.4.x reports the following compilation error:
+// Eval.h:91: sorry, unimplemented: inlining failed in call to 'const Eigen::Eval Eigen::MatrixBase::eval() const'
+// : function body not available
+#if EIGEN_GNUC_AT_LEAST(4,0)
+#define EIGEN_ALWAYS_INLINE __attribute__((always_inline)) inline
+#else
+#define EIGEN_ALWAYS_INLINE EIGEN_STRONG_INLINE
+#endif
+
#if (defined __GNUC__)
#define EIGEN_DONT_INLINE __attribute__((noinline))
#elif (defined _MSC_VER)
@@ -249,7 +252,7 @@
#define EIGEN_UNUSED_VARIABLE(var) (void)var;
#if (defined __GNUC__)
-#define EIGEN_ASM_COMMENT(X) asm("#"X)
+#define EIGEN_ASM_COMMENT(X) asm("#" X)
#else
#define EIGEN_ASM_COMMENT(X)
#endif
diff --git a/gtsam/3rdparty/Eigen/Eigen/src/Core/util/Memory.h b/gtsam/3rdparty/Eigen/Eigen/src/Core/util/Memory.h
index a580b95ad..023716dc9 100644
--- a/gtsam/3rdparty/Eigen/Eigen/src/Core/util/Memory.h
+++ b/gtsam/3rdparty/Eigen/Eigen/src/Core/util/Memory.h
@@ -82,6 +82,16 @@
namespace internal {
+inline void throw_std_bad_alloc()
+{
+ #ifdef EIGEN_EXCEPTIONS
+ throw std::bad_alloc();
+ #else
+ std::size_t huge = -1;
+ new int[huge];
+ #endif
+}
+
/*****************************************************************************
*** Implementation of handmade aligned functions ***
*****************************************************************************/
@@ -192,7 +202,7 @@ inline void check_that_malloc_is_allowed()
#endif
/** \internal Allocates \a size bytes. The returned pointer is guaranteed to have 16 bytes alignment.
- * On allocation error, the returned pointer is null, and if exceptions are enabled then a std::bad_alloc is thrown.
+ * On allocation error, the returned pointer is null, and std::bad_alloc is thrown.
*/
inline void* aligned_malloc(size_t size)
{
@@ -213,10 +223,9 @@ inline void* aligned_malloc(size_t size)
result = handmade_aligned_malloc(size);
#endif
- #ifdef EIGEN_EXCEPTIONS
- if(result == 0)
- throw std::bad_alloc();
- #endif
+ if(!result && size)
+ throw_std_bad_alloc();
+
return result;
}
@@ -241,7 +250,7 @@ inline void aligned_free(void *ptr)
/**
* \internal
* \brief Reallocates an aligned block of memory.
-* \throws std::bad_alloc if EIGEN_EXCEPTIONS are defined.
+* \throws std::bad_alloc on allocation failure
**/
inline void* aligned_realloc(void *ptr, size_t new_size, size_t old_size)
{
@@ -269,10 +278,9 @@ inline void* aligned_realloc(void *ptr, size_t new_size, size_t old_size)
result = handmade_aligned_realloc(ptr,new_size,old_size);
#endif
-#ifdef EIGEN_EXCEPTIONS
- if (result==0 && new_size!=0)
- throw std::bad_alloc();
-#endif
+ if (!result && new_size)
+ throw_std_bad_alloc();
+
return result;
}
@@ -281,7 +289,7 @@ inline void* aligned_realloc(void *ptr, size_t new_size, size_t old_size)
*****************************************************************************/
/** \internal Allocates \a size bytes. If Align is true, then the returned ptr is 16-byte-aligned.
- * On allocation error, the returned pointer is null, and if exceptions are enabled then a std::bad_alloc is thrown.
+ * On allocation error, the returned pointer is null, and a std::bad_alloc is thrown.
*/
template inline void* conditional_aligned_malloc(size_t size)
{
@@ -293,9 +301,8 @@ template<> inline void* conditional_aligned_malloc(size_t size)
check_that_malloc_is_allowed();
void *result = std::malloc(size);
- #ifdef EIGEN_EXCEPTIONS
- if(!result) throw std::bad_alloc();
- #endif
+ if(!result && size)
+ throw_std_bad_alloc();
return result;
}
@@ -347,18 +354,27 @@ template inline void destruct_elements_of_array(T *ptr, size_t size)
*** Implementation of aligned new/delete-like functions ***
*****************************************************************************/
+template
+EIGEN_ALWAYS_INLINE void check_size_for_overflow(size_t size)
+{
+ if(size > size_t(-1) / sizeof(T))
+ throw_std_bad_alloc();
+}
+
/** \internal Allocates \a size objects of type T. The returned pointer is guaranteed to have 16 bytes alignment.
- * On allocation error, the returned pointer is undefined, but if exceptions are enabled then a std::bad_alloc is thrown.
+ * On allocation error, the returned pointer is undefined, but a std::bad_alloc is thrown.
* The default constructor of T is called.
*/
template inline T* aligned_new(size_t size)
{
+ check_size_for_overflow(size);
T *result = reinterpret_cast(aligned_malloc(sizeof(T)*size));
return construct_elements_of_array(result, size);
}
template inline T* conditional_aligned_new(size_t size)
{
+ check_size_for_overflow(size);
T *result = reinterpret_cast(conditional_aligned_malloc(sizeof(T)*size));
return construct_elements_of_array(result, size);
}
@@ -383,6 +399,8 @@ template inline void conditional_aligned_delete(T *ptr,
template inline T* conditional_aligned_realloc_new(T* pts, size_t new_size, size_t old_size)
{
+ check_size_for_overflow(new_size);
+ check_size_for_overflow(old_size);
if(new_size < old_size)
destruct_elements_of_array(pts+new_size, old_size-new_size);
T *result = reinterpret_cast(conditional_aligned_realloc(reinterpret_cast(pts), sizeof(T)*new_size, sizeof(T)*old_size));
@@ -394,6 +412,7 @@ template inline T* conditional_aligned_realloc_new(T* pt
template inline T* conditional_aligned_new_auto(size_t size)
{
+ check_size_for_overflow(size);
T *result = reinterpret_cast(conditional_aligned_malloc(sizeof(T)*size));
if(NumTraits::RequireInitialization)
construct_elements_of_array(result, size);
@@ -402,6 +421,8 @@ template inline T* conditional_aligned_new_auto(size_t s
template inline T* conditional_aligned_realloc_new_auto(T* pts, size_t new_size, size_t old_size)
{
+ check_size_for_overflow(new_size);
+ check_size_for_overflow(old_size);
if(NumTraits::RequireInitialization && (new_size < old_size))
destruct_elements_of_array(pts+new_size, old_size-new_size);
T *result = reinterpret_cast(conditional_aligned_realloc(reinterpret_cast(pts), sizeof(T)*new_size, sizeof(T)*old_size));
@@ -536,6 +557,7 @@ template class aligned_stack_memory_handler
#endif
#define ei_declare_aligned_stack_constructed_variable(TYPE,NAME,SIZE,BUFFER) \
+ Eigen::internal::check_size_for_overflow(SIZE); \
TYPE* NAME = (BUFFER)!=0 ? (BUFFER) \
: reinterpret_cast( \
(sizeof(TYPE)*SIZE<=EIGEN_STACK_ALLOCATION_LIMIT) ? EIGEN_ALIGNED_ALLOCA(sizeof(TYPE)*SIZE) \
@@ -545,6 +567,7 @@ template class aligned_stack_memory_handler
#else
#define ei_declare_aligned_stack_constructed_variable(TYPE,NAME,SIZE,BUFFER) \
+ Eigen::internal::check_size_for_overflow(SIZE); \
TYPE* NAME = (BUFFER)!=0 ? BUFFER : reinterpret_cast(Eigen::internal::aligned_malloc(sizeof(TYPE)*SIZE)); \
Eigen::internal::aligned_stack_memory_handler EIGEN_CAT(NAME,_stack_memory_destructor)((BUFFER)==0 ? NAME : 0,SIZE,true)
@@ -669,6 +692,7 @@ public:
pointer allocate( size_type num, const void* hint = 0 )
{
EIGEN_UNUSED_VARIABLE(hint);
+ internal::check_size_for_overflow(num);
return static_cast( internal::aligned_malloc( num * sizeof(T) ) );
}
diff --git a/gtsam/3rdparty/Eigen/Eigen/src/Core/util/XprHelper.h b/gtsam/3rdparty/Eigen/Eigen/src/Core/util/XprHelper.h
index 9047c5f83..fcd3b093f 100644
--- a/gtsam/3rdparty/Eigen/Eigen/src/Core/util/XprHelper.h
+++ b/gtsam/3rdparty/Eigen/Eigen/src/Core/util/XprHelper.h
@@ -125,10 +125,9 @@ class compute_matrix_flags
aligned_bit =
(
((Options&DontAlign)==0)
- && packet_traits::Vectorizable
&& (
#if EIGEN_ALIGN_STATICALLY
- ((!is_dynamic_size_storage) && (((MaxCols*MaxRows) % packet_traits::size) == 0))
+ ((!is_dynamic_size_storage) && (((MaxCols*MaxRows*sizeof(Scalar)) % 16) == 0))
#else
0
#endif
diff --git a/gtsam/3rdparty/Eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h b/gtsam/3rdparty/Eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h
index 965dda88b..c8945a848 100644
--- a/gtsam/3rdparty/Eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h
+++ b/gtsam/3rdparty/Eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h
@@ -220,6 +220,7 @@ template class SelfAdjointEigenSolver
const MatrixType& eigenvectors() const
{
eigen_assert(m_isInitialized && "SelfAdjointEigenSolver is not initialized.");
+ eigen_assert(info() == Success && "Eigenvalue computation did not converge.");
eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
return m_eivec;
}
@@ -242,6 +243,7 @@ template class SelfAdjointEigenSolver
const RealVectorType& eigenvalues() const
{
eigen_assert(m_isInitialized && "SelfAdjointEigenSolver is not initialized.");
+ eigen_assert(info() == Success && "Eigenvalue computation did not converge.");
return m_eivalues;
}
@@ -266,6 +268,7 @@ template class SelfAdjointEigenSolver
MatrixType operatorSqrt() const
{
eigen_assert(m_isInitialized && "SelfAdjointEigenSolver is not initialized.");
+ eigen_assert(info() == Success && "Eigenvalue computation did not converge.");
eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
return m_eivec * m_eivalues.cwiseSqrt().asDiagonal() * m_eivec.adjoint();
}
@@ -291,6 +294,7 @@ template class SelfAdjointEigenSolver
MatrixType operatorInverseSqrt() const
{
eigen_assert(m_isInitialized && "SelfAdjointEigenSolver is not initialized.");
+ eigen_assert(info() == Success && "Eigenvalue computation did not converge.");
eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
return m_eivec * m_eivalues.cwiseInverse().cwiseSqrt().asDiagonal() * m_eivec.adjoint();
}
@@ -307,7 +311,8 @@ template class SelfAdjointEigenSolver
/** \brief Maximum number of iterations.
*
- * Maximum number of iterations allowed for an eigenvalue to converge.
+ * The algorithm terminates if it does not converge within m_maxIterations * n iterations, where n
+ * denotes the size of the matrix. This value is currently set to 30 (copied from LAPACK).
*/
static const int m_maxIterations = 30;
@@ -407,7 +412,7 @@ SelfAdjointEigenSolver& SelfAdjointEigenSolver
Index end = n-1;
Index start = 0;
- Index iter = 0; // number of iterations we are working on one element
+ Index iter = 0; // total number of iterations
while (end>0)
{
@@ -418,15 +423,14 @@ SelfAdjointEigenSolver& SelfAdjointEigenSolver
// find the largest unreduced block
while (end>0 && m_subdiag[end-1]==0)
{
- iter = 0;
end--;
}
if (end<=0)
break;
- // if we spent too many iterations on the current element, we give up
+ // if we spent too many iterations, we give up
iter++;
- if(iter > m_maxIterations) break;
+ if(iter > m_maxIterations * n) break;
start = end - 1;
while (start>0 && m_subdiag[start-1]!=0)
@@ -435,7 +439,7 @@ SelfAdjointEigenSolver& SelfAdjointEigenSolver
internal::tridiagonal_qr_step(diag.data(), m_subdiag.data(), start, end, computeEigenvectors ? m_eivec.data() : (Scalar*)0, n);
}
- if (iter <= m_maxIterations)
+ if (iter <= m_maxIterations * n)
m_info = Success;
else
m_info = NoConvergence;
diff --git a/gtsam/3rdparty/Eigen/Eigen/src/Geometry/Quaternion.h b/gtsam/3rdparty/Eigen/Eigen/src/Geometry/Quaternion.h
index 2662d60fe..b2f127b6a 100644
--- a/gtsam/3rdparty/Eigen/Eigen/src/Geometry/Quaternion.h
+++ b/gtsam/3rdparty/Eigen/Eigen/src/Geometry/Quaternion.h
@@ -182,10 +182,9 @@ public:
template
inline typename internal::cast_return_type >::type cast() const
{
- return typename internal::cast_return_type >::type(
- coeffs().template cast());
+ return typename internal::cast_return_type >::type(derived());
}
-
+
#ifdef EIGEN_QUATERNIONBASE_PLUGIN
# include EIGEN_QUATERNIONBASE_PLUGIN
#endif
@@ -225,22 +224,25 @@ struct traits >
typedef _Scalar Scalar;
typedef Matrix<_Scalar,4,1,_Options> Coefficients;
enum{
- IsAligned = bool(EIGEN_ALIGN) && ((int(_Options)&Aligned)==Aligned),
+ IsAligned = internal::traits::Flags & AlignedBit,
Flags = IsAligned ? (AlignedBit | LvalueBit) : LvalueBit
};
};
}
template
-class Quaternion : public QuaternionBase >{
+class Quaternion : public QuaternionBase >
+{
typedef QuaternionBase > Base;
+ enum { IsAligned = internal::traits::IsAligned };
+
public:
typedef _Scalar Scalar;
EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Quaternion)
using Base::operator*=;
- typedef typename internal::traits >::Coefficients Coefficients;
+ typedef typename internal::traits::Coefficients Coefficients;
typedef typename Base::AngleAxisType AngleAxisType;
/** Default constructor leaving the quaternion uninitialized. */
@@ -271,9 +273,16 @@ public:
template
explicit inline Quaternion(const MatrixBase& other) { *this = other; }
+ /** Explicit copy constructor with scalar conversion */
+ template
+ explicit inline Quaternion(const Quaternion& other)
+ { m_coeffs = other.coeffs().template cast(); }
+
inline Coefficients& coeffs() { return m_coeffs;}
inline const Coefficients& coeffs() const { return m_coeffs;}
+ EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(IsAligned)
+
protected:
Coefficients m_coeffs;
diff --git a/gtsam/3rdparty/Eigen/Eigen/src/LU/FullPivLU.h b/gtsam/3rdparty/Eigen/Eigen/src/LU/FullPivLU.h
index 633fb23fd..46ae7d651 100644
--- a/gtsam/3rdparty/Eigen/Eigen/src/LU/FullPivLU.h
+++ b/gtsam/3rdparty/Eigen/Eigen/src/LU/FullPivLU.h
@@ -443,7 +443,6 @@ FullPivLU& FullPivLU::compute(const MatrixType& matrix)
m_nonzero_pivots = size; // the generic case is that in which all pivots are nonzero (invertible case)
m_maxpivot = RealScalar(0);
- RealScalar cutoff(0);
for(Index k = 0; k < size; ++k)
{
@@ -458,14 +457,7 @@ FullPivLU& FullPivLU::compute(const MatrixType& matrix)
row_of_biggest_in_corner += k; // correct the values! since they were computed in the corner,
col_of_biggest_in_corner += k; // need to add k to them.
- // when k==0, biggest_in_corner is the biggest coeff absolute value in the original matrix
- if(k == 0) cutoff = biggest_in_corner * NumTraits::epsilon();
-
- // if the pivot (hence the corner) is "zero", terminate to avoid generating nan/inf values.
- // Notice that using an exact comparison (biggest_in_corner==0) here, as Golub-van Loan do in
- // their pseudo-code, results in numerical instability! The cutoff here has been validated
- // by running the unit test 'lu' with many repetitions.
- if(biggest_in_corner < cutoff)
+ if(biggest_in_corner==RealScalar(0))
{
// before exiting, make sure to initialize the still uninitialized transpositions
// in a sane state without destroying what we already have.
diff --git a/gtsam/3rdparty/Eigen/bench/btl/generic_bench/btl.hh b/gtsam/3rdparty/Eigen/bench/btl/generic_bench/btl.hh
index 17cd397a1..f1a88ff74 100644
--- a/gtsam/3rdparty/Eigen/bench/btl/generic_bench/btl.hh
+++ b/gtsam/3rdparty/Eigen/bench/btl/generic_bench/btl.hh
@@ -39,7 +39,7 @@
#endif
#if (defined __GNUC__)
-#define BTL_ASM_COMMENT(X) asm("#"X)
+#define BTL_ASM_COMMENT(X) asm("#" X)
#else
#define BTL_ASM_COMMENT(X)
#endif
diff --git a/gtsam/3rdparty/Eigen/doc/CMakeLists.txt b/gtsam/3rdparty/Eigen/doc/CMakeLists.txt
index 43f31b91e..50ce7ee0c 100644
--- a/gtsam/3rdparty/Eigen/doc/CMakeLists.txt
+++ b/gtsam/3rdparty/Eigen/doc/CMakeLists.txt
@@ -64,9 +64,14 @@ add_custom_target(
add_dependencies(doc-eigen-prerequisites all_snippets all_examples)
add_dependencies(doc-unsupported-prerequisites unsupported_snippets unsupported_examples)
+
add_custom_target(doc ALL
COMMAND doxygen Doxyfile-unsupported
COMMAND doxygen
COMMAND doxygen Doxyfile-unsupported # run doxygen twice to get proper eigen <=> unsupported cross references
+ COMMAND ${CMAKE_COMMAND} -E rename html eigen-doc
+ COMMAND ${CMAKE_COMMAND} -E tar cvfz eigen-doc/eigen-doc.tgz eigen-doc/*.html eigen-doc/*.map eigen-doc/*.png eigen-doc/*.css eigen-doc/*.js eigen-doc/*.txt eigen-doc/unsupported
+ COMMAND ${CMAKE_COMMAND} -E rename eigen-doc html
WORKING_DIRECTORY ${Eigen_BINARY_DIR}/doc)
+
add_dependencies(doc doc-eigen-prerequisites doc-unsupported-prerequisites)
diff --git a/gtsam/3rdparty/Eigen/doc/Overview.dox b/gtsam/3rdparty/Eigen/doc/Overview.dox
index 04bc075f0..598a96b4d 100644
--- a/gtsam/3rdparty/Eigen/doc/Overview.dox
+++ b/gtsam/3rdparty/Eigen/doc/Overview.dox
@@ -8,7 +8,7 @@ o /** \mainpage Eigen
| \ref QuickRefPage "Short reference"
-This is the API documentation for Eigen3.
+This is the API documentation for Eigen3. You can download it as a tgz archive for offline reading.
Eigen2 users: here is a \ref Eigen2ToEigen3 guide to help porting your application.
diff --git a/gtsam/3rdparty/Eigen/doc/examples/TutorialLinAlgSelfAdjointEigenSolver.cpp b/gtsam/3rdparty/Eigen/doc/examples/TutorialLinAlgSelfAdjointEigenSolver.cpp
index e98444347..8d1d1ed65 100644
--- a/gtsam/3rdparty/Eigen/doc/examples/TutorialLinAlgSelfAdjointEigenSolver.cpp
+++ b/gtsam/3rdparty/Eigen/doc/examples/TutorialLinAlgSelfAdjointEigenSolver.cpp
@@ -10,8 +10,9 @@ int main()
A << 1, 2, 2, 3;
cout << "Here is the matrix A:\n" << A << endl;
SelfAdjointEigenSolver eigensolver(A);
+ if (eigensolver.info() != Success) abort();
cout << "The eigenvalues of A are:\n" << eigensolver.eigenvalues() << endl;
- cout << "Here's a matrix whose columns are eigenvectors of A "
+ cout << "Here's a matrix whose columns are eigenvectors of A \n"
<< "corresponding to these eigenvalues:\n"
<< eigensolver.eigenvectors() << endl;
}
diff --git a/gtsam/3rdparty/Eigen/test/CMakeLists.txt b/gtsam/3rdparty/Eigen/test/CMakeLists.txt
index adaecb5f8..fab7de0d4 100644
--- a/gtsam/3rdparty/Eigen/test/CMakeLists.txt
+++ b/gtsam/3rdparty/Eigen/test/CMakeLists.txt
@@ -121,7 +121,7 @@ ei_add_test(nullary)
ei_add_test(nesting_ops "${CMAKE_CXX_FLAGS_DEBUG}")
ei_add_test(zerosized)
ei_add_test(dontalign)
-
+ei_add_test(sizeoverflow)
ei_add_test(prec_inverse_4x4)
string(TOLOWER "${CMAKE_CXX_COMPILER}" cmake_cxx_compiler_tolower)
diff --git a/gtsam/3rdparty/Eigen/test/geo_quaternion.cpp b/gtsam/3rdparty/Eigen/test/geo_quaternion.cpp
index e03245654..1e7b2cba0 100644
--- a/gtsam/3rdparty/Eigen/test/geo_quaternion.cpp
+++ b/gtsam/3rdparty/Eigen/test/geo_quaternion.cpp
@@ -120,6 +120,10 @@ template void quaternion(void)
VERIFY_IS_APPROX(q1f.template cast(),q1);
Quaternion q1d = q1.template cast();
VERIFY_IS_APPROX(q1d.template cast(),q1);
+
+ // test bug 369 - improper alignment.
+ Quaternionx *q = new Quaternionx;
+ delete q;
}
template void mapQuaternion(void){
@@ -191,7 +195,6 @@ template void check_const_correctness(const PlainObjec
VERIFY( !(Map::Flags & LvalueBit) );
}
-
void test_geo_quaternion()
{
for(int i = 0; i < g_repeat; i++) {
diff --git a/gtsam/3rdparty/Eigen/test/main.h b/gtsam/3rdparty/Eigen/test/main.h
index 4ddd11e6b..4510c1905 100644
--- a/gtsam/3rdparty/Eigen/test/main.h
+++ b/gtsam/3rdparty/Eigen/test/main.h
@@ -118,7 +118,7 @@ namespace Eigen
} \
else if (Eigen::internal::push_assert) \
{ \
- eigen_assert_list.push_back(std::string(EI_PP_MAKE_STRING(__FILE__)" ("EI_PP_MAKE_STRING(__LINE__)") : "#a) ); \
+ eigen_assert_list.push_back(std::string(EI_PP_MAKE_STRING(__FILE__) " (" EI_PP_MAKE_STRING(__LINE__) ") : " #a) ); \
}
#define VERIFY_RAISES_ASSERT(a) \
diff --git a/gtsam/3rdparty/Eigen/test/sizeoverflow.cpp b/gtsam/3rdparty/Eigen/test/sizeoverflow.cpp
new file mode 100644
index 000000000..78ededbea
--- /dev/null
+++ b/gtsam/3rdparty/Eigen/test/sizeoverflow.cpp
@@ -0,0 +1,81 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2011 Benoit Jacob
+//
+// Eigen is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 3 of the License, or (at your option) any later version.
+//
+// Alternatively, you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 2 of
+// the License, or (at your option) any later version.
+//
+// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License and a copy of the GNU General Public License along with
+// Eigen. If not, see .
+
+#include "main.h"
+
+#define VERIFY_THROWS_BADALLOC(a) { \
+ bool threw = false; \
+ try { \
+ a; \
+ } \
+ catch (std::bad_alloc&) { threw = true; } \
+ VERIFY(threw && "should have thrown bad_alloc: " #a); \
+ }
+
+typedef DenseIndex Index;
+
+template
+void triggerMatrixBadAlloc(Index rows, Index cols)
+{
+ VERIFY_THROWS_BADALLOC( MatrixType m(rows, cols) );
+ VERIFY_THROWS_BADALLOC( MatrixType m; m.resize(rows, cols) );
+ VERIFY_THROWS_BADALLOC( MatrixType m; m.conservativeResize(rows, cols) );
+}
+
+template
+void triggerVectorBadAlloc(Index size)
+{
+ VERIFY_THROWS_BADALLOC( VectorType v(size) );
+ VERIFY_THROWS_BADALLOC( VectorType v; v.resize(size) );
+ VERIFY_THROWS_BADALLOC( VectorType v; v.conservativeResize(size) );
+}
+
+void test_sizeoverflow()
+{
+ // there are 2 levels of overflow checking. first in PlainObjectBase.h we check for overflow in rows*cols computations.
+ // this is tested in tests of the form times_itself_gives_0 * times_itself_gives_0
+ // Then in Memory.h we check for overflow in size * sizeof(T) computations.
+ // this is tested in tests of the form times_4_gives_0 * sizeof(float)
+
+ size_t times_itself_gives_0 = size_t(1) << (8 * sizeof(Index) / 2);
+ VERIFY(times_itself_gives_0 * times_itself_gives_0 == 0);
+
+ size_t times_4_gives_0 = size_t(1) << (8 * sizeof(Index) - 2);
+ VERIFY(times_4_gives_0 * 4 == 0);
+
+ size_t times_8_gives_0 = size_t(1) << (8 * sizeof(Index) - 3);
+ VERIFY(times_8_gives_0 * 8 == 0);
+
+ triggerMatrixBadAlloc(times_itself_gives_0, times_itself_gives_0);
+ triggerMatrixBadAlloc(times_itself_gives_0 / 4, times_itself_gives_0);
+ triggerMatrixBadAlloc(times_4_gives_0, 1);
+
+ triggerMatrixBadAlloc(times_itself_gives_0, times_itself_gives_0);
+ triggerMatrixBadAlloc(times_itself_gives_0 / 8, times_itself_gives_0);
+ triggerMatrixBadAlloc(times_8_gives_0, 1);
+
+ triggerVectorBadAlloc(times_4_gives_0);
+
+ triggerVectorBadAlloc(times_8_gives_0);
+}
diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/MPRealSupport b/gtsam/3rdparty/Eigen/unsupported/Eigen/MPRealSupport
index 10fa23b35..8f2396353 100644
--- a/gtsam/3rdparty/Eigen/unsupported/Eigen/MPRealSupport
+++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/MPRealSupport
@@ -35,7 +35,8 @@
namespace Eigen {
- /** \defgroup MPRealSupport_Module MPFRC++ Support module
+ /** \ingroup Unsupported_modules
+ * \defgroup MPRealSupport_Module MPFRC++ Support module
*
* \code
* #include
diff --git a/gtsam/3rdparty/Eigen/unsupported/doc/Overview.dox b/gtsam/3rdparty/Eigen/unsupported/doc/Overview.dox
index c09f06857..458b507b5 100644
--- a/gtsam/3rdparty/Eigen/unsupported/doc/Overview.dox
+++ b/gtsam/3rdparty/Eigen/unsupported/doc/Overview.dox
@@ -1,13 +1,22 @@
namespace Eigen {
-o /** \mainpage Eigen's unsupported modules
+/** \mainpage Eigen's unsupported modules
This is the API documentation for Eigen's unsupported modules.
These modules are contributions from various users. They are provided "as is", without any support.
+Click on the \e Modules tab at the top of this page to get a list of all unsupported modules.
+
Don't miss the official Eigen documentation.
+
+\defgroup Unsupported_modules Unsupported modules
+
+The unsupported modules are contributions from various users. They are
+provided "as is", without any support. Nevertheless, some of them are
+subject to be included in Eigen in the future.
+
*/
}
diff --git a/gtsam/CMakeLists.txt b/gtsam/CMakeLists.txt
new file mode 100644
index 000000000..5b795b11f
--- /dev/null
+++ b/gtsam/CMakeLists.txt
@@ -0,0 +1,59 @@
+# Build full gtsam library as a single library
+# and also build tests
+set (gtsam_subdirs
+ base
+ geometry
+ inference
+ linear
+ nonlinear
+ slam)
+
+set (ccolamd_srcs
+ 3rdparty/CCOLAMD/Source/ccolamd.c
+ 3rdparty/CCOLAMD/Source/ccolamd_global.c
+ 3rdparty/UFconfig/UFconfig.c)
+
+# install headers from 3rdparty libraries
+add_subdirectory(3rdparty)
+
+# Accumulate gtsam_srcs
+set(gtsam_srcs ${ccolamd_srcs})
+
+# Get all sources and headers from each
+foreach(subdir ${gtsam_subdirs})
+ message(STATUS "Building ${subdir}")
+ file(GLOB sub_gtsam_srcs "${subdir}/*.cpp")
+ list(APPEND gtsam_srcs ${sub_gtsam_srcs})
+
+ # install headers
+ file(GLOB sub_gtsam_headers "${subdir}/*.h")
+ install(FILES ${sub_gtsam_headers} DESTINATION ${CMAKE_INSTALL_PREFIX}/include/gtsam/${subdir})
+
+ # Build tests
+ file(GLOB tests_srcs "${subdir}/tests/test*.cpp")
+ foreach(test_src ${tests_srcs})
+ get_filename_component(test_base ${test_src} NAME_WE)
+ set( test_bin ${subdir}_${test_base} )
+ add_executable(${test_bin} EXCLUDE_FROM_ALL ${test_src})
+ add_dependencies(check ${test_bin})
+ add_test(${subdir}/${test_base} ${EXECUTABLE_OUTPUT_PATH}${test_bin})
+ target_link_libraries(${test_bin} CppUnitLite gtsam)
+ add_custom_target(${test_bin}.run ${EXECUTABLE_OUTPUT_PATH}${test_bin} ${ARGN})
+ endforeach(test_src)
+
+ # Build timing scripts
+ file(GLOB time_srcs "${subdir}/tests/time*.cpp")
+ foreach(time_src ${time_srcs})
+ get_filename_component(time_base ${time_src} NAME_WE)
+ set( time_bin ${time_base} )
+ add_executable(${time_bin} EXCLUDE_FROM_ALL ${time_src})
+ add_dependencies(check ${time_bin})
+ target_link_libraries(${time_bin} CppUnitLite gtsam)
+ add_custom_target(${time_base}.run ${EXECUTABLE_OUTPUT_PATH}${time_bin} ${ARGN})
+ endforeach(time_src)
+endforeach(subdir)
+
+# build a single shared library
+add_library(gtsam SHARED ${gtsam_srcs})
+install(TARGETS gtsam LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
+
diff --git a/gtsam/geometry/CalibratedCamera.cpp b/gtsam/geometry/CalibratedCamera.cpp
index f0c70408e..a45da9789 100644
--- a/gtsam/geometry/CalibratedCamera.cpp
+++ b/gtsam/geometry/CalibratedCamera.cpp
@@ -61,6 +61,8 @@ Point2 CalibratedCamera::project(const Point3& point,
const Rot3& R = pose.rotation();
const Point3& r1 = R.r1(), r2 = R.r2(), r3 = R.r3();
Point3 q = pose.transform_to(point);
+ if(q.z() <= 0)
+ throw CheiralityException();
if (D_intrinsic_pose || D_intrinsic_point) {
double X = q.x(), Y = q.y(), Z = q.z();
diff --git a/gtsam/geometry/CalibratedCamera.h b/gtsam/geometry/CalibratedCamera.h
index 880bb9316..4538b3367 100644
--- a/gtsam/geometry/CalibratedCamera.h
+++ b/gtsam/geometry/CalibratedCamera.h
@@ -23,6 +23,11 @@
namespace gtsam {
+ class CheiralityException: public std::runtime_error {
+ public:
+ CheiralityException() : std::runtime_error("Cheirality Exception") {}
+ };
+
/**
* A Calibrated camera class [R|-R't], calibration K=I.
* If calibration is known, it is more computationally efficient
diff --git a/gtsam/slam/ProjectionFactor.h b/gtsam/slam/ProjectionFactor.h
index ee5649f78..6940e367f 100644
--- a/gtsam/slam/ProjectionFactor.h
+++ b/gtsam/slam/ProjectionFactor.h
@@ -82,9 +82,18 @@ namespace gtsam {
/// Evaluate error h(x)-z and optionally derivatives
Vector evaluateError(const Pose3& pose, const Point3& point,
boost::optional H1, boost::optional H2) const {
- SimpleCamera camera(*K_, pose);
- Point2 reprojectionError(camera.project(point, H1, H2) - z_);
- return reprojectionError.vector();
+ try {
+ SimpleCamera camera(*K_, pose);
+ Point2 reprojectionError(camera.project(point, H1, H2) - z_);
+ return reprojectionError.vector();
+ }
+ catch( CheiralityException& e) {
+ if (H1) *H1 = zeros(2,6);
+ if (H2) *H2 = zeros(2,3);
+ cout << e.what() << ": Landmark "<< this->key2_.index() <<
+ " moved behind camera " << this->key1_.index() << endl;
+ return zero(2);
+ }
}
/** return the measurement */
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
new file mode 100644
index 000000000..96f101f5c
--- /dev/null
+++ b/tests/CMakeLists.txt
@@ -0,0 +1,29 @@
+include_directories(
+ 3rdparty/UFconfig
+ 3rdparty/CCOLAMD/Include
+ ${CMAKE_SOURCE_DIR})
+
+find_package(Boost COMPONENTS serialization REQUIRED)
+
+# Build tests
+file(GLOB tests_srcs "test*.cpp")
+foreach(test_src ${tests_srcs})
+ get_filename_component(test_base ${test_src} NAME_WE)
+ set( test_bin ${test_base} )
+ add_executable(${test_bin} EXCLUDE_FROM_ALL ${test_src})
+ add_dependencies(check ${test_bin})
+ add_test(${test_bin} ${EXECUTABLE_OUTPUT_PATH}${test_bin})
+ target_link_libraries(${test_bin} CppUnitLite gtsam ${Boost_SERIALIZATION_LIBRARY})
+ add_custom_target(${test_base}.run ${EXECUTABLE_OUTPUT_PATH}${test_bin} ${ARGN})
+endforeach(test_src)
+
+# Build timing scripts
+file(GLOB time_srcs "time*.cpp")
+foreach(time_src ${time_srcs})
+ get_filename_component(time_base ${time_src} NAME_WE)
+ set( time_bin ${time_base} )
+ add_executable(${time_bin} EXCLUDE_FROM_ALL ${time_src})
+ add_dependencies(check ${time_bin})
+ target_link_libraries(${time_bin} CppUnitLite gtsam)
+ add_custom_target(${time_base}.run ${EXECUTABLE_OUTPUT_PATH}${time_bin} ${ARGN})
+endforeach(time_src)
\ No newline at end of file
diff --git a/wrap/Argument.cpp b/wrap/Argument.cpp
index 1610f98aa..329f0a643 100644
--- a/wrap/Argument.cpp
+++ b/wrap/Argument.cpp
@@ -18,6 +18,7 @@
#include
#include
#include
+#include
#include "Argument.h"
@@ -70,8 +71,17 @@ string ArgumentList::types() const {
/* ************************************************************************* */
string ArgumentList::signature() const {
string str;
+
BOOST_FOREACH(Argument arg, *this)
- str += arg.type[0];
+ {
+ BOOST_FOREACH(char ch, arg.type)
+ if(isupper(ch))
+ str += ch;
+
+ if(str.length() == 0)
+ str += arg.type[0];
+ }
+
return str;
}
diff --git a/wrap/CMakeLists.txt b/wrap/CMakeLists.txt
new file mode 100644
index 000000000..b6bf8b4f9
--- /dev/null
+++ b/wrap/CMakeLists.txt
@@ -0,0 +1,25 @@
+# Build/install Wrap
+
+# Build the executable itself
+file(GLOB wrap_srcs "*.cpp")
+list(REMOVE_ITEM wrap_srcs wrap.cpp)
+add_library(wrapLib STATIC ${wrap_srcs})
+add_executable(wrap wrap.cpp)
+target_link_libraries(wrap wrapLib)
+install(TARGETS wrap DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
+
+# Build tests
+file(GLOB wrap_test_srcs "tests/test*.cpp")
+add_definitions(-DTOPSRCDIR="${CMAKE_SOURCE_DIR}")
+foreach(test_src ${wrap_test_srcs} )
+ get_filename_component(test_base ${test_src} NAME_WE)
+ set( test_bin wrap_${test_base} )
+ add_executable(${test_bin} EXCLUDE_FROM_ALL ${test_src})
+ add_test(${test_base} ${EXECUTABLE_OUTPUT_PATH}${test_bin})
+ add_dependencies(check ${test_bin})
+ target_link_libraries(${test_bin} CppUnitLite gtsam wrapLib)
+ add_custom_target(${test_bin}.run ${EXECUTABLE_OUTPUT_PATH}${test_bin} ${ARGN})
+endforeach(test_src)
+
+# Install matlab header
+install(FILES matlab.h DESTINATION ${CMAKE_INSTALL_PREFIX}/include/wrap)