Blame ImathTest/testTinySVD.cpp

Packit 8dc392
///////////////////////////////////////////////////////////////////////////
Packit 8dc392
//
Packit 8dc392
// Copyright (c) 2010, Industrial Light & Magic, a division of Lucas
Packit 8dc392
// Digital Ltd. LLC
Packit 8dc392
// 
Packit 8dc392
// All rights reserved.
Packit 8dc392
// 
Packit 8dc392
// Redistribution and use in source and binary forms, with or without
Packit 8dc392
// modification, are permitted provided that the following conditions are
Packit 8dc392
// met:
Packit 8dc392
// *       Redistributions of source code must retain the above copyright
Packit 8dc392
// notice, this list of conditions and the following disclaimer.
Packit 8dc392
// *       Redistributions in binary form must reproduce the above
Packit 8dc392
// copyright notice, this list of conditions and the following disclaimer
Packit 8dc392
// in the documentation and/or other materials provided with the
Packit 8dc392
// distribution.
Packit 8dc392
// *       Neither the name of Industrial Light & Magic nor the names of
Packit 8dc392
// its contributors may be used to endorse or promote products derived
Packit 8dc392
// from this software without specific prior written permission. 
Packit 8dc392
// 
Packit 8dc392
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit 8dc392
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit 8dc392
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit 8dc392
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit 8dc392
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit 8dc392
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit 8dc392
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit 8dc392
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit 8dc392
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit 8dc392
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit 8dc392
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit 8dc392
//
Packit 8dc392
///////////////////////////////////////////////////////////////////////////
Packit 8dc392
Packit 8dc392
#include "ImathMatrixAlgo.h"
Packit 8dc392
#include <iostream>
Packit 8dc392
#include <assert.h>
Packit 8dc392
#include <cmath>
Packit 8dc392
#include <limits>
Packit 8dc392
#include <algorithm>
Packit 8dc392
Packit 8dc392
template <typename T>
Packit 8dc392
void
Packit 8dc392
verifyOrthonormal (const IMATH_INTERNAL_NAMESPACE::Matrix33<T>& A)
Packit 8dc392
{
Packit 8dc392
    const T valueEps = T(100) * std::numeric_limits<T>::epsilon();
Packit 8dc392
Packit 8dc392
    const IMATH_INTERNAL_NAMESPACE::Matrix33<T> prod = A * A.transposed();
Packit 8dc392
    for (int i = 0; i < 3; ++i)
Packit 8dc392
    {
Packit 8dc392
        for (int j = 0; j < 3; ++j)
Packit 8dc392
        {
Packit 8dc392
            if (i == j)
Packit 8dc392
                assert (std::abs (prod[i][j] - 1) < valueEps);
Packit 8dc392
            else
Packit 8dc392
                assert (std::abs (prod[i][j]) < valueEps);
Packit 8dc392
        }
Packit 8dc392
    }
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <typename T>
Packit 8dc392
void
Packit 8dc392
verifyOrthonormal (const IMATH_INTERNAL_NAMESPACE::Matrix44<T>& A)
Packit 8dc392
{
Packit 8dc392
    const T valueEps = T(100) * std::numeric_limits<T>::epsilon();
Packit 8dc392
Packit 8dc392
    const IMATH_INTERNAL_NAMESPACE::Matrix44<T> prod = A * A.transposed();
Packit 8dc392
    for (int i = 0; i < 4; ++i)
Packit 8dc392
    {
Packit 8dc392
        for (int j = 0; j < 4; ++j)
Packit 8dc392
        {
Packit 8dc392
            if (i == j)
Packit 8dc392
                assert (std::abs (prod[i][j] - 1) <= valueEps);
Packit 8dc392
            else
Packit 8dc392
                assert (std::abs (prod[i][j]) <= valueEps);
Packit 8dc392
        }
Packit 8dc392
    }
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <typename T>
Packit 8dc392
void
Packit 8dc392
verifyTinySVD_3x3 (const IMATH_INTERNAL_NAMESPACE::Matrix33<T>& A)
Packit 8dc392
{
Packit 8dc392
    T maxEntry = 0;
Packit 8dc392
    for (int i = 0; i < 3; ++i)
Packit 8dc392
        for (int j = 0; j < 3; ++j)
Packit 8dc392
            maxEntry = std::max (maxEntry, std::abs (A[i][j]));
Packit 8dc392
Packit 8dc392
    const T eps = std::numeric_limits<T>::epsilon();
Packit 8dc392
    const T valueEps = maxEntry * T(10) * eps;
Packit 8dc392
Packit 8dc392
    for (int i = 0; i < 2; ++i)
Packit 8dc392
    {
Packit 8dc392
        const bool posDet = (i == 0);
Packit 8dc392
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::Matrix33<T> U, V;
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::Vec3<T> S;
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::jacobiSVD (A, U, S, V, eps, posDet);
Packit 8dc392
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::Matrix33<T> S_times_Vt;
Packit 8dc392
        for (int i = 0; i < 3; ++i)
Packit 8dc392
            for (int j = 0; j < 3; ++j)
Packit 8dc392
                S_times_Vt[i][j] = S[j] * V[i][j];
Packit 8dc392
        S_times_Vt.transpose();
Packit 8dc392
Packit 8dc392
        // Verify that the product of the matrices is A:
Packit 8dc392
        const IMATH_INTERNAL_NAMESPACE::Matrix33<T> product = U * S_times_Vt;
Packit 8dc392
        for (int i = 0; i < 3; ++i)
Packit 8dc392
            for (int j = 0; j < 3; ++j)
Packit 8dc392
                assert (std::abs (product[i][j] - A[i][j]) <= valueEps);
Packit 8dc392
Packit 8dc392
        // Verify that U and V are orthogonal:
Packit 8dc392
        if (posDet)
Packit 8dc392
        {
Packit 8dc392
            assert (U.determinant() > 0.9);
Packit 8dc392
            assert (V.determinant() > 0.9);
Packit 8dc392
        }
Packit 8dc392
Packit 8dc392
        // Verify that the singular values are sorted:
Packit 8dc392
        for (int i = 0; i < 2; ++i)
Packit 8dc392
            assert (S[i] >= S[i+1]);
Packit 8dc392
Packit 8dc392
        // Verify that all the SVs except maybe the last one are positive:
Packit 8dc392
        for (int i = 0; i < 2; ++i)
Packit 8dc392
            assert (S[i] >= T(0));
Packit 8dc392
Packit 8dc392
        if (!posDet)
Packit 8dc392
            assert (S[2] >= T(0));
Packit 8dc392
Packit 8dc392
        verifyOrthonormal (U);
Packit 8dc392
        verifyOrthonormal (V);
Packit 8dc392
    }
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <typename T>
Packit 8dc392
void
Packit 8dc392
verifyTinySVD_4x4 (const IMATH_INTERNAL_NAMESPACE::Matrix44<T>& A)
Packit 8dc392
{
Packit 8dc392
    T maxEntry = 0;
Packit 8dc392
    for (int i = 0; i < 4; ++i)
Packit 8dc392
        for (int j = 0; j < 4; ++j)
Packit 8dc392
            maxEntry = std::max (maxEntry, std::abs (A[i][j]));
Packit 8dc392
Packit 8dc392
    const T eps = std::numeric_limits<T>::epsilon();
Packit 8dc392
    const T valueEps = maxEntry * T(100) * eps;
Packit 8dc392
Packit 8dc392
    for (int i = 0; i < 2; ++i)
Packit 8dc392
    {
Packit 8dc392
        const bool posDet = (i == 0);
Packit 8dc392
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::Matrix44<T> U, V;
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::Vec4<T> S;
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::jacobiSVD (A, U, S, V, eps, posDet);
Packit 8dc392
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::Matrix44<T> S_times_Vt;
Packit 8dc392
        for (int i = 0; i < 4; ++i)
Packit 8dc392
            for (int j = 0; j < 4; ++j)
Packit 8dc392
                S_times_Vt[i][j] = S[j] * V[i][j];
Packit 8dc392
        S_times_Vt.transpose();
Packit 8dc392
Packit 8dc392
        // Verify that the product of the matrices is A:
Packit 8dc392
        const IMATH_INTERNAL_NAMESPACE::Matrix44<T> product = U * S_times_Vt;
Packit 8dc392
        for (int i = 0; i < 4; ++i)
Packit 8dc392
            for (int j = 0; j < 4; ++j)
Packit 8dc392
                assert (std::abs (product[i][j] - A[i][j]) <= valueEps);
Packit 8dc392
Packit 8dc392
        // Verify that U and V have positive determinant if requested:
Packit 8dc392
        if (posDet)
Packit 8dc392
        {
Packit 8dc392
            assert (U.determinant() > 0.99);
Packit 8dc392
            assert (V.determinant() > 0.99);
Packit 8dc392
        }
Packit 8dc392
Packit 8dc392
        // Verify that the singular values are sorted:
Packit 8dc392
        for (int i = 0; i < 3; ++i)
Packit 8dc392
            assert (S[i] >= S[i+1]);
Packit 8dc392
Packit 8dc392
        // Verify that all the SVs except maybe the last one are positive:
Packit 8dc392
        for (int i = 0; i < 3; ++i)
Packit 8dc392
            assert (S[i] >= T(0));
Packit 8dc392
Packit 8dc392
        if (!posDet)
Packit 8dc392
            assert (S[3] >= T(0));
Packit 8dc392
Packit 8dc392
        verifyOrthonormal (U);
Packit 8dc392
        verifyOrthonormal (V);
Packit 8dc392
    }
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <typename T>
Packit 8dc392
void
Packit 8dc392
testTinySVD_3x3 (const IMATH_INTERNAL_NAMESPACE::Matrix33<T>& A)
Packit 8dc392
{
Packit 8dc392
    std::cout << "Verifying SVD for [[" << A[0][0] << ", " << A[0][1] << ", " << A[0][2] << "], "
Packit 8dc392
                                 << "[" << A[1][0] << ", " << A[1][1] << ", " << A[1][2] << "], "
Packit 8dc392
                                 << "[" << A[2][0] << ", " << A[2][1] << ", " << A[2][2] << "]]\n";
Packit 8dc392
 
Packit 8dc392
    verifyTinySVD_3x3 (A);
Packit 8dc392
    verifyTinySVD_3x3 (A.transposed());
Packit 8dc392
Packit 8dc392
    // Try all different orderings of the columns of A:
Packit 8dc392
    int cols[3] = { 0, 1, 2 };
Packit 8dc392
    do
Packit 8dc392
    {
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::Matrix33<T> B;
Packit 8dc392
        for (int i = 0; i < 3; ++i)
Packit 8dc392
            for (int j = 0; j < 3; ++j)
Packit 8dc392
                B[i][j] = A[i][cols[j]];
Packit 8dc392
Packit 8dc392
        verifyTinySVD_3x3 (B);
Packit 8dc392
    } while (std::next_permutation (cols, cols + 3));
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <typename T>
Packit 8dc392
void
Packit 8dc392
testTinySVD_3x3 (const T a, const T b, const T c,
Packit 8dc392
                 const T d, const T e, const T f,
Packit 8dc392
                 const T g, const T h, const T i)
Packit 8dc392
{
Packit 8dc392
    const IMATH_INTERNAL_NAMESPACE::Matrix33<T> A (a, b, c, d, e, f, g, h, i);
Packit 8dc392
    testTinySVD_3x3 (A);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <typename T>
Packit 8dc392
void
Packit 8dc392
testTinySVD_4x4 (const IMATH_INTERNAL_NAMESPACE::Matrix44<T>& A)
Packit 8dc392
{
Packit 8dc392
    std::cout << "Verifying SVD for [[" << A[0][0] << ", " << A[0][1] << ", " << A[0][2] << ", " << A[0][3] << "], "
Packit 8dc392
                                 << "[" << A[1][0] << ", " << A[1][1] << ", " << A[1][2] << ", " << A[1][3] << "], "
Packit 8dc392
                                 << "[" << A[2][0] << ", " << A[2][1] << ", " << A[2][2] << ", " << A[2][3] << "], "
Packit 8dc392
                                 << "[" << A[3][0] << ", " << A[3][1] << ", " << A[3][2] << ", " << A[3][3] << "]]\n";
Packit 8dc392
 
Packit 8dc392
    verifyTinySVD_4x4 (A);
Packit 8dc392
    verifyTinySVD_4x4 (A.transposed());
Packit 8dc392
Packit 8dc392
    // Try all different orderings of the columns of A:
Packit 8dc392
    int cols[4] = { 0, 1, 2, 3 };
Packit 8dc392
    do
Packit 8dc392
    {
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::Matrix44<T> B;
Packit 8dc392
        for (int i = 0; i < 4; ++i)
Packit 8dc392
            for (int j = 0; j < 4; ++j)
Packit 8dc392
                B[i][j] = A[i][cols[j]];
Packit 8dc392
Packit 8dc392
        verifyTinySVD_4x4 (B);
Packit 8dc392
    } while (std::next_permutation (cols, cols + 4));
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <typename T>
Packit 8dc392
void
Packit 8dc392
testTinySVD_4x4 (const T a, const T b, const T c, const T d, 
Packit 8dc392
                 const T e, const T f, const T g, const T h, 
Packit 8dc392
                 const T i, const T j, const T k, const T l,
Packit 8dc392
                 const T m, const T n, const T o, const T p)
Packit 8dc392
{
Packit 8dc392
    const IMATH_INTERNAL_NAMESPACE::Matrix44<T> A (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p);
Packit 8dc392
    testTinySVD_4x4 (A);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <typename T>
Packit 8dc392
void
Packit 8dc392
testTinySVDImp()
Packit 8dc392
{
Packit 8dc392
    // Try a bunch of 3x3 matrices:
Packit 8dc392
    testTinySVD_3x3<T> (1, 0, 0, 0, 1, 0, 0, 0, 1);
Packit 8dc392
    testTinySVD_3x3<T> (1, 0, 0, 0, -1, 0, 0, 0, 1);
Packit 8dc392
    testTinySVD_3x3<T> (0, 0, 0, 0, 0, 0, 0, 0, 0);
Packit 8dc392
    testTinySVD_3x3<T> (0, 0, 0, 0, 0, 0, 0, 0, 1);
Packit 8dc392
    testTinySVD_3x3<T> (1, 0, 0, 0, 1, 0, 0, 0, 0);
Packit 8dc392
    testTinySVD_3x3<T> (1, 0, 0, 0, 0, 0, 0, 0, 0);
Packit 8dc392
    testTinySVD_3x3<T> (1, 0, 0, 1e-10, 0, 0, 0, 0, 0);
Packit 8dc392
    testTinySVD_3x3<T> (1, 0, 0, 1e-10, 0, 0, 0, 0, 100000);
Packit 8dc392
    testTinySVD_3x3<T> (1, 2, 3, 4, 5, 6, 7, 8, 9);
Packit 8dc392
    testTinySVD_3x3<T> (1, 2, 3, 4, 5, 6, 7, 8, 9);
Packit 8dc392
    testTinySVD_3x3<T> (outerProduct (IMATH_INTERNAL_NAMESPACE::Vec3<T> (100, 1e-5, 0), IMATH_INTERNAL_NAMESPACE::Vec3<T> (100, 1e-5, 0)));
Packit 8dc392
    testTinySVD_3x3<T> (outerProduct (IMATH_INTERNAL_NAMESPACE::Vec3<T> (245, 20, 1), IMATH_INTERNAL_NAMESPACE::Vec3<T> (256, 300, 20)));
Packit 8dc392
    testTinySVD_3x3<T> (outerProduct (IMATH_INTERNAL_NAMESPACE::Vec3<T> (245, 20, 1), IMATH_INTERNAL_NAMESPACE::Vec3<T> (245, 20, 1)) +
Packit 8dc392
                        outerProduct (IMATH_INTERNAL_NAMESPACE::Vec3<T> (1, 2, 3), IMATH_INTERNAL_NAMESPACE::Vec3<T> (1, 2, 3)));
Packit 8dc392
Packit 8dc392
    // Some problematic matrices from SVDTest:
Packit 8dc392
    testTinySVD_3x3<T> (
Packit 8dc392
            0.0023588321752040036, -0.0096558131480729038, 0.0010959850449366493,
Packit 8dc392
            0.0088671829608044754, 0.0016771794267033666, -0.0043081475729438235,
Packit 8dc392
            0.003976050440932701, 0.0019880497026345716, 0.0089576046614601966);
Packit 8dc392
    testTinySVD_3x3<T> (
Packit 8dc392
            2.3588321752040035e-09, -9.6558131480729038e-09,  1.0959850449366498e-09,
Packit 8dc392
            8.8671829608044748e-09,  1.6771794267033661e-09, -4.3081475729438225e-09,
Packit 8dc392
            3.9760504409327016e-09,  1.9880497026345722e-09,  8.9576046614601957e-09);
Packit 8dc392
    testTinySVD_3x3<T> (
Packit 8dc392
            -0.46673855799602715,  0.67466260360310948,  0.97646986796448998,
Packit 8dc392
            -0.032460753747103721, 0.046584527749418278, 0.067431228641151142,
Packit 8dc392
            -0.088885055229687815, 0.1280389179308779,   0.18532617511453064);
Packit 8dc392
    testTinySVD_3x3<T> (
Packit 8dc392
            1e-8, 0, 0,
Packit 8dc392
            0, 1e-8, 0,
Packit 8dc392
            0, 0, 1e-8);
Packit 8dc392
    testTinySVD_3x3<T> (
Packit 8dc392
            1,     0,      0,
Packit 8dc392
            0,     .00036, 0,
Packit 8dc392
            1e-18, 0,      .00018);
Packit 8dc392
    testTinySVD_3x3<T> (
Packit 8dc392
            1.3,   0,     0,
Packit 8dc392
            0,     .0003, 0,
Packit 8dc392
            1e-17, 0,     0);
Packit 8dc392
    testTinySVD_3x3<T> (
Packit 8dc392
            1, 0,    0,
Packit 8dc392
            0, 1e-2, 0,
Packit 8dc392
            0, 0, 1e-2);
Packit 8dc392
    testTinySVD_3x3<T> (
Packit 8dc392
            1,0,0,
Packit 8dc392
            0,1,0,
Packit 8dc392
            0,0,0);
Packit 8dc392
    testTinySVD_3x3<T> (
Packit 8dc392
            1,  0,     0,
Packit 8dc392
            0,  1e-3,  0,
Packit 8dc392
            0,  0,  1e-6);
Packit 8dc392
    testTinySVD_3x3<T> (
Packit 8dc392
             0.59588638570136332, -0.79761234126107794, -1,
Packit 8dc392
             0.39194500425202045,  0.91763115383440363, -0.341818175044664,
Packit 8dc392
            -0.45056075218951946, -0.71259057727425101,  0.47125008216720271);
Packit 8dc392
    testTinySVD_3x3<T> (
Packit 8dc392
             4.38805348e-09, -2.53189691e-09, -4.65678607e-09,
Packit 8dc392
            -3.23000099e-10,  1.86370294e-10,  3.42781192e-10,
Packit 8dc392
            -4.61572824e-09,  2.6632645e-09,   4.89840346e-09);
Packit 8dc392
    // problematic 2x2 one for lapack on suse (see below), padded with 0's
Packit 8dc392
    testTinySVD_3x3<T> (
Packit 8dc392
            0,  -1.00000003e-22, 0,
Packit 8dc392
            1.00000001e-07,  0, 0,
Packit 8dc392
            0, 0, 0);
Packit 8dc392
    // problematic 2x2 one for lapack on suse (see below), padded with 0's and 1
Packit 8dc392
    testTinySVD_3x3<T> (
Packit 8dc392
            0,  -1.00000003e-22, 0,
Packit 8dc392
            1.00000001e-07,  0, 0,
Packit 8dc392
            0, 0, 1);
Packit 8dc392
Packit 8dc392
    // Now, 4x4 matrices:
Packit 8dc392
    testTinySVD_4x4<T> (1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
Packit 8dc392
    testTinySVD_4x4<T> (1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
Packit 8dc392
    testTinySVD_4x4<T> (1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0);
Packit 8dc392
    testTinySVD_4x4<T> (1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
Packit 8dc392
    testTinySVD_4x4<T> (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
Packit 8dc392
    testTinySVD_4x4<T> (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
Packit 8dc392
    testTinySVD_4x4<T> (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
Packit 8dc392
    testTinySVD_4x4<T> (0, -1.00000003e-22, 0, 0, 00000001e-07, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
Packit 8dc392
    testTinySVD_4x4<T> (outerProduct (IMATH_INTERNAL_NAMESPACE::Vec4<T> (100, 1e-5, 0, 0), IMATH_INTERNAL_NAMESPACE::Vec4<T> (100, 1e-5, 0, 0)));
Packit 8dc392
    testTinySVD_4x4<T> (outerProduct (IMATH_INTERNAL_NAMESPACE::Vec4<T> (245, 20, 1, 0.5), IMATH_INTERNAL_NAMESPACE::Vec4<T> (256, 300, 20, 10)));
Packit 8dc392
    testTinySVD_4x4<T> (outerProduct (IMATH_INTERNAL_NAMESPACE::Vec4<T> (245, 20, 1, 0.5), IMATH_INTERNAL_NAMESPACE::Vec4<T> (256, 300, 20, 10)) +
Packit 8dc392
                        outerProduct (IMATH_INTERNAL_NAMESPACE::Vec4<T> (30, 10, 10, 10), IMATH_INTERNAL_NAMESPACE::Vec4<T> (1, 2, 3, 3)));
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
void
Packit 8dc392
testTinySVD ()
Packit 8dc392
{
Packit 8dc392
    std::cout << "Testing TinySVD algorithms in single precision..." << std::endl;
Packit 8dc392
    testTinySVDImp<float>();
Packit 8dc392
Packit 8dc392
    std::cout << "Testing TinySVD algorithms in double precision..." << std::endl;
Packit 8dc392
    testTinySVDImp<double>();
Packit 8dc392
}
Packit 8dc392