//================================================================================================== /* ROTGEN - Runtime Overlay for Eigen Copyright : CODE RECKONS SPDX-License-Identifier: BSL-1.0 */ //================================================================================================== #include "unit/tests.hpp" #include TTS_CASE_TPL("SVD decomposition - Dynamic case", rotgen::tests::types) ( tts::type< tts::types> ) { int rank, i = 5; auto eps = std::numeric_limits::epsilon(); auto m = rotgen::matrix::Random(5,5); auto decomp = rotgen::svd(m); do { rank = decomp.rank(); auto u = decomp.U(rank); auto d = decomp.singular_values(rank); auto dd = decomp.D(rank); auto v = decomp.V(rank); TTS_EQUAL(rank, i); auto rec = (u * dd * rotgen::transpose(v)); auto error = m - rec; TTS_LESS_EQUAL(rotgen::maxCoeff(rotgen::abs(error)) / eps, 16.) << "Result:\n" << rec << "\n" << "Residuals:\n" << error << "\n"; // Reduce rank by duplicating one column i--; col(m,i) = col(m,0); decomp = rotgen::svd(m); }while(rank != 1); }; TTS_CASE_TPL("SVD decomposition - Static case", rotgen::tests::types) ( tts::type< tts::types> ) { int rank, i = 5; auto eps = std::numeric_limits::epsilon(); auto m = rotgen::matrix::Random(); auto decomp = rotgen::svd(m); do { rank = decomp.rank(); auto u = decomp.U(rank); auto d = decomp.singular_values(rank); auto dd = decomp.D(rank); auto v = decomp.V(rank); TTS_EQUAL(rank, i); auto rec = (u * dd * rotgen::transpose(v)); auto error = m - rec; TTS_LESS_EQUAL(rotgen::maxCoeff(rotgen::abs(error)) / eps, 16.) << "Result:\n" << rec << "\n" << "Residuals:\n" << error << "\n"; // Reduce rank by duplicating one column i--; col(m,i) = col(m,0); decomp = rotgen::svd(m); }while(rank != 1); };