From 341dec231d07ecb677f80d0d60a7063eaf6d8bd4 Mon Sep 17 00:00:00 2001 From: Marcus Cuda Date: Wed, 18 Feb 2015 18:38:34 +0200 Subject: [PATCH] fixed tests for complex evd --- src/NativeProviders/MKL/lapack.cpp | 4 ++-- .../Mkl/MklLinearAlgebraProvider.Complex.cs | 4 +++- .../Complex/Factorization/EvdTests.cs | 11 ++++++----- .../Complex/Factorization/UserEvdTests.cs | 10 +++++----- .../Complex32/Factorization/EvdTests.cs | 10 +++++----- .../Complex32/Factorization/UserEvdTests.cs | 10 +++++----- 6 files changed, 26 insertions(+), 23 deletions(-) diff --git a/src/NativeProviders/MKL/lapack.cpp b/src/NativeProviders/MKL/lapack.cpp index 2f466777..fb2601f1 100644 --- a/src/NativeProviders/MKL/lapack.cpp +++ b/src/NativeProviders/MKL/lapack.cpp @@ -356,7 +356,7 @@ inline MKL_INT sym_eigen_factor(MKL_INT n, T a[], T vectors[], MKL_Complex16 val delete[] w; return info; } - + memcpy(vectors, clone_a, n*n*sizeof(T)); for (MKL_INT index = 0; index < n; ++index) @@ -364,7 +364,7 @@ inline MKL_INT sym_eigen_factor(MKL_INT n, T a[], T vectors[], MKL_Complex16 val values[index] = MKL_Complex16(w[index]); } - for (MKL_INT j = 0; j < n; j++) + for (MKL_INT j = 0; j < n; ++j) { MKL_INT jn = j*n; diff --git a/src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.Complex.cs b/src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.Complex.cs index 4bed4a5d..98f27244 100644 --- a/src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.Complex.cs +++ b/src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.Complex.cs @@ -31,6 +31,7 @@ #if NATIVEMKL using System; +using System.CodeDom; using System.Numerics; using System.Security; using MathNet.Numerics.LinearAlgebra.Factorization; @@ -1366,7 +1367,8 @@ namespace MathNet.Numerics.Providers.LinearAlgebra.Mkl throw new ArgumentException(String.Format(Resources.ArgumentArrayWrongLength, order * order), "matrixD"); } - SafeNativeMethods.z_eigen(isSymmetric, order, matrix, matrixEv, vectorEv, matrixD); + if (SafeNativeMethods.z_eigen(isSymmetric, order, matrix, matrixEv, vectorEv, matrixD) > 0) + throw new NonConvergenceException(); } } } diff --git a/src/UnitTests/LinearAlgebraTests/Complex/Factorization/EvdTests.cs b/src/UnitTests/LinearAlgebraTests/Complex/Factorization/EvdTests.cs index 079e1fbd..e120c5f1 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/Factorization/EvdTests.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/Factorization/EvdTests.cs @@ -28,6 +28,7 @@ // OTHER DEALINGS IN THE SOFTWARE. // +using System; using MathNet.Numerics.LinearAlgebra; using MathNet.Numerics.LinearAlgebra.Complex; using NUnit.Framework; @@ -91,7 +92,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization { var A = Matrix.Build.RandomPositiveDefinite(order, 1); MatrixHelpers.ForceHermitian(A); - var factorEvd = A.Evd(); + var factorEvd = A.Evd(Symmetricity.Hermitian); var V = factorEvd.EigenVectors; var λ = factorEvd.D; @@ -151,7 +152,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization var A = Matrix.Build.RandomPositiveDefinite(order, 1); MatrixHelpers.ForceHermitian(A); var ACopy = A.Clone(); - var evd = A.Evd(); + var evd = A.Evd(Symmetricity.Hermitian); var b = Vector.Build.Random(order, 2); var bCopy = b.Clone(); @@ -179,7 +180,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization var A = Matrix.Build.RandomPositiveDefinite(order, 1); MatrixHelpers.ForceHermitian(A); var ACopy = A.Clone(); - var evd = A.Evd(); + var evd = A.Evd(Symmetricity.Hermitian); var B = Matrix.Build.Random(order, order, 2); var BCopy = B.Clone(); @@ -212,7 +213,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization var A = Matrix.Build.RandomPositiveDefinite(order, 1); MatrixHelpers.ForceHermitian(A); var ACopy = A.Clone(); - var evd = A.Evd(); + var evd = A.Evd(Symmetricity.Hermitian); var b = Vector.Build.Random(order, 2); var bCopy = b.Clone(); @@ -240,7 +241,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization var A = Matrix.Build.RandomPositiveDefinite(order, 1); MatrixHelpers.ForceHermitian(A); var ACopy = A.Clone(); - var evd = A.Evd(); + var evd = A.Evd(Symmetricity.Hermitian); var B = Matrix.Build.Random(order, order, 2); var BCopy = B.Clone(); diff --git a/src/UnitTests/LinearAlgebraTests/Complex/Factorization/UserEvdTests.cs b/src/UnitTests/LinearAlgebraTests/Complex/Factorization/UserEvdTests.cs index f2f01f8a..f995c472 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/Factorization/UserEvdTests.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/Factorization/UserEvdTests.cs @@ -117,7 +117,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization public void CanFactorizeRandomSymmetricMatrix(int order) { var matrixA = new UserDefinedMatrix(Matrix.Build.RandomPositiveDefinite(order, 1).ToArray()); - var factorEvd = matrixA.Evd(); + var factorEvd = matrixA.Evd(Symmetricity.Hermitian); var eigenVectors = factorEvd.EigenVectors; var d = factorEvd.D; @@ -204,7 +204,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization var A = new UserDefinedMatrix(Matrix.Build.RandomPositiveDefinite(order, 1).ToArray()); MatrixHelpers.ForceHermitian(A); var ACopy = A.Clone(); - var evd = A.Evd(); + var evd = A.Evd(Symmetricity.Hermitian); var b = new UserDefinedVector(Vector.Build.Random(order, 1).ToArray()); var bCopy = b.Clone(); @@ -231,7 +231,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization var A = new UserDefinedMatrix(Matrix.Build.RandomPositiveDefinite(order, 1).ToArray()); MatrixHelpers.ForceHermitian(A); var ACopy = A.Clone(); - var evd = A.Evd(); + var evd = A.Evd(Symmetricity.Hermitian); var B = new UserDefinedMatrix(Matrix.Build.Random(order, order, 1).ToArray()); var BCopy = B.Clone(); @@ -264,7 +264,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization var A = new UserDefinedMatrix(Matrix.Build.RandomPositiveDefinite(order, 1).ToArray()); MatrixHelpers.ForceHermitian(A); var ACopy = A.Clone(); - var evd = A.Evd(); + var evd = A.Evd(Symmetricity.Hermitian); var b = new UserDefinedVector(Vector.Build.Random(order, 1).ToArray()); var bCopy = b.Clone(); @@ -292,7 +292,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization var A = new UserDefinedMatrix(Matrix.Build.RandomPositiveDefinite(order, 1).ToArray()); MatrixHelpers.ForceHermitian(A); var ACopy = A.Clone(); - var evd = A.Evd(); + var evd = A.Evd(Symmetricity.Hermitian); var B = new UserDefinedMatrix(Matrix.Build.Random(order, order, 1).ToArray()); var BCopy = B.Clone(); diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/Factorization/EvdTests.cs b/src/UnitTests/LinearAlgebraTests/Complex32/Factorization/EvdTests.cs index cf7e08b6..37be44e4 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/Factorization/EvdTests.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/Factorization/EvdTests.cs @@ -92,7 +92,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization { var A = Matrix.Build.RandomPositiveDefinite(order, 1); MatrixHelpers.ForceHermitian(A); - var factorEvd = A.Evd(); + var factorEvd = A.Evd(Symmetricity.Hermitian); var V = factorEvd.EigenVectors; var λ = factorEvd.D; @@ -152,7 +152,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization var A = Matrix.Build.RandomPositiveDefinite(order, 1); MatrixHelpers.ForceHermitian(A); var ACopy = A.Clone(); - var evd = A.Evd(); + var evd = A.Evd(Symmetricity.Hermitian); var b = Vector.Build.Random(order, 2); var bCopy = b.Clone(); @@ -179,7 +179,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization var A = Matrix.Build.RandomPositiveDefinite(order, 1); MatrixHelpers.ForceHermitian(A); var ACopy = A.Clone(); - var evd = A.Evd(); + var evd = A.Evd(Symmetricity.Hermitian); var B = Matrix.Build.Random(order, order, 2); var BCopy = B.Clone(); @@ -212,7 +212,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization var A = Matrix.Build.RandomPositiveDefinite(order, 1); MatrixHelpers.ForceHermitian(A); var ACopy = A.Clone(); - var evd = A.Evd(); + var evd = A.Evd(Symmetricity.Hermitian); var b = Vector.Build.Random(order, 2); var bCopy = b.Clone(); @@ -240,7 +240,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization var A = Matrix.Build.RandomPositiveDefinite(order, 1); MatrixHelpers.ForceHermitian(A); var ACopy = A.Clone(); - var evd = A.Evd(); + var evd = A.Evd(Symmetricity.Hermitian); var B = Matrix.Build.Random(order, order, 2); var BCopy = B.Clone(); diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/Factorization/UserEvdTests.cs b/src/UnitTests/LinearAlgebraTests/Complex32/Factorization/UserEvdTests.cs index 19f17c91..1c32b514 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/Factorization/UserEvdTests.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/Factorization/UserEvdTests.cs @@ -115,7 +115,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization public void CanFactorizeRandomSymmetricMatrix([Values(1, 2, 5, 10, 50, 100)] int order) { var matrixA = new UserDefinedMatrix(Matrix.Build.RandomPositiveDefinite(order, 1).ToArray()); - var factorEvd = matrixA.Evd(); + var factorEvd = matrixA.Evd(Symmetricity.Hermitian); var eigenVectors = factorEvd.EigenVectors; var d = factorEvd.D; @@ -203,7 +203,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization var A = new UserDefinedMatrix(Matrix.Build.RandomPositiveDefinite(order, 1).ToArray()); MatrixHelpers.ForceHermitian(A); var ACopy = A.Clone(); - var evd = A.Evd(); + var evd = A.Evd(Symmetricity.Hermitian); var b = new UserDefinedVector(Vector.Build.Random(order, 1).ToArray()); var bCopy = b.Clone(); @@ -230,7 +230,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization var A = new UserDefinedMatrix(Matrix.Build.RandomPositiveDefinite(order, 1).ToArray()); MatrixHelpers.ForceHermitian(A); var ACopy = A.Clone(); - var evd = A.Evd(); + var evd = A.Evd(Symmetricity.Hermitian); var B = new UserDefinedMatrix(Matrix.Build.Random(order, order, 1).ToArray()); var BCopy = B.Clone(); @@ -263,7 +263,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization var A = new UserDefinedMatrix(Matrix.Build.RandomPositiveDefinite(order, 1).ToArray()); MatrixHelpers.ForceHermitian(A); var ACopy = A.Clone(); - var evd = A.Evd(); + var evd = A.Evd(Symmetricity.Hermitian); var b = new UserDefinedVector(Vector.Build.Random(order, 1).ToArray()); var bCopy = b.Clone(); @@ -291,7 +291,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization var A = new UserDefinedMatrix(Matrix.Build.RandomPositiveDefinite(order, 1).ToArray()); MatrixHelpers.ForceHermitian(A); var ACopy = A.Clone(); - var evd = A.Evd(); + var evd = A.Evd(Symmetricity.Hermitian); var B = new UserDefinedMatrix(Matrix.Build.Random(order, order, 1).ToArray()); var BCopy = B.Clone();