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
+