mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
Compare commits
20 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0fd6b4f71d | ||
|
|
52207cf6f9 | ||
|
|
0c26611d2d | ||
|
|
2a4fcb2c31 | ||
|
|
54930b6b55 | ||
|
|
4e5385c905 | ||
|
|
ac632f663e | ||
|
|
3620371c5c | ||
|
|
5dda502f84 | ||
|
|
590aec8fab | ||
|
|
75f8b06e50 | ||
|
|
e91e5d8c87 | ||
|
|
ef3cc72cb6 | ||
|
|
7a0a2a5001 | ||
|
|
bfdd4a9903 | ||
|
|
dc252fbf00 | ||
|
|
9f202c6f1e | ||
|
|
b933946d63 | ||
|
|
1b080fdcb9 | ||
|
|
a796be81a4 |
@@ -391,22 +391,27 @@ endif()
|
||||
|
||||
if(EIGEN_INCLUDE_INSTALL_DIR AND NOT INCLUDE_INSTALL_DIR)
|
||||
set(INCLUDE_INSTALL_DIR ${EIGEN_INCLUDE_INSTALL_DIR}
|
||||
CACHE PATH "The directory relative to CMAKE_PREFIX_PATH where Eigen header files are installed")
|
||||
CACHE STRING "The directory relative to CMAKE_PREFIX_PATH where Eigen header files are installed")
|
||||
else()
|
||||
set(INCLUDE_INSTALL_DIR
|
||||
"${CMAKE_INSTALL_INCLUDEDIR}/eigen3"
|
||||
CACHE PATH "The directory relative to CMAKE_PREFIX_PATH where Eigen header files are installed"
|
||||
CACHE STRING "The directory relative to CMAKE_PREFIX_PATH where Eigen header files are installed"
|
||||
)
|
||||
endif()
|
||||
set(CMAKEPACKAGE_INSTALL_DIR
|
||||
"${CMAKE_INSTALL_DATADIR}/eigen3/cmake"
|
||||
CACHE PATH "The directory relative to CMAKE_PREFIX_PATH where Eigen3Config.cmake is installed"
|
||||
CACHE STRING "The directory relative to CMAKE_PREFIX_PATH where Eigen3Config.cmake is installed"
|
||||
)
|
||||
set(PKGCONFIG_INSTALL_DIR
|
||||
"${CMAKE_INSTALL_DATADIR}/pkgconfig"
|
||||
CACHE PATH "The directory relative to CMAKE_PREFIX_PATH where eigen3.pc is installed"
|
||||
CACHE STRING "The directory relative to CMAKE_PREFIX_PATH where eigen3.pc is installed"
|
||||
)
|
||||
|
||||
foreach(var INCLUDE_INSTALL_DIR CMAKEPACKAGE_INSTALL_DIR PKGCONFIG_INSTALL_DIR)
|
||||
if(IS_ABSOLUTE "${${var}}")
|
||||
message(FATAL_ERROR "${var} must be relative to CMAKE_PREFIX_PATH. Got: ${${var}}")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
# similar to set_target_properties but append the property instead of overwriting it
|
||||
macro(ei_add_target_property target prop value)
|
||||
|
||||
@@ -87,17 +87,6 @@ class PermutationBase : public EigenBase<Derived>
|
||||
return derived();
|
||||
}
|
||||
|
||||
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
||||
/** This is a special case of the templated operator=. Its purpose is to
|
||||
* prevent a default operator= from hiding the templated operator=.
|
||||
*/
|
||||
Derived& operator=(const PermutationBase& other)
|
||||
{
|
||||
indices() = other.indices();
|
||||
return derived();
|
||||
}
|
||||
#endif
|
||||
|
||||
/** \returns the number of rows */
|
||||
inline Index rows() const { return Index(indices().size()); }
|
||||
|
||||
@@ -333,12 +322,6 @@ class PermutationMatrix : public PermutationBase<PermutationMatrix<SizeAtCompile
|
||||
inline PermutationMatrix(const PermutationBase<OtherDerived>& other)
|
||||
: m_indices(other.indices()) {}
|
||||
|
||||
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
||||
/** Standard copy constructor. Defined only to prevent a default copy constructor
|
||||
* from hiding the other templated constructor */
|
||||
inline PermutationMatrix(const PermutationMatrix& other) : m_indices(other.indices()) {}
|
||||
#endif
|
||||
|
||||
/** Generic constructor from expression of the indices. The indices
|
||||
* array has the meaning that the permutations sends each integer i to indices[i].
|
||||
*
|
||||
@@ -373,17 +356,6 @@ class PermutationMatrix : public PermutationBase<PermutationMatrix<SizeAtCompile
|
||||
return Base::operator=(tr.derived());
|
||||
}
|
||||
|
||||
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
||||
/** This is a special case of the templated operator=. Its purpose is to
|
||||
* prevent a default operator= from hiding the templated operator=.
|
||||
*/
|
||||
PermutationMatrix& operator=(const PermutationMatrix& other)
|
||||
{
|
||||
m_indices = other.m_indices;
|
||||
return *this;
|
||||
}
|
||||
#endif
|
||||
|
||||
/** const version of indices(). */
|
||||
const IndicesType& indices() const { return m_indices; }
|
||||
/** \returns a reference to the stored array representing the permutation. */
|
||||
|
||||
@@ -33,17 +33,6 @@ class TranspositionsBase
|
||||
indices() = other.indices();
|
||||
return derived();
|
||||
}
|
||||
|
||||
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
||||
/** This is a special case of the templated operator=. Its purpose is to
|
||||
* prevent a default operator= from hiding the templated operator=.
|
||||
*/
|
||||
Derived& operator=(const TranspositionsBase& other)
|
||||
{
|
||||
indices() = other.indices();
|
||||
return derived();
|
||||
}
|
||||
#endif
|
||||
|
||||
/** \returns the number of transpositions */
|
||||
Index size() const { return indices().size(); }
|
||||
@@ -171,12 +160,6 @@ class Transpositions : public TranspositionsBase<Transpositions<SizeAtCompileTim
|
||||
inline Transpositions(const TranspositionsBase<OtherDerived>& other)
|
||||
: m_indices(other.indices()) {}
|
||||
|
||||
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
||||
/** Standard copy constructor. Defined only to prevent a default copy constructor
|
||||
* from hiding the other templated constructor */
|
||||
inline Transpositions(const Transpositions& other) : m_indices(other.indices()) {}
|
||||
#endif
|
||||
|
||||
/** Generic constructor from expression of the transposition indices. */
|
||||
template<typename Other>
|
||||
explicit inline Transpositions(const MatrixBase<Other>& indices) : m_indices(indices)
|
||||
@@ -189,17 +172,6 @@ class Transpositions : public TranspositionsBase<Transpositions<SizeAtCompileTim
|
||||
return Base::operator=(other);
|
||||
}
|
||||
|
||||
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
||||
/** This is a special case of the templated operator=. Its purpose is to
|
||||
* prevent a default operator= from hiding the templated operator=.
|
||||
*/
|
||||
Transpositions& operator=(const Transpositions& other)
|
||||
{
|
||||
m_indices = other.m_indices;
|
||||
return *this;
|
||||
}
|
||||
#endif
|
||||
|
||||
/** Constructs an uninitialized permutation matrix of given size.
|
||||
*/
|
||||
inline Transpositions(Index size) : m_indices(size)
|
||||
@@ -306,17 +278,6 @@ class TranspositionsWrapper
|
||||
return Base::operator=(other);
|
||||
}
|
||||
|
||||
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
||||
/** This is a special case of the templated operator=. Its purpose is to
|
||||
* prevent a default operator= from hiding the templated operator=.
|
||||
*/
|
||||
TranspositionsWrapper& operator=(const TranspositionsWrapper& other)
|
||||
{
|
||||
m_indices = other.m_indices;
|
||||
return *this;
|
||||
}
|
||||
#endif
|
||||
|
||||
/** const version of indices(). */
|
||||
const IndicesType& indices() const { return m_indices; }
|
||||
|
||||
|
||||
@@ -115,7 +115,8 @@ void evaluateProductBlockingSizesHeuristic(Index& k, Index& m, Index& n, Index n
|
||||
// registers. However once the latency is hidden there is no point in
|
||||
// increasing the value of k, so we'll cap it at 320 (value determined
|
||||
// experimentally).
|
||||
const Index k_cache = (numext::mini<Index>)((l1-ksub)/kdiv, 320);
|
||||
// To avoid that k vanishes, we make k_cache at least as big as kr
|
||||
const Index k_cache = numext::maxi<Index>(kr, (numext::mini<Index>)((l1-ksub)/kdiv, 320));
|
||||
if (k_cache < k) {
|
||||
k = k_cache - (k_cache % kr);
|
||||
eigen_internal_assert(k > 0);
|
||||
|
||||
@@ -151,8 +151,10 @@ void parallelize_gemm(const Functor& func, Index rows, Index cols, Index depth,
|
||||
info[i].lhs_start = r0;
|
||||
info[i].lhs_length = actualBlockRows;
|
||||
|
||||
if(transpose) func(c0, actualBlockCols, 0, rows, info);
|
||||
else func(0, rows, c0, actualBlockCols, info);
|
||||
if(transpose)
|
||||
func(c0, actualBlockCols, 0, rows, info);
|
||||
else
|
||||
func(0, rows, c0, actualBlockCols, info);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
#define EIGEN_WORLD_VERSION 3
|
||||
#define EIGEN_MAJOR_VERSION 3
|
||||
#define EIGEN_MINOR_VERSION 71
|
||||
#define EIGEN_MINOR_VERSION 9
|
||||
|
||||
#define EIGEN_VERSION_AT_LEAST(x,y,z) (EIGEN_WORLD_VERSION>x || (EIGEN_WORLD_VERSION>=x && \
|
||||
(EIGEN_MAJOR_VERSION>y || (EIGEN_MAJOR_VERSION>=y && \
|
||||
|
||||
2
Eigen/src/Geometry/Scaling.h
Executable file → Normal file
2
Eigen/src/Geometry/Scaling.h
Executable file → Normal file
@@ -14,7 +14,7 @@ namespace Eigen {
|
||||
|
||||
/** \geometry_module \ingroup Geometry_Module
|
||||
*
|
||||
* \class Scaling
|
||||
* \class UniformScaling
|
||||
*
|
||||
* \brief Represents a generic uniform scaling transformation
|
||||
*
|
||||
|
||||
@@ -192,7 +192,7 @@ class PardisoImpl : public SparseSolverBase<Derived>
|
||||
void pardisoInit(int type)
|
||||
{
|
||||
m_type = type;
|
||||
EIGEN_USING_STD(abs);
|
||||
EIGEN_USING_STD_MATH(abs);
|
||||
bool symmetric = abs(m_type) < 10;
|
||||
m_iparm[0] = 1; // No solver default
|
||||
m_iparm[1] = 2; // use Metis for the ordering
|
||||
|
||||
@@ -119,7 +119,7 @@ OP(const Scalar& s) const { \
|
||||
return this->OP(Derived::PlainObject::Constant(rows(), cols(), s)); \
|
||||
} \
|
||||
EIGEN_DEVICE_FUNC friend EIGEN_STRONG_INLINE const RCmp ## COMPARATOR ## ReturnType \
|
||||
OP(const Scalar& s, const Derived& d) { \
|
||||
OP(const Scalar& s, const EIGEN_CURRENT_STORAGE_BASE_CLASS<Derived>& d) { \
|
||||
return Derived::PlainObject::Constant(d.rows(), d.cols(), s).OP(d); \
|
||||
}
|
||||
|
||||
|
||||
@@ -19,8 +19,11 @@ include(CheckCXXSourceCompiles)
|
||||
# notice the std:: is required on some platforms such as QNX
|
||||
|
||||
set(find_standard_math_library_test_program
|
||||
"#include<cmath>
|
||||
int main() { std::sin(0.0); std::log(0.0f); }")
|
||||
"
|
||||
#include<cmath>
|
||||
int main(int argc, char **){
|
||||
return int(std::sin(double(argc)) + std::log(double(argc)));
|
||||
}")
|
||||
|
||||
# first try compiling/linking the test program without any linker flags
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ if(CMAKE_COMPILER_IS_GNUCXX)
|
||||
endif(CMAKE_COMPILER_IS_GNUCXX)
|
||||
|
||||
option(EIGEN_INTERNAL_DOCUMENTATION "Build internal documentation" OFF)
|
||||
|
||||
option(EIGEN_DOC_USE_MATHJAX "Use MathJax for rendering math in HTML docs" ON)
|
||||
|
||||
# Set some Doxygen flags
|
||||
set(EIGEN_DOXY_PROJECT_NAME "Eigen")
|
||||
@@ -19,12 +19,19 @@ set(EIGEN_DOXY_OUTPUT_DIRECTORY_SUFFIX "")
|
||||
set(EIGEN_DOXY_INPUT "\"${Eigen_SOURCE_DIR}/Eigen\" \"${Eigen_SOURCE_DIR}/doc\"")
|
||||
set(EIGEN_DOXY_HTML_COLORSTYLE_HUE "220")
|
||||
set(EIGEN_DOXY_TAGFILES "")
|
||||
|
||||
if(EIGEN_INTERNAL_DOCUMENTATION)
|
||||
set(EIGEN_DOXY_INTERNAL "YES")
|
||||
else(EIGEN_INTERNAL_DOCUMENTATION)
|
||||
set(EIGEN_DOXY_INTERNAL "NO")
|
||||
endif(EIGEN_INTERNAL_DOCUMENTATION)
|
||||
|
||||
if (EIGEN_DOC_USE_MATHJAX)
|
||||
set(EIGEN_DOXY_USE_MATHJAX "YES")
|
||||
else ()
|
||||
set(EIGEN_DOXY_USE_MATHJAX "NO")
|
||||
endif()
|
||||
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
|
||||
|
||||
@@ -736,6 +736,14 @@ EXCLUDE = "${Eigen_SOURCE_DIR}/Eigen/src/Core/products" \
|
||||
"${Eigen_SOURCE_DIR}/unsupported/doc/examples" \
|
||||
"${Eigen_SOURCE_DIR}/unsupported/doc/snippets"
|
||||
|
||||
# Forward declarations of class templates cause the title of the main page for
|
||||
# the class template to not contain the template signature. This only happens
|
||||
# when the \class command is used to document the class. Possibly caused
|
||||
# by https://github.com/doxygen/doxygen/issues/7698. Confirmed fixed by
|
||||
# doxygen release 1.8.19.
|
||||
|
||||
EXCLUDE += "${Eigen_SOURCE_DIR}/Eigen/src/Core/util/ForwardDeclarations.h"
|
||||
|
||||
# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
|
||||
# directories that are symbolic links (a Unix file system feature) are excluded
|
||||
# from the input.
|
||||
@@ -1245,7 +1253,7 @@ FORMULA_TRANSPARENT = YES
|
||||
# output. When enabled you may also need to install MathJax separately and
|
||||
# configure the path to it using the MATHJAX_RELPATH option.
|
||||
|
||||
USE_MATHJAX = NO
|
||||
USE_MATHJAX = @EIGEN_DOXY_USE_MATHJAX@
|
||||
|
||||
# When MathJax is enabled you need to specify the location relative to the
|
||||
# HTML output directory using the MATHJAX_RELPATH option. The destination
|
||||
@@ -1257,12 +1265,12 @@ USE_MATHJAX = NO
|
||||
# However, it is strongly recommended to install a local
|
||||
# copy of MathJax from http://www.mathjax.org before deployment.
|
||||
|
||||
MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
|
||||
MATHJAX_RELPATH = https://cdn.mathjax.org/mathjax/latest
|
||||
|
||||
# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension
|
||||
# names that should be enabled during MathJax rendering.
|
||||
|
||||
MATHJAX_EXTENSIONS =
|
||||
MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
|
||||
|
||||
# When the SEARCHENGINE tag is enabled doxygen will generate a search box
|
||||
# for the HTML output. The underlying search engine uses javascript
|
||||
|
||||
@@ -244,7 +244,7 @@ As stated earlier, for a read-write sub-matrix (RW), the evaluation can be done
|
||||
<td>
|
||||
\code
|
||||
sm1.valuePtr(); // Pointer to the values
|
||||
sm1.innerIndextr(); // Pointer to the indices.
|
||||
sm1.innerIndexPtr(); // Pointer to the indices.
|
||||
sm1.outerIndexPtr(); // Pointer to the beginning of each inner vector
|
||||
\endcode
|
||||
</td>
|
||||
|
||||
@@ -49,6 +49,7 @@ int main(int argc, char** argv)
|
||||
|
||||
In the case your application is parallelized with OpenMP, you might want to disable Eigen's own parallization as detailed in the previous section.
|
||||
|
||||
\warning Using OpenMP with custom scalar types that might throw exceptions can lead to unexpected behaviour in the event of throwing.
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
@@ -14,5 +14,5 @@ int main()
|
||||
a.block<2,2>(1,1) = m;
|
||||
cout << "Here is now a with m copied into its central 2x2 block:" << endl << a << endl << endl;
|
||||
a.block(0,0,2,3) = a.block(2,1,2,3);
|
||||
cout << "Here is now a with bottom-right 2x3 block copied into top-left 2x2 block:" << endl << a << endl << endl;
|
||||
cout << "Here is now a with bottom-right 2x3 block copied into top-left 2x3 block:" << endl << a << endl << endl;
|
||||
}
|
||||
|
||||
@@ -163,7 +163,7 @@ ei_add_test(constructor)
|
||||
ei_add_test(linearstructure)
|
||||
ei_add_test(integer_types)
|
||||
ei_add_test(unalignedcount)
|
||||
if(NOT EIGEN_TEST_NO_EXCEPTIONS)
|
||||
if(NOT EIGEN_TEST_NO_EXCEPTIONS AND NOT EIGEN_TEST_OPENMP)
|
||||
ei_add_test(exceptions)
|
||||
endif()
|
||||
ei_add_test(redux)
|
||||
@@ -185,7 +185,7 @@ ei_add_test(smallvectors)
|
||||
ei_add_test(mapped_matrix)
|
||||
ei_add_test(mapstride)
|
||||
ei_add_test(mapstaticmethods)
|
||||
ei_add_test(array)
|
||||
ei_add_test(array_cwise)
|
||||
ei_add_test(array_for_matrix)
|
||||
ei_add_test(array_replicate)
|
||||
ei_add_test(array_reverse)
|
||||
|
||||
@@ -446,7 +446,7 @@ template<typename ArrayType> void min_max(const ArrayType& m)
|
||||
|
||||
}
|
||||
|
||||
void test_array()
|
||||
void test_array_cwise()
|
||||
{
|
||||
for(int i = 0; i < g_repeat; i++) {
|
||||
CALL_SUBTEST_1( array(Array<float, 1, 1>()) );
|
||||
@@ -8,7 +8,7 @@ struct Foo
|
||||
static Index object_limit;
|
||||
int dummy;
|
||||
|
||||
Foo()
|
||||
Foo() : dummy(0)
|
||||
{
|
||||
#ifdef EIGEN_EXCEPTIONS
|
||||
// TODO: Is this the correct way to handle this?
|
||||
@@ -37,22 +37,33 @@ void test_ctorleak()
|
||||
{
|
||||
typedef Matrix<Foo, Dynamic, Dynamic> MatrixX;
|
||||
typedef Matrix<Foo, Dynamic, 1> VectorX;
|
||||
|
||||
Foo::object_count = 0;
|
||||
for(int i = 0; i < g_repeat; i++) {
|
||||
Index rows = internal::random<Index>(2,EIGEN_TEST_MAX_SIZE), cols = internal::random<Index>(2,EIGEN_TEST_MAX_SIZE);
|
||||
Foo::object_limit = internal::random<Index>(0, rows*cols - 2);
|
||||
Foo::object_limit = rows*cols;
|
||||
{
|
||||
MatrixX r(rows, cols);
|
||||
Foo::object_limit = r.size()+internal::random<Index>(0, rows*cols - 2);
|
||||
std::cout << "object_limit =" << Foo::object_limit << std::endl;
|
||||
#ifdef EIGEN_EXCEPTIONS
|
||||
try
|
||||
{
|
||||
#endif
|
||||
std::cout << "\nMatrixX m(" << rows << ", " << cols << ");\n";
|
||||
MatrixX m(rows, cols);
|
||||
if(internal::random<bool>()) {
|
||||
std::cout << "\nMatrixX m(" << rows << ", " << cols << ");\n";
|
||||
MatrixX m(rows, cols);
|
||||
}
|
||||
else {
|
||||
std::cout << "\nMatrixX m(r);\n";
|
||||
MatrixX m(r);
|
||||
}
|
||||
#ifdef EIGEN_EXCEPTIONS
|
||||
VERIFY(false); // not reached if exceptions are enabled
|
||||
}
|
||||
catch (const Foo::Fail&) { /* ignore */ }
|
||||
#endif
|
||||
}
|
||||
VERIFY_IS_EQUAL(Index(0), Foo::object_count);
|
||||
|
||||
{
|
||||
@@ -66,4 +77,5 @@ void test_ctorleak()
|
||||
}
|
||||
VERIFY_IS_EQUAL(Index(0), Foo::object_count);
|
||||
}
|
||||
std::cout << "\n";
|
||||
}
|
||||
|
||||
@@ -109,5 +109,7 @@ void memoryleak()
|
||||
|
||||
void test_exceptions()
|
||||
{
|
||||
CALL_SUBTEST( memoryleak() );
|
||||
EIGEN_TRY {
|
||||
CALL_SUBTEST( memoryleak() );
|
||||
} EIGEN_CATCH(...) {}
|
||||
}
|
||||
|
||||
@@ -16,12 +16,6 @@
|
||||
#endif
|
||||
// using namespace Eigen;
|
||||
|
||||
#ifdef EIGEN_VECTORIZE_SSE
|
||||
const bool g_vectorize_sse = true;
|
||||
#else
|
||||
const bool g_vectorize_sse = false;
|
||||
#endif
|
||||
|
||||
namespace Eigen {
|
||||
namespace internal {
|
||||
template<typename T> T negate(const T& x) { return -x; }
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
#define EIGEN_RUNTIME_NO_MALLOC
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#include <Eigen/Core>
|
||||
@@ -24,41 +26,85 @@ void rvalue_copyassign(const MatrixType& m)
|
||||
MatrixType tmp = m;
|
||||
UIntPtr src_address = reinterpret_cast<UIntPtr>(tmp.data());
|
||||
|
||||
Eigen::internal::set_is_malloc_allowed(false); // moving from an rvalue reference shall never allocate
|
||||
// move the temporary to n
|
||||
MatrixType n = std::move(tmp);
|
||||
UIntPtr dst_address = reinterpret_cast<UIntPtr>(n.data());
|
||||
|
||||
if (MatrixType::RowsAtCompileTime==Dynamic|| MatrixType::ColsAtCompileTime==Dynamic)
|
||||
{
|
||||
// verify that we actually moved the guts
|
||||
VERIFY_IS_EQUAL(src_address, dst_address);
|
||||
VERIFY_IS_EQUAL(tmp.size(), 0);
|
||||
VERIFY_IS_EQUAL(reinterpret_cast<UIntPtr>(tmp.data()), UIntPtr(0));
|
||||
}
|
||||
|
||||
// verify that the content did not change
|
||||
Scalar abs_diff = (m-n).array().abs().sum();
|
||||
VERIFY_IS_EQUAL(abs_diff, Scalar(0));
|
||||
Eigen::internal::set_is_malloc_allowed(true);
|
||||
}
|
||||
template<typename TranspositionsType>
|
||||
void rvalue_transpositions(Index rows)
|
||||
{
|
||||
typedef typename TranspositionsType::IndicesType PermutationVectorType;
|
||||
|
||||
PermutationVectorType vec;
|
||||
randomPermutationVector(vec, rows);
|
||||
TranspositionsType t0(vec);
|
||||
|
||||
Eigen::internal::set_is_malloc_allowed(false); // moving from an rvalue reference shall never allocate
|
||||
|
||||
UIntPtr t0_address = reinterpret_cast<UIntPtr>(t0.indices().data());
|
||||
|
||||
// Move constructors:
|
||||
TranspositionsType t1 = std::move(t0);
|
||||
UIntPtr t1_address = reinterpret_cast<UIntPtr>(t1.indices().data());
|
||||
VERIFY_IS_EQUAL(t0_address, t1_address);
|
||||
// t0 must be de-allocated:
|
||||
VERIFY_IS_EQUAL(t0.size(), 0);
|
||||
VERIFY_IS_EQUAL(reinterpret_cast<UIntPtr>(t0.indices().data()), UIntPtr(0));
|
||||
|
||||
|
||||
// Move assignment:
|
||||
t0 = std::move(t1);
|
||||
t0_address = reinterpret_cast<UIntPtr>(t0.indices().data());
|
||||
VERIFY_IS_EQUAL(t0_address, t1_address);
|
||||
// t1 must be de-allocated:
|
||||
VERIFY_IS_EQUAL(t1.size(), 0);
|
||||
VERIFY_IS_EQUAL(reinterpret_cast<UIntPtr>(t1.indices().data()), UIntPtr(0));
|
||||
|
||||
Eigen::internal::set_is_malloc_allowed(true);
|
||||
}
|
||||
#else
|
||||
template <typename MatrixType>
|
||||
void rvalue_copyassign(const MatrixType&) {}
|
||||
template<typename TranspositionsType>
|
||||
void rvalue_transpositions(Index) {}
|
||||
#endif
|
||||
|
||||
void test_rvalue_types()
|
||||
{
|
||||
CALL_SUBTEST_1(rvalue_copyassign( MatrixXf::Random(50,50).eval() ));
|
||||
CALL_SUBTEST_1(rvalue_copyassign( ArrayXXf::Random(50,50).eval() ));
|
||||
for(int i = 0; i < g_repeat; i++) {
|
||||
CALL_SUBTEST_1(rvalue_copyassign( MatrixXf::Random(50,50).eval() ));
|
||||
CALL_SUBTEST_1(rvalue_copyassign( ArrayXXf::Random(50,50).eval() ));
|
||||
|
||||
CALL_SUBTEST_1(rvalue_copyassign( Matrix<float,1,Dynamic>::Random(50).eval() ));
|
||||
CALL_SUBTEST_1(rvalue_copyassign( Array<float,1,Dynamic>::Random(50).eval() ));
|
||||
CALL_SUBTEST_1(rvalue_copyassign( Matrix<float,1,Dynamic>::Random(50).eval() ));
|
||||
CALL_SUBTEST_1(rvalue_copyassign( Array<float,1,Dynamic>::Random(50).eval() ));
|
||||
|
||||
CALL_SUBTEST_1(rvalue_copyassign( Matrix<float,Dynamic,1>::Random(50).eval() ));
|
||||
CALL_SUBTEST_1(rvalue_copyassign( Array<float,Dynamic,1>::Random(50).eval() ));
|
||||
CALL_SUBTEST_1(rvalue_copyassign( Matrix<float,Dynamic,1>::Random(50).eval() ));
|
||||
CALL_SUBTEST_1(rvalue_copyassign( Array<float,Dynamic,1>::Random(50).eval() ));
|
||||
|
||||
CALL_SUBTEST_2(rvalue_copyassign( Array<float,2,1>::Random().eval() ));
|
||||
CALL_SUBTEST_2(rvalue_copyassign( Array<float,3,1>::Random().eval() ));
|
||||
CALL_SUBTEST_2(rvalue_copyassign( Array<float,4,1>::Random().eval() ));
|
||||
|
||||
CALL_SUBTEST_2(rvalue_copyassign( Array<float,2,2>::Random().eval() ));
|
||||
CALL_SUBTEST_2(rvalue_copyassign( Array<float,3,3>::Random().eval() ));
|
||||
CALL_SUBTEST_2(rvalue_copyassign( Array<float,4,4>::Random().eval() ));
|
||||
|
||||
CALL_SUBTEST_2(rvalue_copyassign( Array<float,2,1>::Random().eval() ));
|
||||
CALL_SUBTEST_2(rvalue_copyassign( Array<float,3,1>::Random().eval() ));
|
||||
CALL_SUBTEST_2(rvalue_copyassign( Array<float,4,1>::Random().eval() ));
|
||||
|
||||
CALL_SUBTEST_2(rvalue_copyassign( Array<float,2,2>::Random().eval() ));
|
||||
CALL_SUBTEST_2(rvalue_copyassign( Array<float,3,3>::Random().eval() ));
|
||||
CALL_SUBTEST_2(rvalue_copyassign( Array<float,4,4>::Random().eval() ));
|
||||
CALL_SUBTEST_3((rvalue_transpositions<PermutationMatrix<Dynamic, Dynamic, int> >(internal::random<int>(1,EIGEN_TEST_MAX_SIZE))));
|
||||
CALL_SUBTEST_3((rvalue_transpositions<PermutationMatrix<Dynamic, Dynamic, Index> >(internal::random<int>(1,EIGEN_TEST_MAX_SIZE))));
|
||||
CALL_SUBTEST_4((rvalue_transpositions<Transpositions<Dynamic, Dynamic, int> >(internal::random<int>(1,EIGEN_TEST_MAX_SIZE))));
|
||||
CALL_SUBTEST_4((rvalue_transpositions<Transpositions<Dynamic, Dynamic, Index> >(internal::random<int>(1,EIGEN_TEST_MAX_SIZE))));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,15 @@
|
||||
// tolerance for chekcing number of iterations
|
||||
#define LM_EVAL_COUNT_TOL 4/3
|
||||
|
||||
#define LM_CHECK_N_ITERS(SOLVER,NFEV,NJEV) { \
|
||||
++g_test_level; \
|
||||
VERIFY_IS_EQUAL(SOLVER.nfev, NFEV); \
|
||||
VERIFY_IS_EQUAL(SOLVER.njev, NJEV); \
|
||||
--g_test_level; \
|
||||
VERIFY(SOLVER.nfev <= NFEV * LM_EVAL_COUNT_TOL); \
|
||||
VERIFY(SOLVER.njev <= NJEV * LM_EVAL_COUNT_TOL); \
|
||||
}
|
||||
|
||||
int fcn_chkder(const VectorXd &x, VectorXd &fvec, MatrixXd &fjac, int iflag)
|
||||
{
|
||||
/* subroutine fcn for chkder example. */
|
||||
@@ -180,8 +189,7 @@ void testLmder1()
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 6);
|
||||
VERIFY_IS_EQUAL(lm.njev, 5);
|
||||
LM_CHECK_N_ITERS(lm, 6, 5);
|
||||
|
||||
// check norm
|
||||
VERIFY_IS_APPROX(lm.fvec.blueNorm(), 0.09063596);
|
||||
@@ -209,8 +217,7 @@ void testLmder()
|
||||
|
||||
// check return values
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 6);
|
||||
VERIFY_IS_EQUAL(lm.njev, 5);
|
||||
LM_CHECK_N_ITERS(lm, 6, 5);
|
||||
|
||||
// check norm
|
||||
fnorm = lm.fvec.blueNorm();
|
||||
@@ -294,8 +301,7 @@ void testHybrj1()
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(solver.nfev, 11);
|
||||
VERIFY_IS_EQUAL(solver.njev, 1);
|
||||
LM_CHECK_N_ITERS(solver, 11, 1);
|
||||
|
||||
// check norm
|
||||
VERIFY_IS_APPROX(solver.fvec.blueNorm(), 1.192636e-08);
|
||||
@@ -329,8 +335,7 @@ void testHybrj()
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(solver.nfev, 11);
|
||||
VERIFY_IS_EQUAL(solver.njev, 1);
|
||||
LM_CHECK_N_ITERS(solver, 11, 1);
|
||||
|
||||
// check norm
|
||||
VERIFY_IS_APPROX(solver.fvec.blueNorm(), 1.192636e-08);
|
||||
@@ -485,8 +490,7 @@ void testLmstr1()
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 6);
|
||||
VERIFY_IS_EQUAL(lm.njev, 5);
|
||||
LM_CHECK_N_ITERS(lm, 6, 5);
|
||||
|
||||
// check norm
|
||||
VERIFY_IS_APPROX(lm.fvec.blueNorm(), 0.09063596);
|
||||
@@ -514,8 +518,7 @@ void testLmstr()
|
||||
|
||||
// check return values
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 6);
|
||||
VERIFY_IS_EQUAL(lm.njev, 5);
|
||||
LM_CHECK_N_ITERS(lm, 6, 5);
|
||||
|
||||
// check norm
|
||||
fnorm = lm.fvec.blueNorm();
|
||||
@@ -686,8 +689,7 @@ void testNistChwirut2(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 10);
|
||||
VERIFY_IS_EQUAL(lm.njev, 8);
|
||||
LM_CHECK_N_ITERS(lm, 10, 8);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.1304802941E+02);
|
||||
// check x
|
||||
@@ -707,8 +709,7 @@ void testNistChwirut2(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 7);
|
||||
VERIFY_IS_EQUAL(lm.njev, 6);
|
||||
LM_CHECK_N_ITERS(lm, 7, 6);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.1304802941E+02);
|
||||
// check x
|
||||
@@ -766,8 +767,7 @@ void testNistMisra1a(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 19);
|
||||
VERIFY_IS_EQUAL(lm.njev, 15);
|
||||
LM_CHECK_N_ITERS(lm, 19, 15);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.2455138894E-01);
|
||||
// check x
|
||||
@@ -783,8 +783,7 @@ void testNistMisra1a(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 5);
|
||||
VERIFY_IS_EQUAL(lm.njev, 4);
|
||||
LM_CHECK_N_ITERS(lm, 5, 4);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.2455138894E-01);
|
||||
// check x
|
||||
@@ -856,8 +855,7 @@ void testNistHahn1(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 11);
|
||||
VERIFY_IS_EQUAL(lm.njev, 10);
|
||||
LM_CHECK_N_ITERS(lm, 11, 10);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.5324382854E+00);
|
||||
// check x
|
||||
@@ -878,8 +876,7 @@ void testNistHahn1(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 11);
|
||||
VERIFY_IS_EQUAL(lm.njev, 10);
|
||||
LM_CHECK_N_ITERS(lm, 11, 10);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.5324382854E+00);
|
||||
// check x
|
||||
@@ -942,8 +939,7 @@ void testNistMisra1d(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 3);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 9);
|
||||
VERIFY_IS_EQUAL(lm.njev, 7);
|
||||
LM_CHECK_N_ITERS(lm, 9, 7);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.6419295283E-02);
|
||||
// check x
|
||||
@@ -959,8 +955,7 @@ void testNistMisra1d(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 4);
|
||||
VERIFY_IS_EQUAL(lm.njev, 3);
|
||||
LM_CHECK_N_ITERS(lm, 4, 3);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.6419295283E-02);
|
||||
// check x
|
||||
@@ -1020,8 +1015,7 @@ void testNistLanczos1(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 2);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 79);
|
||||
VERIFY_IS_EQUAL(lm.njev, 72);
|
||||
LM_CHECK_N_ITERS(lm, 79, 72);
|
||||
// check norm^2
|
||||
std::cout.precision(30);
|
||||
std::cout << lm.fvec.squaredNorm() << "\n";
|
||||
@@ -1043,8 +1037,7 @@ void testNistLanczos1(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 2);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 9);
|
||||
VERIFY_IS_EQUAL(lm.njev, 8);
|
||||
LM_CHECK_N_ITERS(lm, 9, 8);
|
||||
// check norm^2
|
||||
VERIFY(lm.fvec.squaredNorm() <= 1.4307867721E-25);
|
||||
// check x
|
||||
@@ -1108,8 +1101,7 @@ void testNistRat42(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 10);
|
||||
VERIFY_IS_EQUAL(lm.njev, 8);
|
||||
LM_CHECK_N_ITERS(lm, 10, 8);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.0565229338E+00);
|
||||
// check x
|
||||
@@ -1126,8 +1118,7 @@ void testNistRat42(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 6);
|
||||
VERIFY_IS_EQUAL(lm.njev, 5);
|
||||
LM_CHECK_N_ITERS(lm, 6, 5);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.0565229338E+00);
|
||||
// check x
|
||||
@@ -1186,8 +1177,7 @@ void testNistMGH10(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 2);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 284 );
|
||||
VERIFY_IS_EQUAL(lm.njev, 249 );
|
||||
LM_CHECK_N_ITERS(lm, 284, 249);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.7945855171E+01);
|
||||
// check x
|
||||
@@ -1204,8 +1194,7 @@ void testNistMGH10(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 3);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 126);
|
||||
VERIFY_IS_EQUAL(lm.njev, 116);
|
||||
LM_CHECK_N_ITERS(lm, 126, 116);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.7945855171E+01);
|
||||
// check x
|
||||
@@ -1265,8 +1254,7 @@ void testNistBoxBOD(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY(lm.nfev < 31); // 31
|
||||
VERIFY(lm.njev < 25); // 25
|
||||
LM_CHECK_N_ITERS(lm, 31, 25);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.1680088766E+03);
|
||||
// check x
|
||||
@@ -1284,9 +1272,8 @@ void testNistBoxBOD(void)
|
||||
info = lm.minimize(x);
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 15 );
|
||||
VERIFY_IS_EQUAL(lm.njev, 14 );
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
LM_CHECK_N_ITERS(lm, 15, 14);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.1680088766E+03);
|
||||
// check x
|
||||
@@ -1356,12 +1343,7 @@ void testNistMGH17(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 2);
|
||||
++g_test_level;
|
||||
VERIFY_IS_EQUAL(lm.nfev, 602); // 602
|
||||
VERIFY_IS_EQUAL(lm.njev, 545); // 545
|
||||
--g_test_level;
|
||||
VERIFY(lm.nfev < 602 * LM_EVAL_COUNT_TOL);
|
||||
VERIFY(lm.njev < 545 * LM_EVAL_COUNT_TOL);
|
||||
LM_CHECK_N_ITERS(lm, 602, 545);
|
||||
|
||||
/*
|
||||
* Second try
|
||||
@@ -1373,8 +1355,7 @@ void testNistMGH17(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 18);
|
||||
VERIFY_IS_EQUAL(lm.njev, 15);
|
||||
LM_CHECK_N_ITERS(lm, 18, 15);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.4648946975E-05);
|
||||
// check x
|
||||
@@ -1438,9 +1419,8 @@ void testNistMGH09(void)
|
||||
info = lm.minimize(x);
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 490 );
|
||||
VERIFY_IS_EQUAL(lm.njev, 376 );
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
LM_CHECK_N_ITERS(lm, 490, 376);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 3.0750560385E-04);
|
||||
// check x
|
||||
@@ -1459,8 +1439,7 @@ void testNistMGH09(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 18);
|
||||
VERIFY_IS_EQUAL(lm.njev, 16);
|
||||
LM_CHECK_N_ITERS(lm, 18, 16);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 3.0750560385E-04);
|
||||
// check x
|
||||
@@ -1525,8 +1504,7 @@ void testNistBennett5(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 758);
|
||||
VERIFY_IS_EQUAL(lm.njev, 744);
|
||||
LM_CHECK_N_ITERS(lm, 758, 744);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.2404744073E-04);
|
||||
// check x
|
||||
@@ -1543,8 +1521,7 @@ void testNistBennett5(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 203);
|
||||
VERIFY_IS_EQUAL(lm.njev, 192);
|
||||
LM_CHECK_N_ITERS(lm, 203, 192);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.2404744073E-04);
|
||||
// check x
|
||||
@@ -1613,8 +1590,7 @@ void testNistThurber(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 39);
|
||||
VERIFY_IS_EQUAL(lm.njev, 36);
|
||||
LM_CHECK_N_ITERS(lm, 39,36);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.6427082397E+03);
|
||||
// check x
|
||||
@@ -1638,8 +1614,7 @@ void testNistThurber(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 29);
|
||||
VERIFY_IS_EQUAL(lm.njev, 28);
|
||||
LM_CHECK_N_ITERS(lm, 29, 28);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.6427082397E+03);
|
||||
// check x
|
||||
@@ -1705,8 +1680,7 @@ void testNistRat43(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 27);
|
||||
VERIFY_IS_EQUAL(lm.njev, 20);
|
||||
LM_CHECK_N_ITERS(lm, 27, 20);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.7864049080E+03);
|
||||
// check x
|
||||
@@ -1727,8 +1701,7 @@ void testNistRat43(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 9);
|
||||
VERIFY_IS_EQUAL(lm.njev, 8);
|
||||
LM_CHECK_N_ITERS(lm, 9, 8);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.7864049080E+03);
|
||||
// check x
|
||||
@@ -1790,8 +1763,7 @@ void testNistEckerle4(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 18);
|
||||
VERIFY_IS_EQUAL(lm.njev, 15);
|
||||
LM_CHECK_N_ITERS(lm, 18, 15);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.4635887487E-03);
|
||||
// check x
|
||||
@@ -1808,8 +1780,7 @@ void testNistEckerle4(void)
|
||||
|
||||
// check return value
|
||||
VERIFY_IS_EQUAL(info, 1);
|
||||
VERIFY_IS_EQUAL(lm.nfev, 7);
|
||||
VERIFY_IS_EQUAL(lm.njev, 6);
|
||||
LM_CHECK_N_ITERS(lm, 7, 6);
|
||||
// check norm^2
|
||||
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.4635887487E-03);
|
||||
// check x
|
||||
|
||||
Reference in New Issue
Block a user