swh:1:snp:f50ab94432af916b5fb8b4ad831e8dddded77084
Tip revision: 0834f71ecfe465d9941b24b6833e6b5d5d3b9cda authored by thhoens on 28 June 2016, 18:43:52 UTC
Removed atmoic and added instrumentation.
Removed atmoic and added instrumentation.
Tip revision: 0834f71
CPUMatrixTests.cpp
//
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.md file in the project root for full license information.
//
#include "stdafx.h"
#include "../../../Source/Math/CPUMatrix.h"
using namespace Microsoft::MSR::CNTK;
namespace Microsoft { namespace MSR { namespace CNTK { namespace Test {
typedef CPUDoubleMatrix DMatrix;
typedef CPUSingleMatrix SMatrix;
// TODO: consider using PI from some library, e.g. boost
const double pi = 3.14159265358979323846264338327950288419716939937510;
BOOST_AUTO_TEST_SUITE(CPUMatrixSuite)
BOOST_FIXTURE_TEST_CASE(CPUMatrixConstructorNoFlags, RandomSeedFixture)
{
DMatrix m;
BOOST_CHECK(m.IsEmpty());
m.Resize(2, 3);
BOOST_CHECK(!m.IsEmpty());
BOOST_CHECK_EQUAL(m.GetNumRows(), 2);
BOOST_CHECK_EQUAL(m.GetNumCols(), 3);
BOOST_CHECK_EQUAL(m.GetNumElements(), 6);
m(0, 0) = 1;
m(1, 2) = 2;
BOOST_CHECK_EQUAL(m(0, 0), 1);
BOOST_CHECK_EQUAL(m(1, 2), 2);
DMatrix m1(m);
BOOST_CHECK(m1.IsEqualTo(m));
}
BOOST_FIXTURE_TEST_CASE(CPUMatrixConstructorFlagNormal, RandomSeedFixture)
{
std::array<float, 6> array = {1, 2, 3, 4, 5, 6};
SMatrix m(2, 3, array.data(), matrixFlagNormal);
BOOST_CHECK_EQUAL(m(0, 0), 1);
BOOST_CHECK_EQUAL(m(0, 1), 3);
BOOST_CHECK_EQUAL(m(0, 2), 5);
BOOST_CHECK_EQUAL(m(1, 0), 2);
BOOST_CHECK_EQUAL(m(1, 1), 4);
BOOST_CHECK_EQUAL(m(1, 2), 6);
}
BOOST_FIXTURE_TEST_CASE(CPUMatrixConstructorFormatRowMajor, RandomSeedFixture)
{
std::array<double, 6> array = {7, 8, 9, 10, 11, 12};
DMatrix m(2, 3, array.data(), matrixFormatRowMajor);
BOOST_CHECK_EQUAL(m(0, 0), 7);
BOOST_CHECK_EQUAL(m(0, 1), 8);
BOOST_CHECK_EQUAL(m(0, 2), 9);
BOOST_CHECK_EQUAL(m(1, 0), 10);
BOOST_CHECK_EQUAL(m(1, 1), 11);
BOOST_CHECK_EQUAL(m(1, 2), 12);
}
BOOST_FIXTURE_TEST_CASE(CPUMatrixAddAndSub, RandomSeedFixture)
{
DMatrix m0(2, 3);
m0(0, 0) = 1;
m0(0, 1) = 2;
m0(0, 2) = 3;
m0(1, 0) = 4;
m0(1, 1) = 5;
m0(1, 2) = 6;
DMatrix m1(2, 3);
m1(0, 0) = 11;
m1(0, 1) = 12;
m1(0, 2) = 13;
m1(1, 0) = 14;
m1(1, 1) = 15;
m1(1, 2) = 16;
DMatrix m2(2, 3);
m2(0, 0) = 12;
m2(0, 1) = 14;
m2(0, 2) = 16;
m2(1, 0) = 18;
m2(1, 1) = 20;
m2(1, 2) = 22;
DMatrix mC(2, 1);
mC(0, 0) = 10;
mC(1, 0) = 10;
DMatrix mR(1, 3);
mR(0, 0) = 10;
mR(0, 1) = 10;
mR(0, 2) = 10;
DMatrix mS(1, 1);
mS(0, 0) = 10;
DMatrix m3 = m2 - m0;
BOOST_CHECK(m3.IsEqualTo(m1));
m3 += m0;
BOOST_CHECK(m3.IsEqualTo(m2));
m3 = m0 + 10;
BOOST_CHECK(m3.IsEqualTo(m1));
m3 -= 10;
BOOST_CHECK(m3.IsEqualTo(m0));
m3 = m1 + m0;
BOOST_CHECK(m3.IsEqualTo(m2));
m3 -= m0;
BOOST_CHECK(m3.IsEqualTo(m1));
m3 = m1 - 10;
BOOST_CHECK(m3.IsEqualTo(m0));
m3 += 10;
BOOST_CHECK(m3.IsEqualTo(m1));
m3 -= mC;
BOOST_CHECK(m3.IsEqualTo(m0));
m3 += mC;
BOOST_CHECK(m3.IsEqualTo(m1));
m3 -= mR;
BOOST_CHECK(m3.IsEqualTo(m0));
m3 += mR;
BOOST_CHECK(m3.IsEqualTo(m1));
m3.AssignDifferenceOf(m3, mS);
BOOST_CHECK(m3.IsEqualTo(m0));
}
BOOST_FIXTURE_TEST_CASE(CPUMatrixMultiplyAndDiv, RandomSeedFixture)
{
DMatrix m0(2, 3);
m0(0, 0) = 1;
m0(0, 1) = 2;
m0(0, 2) = 3;
m0(1, 0) = 4;
m0(1, 1) = 5;
m0(1, 2) = 6;
DMatrix m00(2, 3);
m00(0, 0) = 10;
m00(0, 1) = 20;
m00(0, 2) = 30;
m00(1, 0) = 40;
m00(1, 1) = 50;
m00(1, 2) = 60;
// TODO: consider separate reshape test
DMatrix m1(2, 3);
m1.Reshape(3, 2);
m1(0, 0) = 11;
m1(0, 1) = 15;
m1(1, 0) = 14;
m1(1, 1) = 13;
m1(2, 0) = 12;
m1(2, 1) = 16;
DMatrix m2(2, 2);
m2(0, 0) = 75;
m2(0, 1) = 89;
m2(1, 0) = 186;
m2(1, 1) = 221;
DMatrix m3 = m0 * m1;
BOOST_CHECK(m3.IsEqualTo(m2));
m3 = m0 * 10;
BOOST_CHECK(m3.IsEqualTo(m00));
m3 = m3 / 10;
BOOST_CHECK(m3.IsEqualTo(m0));
m3 *= 10;
BOOST_CHECK(m3.IsEqualTo(m00));
m3 /= 10;
BOOST_CHECK(m3.IsEqualTo(m0));
DMatrix::MultiplyAndWeightedAdd(1, m0, false, m1, false, 0, m3);
BOOST_CHECK(m3.IsEqualTo(m2));
m1.Reshape(2, 3);
DMatrix::MultiplyAndWeightedAdd(1, m0, false, m1, true, 0, m3);
m2(0, 0) = 74;
m2(0, 1) = 92;
m2(1, 0) = 182;
m2(1, 1) = 227;
BOOST_CHECK(m3.IsEqualTo(m2));
DMatrix::MultiplyAndWeightedAdd(10, m0, false, m1, true, 2, m3);
m2(0, 0) = 888;
m2(0, 1) = 1104;
m2(1, 0) = 2184;
m2(1, 1) = 2724;
BOOST_CHECK(m3.IsEqualTo(m2));
DMatrix::MultiplyAndWeightedAdd(1, m0, true, m1, false, 0, m3);
m2.Resize(3, 3);
m2(0, 0) = 67;
m2(0, 1) = 72;
m2(0, 2) = 77;
m2(1, 0) = 92;
m2(1, 1) = 99;
m2(1, 2) = 106;
m2(2, 0) = 117;
m2(2, 1) = 126;
m2(2, 2) = 135;
BOOST_CHECK(m3.IsEqualTo(m2));
}
BOOST_FIXTURE_TEST_CASE(CPUMatrixElementOperations, RandomSeedFixture)
{
// TODO: consider splitting this large test
DMatrix m0(2, 3);
m0(0, 0) = 1;
m0(0, 1) = 2;
m0(0, 2) = 3;
m0(1, 0) = 4;
m0(1, 1) = 5;
m0(1, 2) = 6;
DMatrix m0Inverse(2, 3);
m0Inverse(0, 0) = 1.0;
m0Inverse(0, 1) = 1 / 2.0;
m0Inverse(0, 2) = 1 / 3.0;
m0Inverse(1, 0) = 1 / 4.0;
m0Inverse(1, 1) = 1 / 5.0;
m0Inverse(1, 2) = 1 / 6.0;
DMatrix m1(2, 3);
m1(0, 0) = 1;
m1(0, 1) = 1;
m1(0, 2) = 1;
m1(1, 0) = 1;
m1(1, 1) = 1;
m1(1, 2) = 1;
DMatrix m3;
m3.AssignElementProductOf(m0, m0Inverse);
BOOST_CHECK(m3.IsEqualTo(m1, c_epsilonFloatE4));
m3 = m0 ^ 4;
DMatrix m2(2, 3);
m2(0, 0) = 1;
m2(0, 1) = 16;
m2(0, 2) = 81;
m2(1, 0) = 256;
m2(1, 1) = 625;
m2(1, 2) = 1296;
BOOST_CHECK(m3.IsEqualTo(m2));
m3.SetValue(m0);
m3 ^= 4;
BOOST_CHECK(m3.IsEqualTo(m2));
m3.SetValue(m0);
m3.ElementMultiplyWith(m0Inverse);
BOOST_CHECK(m3.IsEqualTo(m1));
m3.SetValue(m0);
m3.ElementInverse();
BOOST_CHECK(m3.IsEqualTo(m0Inverse));
m2(0, 0) = 0.7311;
m2(0, 1) = 0.8808;
m2(0, 2) = 0.9526;
m2(1, 0) = 0.9820;
m2(1, 1) = 0.9933;
m2(1, 2) = 0.9975;
m3.AssignElementDivisionOf(m2, m0);
m2.ElementMultiplyWith(m0Inverse);
BOOST_CHECK(m3.IsEqualTo(m2, c_epsilonFloatE4));
m3.SetValue(m0);
m3.InplaceSigmoid();
m2(0, 0) = 0.7311;
m2(0, 1) = 0.8808;
m2(0, 2) = 0.9526;
m2(1, 0) = 0.9820;
m2(1, 1) = 0.9933;
m2(1, 2) = 0.9975;
BOOST_CHECK(m3.IsEqualTo(m2, c_epsilonFloatE4));
m3.SetValue(m0);
m3.InplaceTanh();
m2(0, 0) = 0.7616;
m2(0, 1) = 0.9640;
m2(0, 2) = 0.9951;
m2(1, 0) = 0.9993;
m2(1, 1) = 0.9999;
m2(1, 2) = 1.0000;
BOOST_CHECK(m3.IsEqualTo(m2, c_epsilonFloatE4));
m3.SetValue(m0);
m3.InplaceLogSoftmax(true);
m3.InplaceExp();
m2(0, 0) = 0.0474;
m2(0, 1) = 0.0474;
m2(0, 2) = 0.0474;
m2(1, 0) = 0.9526;
m2(1, 1) = 0.9526;
m2(1, 2) = 0.9526;
BOOST_CHECK(m3.IsEqualTo(m2, c_epsilonFloatE4));
m3.SetValue(m0);
m3.InplaceLogSoftmax(false);
m3.InplaceExp();
m2(0, 0) = 0.0900;
m2(0, 1) = 0.2447;
m2(0, 2) = 0.6652;
m2(1, 0) = 0.0900;
m2(1, 1) = 0.2447;
m2(1, 2) = 0.6652;
BOOST_CHECK(m3.IsEqualTo(m2, c_epsilonFloatE4));
m3.SetValue(m0);
m3.InplaceHardmax(true);
m2(0, 0) = 0.0;
m2(0, 1) = 0.0;
m2(0, 2) = 0.0;
m2(1, 0) = 1.0;
m2(1, 1) = 1.0;
m2(1, 2) = 1.0;
BOOST_CHECK(m3.IsEqualTo(m2, c_epsilonFloatE4));
m3.SetValue(m0);
m3.InplaceHardmax(false);
m2(0, 0) = 0.0;
m2(0, 1) = 0.0;
m2(0, 2) = 1.0;
m2(1, 0) = 0.0;
m2(1, 1) = 0.0;
m2(1, 2) = 1.0;
BOOST_CHECK(m3.IsEqualTo(m2, c_epsilonFloatE4));
m3.SetValue(m0);
m3.InplaceSqrt();
m2(0, 0) = 1;
m2(0, 1) = 1.4142;
m2(0, 2) = 1.7321;
m2(1, 0) = 2;
m2(1, 1) = 2.2361;
m2(1, 2) = 2.4495;
BOOST_CHECK(m3.IsEqualTo(m2, c_epsilonFloatE4));
m3.SetValue(m0);
m3.InplaceExp();
m2(0, 0) = 2.7183;
m2(0, 1) = 7.3891;
m2(0, 2) = 20.0855;
m2(1, 0) = 54.5982;
m2(1, 1) = 148.4132;
m2(1, 2) = 403.4288;
BOOST_CHECK(m3.IsEqualTo(m2, c_epsilonFloatE4));
m3.InplaceLog();
BOOST_CHECK(m3.IsEqualTo(m0, c_epsilonFloatE4));
m3.SetValue(m0);
m3.InplaceTruncateBottom(2);
m2(0, 0) = 2;
m2(0, 1) = 2;
m2(0, 2) = 3;
m2(1, 0) = 4;
m2(1, 1) = 5;
m2(1, 2) = 6;
BOOST_CHECK(m3.IsEqualTo(m2));
m3.SetValue(m0);
m3.InplaceTruncateTop(4);
m2(0, 0) = 1;
m2(0, 1) = 2;
m2(0, 2) = 3;
m2(1, 0) = 4;
m2(1, 1) = 4;
m2(1, 2) = 4;
BOOST_CHECK(m3.IsEqualTo(m2));
DMatrix m_Trig(2, 3);
m_Trig(0, 0) = 0;
m_Trig(0, 1) = pi / 2.0;
m_Trig(0, 2) = pi;
m_Trig(1, 0) = 3.0 * pi / 2.0;
m_Trig(1, 1) = 2.0 * pi;
m_Trig(1, 2) = 5.0 * pi / 2.0;
DMatrix m_Cos(2, 3);
m_Cos.SetValue(m_Trig);
DMatrix m_Cos_expected(2, 3);
m_Cos_expected(0, 0) = 1;
m_Cos_expected(0, 1) = 0;
m_Cos_expected(0, 2) = -1;
m_Cos_expected(1, 0) = 0;
m_Cos_expected(1, 1) = 1;
m_Cos_expected(1, 2) = 0;
m_Cos.InplaceCosine();
BOOST_CHECK(m_Cos.IsEqualTo(m_Cos_expected, c_epsilonFloatE4));
m_Cos.SetValue(m_Trig);
m_Cos.AssignCosineOf(m_Trig);
BOOST_CHECK(m_Cos.IsEqualTo(m_Cos_expected, c_epsilonFloatE4));
DMatrix m_NegSine(2, 3);
m_NegSine.SetValue(m_Trig);
DMatrix m_NegSine_expected(2, 3);
m_NegSine_expected(0, 0) = 0;
m_NegSine_expected(0, 1) = -1;
m_NegSine_expected(0, 2) = 0;
m_NegSine_expected(1, 0) = 1;
m_NegSine_expected(1, 1) = 0;
m_NegSine_expected(1, 2) = -1;
m_NegSine.InplaceNegativeSine();
BOOST_CHECK(m_NegSine.IsEqualTo(m_NegSine_expected, c_epsilonFloatE4));
m_NegSine.SetValue(m_Trig);
m_NegSine.AssignNegativeSineOf(m_Trig);
BOOST_CHECK(m_NegSine.IsEqualTo(m_NegSine_expected, c_epsilonFloatE4));
}
BOOST_FIXTURE_TEST_CASE(CPUMatrixNorms, RandomSeedFixture)
{
DMatrix m0(2, 3);
m0(0, 0) = 1;
m0(0, 1) = 2;
m0(0, 2) = 3;
m0(1, 0) = 4;
m0(1, 1) = 5;
m0(1, 2) = 6;
DMatrix mResult;
m0.VectorNorm1(mResult, true);
DMatrix m2(1, 3);
m2(0, 0) = 5;
m2(0, 1) = 7;
m2(0, 2) = 9;
BOOST_CHECK(mResult.IsEqualTo(m2));
m0.VectorNorm1(mResult, false);
m2.Resize(2, 1);
m2(0, 0) = 6;
m2(1, 0) = 15;
BOOST_CHECK(mResult.IsEqualTo(m2));
m0.VectorNorm2(mResult, true);
m2.Resize(1, 3);
m2(0, 0) = 4.1231;
m2(0, 1) = 5.3852;
m2(0, 2) = 6.7082;
BOOST_CHECK(mResult.IsEqualTo(m2, c_epsilonFloatE4));
m0.VectorNorm2(mResult, false);
m2.Resize(2, 1);
m2(0, 0) = 3.7417;
m2(1, 0) = 8.7750;
BOOST_CHECK(mResult.IsEqualTo(m2, c_epsilonFloatE4));
m0.VectorNormInf(mResult, true);
m2.Resize(1, 3);
m2(0, 0) = 4;
m2(0, 1) = 5;
m2(0, 2) = 6;
BOOST_CHECK(mResult.IsEqualTo(m2, c_epsilonFloatE4));
m0.VectorNormInf(mResult, false);
m2.Resize(2, 1);
m2(0, 0) = 3;
m2(1, 0) = 6;
BOOST_CHECK(mResult.IsEqualTo(m2));
BOOST_CHECK(abs(m0.FrobeniusNorm() - 9.5394) < c_epsilonFloatE4);
BOOST_CHECK(abs(m0.MatrixNormInf() - 6) < c_epsilonFloatE4);
DMatrix m1;
m0.VectorMax(m1, mResult, true);
m2.Resize(1, 3);
m2(0, 0) = 4;
m2(0, 1) = 5;
m2(0, 2) = 6;
BOOST_CHECK(mResult.IsEqualTo(m2, c_epsilonFloatE4));
m0.VectorMax(m1, mResult, false);
m2.Resize(2, 1);
m2(0, 0) = 3;
m2(1, 0) = 6;
BOOST_CHECK(mResult.IsEqualTo(m2, c_epsilonFloatE4));
m0.VectorMin(m1, mResult, true);
m2.Resize(1, 3);
m2(0, 0) = 1;
m2(0, 1) = 2;
m2(0, 2) = 3;
BOOST_CHECK(mResult.IsEqualTo(m2, c_epsilonFloatE4));
m0.VectorMin(m1, mResult, false);
m2.Resize(2, 1);
m2(0, 0) = 1;
m2(1, 0) = 4;
BOOST_CHECK(mResult.IsEqualTo(m2, c_epsilonFloatE4));
}
BOOST_FIXTURE_TEST_CASE(CPUMatrixSetValues, RandomSeedFixture)
{
DMatrix m0(3, 3);
m0(0, 0) = 10;
m0(1, 1) = 10;
m0(2, 2) = 10;
DMatrix m1(3, 3);
m1.SetDiagonalValue(10);
BOOST_CHECK(m1.IsEqualTo(m0, c_epsilonFloatE4));
DMatrix m2(3, 1);
m2(0, 0) = 10;
m2(1, 0) = 10;
m2(2, 0) = 10;
m1.SetDiagonalValue(m2);
BOOST_CHECK(m1.IsEqualTo(m0, c_epsilonFloatE4));
m1.SetUniformRandomValue(-0.01, 0.01, IncrementCounter());
foreach_coord (i, j, m1)
{
BOOST_CHECK(m1(i, j) >= -0.01 && m1(i, j) < 0.01);
}
m1.Resize(20, 20);
m1.SetGaussianRandomValue(1.0, 0.01, IncrementCounter());
BOOST_CHECK_CLOSE(m1.SumOfElements(), static_cast<double>(m1.GetNumElements()), 1);
}
BOOST_FIXTURE_TEST_CASE(CPUMatrixTranspose, RandomSeedFixture)
{
DMatrix m0(2, 3);
m0(0, 0) = 1;
m0(0, 1) = 2;
m0(0, 2) = 3;
m0(1, 0) = 4;
m0(1, 1) = 5;
m0(1, 2) = 6;
DMatrix m1(3, 2);
m1(0, 0) = 1;
m1(0, 1) = 4;
m1(1, 0) = 2;
m1(1, 1) = 5;
m1(2, 0) = 3;
m1(2, 1) = 6;
DMatrix m2 = m0.Transpose();
BOOST_CHECK(m2.IsEqualTo(m1, c_epsilonFloatE4));
m2.AssignTransposeOf(m1);
BOOST_CHECK(m2.IsEqualTo(m0, c_epsilonFloatE4));
}
BOOST_FIXTURE_TEST_CASE(CPUMatrixColumnSlice, RandomSeedFixture)
{
DMatrix m0(2, 3);
m0(0, 0) = 1;
m0(0, 1) = 2;
m0(0, 2) = 3;
m0(1, 0) = 4;
m0(1, 1) = 5;
m0(1, 2) = 6;
DMatrix m1(2, 2);
m1(0, 0) = 1;
m1(0, 1) = 2;
m1(1, 0) = 4;
m1(1, 1) = 5;
DMatrix m2 = m0.ColumnSlice(0, 2);
BOOST_CHECK(m2.IsEqualTo(m1, c_epsilonFloatE4));
m1(0, 0) = 2;
m1(0, 1) = 3;
m1(1, 0) = 5;
m1(1, 1) = 6;
m2 = m0.ColumnSlice(1, 2);
BOOST_CHECK(m2.IsEqualTo(m1, c_epsilonFloatE4));
// TODO: this fails due to access violation (at least on desktop machine of pkranen)
// size_t k = 100, n = 20, m = 50;
// reducing sizes to 2, 20, 5
size_t k = 2;
size_t n = 20;
size_t m = 5;
DMatrix mA(k, n);
mA.SetUniformRandomValue(-1, 1, IncrementCounter());
DMatrix mB(n, m);
mB.SetUniformRandomValue(-1, 1, IncrementCounter());
DMatrix mC(k, m);
mC.SetUniformRandomValue(-1, 1, IncrementCounter());
DMatrix mD(k, m);
mD.SetValue(mC);
DMatrix::MultiplyAndAdd(mA, false, mB, false, mD);
for (int i = 0; i < m; i++)
{
DMatrix colMB = mB.ColumnSlice(i, 1);
DMatrix colMC = mC.ColumnSlice(i, 1);
DMatrix::MultiplyAndAdd(mA, false, colMB, false, colMC);
}
BOOST_CHECK(mC.IsEqualTo(mD, c_epsilonFloatE4));
}
BOOST_FIXTURE_TEST_CASE(CPUKhatriRaoProduct, RandomSeedFixture)
{
DMatrix mA(3, 4);
mA(0, 0) = 0.8147;
mA(0, 1) = 0.9134;
mA(0, 2) = 0.2785;
mA(0, 3) = 0.9649;
mA(1, 0) = 0.9058;
mA(1, 1) = 0.6324;
mA(1, 2) = 0.5469;
mA(1, 3) = 0.1576;
mA(2, 0) = 0.1270;
mA(2, 1) = 0.0975;
mA(2, 2) = 0.9575;
mA(2, 3) = 0.9706;
DMatrix mB(2, 4);
mB(0, 0) = 0.9572;
mB(0, 1) = 0.8003;
mB(0, 2) = 0.4218;
mB(0, 3) = 0.7922;
mB(1, 0) = 0.4854;
mB(1, 1) = 0.1419;
mB(1, 2) = 0.9157;
mB(1, 3) = 0.9595;
DMatrix mD(6, 4);
mD(0, 0) = 0.7798;
mD(0, 1) = 0.7310;
mD(0, 2) = 0.1175;
mD(0, 3) = 0.7644;
mD(1, 0) = 0.8670;
mD(1, 1) = 0.5061;
mD(1, 2) = 0.2307;
mD(1, 3) = 0.1249;
mD(2, 0) = 0.1215;
mD(2, 1) = 0.0781;
mD(2, 2) = 0.4038;
mD(2, 3) = 0.7689;
mD(3, 0) = 0.3954;
mD(3, 1) = 0.1296;
mD(3, 2) = 0.2550;
mD(3, 3) = 0.9258;
mD(4, 0) = 0.4396;
mD(4, 1) = 0.0897;
mD(4, 2) = 0.5008;
mD(4, 3) = 0.1512;
mD(5, 0) = 0.0616;
mD(5, 1) = 0.0138;
mD(5, 2) = 0.8768;
mD(5, 3) = 0.9313;
DMatrix mC;
mC.AssignKhatriRaoProductOf(mA, mB);
BOOST_CHECK(mC.IsEqualTo(mD, c_epsilonFloatE4));
}
BOOST_FIXTURE_TEST_CASE(CPUAddColumnReshapeProductOf, RandomSeedFixture)
{
DMatrix mA(6, 2);
mA(0, 0) = 0.6557;
mA(0, 1) = 0.7431;
mA(1, 0) = 0.0357;
mA(1, 1) = 0.3922;
mA(2, 0) = 0.8491;
mA(2, 1) = 0.6555;
mA(3, 0) = 0.9340;
mA(3, 1) = 0.1712;
mA(4, 0) = 0.6787;
mA(4, 1) = 0.7060;
mA(5, 0) = 0.7577;
mA(5, 1) = 0.0318;
DMatrix mB(3, 2);
mB(0, 0) = 0.2769;
mB(0, 1) = 0.8235;
mB(1, 0) = 0.0462;
mB(1, 1) = 0.6948;
mB(2, 0) = 0.0971;
mB(2, 1) = 0.3171;
DMatrix mD(2, 2);
mD(0, 0) = 0.2867;
mD(0, 1) = 1.2913;
mD(1, 0) = 0.1266;
mD(1, 1) = 0.4520;
DMatrix mE(2, 2);
mE(0, 0) = 0.2657;
mE(0, 1) = 1.0923;
mE(1, 0) = 0.3636;
mE(1, 1) = 0.6416;
DMatrix mC(2, 2);
mC.SetValue(0);
mC.AddColumnReshapeProductOf(mA, mB, false);
BOOST_CHECK(mC.IsEqualTo(mD, c_epsilonFloatE4));
mC.SetValue(0);
mC.AddColumnReshapeProductOf(mA, mB, true);
BOOST_CHECK(mC.IsEqualTo(mE, c_epsilonFloatE4));
}
BOOST_FIXTURE_TEST_CASE(CPUMatrixRowSliceAndStack, RandomSeedFixture)
{
DMatrix m0(5, 3);
m0(0, 0) = 1;
m0(0, 1) = 6;
m0(0, 2) = 11;
m0(1, 0) = 2;
m0(1, 1) = 7;
m0(1, 2) = 12;
m0(2, 0) = 3;
m0(2, 1) = 8;
m0(2, 2) = 13;
m0(3, 0) = 4;
m0(3, 1) = 9;
m0(3, 2) = 14;
m0(4, 0) = 5;
m0(4, 1) = 10;
m0(4, 2) = 15;
DMatrix m1(2, 3);
m1(0, 0) = 3;
m1(0, 1) = 8;
m1(0, 2) = 13;
m1(1, 0) = 4;
m1(1, 1) = 9;
m1(1, 2) = 14;
DMatrix m2;
m2.AssignRowSliceValuesOf(m0, 2, 2);
BOOST_CHECK(m2.IsEqualTo(m1, c_epsilonFloatE4));
DMatrix m3(5, 3);
m3(0, 0) = 0;
m3(0, 1) = 0;
m3(0, 2) = 0;
m3(1, 0) = 0;
m3(1, 1) = 0;
m3(1, 2) = 0;
m3(2, 0) = 3;
m3(2, 1) = 8;
m3(2, 2) = 13;
m3(3, 0) = 4;
m3(3, 1) = 9;
m3(3, 2) = 14;
m3(4, 0) = 0;
m3(4, 1) = 0;
m3(4, 2) = 0;
m3 += m0;
m0.AddToRowSliceValuesOf(m1, 2, 2);
BOOST_CHECK(m3.IsEqualTo(m0, c_epsilonFloatE4));
m2.AddWithRowSliceValuesOf(m1, 0, 2);
DMatrix m4(2, 3);
m4(0, 0) = 6;
m4(0, 1) = 16;
m4(0, 2) = 26;
m4(1, 0) = 8;
m4(1, 1) = 18;
m4(1, 2) = 28;
BOOST_CHECK(m2.IsEqualTo(m4, c_epsilonFloatE4));
}
BOOST_FIXTURE_TEST_CASE(CPUAssignRepeatOf, RandomSeedFixture)
{
DMatrix m0(2, 3);
m0(0, 0) = 1;
m0(0, 1) = 6;
m0(0, 2) = 11;
m0(1, 0) = 2;
m0(1, 1) = 7;
m0(1, 2) = 12;
DMatrix m1;
m1.AssignRepeatOf(m0, 1, 1);
BOOST_CHECK(m1.IsEqualTo(m0, c_epsilonFloatE4));
DMatrix m2(6, 6);
m2(0, 0) = 1;
m2(0, 1) = 6;
m2(0, 2) = 11;
m2(0, 3) = 1;
m2(0, 4) = 6;
m2(0, 5) = 11;
m2(1, 0) = 2;
m2(1, 1) = 7;
m2(1, 2) = 12;
m2(1, 3) = 2;
m2(1, 4) = 7;
m2(1, 5) = 12;
m2(2, 0) = 1;
m2(2, 1) = 6;
m2(2, 2) = 11;
m2(2, 3) = 1;
m2(2, 4) = 6;
m2(2, 5) = 11;
m2(3, 0) = 2;
m2(3, 1) = 7;
m2(3, 2) = 12;
m2(3, 3) = 2;
m2(3, 4) = 7;
m2(3, 5) = 12;
m2(4, 0) = 1;
m2(4, 1) = 6;
m2(4, 2) = 11;
m2(4, 3) = 1;
m2(4, 4) = 6;
m2(4, 5) = 11;
m2(5, 0) = 2;
m2(5, 1) = 7;
m2(5, 2) = 12;
m2(5, 3) = 2;
m2(5, 4) = 7;
m2(5, 5) = 12;
m1.AssignRepeatOf(m0, 3, 2);
BOOST_CHECK(m1.IsEqualTo(m2, c_epsilonFloatE4));
}
BOOST_FIXTURE_TEST_CASE(CPURowElementOperations, RandomSeedFixture)
{
DMatrix m0 = DMatrix::RandomUniform(20, 28, -1, 1, IncrementCounter());
DMatrix m1 = DMatrix::RandomUniform(1, 28, 1, 2, IncrementCounter());
DMatrix m2;
m2.SetValue(m0);
m2.RowElementMultiplyWith(m1);
m2.RowElementDivideBy(m1);
BOOST_CHECK(m0.IsEqualTo(m2, c_epsilonFloatE4));
}
BOOST_FIXTURE_TEST_CASE(CPUColumnElementOperations, RandomSeedFixture)
{
DMatrix m0 = DMatrix::RandomUniform(20, 28, -1, 1, IncrementCounter());
DMatrix m1 = DMatrix::RandomUniform(20, 1, 1, 2, IncrementCounter());
DMatrix m2;
m2.SetValue(m0);
m2.ColumnElementMultiplyWith(m1);
m2.ColumnElementDivideBy(m1);
BOOST_CHECK(m0.IsEqualTo(m2, c_epsilonFloatE4));
}
BOOST_FIXTURE_TEST_CASE(CPUMatrixSeedingFloat, RandomSeedFixture)
{
const float low = 0;
const float high = 1;
const unsigned long seed = 4711;
auto m1 = CPUMatrix<float>::RandomUniform(16, 16, low, high, seed);
auto m2 = CPUMatrix<float>::RandomUniform(16, 16, low, high, seed);
BOOST_CHECK(m1.IsEqualTo(m2));
}
BOOST_FIXTURE_TEST_CASE(CPUMatrixSeedingDouble, RandomSeedFixture)
{
const double low = 0;
const double high = 1;
const unsigned long seed = 4711;
auto m1 = CPUMatrix<double>::RandomUniform(16, 16, low, high, seed);
auto m2 = CPUMatrix<double>::RandomUniform(16, 16, low, high, seed);
BOOST_CHECK(m1.IsEqualTo(m2));
}
BOOST_AUTO_TEST_SUITE_END()
}
} } }