diff --git a/build/build.proj b/build/build.proj index 714e94af..9a11003e 100644 --- a/build/build.proj +++ b/build/build.proj @@ -3,7 +3,7 @@ - + @@ -11,7 +11,7 @@ False - + diff --git a/build/t4.bat b/build/t4.bat index 3a7bc2d2..55021947 100644 --- a/build/t4.bat +++ b/build/t4.bat @@ -1,10 +1,23 @@ -if "%CommonProgramFiles(x86)%"=="" (set common=%CommonProgramFiles%) else (set common=%CommonProgramFiles(x86)%) +IF DEFINED CommonProgramFiles(x86) GOTO x64 -"%common%\Microsoft Shared\TextTemplating\1.2\texttransform.exe" -out ..\src\Numerics\Version.cs -P "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.5" ..\src\Numerics\Version.tt +:x86 +SET common=%CommonProgramFiles% +GOTO prepare -"%common%\Microsoft Shared\TextTemplating\1.2\texttransform.exe" -out ..\src\Numerics\Algorithms\LinearAlgebra\Atlas\AtlasLinearAlgebraProvider.cs -P "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.5" ..\src\Numerics\Algorithms\LinearAlgebra\Atlas\AtlasLinearAlgebraProvider.tt -"%common%\Microsoft Shared\TextTemplating\1.2\texttransform.exe" -out ..\src\Numerics\Algorithms\LinearAlgebra\Atlas\SafeNativeMethods.cs -P "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.5" ..\src\Numerics\Algorithms\LinearAlgebra\Atlas\SafeNativeMethods.tt -"%common%\Microsoft Shared\TextTemplating\1.2\texttransform.exe" -out ..\src\Numerics\Algorithms\LinearAlgebra\Mkl\MklLinearAlgebraProvider.cs -P "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.5" ..\src\Numerics\Algorithms\LinearAlgebra\Mkl\MklLinearAlgebraProvider.tt -"%common%\Microsoft Shared\TextTemplating\1.2\texttransform.exe" -out ..\src\Numerics\Algorithms\LinearAlgebra\Mkl\SafeNativeMethods.cs -P "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.5" ..\src\Numerics\Algorithms\LinearAlgebra\Mkl\SafeNativeMethods.tt +:x64 +SET common=%CommonProgramFiles(x86)% +GOTO prepare + +:prepare +"%common%\Microsoft Shared\TextTemplating\10.0\texttransform.exe" -out ..\src\Numerics\Version.cs -P "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.5" ..\src\Numerics\Version.tt +"%common%\Microsoft Shared\TextTemplating\10.0\texttransform.exe" -out ..\src\Silverlight\Version.cs -P "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.5" ..\src\Silverlight\Version.tt + +"%common%\Microsoft Shared\TextTemplating\10.0\texttransform.exe" -out ..\src\Numerics\Algorithms\LinearAlgebra\Mkl\MklLinearAlgebraProvider.Common.cs -P "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.5" ..\src\Numerics\Algorithms\LinearAlgebra\Mkl\MklLinearAlgebraProvider.Common.tt +"%common%\Microsoft Shared\TextTemplating\10.0\texttransform.exe" -out ..\src\Numerics\Algorithms\LinearAlgebra\Mkl\MklLinearAlgebraProvider.Complex.cs -P "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.5" ..\src\Numerics\Algorithms\LinearAlgebra\Mkl\MklLinearAlgebraProvider.Complex.tt +"%common%\Microsoft Shared\TextTemplating\10.0\texttransform.exe" -out ..\src\Numerics\Algorithms\LinearAlgebra\Mkl\MklLinearAlgebraProvider.Complex32.cs -P "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.5" ..\src\Numerics\Algorithms\LinearAlgebra\Mkl\MklLinearAlgebraProvider.Complex32.tt +"%common%\Microsoft Shared\TextTemplating\10.0\texttransform.exe" -out ..\src\Numerics\Algorithms\LinearAlgebra\Mkl\MklLinearAlgebraProvider.double.cs -P "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.5" ..\src\Numerics\Algorithms\LinearAlgebra\Mkl\MklLinearAlgebraProvider.double.tt +"%common%\Microsoft Shared\TextTemplating\10.0\texttransform.exe" -out ..\src\Numerics\Algorithms\LinearAlgebra\Mkl\MklLinearAlgebraProvider.float.cs -P "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.5" ..\src\Numerics\Algorithms\LinearAlgebra\Mkl\MklLinearAlgebraProvider.float.tt + +"%common%\Microsoft Shared\TextTemplating\10.0\texttransform.exe" -out ..\src\Numerics\Algorithms\LinearAlgebra\Mkl\SafeNativeMethods.cs -P "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.5" ..\src\Numerics\Algorithms\LinearAlgebra\Mkl\SafeNativeMethods.tt set common = \ No newline at end of file diff --git a/src/.gitignore b/src/.gitignore index 5acbe5d7..f7542453 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -5,4 +5,4 @@ obj *.suo *.vsdoc TestResults -*.sdf +Version.cs \ No newline at end of file diff --git a/src/MSUnitTests/LinearAlgebraProviderTests/LinearAlgebraProviderTests/LinearAlgebraProviderTests.cs b/src/MSUnitTests/LinearAlgebraProviderTests/LinearAlgebraProviderTests/LinearAlgebraProviderTests.cs new file mode 100644 index 00000000..127b9a73 --- /dev/null +++ b/src/MSUnitTests/LinearAlgebraProviderTests/LinearAlgebraProviderTests/LinearAlgebraProviderTests.cs @@ -0,0 +1,402 @@ +// +// Math.NET Numerics, part of the Math.NET Project +// http://numerics.mathdotnet.com +// http://github.com/mathnet/mathnet-numerics +// http://mathnetnumerics.codeplex.com +// +// Copyright (c) 2009-2010 Math.NET +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Double +{ + using System; + using System.Collections.Generic; + using Algorithms.LinearAlgebra; + using LinearAlgebra.Double; + using Microsoft.VisualStudio.TestTools.UnitTesting; + + /// + /// Base class for linear algebra provider tests. + /// + [TestClass] + public abstract class LinearAlgebraProviderTests + { + /// + /// Gets or sets linear algebra provider to test. + /// + protected static ILinearAlgebraProvider Provider + { + get; + set; + } + + /// + /// The Y double test vector. + /// + private readonly double[] _y = new[] { 1.1, 2.2, 3.3, 4.4, 5.5 }; + + /// + /// The X double test vector. + /// + private readonly double[] _x = new[] { 6.6, 7.7, 8.8, 9.9, 10.1 }; + + /// + /// Test matrix to use. + /// + private readonly IDictionary _matrices = new Dictionary + { + { "Singular3x3", new DenseMatrix(new[,] { { 1.0, 1.0, 2.0 }, { 1.0, 1.0, 2.0 }, { 1.0, 1.0, 2.0 } }) }, + { "Square3x3", new DenseMatrix(new[,] { { -1.1, -2.2, -3.3 }, { 0.0, 1.1, 2.2 }, { -4.4, 5.5, 6.6 } }) }, + { "Square4x4", new DenseMatrix(new[,] { { -1.1, -2.2, -3.3, -4.4 }, { 0.0, 1.1, 2.2, 3.3 }, { 1.0, 2.1, 6.2, 4.3 }, { -4.4, 5.5, 6.6, -7.7 } }) }, + { "Singular4x4", new DenseMatrix(new[,] { { -1.1, -2.2, -3.3, -4.4 }, { -1.1, -2.2, -3.3, -4.4 }, { -1.1, -2.2, -3.3, -4.4 }, { -1.1, -2.2, -3.3, -4.4 } }) }, + { "Tall3x2", new DenseMatrix(new[,] { { -1.1, -2.2 }, { 0.0, 1.1 }, { -4.4, 5.5 } }) }, + { "Wide2x3", new DenseMatrix(new[,] { { -1.1, -2.2, -3.3 }, { 0.0, 1.1, 2.2 } }) } + }; + + /// + /// Can add a vector to scaled vector + /// + [TestMethod] + public void CanAddVectorToScaledVectorDouble() + { + var result = new double[_y.Length]; + Array.Copy(_y, result, _y.Length); + + Provider.AddVectorToScaledVector(result, 0, _x); + for (var i = 0; i < _y.Length; i++) + { + Assert.AreEqual(_y[i], result[i]); + } + + Array.Copy(_y, result, _y.Length); + Provider.AddVectorToScaledVector(result, 1, _x); + for (var i = 0; i < _y.Length; i++) + { + Assert.AreEqual(_y[i] + _x[i], result[i]); + } + + Array.Copy(_y, result, _y.Length); + Provider.AddVectorToScaledVector(result, Math.PI, _x); + for (var i = 0; i < _y.Length; i++) + { + Assert.AreEqual(_y[i] + (Math.PI * _x[i]), result[i]); + } + } + + /// + /// Can scale an array. + /// + [TestMethod] + public void CanScaleArray() + { + var result = new double[_y.Length]; + + Array.Copy(_y, result, _y.Length); + Provider.ScaleArray(1, result); + for (var i = 0; i < _y.Length; i++) + { + Assert.AreEqual(_y[i], result[i]); + } + + Array.Copy(_y, result, _y.Length); + Provider.ScaleArray(Math.PI, result); + for (var i = 0; i < _y.Length; i++) + { + Assert.AreEqual(_y[i] * Math.PI, result[i]); + } + } + + /// + /// Can compute the dot product. + /// + [TestMethod] + public void CanComputeDotProduct() + { + var result = Provider.DotProduct(_x, _y); + AssertHelpers.AlmostEqual(152.35, result, 15); + } + + /// + /// Can add two arrays. + /// + [TestMethod] + public void CanAddArrays() + { + var result = new double[_y.Length]; + Provider.AddArrays(_x, _y, result); + for (var i = 0; i < result.Length; i++) + { + Assert.AreEqual(_x[i] + _y[i], result[i]); + } + } + + /// + /// Can subtract two arrays. + /// + [TestMethod] + public void CanSubtractArrays() + { + var result = new double[_y.Length]; + Provider.SubtractArrays(_x, _y, result); + for (var i = 0; i < result.Length; i++) + { + Assert.AreEqual(_x[i] - _y[i], result[i]); + } + } + + /// + /// Can pointwise multiply two arrays. + /// + [TestMethod] + public void CanPointWiseMultiplyArrays() + { + var result = new double[_y.Length]; + Provider.PointWiseMultiplyArrays(_x, _y, result); + for (var i = 0; i < result.Length; i++) + { + Assert.AreEqual(_x[i] * _y[i], result[i]); + } + } + + /// + /// Can compute L1 norm. + /// + [TestMethod] + public void CanComputeMatrixL1Norm() + { + var matrix = _matrices["Square3x3"]; + var work = new double[matrix.RowCount]; + var norm = Provider.MatrixNorm(Norm.OneNorm, matrix.RowCount, matrix.ColumnCount, matrix.Data, work); + AssertHelpers.AlmostEqual(12.1, norm, 6); + } + + /// + /// Can compute Frobenius norm. + /// + [TestMethod] + public void CanComputeMatrixFrobeniusNorm() + { + var matrix = _matrices["Square3x3"]; + var work = new double[matrix.RowCount]; + var norm = Provider.MatrixNorm(Norm.FrobeniusNorm, matrix.RowCount, matrix.ColumnCount, matrix.Data, work); + AssertHelpers.AlmostEqual(10.777754868246, norm, 8); + } + + /// + /// Can compute Infinity norm. + /// + [TestMethod] + public void CanComputeMatrixInfinityNorm() + { + var matrix = _matrices["Square3x3"]; + var work = new double[matrix.RowCount]; + var norm = Provider.MatrixNorm(Norm.InfinityNorm, matrix.RowCount, matrix.ColumnCount, matrix.Data, work); + Assert.AreEqual(16.5, norm); + } + + /// + /// Can compute L1 norm using a work array. + /// + [TestMethod] + public void CanComputeMatrixL1NormWithWorkArray() + { + var matrix = _matrices["Square3x3"]; + var norm = Provider.MatrixNorm(Norm.OneNorm, matrix.RowCount, matrix.ColumnCount, matrix.Data); + AssertHelpers.AlmostEqual(12.1, norm, 6); + } + + /// + /// Can compute Frobenius norm using a work array. + /// + [TestMethod] + public void CanComputeMatrixFrobeniusNormWithWorkArray() + { + var matrix = _matrices["Square3x3"]; + var norm = Provider.MatrixNorm(Norm.FrobeniusNorm, matrix.RowCount, matrix.ColumnCount, matrix.Data); + AssertHelpers.AlmostEqual(10.777754868246, norm, 8); + } + + /// + /// Can compute Infinity norm using a work array. + /// + [TestMethod] + public void CanComputeMatrixInfinityNormWithWorkArray() + { + var matrix = _matrices["Square3x3"]; + var norm = Provider.MatrixNorm(Norm.InfinityNorm, matrix.RowCount, matrix.ColumnCount, matrix.Data); + Assert.AreEqual(16.5, norm); + } + + /// + /// Can multiply two square matrices. + /// + [TestMethod] + public void CanMultiplySquareMatrices() + { + var x = _matrices["Singular3x3"]; + var y = _matrices["Square3x3"]; + var c = new DenseMatrix(x.RowCount, y.ColumnCount); + + Provider.MatrixMultiply(x.Data, x.RowCount, x.ColumnCount, y.Data, y.RowCount, y.ColumnCount, c.Data); + + for (var i = 0; i < c.RowCount; i++) + { + for (var j = 0; j < c.ColumnCount; j++) + { + AssertHelpers.AlmostEqual(x.Row(i) * y.Column(j), c[i, j], 15); + } + } + } + + /// + /// Can multiply a wide and tall matrix. + /// + [TestMethod] + public void CanMultiplyWideAndTallMatrices() + { + var x = _matrices["Wide2x3"]; + var y = _matrices["Tall3x2"]; + var c = new DenseMatrix(x.RowCount, y.ColumnCount); + + Provider.MatrixMultiply(x.Data, x.RowCount, x.ColumnCount, y.Data, y.RowCount, y.ColumnCount, c.Data); + + for (var i = 0; i < c.RowCount; i++) + { + for (var j = 0; j < c.ColumnCount; j++) + { + AssertHelpers.AlmostEqual(x.Row(i) * y.Column(j), c[i, j], 15); + } + } + } + + /// + /// Can multiply a tall and wide matrix. + /// + [TestMethod] + public void CanMultiplyTallAndWideMatrices() + { + var x = _matrices["Tall3x2"]; + var y = _matrices["Wide2x3"]; + var c = new DenseMatrix(x.RowCount, y.ColumnCount); + + Provider.MatrixMultiply(x.Data, x.RowCount, x.ColumnCount, y.Data, y.RowCount, y.ColumnCount, c.Data); + + for (var i = 0; i < c.RowCount; i++) + { + for (var j = 0; j < c.ColumnCount; j++) + { + AssertHelpers.AlmostEqual(x.Row(i) * y.Column(j), c[i, j], 15); + } + } + } + + /// + /// Can multiply two square matrices. + /// + [TestMethod] + public void CanMultiplySquareMatricesWithUpdate() + { + var x = _matrices["Singular3x3"]; + var y = _matrices["Square3x3"]; + var c = new DenseMatrix(x.RowCount, y.ColumnCount); + + Provider.MatrixMultiplyWithUpdate(Transpose.DontTranspose, Transpose.DontTranspose, 2.2, x.Data, x.RowCount, x.ColumnCount, y.Data, y.RowCount, y.ColumnCount, 1.0, c.Data); + + for (var i = 0; i < c.RowCount; i++) + { + for (var j = 0; j < c.ColumnCount; j++) + { + AssertHelpers.AlmostEqual(2.2 * x.Row(i) * y.Column(j), c[i, j], 15); + } + } + } + + /// + /// Can multiply a wide and tall matrix. + /// + [TestMethod] + public void CanMultiplyWideAndTallMatricesWithUpdate() + { + var x = _matrices["Wide2x3"]; + var y = _matrices["Tall3x2"]; + var c = new DenseMatrix(x.RowCount, y.ColumnCount); + + Provider.MatrixMultiplyWithUpdate(Transpose.DontTranspose, Transpose.DontTranspose, 2.2, x.Data, x.RowCount, x.ColumnCount, y.Data, y.RowCount, y.ColumnCount, 1.0, c.Data); + + for (var i = 0; i < c.RowCount; i++) + { + for (var j = 0; j < c.ColumnCount; j++) + { + AssertHelpers.AlmostEqual(2.2 * x.Row(i) * y.Column(j), c[i, j], 15); + } + } + } + + /// + /// Can multiply a tall and wide matrix. + /// + [TestMethod] + public void CanMultiplyTallAndWideMatricesWithUpdate() + { + var x = _matrices["Tall3x2"]; + var y = _matrices["Wide2x3"]; + var c = new DenseMatrix(x.RowCount, y.ColumnCount); + + Provider.MatrixMultiplyWithUpdate(Transpose.DontTranspose, Transpose.DontTranspose, 2.2, x.Data, x.RowCount, x.ColumnCount, y.Data, y.RowCount, y.ColumnCount, 1.0, c.Data); + + for (var i = 0; i < c.RowCount; i++) + { + for (var j = 0; j < c.ColumnCount; j++) + { + AssertHelpers.AlmostEqual(2.2 * x.Row(i) * y.Column(j), c[i, j], 15); + } + } + } + + /// + /// Can compute the Cholesky factorization. + /// + [TestMethod] + public void CanComputeCholeskyFactor() + { + var matrix = new double[] { 1, 1, 1, 1, 1, 5, 5, 5, 1, 5, 14, 14, 1, 5, 14, 15 }; + Provider.CholeskyFactor(matrix, 4); + Assert.AreEqual(matrix[0], 1); + Assert.AreEqual(matrix[1], 1); + Assert.AreEqual(matrix[2], 1); + Assert.AreEqual(matrix[3], 1); + Assert.AreEqual(matrix[4], 0); + Assert.AreEqual(matrix[5], 2); + Assert.AreEqual(matrix[6], 2); + Assert.AreEqual(matrix[7], 2); + Assert.AreEqual(matrix[8], 0); + Assert.AreEqual(matrix[9], 0); + Assert.AreEqual(matrix[10], 3); + Assert.AreEqual(matrix[11], 3); + Assert.AreEqual(matrix[12], 0); + Assert.AreEqual(matrix[13], 0); + Assert.AreEqual(matrix[14], 0); + Assert.AreEqual(matrix[15], 1); + } + } +} \ No newline at end of file diff --git a/src/Numerics/Version.cs b/src/MSUnitTests/LinearAlgebraProviderTests/LinearAlgebraProviderTests/ManagedLinearAlgebraProviderTests.cs similarity index 54% rename from src/Numerics/Version.cs rename to src/MSUnitTests/LinearAlgebraProviderTests/LinearAlgebraProviderTests/ManagedLinearAlgebraProviderTests.cs index d9a600fc..ac1e5223 100644 --- a/src/Numerics/Version.cs +++ b/src/MSUnitTests/LinearAlgebraProviderTests/LinearAlgebraProviderTests/ManagedLinearAlgebraProviderTests.cs @@ -1,8 +1,10 @@ -// +// // Math.NET Numerics, part of the Math.NET Project -// http://mathnet.opensourcedotnet.info +// http://numerics.mathdotnet.com +// http://github.com/mathnet/mathnet-numerics +// http://mathnetnumerics.codeplex.com // -// Copyright (c) 2009 Math.NET +// Copyright (c) 2009-2010 Math.NET // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation @@ -26,11 +28,24 @@ // OTHER DEALINGS IN THE SOFTWARE. // -/* This file is automatically generated - do not modify it. Change Version.tt instead. - Last generated on UTC 2010-07-09 23:34:29Z -*/ +namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Double +{ + using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.Reflection; - -[assembly: AssemblyVersion("2010.07.9.1414")] -[assembly: AssemblyFileVersion("2010.07.9.1414")] + /// + /// Unit test container for the managed linear algebra provider. + /// + [TestClass] + public class ManagedLinearAlgebraProviderTests : LinearAlgebraProviderTests + { + /// + /// Sets the linear algebra provider to the managed one. + /// + /// The test context to use. + [ClassInitialize] + public static void SetProvider(TestContext context) + { + Provider = new Algorithms.LinearAlgebra.ManagedLinearAlgebraProvider(); + } + } +} diff --git a/src/Numerics/Numerics.csproj b/src/Numerics/Numerics.csproj index 66b79f43..17b29ad7 100644 --- a/src/Numerics/Numerics.csproj +++ b/src/Numerics/Numerics.csproj @@ -507,6 +507,10 @@ + + cd $(ProjectDir)..\..\build +t4.bat +