Blame ImathTest/testMatrix.cpp

Packit 8dc392
///////////////////////////////////////////////////////////////////////////
Packit 8dc392
//
Packit 8dc392
// Copyright (c) 2002, 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
Packit 8dc392
Packit 8dc392
#include <testMatrix.h>
Packit 8dc392
#include "ImathMatrix.h"
Packit 8dc392
#include "ImathMatrixAlgo.h"
Packit 8dc392
#include "ImathVec.h"
Packit 8dc392
#include "ImathLimits.h"
Packit 8dc392
#include "ImathMath.h"
Packit 8dc392
#include "ImathInt64.h"
Packit 8dc392
#include "ImathRandom.h"
Packit 8dc392
#include <iostream>
Packit 8dc392
#include <assert.h>
Packit 8dc392
Packit 8dc392
Packit 8dc392
using namespace std;
Packit 8dc392
using IMATH_INTERNAL_NAMESPACE::Int64;
Packit 8dc392
Packit 8dc392
Packit 8dc392
//
Packit 8dc392
// This file is not currently intended to exhaustively test
Packit 8dc392
// the Imath Matrix33<T> and Matrix44<T> classes.  We leave
Packit 8dc392
// that to PyImathTest.
Packit 8dc392
//
Packit 8dc392
// Instead, in this file we test only those aspects of the
Packit 8dc392
// Imath Matrix33<T> and Matrix44<T> classes that must be 
Packit 8dc392
// or are more convenient to test from C++.
Packit 8dc392
//
Packit 8dc392
Packit 8dc392
void
Packit 8dc392
testMatrix ()
Packit 8dc392
{
Packit 8dc392
    cout << "Testing functions in ImathMatrix.h" << endl;
Packit 8dc392
Packit 8dc392
    union {float f; int i;} nanf;
Packit 8dc392
    nanf.i = 0x7f800001; //  NAN
Packit 8dc392
Packit 8dc392
    union {double d; Int64 i;} nand;
Packit 8dc392
    nand.i = 0x7ff0000000000001ULL; //  NAN
Packit 8dc392
Packit 8dc392
    {
Packit 8dc392
	cout << "Imath::M33f shear functions" << endl;
Packit 8dc392
Packit 8dc392
	IMATH_INTERNAL_NAMESPACE::M33f m1, m2;
Packit 8dc392
	m1.setShear (2.0f);
Packit 8dc392
	assert
Packit 8dc392
	   (m1[0][0] == 1.0f  &&  m1[0][1] == 0.0f  &&  m1[0][2] == 0.0f  &&
Packit 8dc392
	    m1[1][0] == 2.0f  &&  m1[1][1] == 1.0f  &&  m1[1][2] == 0.0f  &&
Packit 8dc392
	    m1[2][0] == 0.0f  &&  m1[2][1] == 0.0f  &&  m1[2][2] == 1.0f);
Packit 8dc392
Packit 8dc392
	m2.setShear (IMATH_INTERNAL_NAMESPACE::V2f (3.0f, 4.0f));
Packit 8dc392
	assert
Packit 8dc392
	   (m2[0][0] == 1.0f  &&  m2[0][1] == 4.0f  &&  m2[0][2] == 0.0f  &&
Packit 8dc392
	    m2[1][0] == 3.0f  &&  m2[1][1] == 1.0f  &&  m2[1][2] == 0.0f  &&
Packit 8dc392
	    m2[2][0] == 0.0f  &&  m2[2][1] == 0.0f  &&  m2[2][2] == 1.0f);
Packit 8dc392
Packit 8dc392
Packit 8dc392
	m1.shear (IMATH_INTERNAL_NAMESPACE::V2f (5.0f, 6.0f));
Packit 8dc392
	assert
Packit 8dc392
	   (m1[0][0] == 13.0f  &&  m1[0][1] == 6.0f  &&  m1[0][2] == 0.0f  &&
Packit 8dc392
	    m1[1][0] ==  7.0f  &&  m1[1][1] == 1.0f  &&  m1[1][2] == 0.0f  &&
Packit 8dc392
	    m1[2][0] ==  0.0f  &&  m1[2][1] == 0.0f  &&  m1[2][2] == 1.0f);
Packit 8dc392
Packit 8dc392
	m2.shear (7.0f);
Packit 8dc392
	assert
Packit 8dc392
	   (m2[0][0] ==  1.0f  &&  m2[0][1] ==  4.0f  &&  m2[0][2] == 0.0f  &&
Packit 8dc392
	    m2[1][0] == 10.0f  &&  m2[1][1] == 29.0f  &&  m2[1][2] == 0.0f  &&
Packit 8dc392
	    m2[2][0] ==  0.0f  &&  m2[2][1] ==  0.0f  &&  m2[2][2] == 1.0f);
Packit 8dc392
Packit 8dc392
	cout << "M33f constructors and equality operators" << endl;
Packit 8dc392
Packit 8dc392
	IMATH_INTERNAL_NAMESPACE::M33f test(m2);
Packit 8dc392
	assert(test == m2);
Packit 8dc392
Packit 8dc392
	IMATH_INTERNAL_NAMESPACE::M33f test2;
Packit 8dc392
	assert(test != test2);
Packit 8dc392
Packit 8dc392
	IMATH_INTERNAL_NAMESPACE::M33f test3;
Packit 8dc392
	test3.makeIdentity();
Packit 8dc392
	assert(test2 == test3);
Packit 8dc392
    }
Packit 8dc392
Packit 8dc392
    {
Packit 8dc392
	cout << "M33d constructors and equality operators" << endl;
Packit 8dc392
Packit 8dc392
	IMATH_INTERNAL_NAMESPACE::M33d m2;
Packit 8dc392
	m2[0][0] = 99.0f;
Packit 8dc392
	m2[1][2] = 101.0f;
Packit 8dc392
Packit 8dc392
	IMATH_INTERNAL_NAMESPACE::M33d test(m2);
Packit 8dc392
	assert(test == m2);
Packit 8dc392
Packit 8dc392
	IMATH_INTERNAL_NAMESPACE::M33d test2;
Packit 8dc392
	assert(test != test2);
Packit 8dc392
Packit 8dc392
	IMATH_INTERNAL_NAMESPACE::M33d test3;
Packit 8dc392
	test3.makeIdentity();
Packit 8dc392
	assert(test2 == test3);
Packit 8dc392
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M33f test4 (1.0f, 2.0f, 3.0f,
Packit 8dc392
                           4.0f, 5.0f, 6.0f,
Packit 8dc392
                           7.0f, 8.0f, 9.0f);
Packit 8dc392
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M33d test5 = IMATH_INTERNAL_NAMESPACE::M33d (test4);
Packit 8dc392
Packit 8dc392
        assert (test5[0][0] == 1.0);
Packit 8dc392
        assert (test5[0][1] == 2.0);
Packit 8dc392
        assert (test5[0][2] == 3.0);
Packit 8dc392
Packit 8dc392
        assert (test5[1][0] == 4.0);
Packit 8dc392
        assert (test5[1][1] == 5.0);
Packit 8dc392
        assert (test5[1][2] == 6.0);
Packit 8dc392
Packit 8dc392
        assert (test5[2][0] == 7.0);
Packit 8dc392
        assert (test5[2][1] == 8.0);
Packit 8dc392
        assert (test5[2][2] == 9.0);
Packit 8dc392
    }
Packit 8dc392
Packit 8dc392
    {
Packit 8dc392
	IMATH_INTERNAL_NAMESPACE::M44f m2;
Packit 8dc392
	m2[0][0] = 99.0f;
Packit 8dc392
	m2[1][2] = 101.0f;
Packit 8dc392
Packit 8dc392
	cout << "M44f constructors and equality operators" << endl;
Packit 8dc392
Packit 8dc392
	IMATH_INTERNAL_NAMESPACE::M44f test(m2);
Packit 8dc392
	assert(test == m2);
Packit 8dc392
Packit 8dc392
	IMATH_INTERNAL_NAMESPACE::M44f test2;
Packit 8dc392
	assert(test != test2);
Packit 8dc392
Packit 8dc392
	IMATH_INTERNAL_NAMESPACE::M44f test3;
Packit 8dc392
	test3.makeIdentity();
Packit 8dc392
	assert(test2 == test3);
Packit 8dc392
Packit 8dc392
	//
Packit 8dc392
	// Test non-equality when a NAN is in the same
Packit 8dc392
	// place in two identical matrices
Packit 8dc392
	//
Packit 8dc392
Packit 8dc392
	test2[0][0] = nanf.f;
Packit 8dc392
	test3 = test2;
Packit 8dc392
	assert(test2 != test3);
Packit 8dc392
    }
Packit 8dc392
Packit 8dc392
    {
Packit 8dc392
	IMATH_INTERNAL_NAMESPACE::M44d m2;
Packit 8dc392
	m2[0][0] = 99.0f;
Packit 8dc392
	m2[1][2] = 101.0f;
Packit 8dc392
Packit 8dc392
	cout << "M44d constructors and equality operators" << endl;
Packit 8dc392
Packit 8dc392
	IMATH_INTERNAL_NAMESPACE::M44d test(m2);
Packit 8dc392
	assert(test == m2);
Packit 8dc392
Packit 8dc392
	IMATH_INTERNAL_NAMESPACE::M44d test2;
Packit 8dc392
	assert(test != test2);
Packit 8dc392
Packit 8dc392
	IMATH_INTERNAL_NAMESPACE::M44d test3;
Packit 8dc392
	test3.makeIdentity();
Packit 8dc392
	assert(test2 == test3);
Packit 8dc392
Packit 8dc392
	//
Packit 8dc392
	// Test non-equality when a NAN is in the same
Packit 8dc392
	// place in two identical matrices
Packit 8dc392
	//
Packit 8dc392
Packit 8dc392
	test2[0][0] = nand.d;
Packit 8dc392
	test3 = test2;
Packit 8dc392
	assert(test2 != test3);
Packit 8dc392
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M44f test4 ( 1.0f,  2.0f,  3.0f,  4.0f,
Packit 8dc392
                            5.0f,  6.0f,  7.0f,  8.0f,
Packit 8dc392
                            9.0f, 10.0f, 11.0f, 12.0f,
Packit 8dc392
                           13.0f, 14.0f, 15.0f, 16.0f);
Packit 8dc392
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M44d test5 = IMATH_INTERNAL_NAMESPACE::M44d (test4);
Packit 8dc392
Packit 8dc392
        assert (test5[0][0] ==  1.0);
Packit 8dc392
        assert (test5[0][1] ==  2.0);
Packit 8dc392
        assert (test5[0][2] ==  3.0);
Packit 8dc392
        assert (test5[0][3] ==  4.0);
Packit 8dc392
Packit 8dc392
        assert (test5[1][0] ==  5.0);
Packit 8dc392
        assert (test5[1][1] ==  6.0);
Packit 8dc392
        assert (test5[1][2] ==  7.0);
Packit 8dc392
        assert (test5[1][3] ==  8.0);
Packit 8dc392
Packit 8dc392
        assert (test5[2][0] ==  9.0);
Packit 8dc392
        assert (test5[2][1] == 10.0);
Packit 8dc392
        assert (test5[2][2] == 11.0);
Packit 8dc392
        assert (test5[2][3] == 12.0);
Packit 8dc392
Packit 8dc392
        assert (test5[3][0] == 13.0);
Packit 8dc392
        assert (test5[3][1] == 14.0);
Packit 8dc392
        assert (test5[3][2] == 15.0);
Packit 8dc392
        assert (test5[3][3] == 16.0);
Packit 8dc392
    }
Packit 8dc392
Packit 8dc392
    {
Packit 8dc392
	cout << "Converting between M33 and M44" << endl;
Packit 8dc392
Packit 8dc392
	IMATH_INTERNAL_NAMESPACE::M44d m1;
Packit 8dc392
	m1[0][0] = 99;
Packit 8dc392
	IMATH_INTERNAL_NAMESPACE::M44f m2;
Packit 8dc392
	m2.setValue(m1);
Packit 8dc392
	assert(m2[0][0] == (float)m1[0][0]);
Packit 8dc392
	m1[0][0] = 101;
Packit 8dc392
	m1.setValue(m2);
Packit 8dc392
	assert(m2[0][0] == (float)m1[0][0]);
Packit 8dc392
    }
Packit 8dc392
Packit 8dc392
    // Matrix minors
Packit 8dc392
    {
Packit 8dc392
        cout << "3x3 Matrix minors" << endl;
Packit 8dc392
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M33f a(1,2,3,4,5,6,7,8,9);
Packit 8dc392
Packit 8dc392
        assert (a.minorOf(0,0) == a.fastMinor(1,2,1,2));
Packit 8dc392
        assert (a.minorOf(0,1) == a.fastMinor(1,2,0,2));
Packit 8dc392
        assert (a.minorOf(0,2) == a.fastMinor(1,2,0,1));
Packit 8dc392
        assert (a.minorOf(1,0) == a.fastMinor(0,2,1,2));
Packit 8dc392
        assert (a.minorOf(1,1) == a.fastMinor(0,2,0,2));
Packit 8dc392
        assert (a.minorOf(1,2) == a.fastMinor(0,2,0,1));
Packit 8dc392
        assert (a.minorOf(2,0) == a.fastMinor(0,1,1,2));
Packit 8dc392
        assert (a.minorOf(2,1) == a.fastMinor(0,1,0,2));
Packit 8dc392
        assert (a.minorOf(2,2) == a.fastMinor(0,1,0,1));
Packit 8dc392
    }
Packit 8dc392
    {
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M33d a(1,2,3,4,5,6,7,8,9);
Packit 8dc392
Packit 8dc392
        assert (a.minorOf(0,0) == a.fastMinor(1,2,1,2));
Packit 8dc392
        assert (a.minorOf(0,1) == a.fastMinor(1,2,0,2));
Packit 8dc392
        assert (a.minorOf(0,2) == a.fastMinor(1,2,0,1));
Packit 8dc392
        assert (a.minorOf(1,0) == a.fastMinor(0,2,1,2));
Packit 8dc392
        assert (a.minorOf(1,1) == a.fastMinor(0,2,0,2));
Packit 8dc392
        assert (a.minorOf(1,2) == a.fastMinor(0,2,0,1));
Packit 8dc392
        assert (a.minorOf(2,0) == a.fastMinor(0,1,1,2));
Packit 8dc392
        assert (a.minorOf(2,1) == a.fastMinor(0,1,0,2));
Packit 8dc392
        assert (a.minorOf(2,2) == a.fastMinor(0,1,0,1));
Packit 8dc392
    }
Packit 8dc392
Packit 8dc392
    // Determinants (by building a random singular value decomposition)
Packit 8dc392
    {
Packit 8dc392
        cout << "3x3 determinant" << endl;
Packit 8dc392
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::Rand32 random;
Packit 8dc392
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M33f u;
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M33f v;
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M33f s;
Packit 8dc392
Packit 8dc392
        u.setRotation( random.nextf() );
Packit 8dc392
        v.setRotation( random.nextf() );
Packit 8dc392
        s[0][0] = random.nextf();
Packit 8dc392
        s[1][1] = random.nextf();
Packit 8dc392
        s[2][2] = random.nextf();
Packit 8dc392
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M33f c = u * s * v.transpose();
Packit 8dc392
        assert (fabsf(c.determinant() - s[0][0]*s[1][1]*s[2][2]) <= u.baseTypeEpsilon());
Packit 8dc392
    }
Packit 8dc392
    {
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::Rand32 random;
Packit 8dc392
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M33d u;
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M33d v;
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M33d s;
Packit 8dc392
Packit 8dc392
        u.setRotation( (double)random.nextf() );
Packit 8dc392
        v.setRotation( (double)random.nextf() );
Packit 8dc392
        s[0][0] = (double)random.nextf();
Packit 8dc392
        s[1][1] = (double)random.nextf();
Packit 8dc392
        s[2][2] = (double)random.nextf();
Packit 8dc392
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M33d c = u * s * v.transpose();
Packit 8dc392
        assert (fabs(c.determinant() - s[0][0]*s[1][1]*s[2][2]) <= u.baseTypeEpsilon());
Packit 8dc392
    }
Packit 8dc392
Packit 8dc392
    // Outer product of two 3D vectors
Packit 8dc392
    {
Packit 8dc392
        cout << "Outer product of two 3D vectors" << endl;
Packit 8dc392
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::V3f a(1,2,3);
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::V3f b(4,5,6);
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M33f  p = IMATH_INTERNAL_NAMESPACE::outerProduct(a,b);
Packit 8dc392
Packit 8dc392
        for (int i=0; i<3; i++ )
Packit 8dc392
        {
Packit 8dc392
            for (int j=0; j<3; j++)
Packit 8dc392
            {
Packit 8dc392
                assert (p[i][j] == a[i]*b[j]);
Packit 8dc392
            }
Packit 8dc392
        }
Packit 8dc392
    }
Packit 8dc392
    {
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::V3d a(1,2,3);
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::V3d b(4,5,6);
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M33d  p = IMATH_INTERNAL_NAMESPACE::outerProduct(a,b);
Packit 8dc392
Packit 8dc392
        for (int i=0; i<3; i++ )
Packit 8dc392
        {
Packit 8dc392
            for (int j=0; j<3; j++)
Packit 8dc392
            {
Packit 8dc392
                assert (p[i][j] == a[i]*b[j]);
Packit 8dc392
            }
Packit 8dc392
        }
Packit 8dc392
    }
Packit 8dc392
Packit 8dc392
Packit 8dc392
    // Determinants (by building a random singular value decomposition)
Packit 8dc392
    {
Packit 8dc392
        cout << "4x4 determinants" << endl;
Packit 8dc392
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::Rand32 random;
Packit 8dc392
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M44f u = IMATH_INTERNAL_NAMESPACE::rotationMatrix
Packit 8dc392
            ( IMATH_INTERNAL_NAMESPACE::V3f(random.nextf(),random.nextf(),random.nextf()).normalize(),
Packit 8dc392
              IMATH_INTERNAL_NAMESPACE::V3f(random.nextf(),random.nextf(),random.nextf()).normalize() );
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M44f v = IMATH_INTERNAL_NAMESPACE::rotationMatrix
Packit 8dc392
            ( IMATH_INTERNAL_NAMESPACE::V3f(random.nextf(),random.nextf(),random.nextf()).normalize(),
Packit 8dc392
              IMATH_INTERNAL_NAMESPACE::V3f(random.nextf(),random.nextf(),random.nextf()).normalize() );
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M44f s;
Packit 8dc392
Packit 8dc392
        s[0][0] = random.nextf();
Packit 8dc392
        s[1][1] = random.nextf();
Packit 8dc392
        s[2][2] = random.nextf();
Packit 8dc392
        s[3][3] = random.nextf();
Packit 8dc392
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M44f c = u * s * v.transpose();
Packit 8dc392
        assert (fabsf(c.determinant() - s[0][0]*s[1][1]*s[2][2]*s[3][3]) <= u.baseTypeEpsilon());
Packit 8dc392
    }
Packit 8dc392
    {
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::Rand32 random;
Packit 8dc392
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M44d u = IMATH_INTERNAL_NAMESPACE::rotationMatrix
Packit 8dc392
            ( IMATH_INTERNAL_NAMESPACE::V3d(random.nextf(),random.nextf(),random.nextf()).normalize(),
Packit 8dc392
              IMATH_INTERNAL_NAMESPACE::V3d(random.nextf(),random.nextf(),random.nextf()).normalize() );
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M44d v = IMATH_INTERNAL_NAMESPACE::rotationMatrix
Packit 8dc392
            ( IMATH_INTERNAL_NAMESPACE::V3d(random.nextf(),random.nextf(),random.nextf()).normalize(),
Packit 8dc392
              IMATH_INTERNAL_NAMESPACE::V3d(random.nextf(),random.nextf(),random.nextf()).normalize() );
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M44d s;
Packit 8dc392
Packit 8dc392
        s[0][0] = random.nextf();
Packit 8dc392
        s[1][1] = random.nextf();
Packit 8dc392
        s[2][2] = random.nextf();
Packit 8dc392
        s[3][3] = random.nextf();
Packit 8dc392
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M44d c = u * s * v.transpose();
Packit 8dc392
        assert (fabs(c.determinant() - s[0][0]*s[1][1]*s[2][2]*s[3][3]) <= u.baseTypeEpsilon());
Packit 8dc392
    }
Packit 8dc392
Packit 8dc392
    // Matrix minors
Packit 8dc392
    {
Packit 8dc392
        cout << "4x4 matrix minors" << endl;
Packit 8dc392
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M44d a(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16);
Packit 8dc392
Packit 8dc392
        assert (a.minorOf(0,0) == a.fastMinor(1,2,3,1,2,3));
Packit 8dc392
        assert (a.minorOf(0,1) == a.fastMinor(1,2,3,0,2,3));
Packit 8dc392
        assert (a.minorOf(0,2) == a.fastMinor(1,2,3,0,1,3));
Packit 8dc392
        assert (a.minorOf(0,3) == a.fastMinor(1,2,3,0,1,2));
Packit 8dc392
        assert (a.minorOf(1,0) == a.fastMinor(0,2,3,1,2,3));
Packit 8dc392
        assert (a.minorOf(1,1) == a.fastMinor(0,2,3,0,2,3));
Packit 8dc392
        assert (a.minorOf(1,2) == a.fastMinor(0,2,3,0,1,3));
Packit 8dc392
        assert (a.minorOf(1,3) == a.fastMinor(0,2,3,0,1,2));
Packit 8dc392
        assert (a.minorOf(2,0) == a.fastMinor(0,1,3,1,2,3));
Packit 8dc392
        assert (a.minorOf(2,1) == a.fastMinor(0,1,3,0,2,3));
Packit 8dc392
        assert (a.minorOf(2,2) == a.fastMinor(0,1,3,0,1,3));
Packit 8dc392
        assert (a.minorOf(2,3) == a.fastMinor(0,1,3,0,1,2));
Packit 8dc392
        assert (a.minorOf(3,0) == a.fastMinor(0,1,2,1,2,3));
Packit 8dc392
        assert (a.minorOf(3,1) == a.fastMinor(0,1,2,0,2,3));
Packit 8dc392
        assert (a.minorOf(3,2) == a.fastMinor(0,1,2,0,1,3));
Packit 8dc392
        assert (a.minorOf(3,3) == a.fastMinor(0,1,2,0,1,2));
Packit 8dc392
    }
Packit 8dc392
    {
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M44f a(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16);
Packit 8dc392
Packit 8dc392
        assert (a.minorOf(0,0) == a.fastMinor(1,2,3,1,2,3));
Packit 8dc392
        assert (a.minorOf(0,1) == a.fastMinor(1,2,3,0,2,3));
Packit 8dc392
        assert (a.minorOf(0,2) == a.fastMinor(1,2,3,0,1,3));
Packit 8dc392
        assert (a.minorOf(0,3) == a.fastMinor(1,2,3,0,1,2));
Packit 8dc392
        assert (a.minorOf(1,0) == a.fastMinor(0,2,3,1,2,3));
Packit 8dc392
        assert (a.minorOf(1,1) == a.fastMinor(0,2,3,0,2,3));
Packit 8dc392
        assert (a.minorOf(1,2) == a.fastMinor(0,2,3,0,1,3));
Packit 8dc392
        assert (a.minorOf(1,3) == a.fastMinor(0,2,3,0,1,2));
Packit 8dc392
        assert (a.minorOf(2,0) == a.fastMinor(0,1,3,1,2,3));
Packit 8dc392
        assert (a.minorOf(2,1) == a.fastMinor(0,1,3,0,2,3));
Packit 8dc392
        assert (a.minorOf(2,2) == a.fastMinor(0,1,3,0,1,3));
Packit 8dc392
        assert (a.minorOf(2,3) == a.fastMinor(0,1,3,0,1,2));
Packit 8dc392
        assert (a.minorOf(3,0) == a.fastMinor(0,1,2,1,2,3));
Packit 8dc392
        assert (a.minorOf(3,1) == a.fastMinor(0,1,2,0,2,3));
Packit 8dc392
        assert (a.minorOf(3,2) == a.fastMinor(0,1,2,0,1,3));
Packit 8dc392
        assert (a.minorOf(3,3) == a.fastMinor(0,1,2,0,1,2));
Packit 8dc392
    }
Packit 8dc392
Packit 8dc392
    // VC 2005 64 bits compiler has a bug with __restrict keword.
Packit 8dc392
    // Pointers with __restrict should not alias the same symbol.
Packit 8dc392
    // But, with optimization on, VC removes intermediate temp variable
Packit 8dc392
    // and ignores __restrict.
Packit 8dc392
    {
Packit 8dc392
        cout << "M44 multiplicaftion test" << endl;
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M44f M ( 1.0f,  2.0f,  3.0f,  4.0f,
Packit 8dc392
                        5.0f,  6.0f,  7.0f,  8.0f,
Packit 8dc392
                        9.0f, 10.0f, 11.0f, 12.0f,
Packit 8dc392
                        13.0f, 14.0f, 15.0f, 16.0f);
Packit 8dc392
Packit 8dc392
        IMATH_INTERNAL_NAMESPACE::M44f N; N.makeIdentity();
Packit 8dc392
Packit 8dc392
        // N should be equal to M
Packit 8dc392
        // This typical test fails
Packit 8dc392
        // when __restrict is used for pointers in "multiply" function.
Packit 8dc392
        N = N * M;
Packit 8dc392
Packit 8dc392
        assert(N == M);
Packit 8dc392
Packit 8dc392
        if (N != M) {
Packit 8dc392
            cout << "M44 multiplication test has failed, error." << endl
Packit 8dc392
                 << "M" << endl << M << endl
Packit 8dc392
                 << "N" << endl << N << endl;
Packit 8dc392
        }
Packit 8dc392
    }
Packit 8dc392
Packit 8dc392
    cout << "ok\n" << endl;
Packit 8dc392
}