From e5fed32a8bee075867af94ee619c7dcc980ec062 Mon Sep 17 00:00:00 2001 From: Christoph Ruegg Date: Mon, 9 Sep 2013 23:43:30 +0200 Subject: [PATCH] LA: make UnitPreconditioner generic & shared --- .../LinearAlgebra/Complex/Solvers/BiCgStab.cs | 3 +- .../LinearAlgebra/Complex/Solvers/GpBiCg.cs | 3 +- .../Complex/Solvers/MlkBiCgStab.cs | 3 +- .../Preconditioners/UnitPreconditioner.cs | 144 ------------------ .../LinearAlgebra/Complex/Solvers/TFQMR.cs | 3 +- .../Complex32/Solvers/BiCgStab.cs | 3 +- .../LinearAlgebra/Complex32/Solvers/GpBiCg.cs | 3 +- .../Complex32/Solvers/MlkBiCgStab.cs | 3 +- .../Preconditioners/UnitPreconditioner.cs | 139 ----------------- .../LinearAlgebra/Complex32/Solvers/TFQMR.cs | 3 +- .../LinearAlgebra/Double/Solvers/BiCgStab.cs | 3 +- .../LinearAlgebra/Double/Solvers/GpBiCg.cs | 3 +- .../Double/Solvers/MlkBiCgStab.cs | 3 +- .../Preconditioners/UnitPreconditioner.cs | 137 ----------------- .../LinearAlgebra/Double/Solvers/TFQMR.cs | 2 +- .../LinearAlgebra/Single/Solvers/BiCgStab.cs | 3 +- .../LinearAlgebra/Single/Solvers/GpBiCg.cs | 3 +- .../Single/Solvers/MlkBiCgStab.cs | 3 +- .../LinearAlgebra/Single/Solvers/TFQMR.cs | 3 +- .../UnitPreconditioner.cs | 13 +- src/Numerics/Numerics.csproj | 5 +- .../Preconditioners/UnitPreconditionerTest.cs | 5 +- .../Preconditioners/UnitPreconditionerTest.cs | 5 +- .../Preconditioners/UnitPreconditionerTest.cs | 4 +- .../Preconditioners/UnitPreconditionerTest.cs | 4 +- 25 files changed, 31 insertions(+), 472 deletions(-) delete mode 100644 src/Numerics/LinearAlgebra/Complex/Solvers/Preconditioners/UnitPreconditioner.cs delete mode 100644 src/Numerics/LinearAlgebra/Complex32/Solvers/Preconditioners/UnitPreconditioner.cs delete mode 100644 src/Numerics/LinearAlgebra/Double/Solvers/Preconditioners/UnitPreconditioner.cs rename src/Numerics/LinearAlgebra/{Single/Solvers/Preconditioners => Solvers}/UnitPreconditioner.cs (92%) diff --git a/src/Numerics/LinearAlgebra/Complex/Solvers/BiCgStab.cs b/src/Numerics/LinearAlgebra/Complex/Solvers/BiCgStab.cs index 1387579e..d2701c99 100644 --- a/src/Numerics/LinearAlgebra/Complex/Solvers/BiCgStab.cs +++ b/src/Numerics/LinearAlgebra/Complex/Solvers/BiCgStab.cs @@ -29,7 +29,6 @@ // using System; -using MathNet.Numerics.LinearAlgebra.Complex.Solvers.Preconditioners; using MathNet.Numerics.LinearAlgebra.Solvers; using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; @@ -278,7 +277,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers if (_preconditioner == null) { - _preconditioner = new UnitPreconditioner(); + _preconditioner = new UnitPreconditioner(); } _preconditioner.Initialize(matrix); diff --git a/src/Numerics/LinearAlgebra/Complex/Solvers/GpBiCg.cs b/src/Numerics/LinearAlgebra/Complex/Solvers/GpBiCg.cs index 605b8da3..4bd314b6 100644 --- a/src/Numerics/LinearAlgebra/Complex/Solvers/GpBiCg.cs +++ b/src/Numerics/LinearAlgebra/Complex/Solvers/GpBiCg.cs @@ -29,7 +29,6 @@ // using System; -using MathNet.Numerics.LinearAlgebra.Complex.Solvers.Preconditioners; using MathNet.Numerics.LinearAlgebra.Solvers; using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; @@ -322,7 +321,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers if (_preconditioner == null) { - _preconditioner = new UnitPreconditioner(); + _preconditioner = new UnitPreconditioner(); } _preconditioner.Initialize(matrix); diff --git a/src/Numerics/LinearAlgebra/Complex/Solvers/MlkBiCgStab.cs b/src/Numerics/LinearAlgebra/Complex/Solvers/MlkBiCgStab.cs index bb33d0f5..8cd508b5 100644 --- a/src/Numerics/LinearAlgebra/Complex/Solvers/MlkBiCgStab.cs +++ b/src/Numerics/LinearAlgebra/Complex/Solvers/MlkBiCgStab.cs @@ -33,7 +33,6 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; using MathNet.Numerics.Distributions; -using MathNet.Numerics.LinearAlgebra.Complex.Solvers.Preconditioners; using MathNet.Numerics.LinearAlgebra.Solvers; using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; @@ -343,7 +342,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers if (_preconditioner == null) { - _preconditioner = new UnitPreconditioner(); + _preconditioner = new UnitPreconditioner(); } _preconditioner.Initialize(matrix); diff --git a/src/Numerics/LinearAlgebra/Complex/Solvers/Preconditioners/UnitPreconditioner.cs b/src/Numerics/LinearAlgebra/Complex/Solvers/Preconditioners/UnitPreconditioner.cs deleted file mode 100644 index 06d301cc..00000000 --- a/src/Numerics/LinearAlgebra/Complex/Solvers/Preconditioners/UnitPreconditioner.cs +++ /dev/null @@ -1,144 +0,0 @@ -// -// 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. -// - -using System; -using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.Properties; - -namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.Preconditioners -{ - -#if NOSYSNUMERICS - using Complex = Numerics.Complex; -#else - using Complex = System.Numerics.Complex; -#endif - - /// - /// A unit preconditioner. This preconditioner does not actually do anything - /// it is only used when running an without - /// a preconditioner. - /// - internal sealed class UnitPreconditioner : IPreConditioner - { - /// - /// The coefficient matrix on which this preconditioner operates. - /// Is used to check dimensions on the different vectors that are processed. - /// - private int _size; - - /// - /// Initializes the preconditioner and loads the internal data structures. - /// - /// - /// The matrix upon which the preconditioner is based. - /// - /// If is . - /// If is not a square matrix. - public void Initialize(Matrix matrix) - { - if (matrix == null) - { - throw new ArgumentNullException("matrix"); - } - - if (matrix.RowCount != matrix.ColumnCount) - { - throw new ArgumentException(Resources.ArgumentMatrixSquare, "matrix"); - } - - _size = matrix.RowCount; - } - - /// - /// Approximates the solution to the matrix equation Ax = b. - /// - /// The right hand side vector. - /// The left hand side vector. Also known as the result vector. - /// If is . - /// If is . - /// - /// - /// If and do not have the same size. - /// - /// - /// - or - - /// - /// - /// If the size of is different the number of rows of the coefficient matrix. - /// - /// - public void Approximate(Vector rhs, Vector lhs) - { - if (rhs == null) - { - throw new ArgumentNullException("rhs"); - } - - if (lhs == null) - { - throw new ArgumentNullException("lhs"); - } - - if ((lhs.Count != rhs.Count) || (lhs.Count != _size)) - { - throw new ArgumentException(Resources.ArgumentVectorsSameLength); - } - - rhs.CopyTo(lhs); - } - - /// - /// Approximates the solution to the matrix equation Ax = b. - /// - /// The right hand side vector. - /// The left hand side vector. - /// If is . - /// - /// If the size of is different the number of rows of the coefficient matrix. - /// - public Vector Approximate(Vector rhs) - { - if (rhs == null) - { - throw new ArgumentNullException("rhs"); - } - - if (rhs.Count != _size) - { - throw new ArgumentException(Resources.ArgumentMatrixDimensions); - } - - var result = new DenseVector(rhs.Count); - Approximate(rhs, result); - return result; - } - } -} diff --git a/src/Numerics/LinearAlgebra/Complex/Solvers/TFQMR.cs b/src/Numerics/LinearAlgebra/Complex/Solvers/TFQMR.cs index 8004f317..302f2b1b 100644 --- a/src/Numerics/LinearAlgebra/Complex/Solvers/TFQMR.cs +++ b/src/Numerics/LinearAlgebra/Complex/Solvers/TFQMR.cs @@ -29,7 +29,6 @@ // using System; -using MathNet.Numerics.LinearAlgebra.Complex.Solvers.Preconditioners; using MathNet.Numerics.LinearAlgebra.Solvers; using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; @@ -262,7 +261,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers if (_preconditioner == null) { - _preconditioner = new UnitPreconditioner(); + _preconditioner = new UnitPreconditioner(); } _preconditioner.Initialize(matrix); diff --git a/src/Numerics/LinearAlgebra/Complex32/Solvers/BiCgStab.cs b/src/Numerics/LinearAlgebra/Complex32/Solvers/BiCgStab.cs index f18904df..ba8d17b2 100644 --- a/src/Numerics/LinearAlgebra/Complex32/Solvers/BiCgStab.cs +++ b/src/Numerics/LinearAlgebra/Complex32/Solvers/BiCgStab.cs @@ -29,7 +29,6 @@ // using System; -using MathNet.Numerics.LinearAlgebra.Complex32.Solvers.Preconditioners; using MathNet.Numerics.LinearAlgebra.Solvers; using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; @@ -271,7 +270,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers if (_preconditioner == null) { - _preconditioner = new UnitPreconditioner(); + _preconditioner = new UnitPreconditioner(); } _preconditioner.Initialize(matrix); diff --git a/src/Numerics/LinearAlgebra/Complex32/Solvers/GpBiCg.cs b/src/Numerics/LinearAlgebra/Complex32/Solvers/GpBiCg.cs index f9b1c32b..dacaebd8 100644 --- a/src/Numerics/LinearAlgebra/Complex32/Solvers/GpBiCg.cs +++ b/src/Numerics/LinearAlgebra/Complex32/Solvers/GpBiCg.cs @@ -29,7 +29,6 @@ // using System; -using MathNet.Numerics.LinearAlgebra.Complex32.Solvers.Preconditioners; using MathNet.Numerics.LinearAlgebra.Solvers; using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; @@ -320,7 +319,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers if (_preconditioner == null) { - _preconditioner = new UnitPreconditioner(); + _preconditioner = new UnitPreconditioner(); } _preconditioner.Initialize(matrix); diff --git a/src/Numerics/LinearAlgebra/Complex32/Solvers/MlkBiCgStab.cs b/src/Numerics/LinearAlgebra/Complex32/Solvers/MlkBiCgStab.cs index 0b29b8a9..aeb4832d 100644 --- a/src/Numerics/LinearAlgebra/Complex32/Solvers/MlkBiCgStab.cs +++ b/src/Numerics/LinearAlgebra/Complex32/Solvers/MlkBiCgStab.cs @@ -33,7 +33,6 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; using MathNet.Numerics.Distributions; -using MathNet.Numerics.LinearAlgebra.Complex32.Solvers.Preconditioners; using MathNet.Numerics.LinearAlgebra.Solvers; using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; @@ -340,7 +339,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers if (_preconditioner == null) { - _preconditioner = new UnitPreconditioner(); + _preconditioner = new UnitPreconditioner(); } _preconditioner.Initialize(matrix); diff --git a/src/Numerics/LinearAlgebra/Complex32/Solvers/Preconditioners/UnitPreconditioner.cs b/src/Numerics/LinearAlgebra/Complex32/Solvers/Preconditioners/UnitPreconditioner.cs deleted file mode 100644 index 805b3953..00000000 --- a/src/Numerics/LinearAlgebra/Complex32/Solvers/Preconditioners/UnitPreconditioner.cs +++ /dev/null @@ -1,139 +0,0 @@ -// -// 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. -// - -using System; -using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.Properties; - -namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.Preconditioners -{ - using Numerics; - - /// - /// A unit preconditioner. This preconditioner does not actually do anything - /// it is only used when running an without - /// a preconditioner. - /// - internal sealed class UnitPreconditioner : IPreConditioner - { - /// - /// The coefficient matrix on which this preconditioner operates. - /// Is used to check dimensions on the different vectors that are processed. - /// - private int _size; - - /// - /// Initializes the preconditioner and loads the internal data structures. - /// - /// - /// The matrix upon which the preconditioner is based. - /// - /// If is . - /// If is not a square matrix. - public void Initialize(Matrix matrix) - { - if (matrix == null) - { - throw new ArgumentNullException("matrix"); - } - - if (matrix.RowCount != matrix.ColumnCount) - { - throw new ArgumentException(Resources.ArgumentMatrixSquare, "matrix"); - } - - _size = matrix.RowCount; - } - - /// - /// Approximates the solution to the matrix equation Ax = b. - /// - /// The right hand side vector. - /// The left hand side vector. Also known as the result vector. - /// If is . - /// If is . - /// - /// - /// If and do not have the same size. - /// - /// - /// - or - - /// - /// - /// If the size of is different the number of rows of the coefficient matrix. - /// - /// - public void Approximate(Vector rhs, Vector lhs) - { - if (rhs == null) - { - throw new ArgumentNullException("rhs"); - } - - if (lhs == null) - { - throw new ArgumentNullException("lhs"); - } - - if ((lhs.Count != rhs.Count) || (lhs.Count != _size)) - { - throw new ArgumentException(Resources.ArgumentVectorsSameLength); - } - - rhs.CopyTo(lhs); - } - - /// - /// Approximates the solution to the matrix equation Ax = b. - /// - /// The right hand side vector. - /// The left hand side vector. - /// If is . - /// - /// If the size of is different the number of rows of the coefficient matrix. - /// - public Vector Approximate(Vector rhs) - { - if (rhs == null) - { - throw new ArgumentNullException("rhs"); - } - - if (rhs.Count != _size) - { - throw new ArgumentException(Resources.ArgumentMatrixDimensions); - } - - var result = new DenseVector(rhs.Count); - Approximate(rhs, result); - return result; - } - } -} diff --git a/src/Numerics/LinearAlgebra/Complex32/Solvers/TFQMR.cs b/src/Numerics/LinearAlgebra/Complex32/Solvers/TFQMR.cs index ff899b60..d09398f5 100644 --- a/src/Numerics/LinearAlgebra/Complex32/Solvers/TFQMR.cs +++ b/src/Numerics/LinearAlgebra/Complex32/Solvers/TFQMR.cs @@ -29,7 +29,6 @@ // using System; -using MathNet.Numerics.LinearAlgebra.Complex32.Solvers.Preconditioners; using MathNet.Numerics.LinearAlgebra.Solvers; using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; @@ -259,7 +258,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers if (_preconditioner == null) { - _preconditioner = new UnitPreconditioner(); + _preconditioner = new UnitPreconditioner(); } _preconditioner.Initialize(matrix); diff --git a/src/Numerics/LinearAlgebra/Double/Solvers/BiCgStab.cs b/src/Numerics/LinearAlgebra/Double/Solvers/BiCgStab.cs index 70b640a7..c683f00d 100644 --- a/src/Numerics/LinearAlgebra/Double/Solvers/BiCgStab.cs +++ b/src/Numerics/LinearAlgebra/Double/Solvers/BiCgStab.cs @@ -29,7 +29,6 @@ // using System; -using MathNet.Numerics.LinearAlgebra.Double.Solvers.Preconditioners; using MathNet.Numerics.LinearAlgebra.Solvers; using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; @@ -273,7 +272,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers if (_preconditioner == null) { - _preconditioner = new UnitPreconditioner(); + _preconditioner = new UnitPreconditioner(); } _preconditioner.Initialize(matrix); diff --git a/src/Numerics/LinearAlgebra/Double/Solvers/GpBiCg.cs b/src/Numerics/LinearAlgebra/Double/Solvers/GpBiCg.cs index 542911bb..b28e12db 100644 --- a/src/Numerics/LinearAlgebra/Double/Solvers/GpBiCg.cs +++ b/src/Numerics/LinearAlgebra/Double/Solvers/GpBiCg.cs @@ -29,7 +29,6 @@ // using System; -using MathNet.Numerics.LinearAlgebra.Double.Solvers.Preconditioners; using MathNet.Numerics.LinearAlgebra.Solvers; using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; @@ -328,7 +327,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers if (_preconditioner == null) { - _preconditioner = new UnitPreconditioner(); + _preconditioner = new UnitPreconditioner(); } _preconditioner.Initialize(matrix); diff --git a/src/Numerics/LinearAlgebra/Double/Solvers/MlkBiCgStab.cs b/src/Numerics/LinearAlgebra/Double/Solvers/MlkBiCgStab.cs index d4fd4467..b31a58a7 100644 --- a/src/Numerics/LinearAlgebra/Double/Solvers/MlkBiCgStab.cs +++ b/src/Numerics/LinearAlgebra/Double/Solvers/MlkBiCgStab.cs @@ -33,7 +33,6 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; using MathNet.Numerics.Distributions; -using MathNet.Numerics.LinearAlgebra.Double.Solvers.Preconditioners; using MathNet.Numerics.LinearAlgebra.Solvers; using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; @@ -348,7 +347,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers if (_preconditioner == null) { - _preconditioner = new UnitPreconditioner(); + _preconditioner = new UnitPreconditioner(); } _preconditioner.Initialize(matrix); diff --git a/src/Numerics/LinearAlgebra/Double/Solvers/Preconditioners/UnitPreconditioner.cs b/src/Numerics/LinearAlgebra/Double/Solvers/Preconditioners/UnitPreconditioner.cs deleted file mode 100644 index ff5576da..00000000 --- a/src/Numerics/LinearAlgebra/Double/Solvers/Preconditioners/UnitPreconditioner.cs +++ /dev/null @@ -1,137 +0,0 @@ -// -// 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-2013 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. -// - -using System; -using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.Properties; - -namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.Preconditioners -{ - /// - /// A unit preconditioner. This preconditioner does not actually do anything - /// it is only used when running an without - /// a preconditioner. - /// - internal sealed class UnitPreconditioner : IPreConditioner - { - /// - /// The coefficient matrix on which this preconditioner operates. - /// Is used to check dimensions on the different vectors that are processed. - /// - private int _size; - - /// - /// Initializes the preconditioner and loads the internal data structures. - /// - /// - /// The matrix upon which the preconditioner is based. - /// - /// If is . - /// If is not a square matrix. - public void Initialize(Matrix matrix) - { - if (matrix == null) - { - throw new ArgumentNullException("matrix"); - } - - if (matrix.RowCount != matrix.ColumnCount) - { - throw new ArgumentException(Resources.ArgumentMatrixSquare, "matrix"); - } - - _size = matrix.RowCount; - } - - /// - /// Approximates the solution to the matrix equation Ax = b. - /// - /// The right hand side vector. - /// The left hand side vector. Also known as the result vector. - /// If is . - /// If is . - /// - /// - /// If and do not have the same size. - /// - /// - /// - or - - /// - /// - /// If the size of is different the number of rows of the coefficient matrix. - /// - /// - public void Approximate(Vector rhs, Vector lhs) - { - if (rhs == null) - { - throw new ArgumentNullException("rhs"); - } - - if (lhs == null) - { - throw new ArgumentNullException("lhs"); - } - - if ((lhs.Count != rhs.Count) || (lhs.Count != _size)) - { - throw new ArgumentException(Resources.ArgumentVectorsSameLength); - } - - rhs.CopyTo(lhs); - } - - /// - /// Approximates the solution to the matrix equation Ax = b. - /// - /// The right hand side vector. - /// The left hand side vector. - /// If is . - /// - /// If the size of is different the number of rows of the coefficient matrix. - /// - public Vector Approximate(Vector rhs) - { - if (rhs == null) - { - throw new ArgumentNullException("rhs"); - } - - if (rhs.Count != _size) - { - throw new ArgumentException(Resources.ArgumentMatrixDimensions); - } - - var result = new DenseVector(rhs.Count); - Approximate(rhs, result); - return result; - } - } -} diff --git a/src/Numerics/LinearAlgebra/Double/Solvers/TFQMR.cs b/src/Numerics/LinearAlgebra/Double/Solvers/TFQMR.cs index 937796ee..cf65e5a4 100644 --- a/src/Numerics/LinearAlgebra/Double/Solvers/TFQMR.cs +++ b/src/Numerics/LinearAlgebra/Double/Solvers/TFQMR.cs @@ -261,7 +261,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers if (_preconditioner == null) { - _preconditioner = new UnitPreconditioner(); + _preconditioner = new UnitPreconditioner(); } _preconditioner.Initialize(matrix); diff --git a/src/Numerics/LinearAlgebra/Single/Solvers/BiCgStab.cs b/src/Numerics/LinearAlgebra/Single/Solvers/BiCgStab.cs index 02e0ecd4..88b3324c 100644 --- a/src/Numerics/LinearAlgebra/Single/Solvers/BiCgStab.cs +++ b/src/Numerics/LinearAlgebra/Single/Solvers/BiCgStab.cs @@ -29,7 +29,6 @@ // using System; -using MathNet.Numerics.LinearAlgebra.Single.Solvers.Preconditioners; using MathNet.Numerics.LinearAlgebra.Solvers; using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; @@ -273,7 +272,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers if (_preconditioner == null) { - _preconditioner = new UnitPreconditioner(); + _preconditioner = new UnitPreconditioner(); } _preconditioner.Initialize(matrix); diff --git a/src/Numerics/LinearAlgebra/Single/Solvers/GpBiCg.cs b/src/Numerics/LinearAlgebra/Single/Solvers/GpBiCg.cs index 40451e8e..9caa11ad 100644 --- a/src/Numerics/LinearAlgebra/Single/Solvers/GpBiCg.cs +++ b/src/Numerics/LinearAlgebra/Single/Solvers/GpBiCg.cs @@ -29,7 +29,6 @@ // using System; -using MathNet.Numerics.LinearAlgebra.Single.Solvers.Preconditioners; using MathNet.Numerics.LinearAlgebra.Solvers; using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; @@ -320,7 +319,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers if (_preconditioner == null) { - _preconditioner = new UnitPreconditioner(); + _preconditioner = new UnitPreconditioner(); } _preconditioner.Initialize(matrix); diff --git a/src/Numerics/LinearAlgebra/Single/Solvers/MlkBiCgStab.cs b/src/Numerics/LinearAlgebra/Single/Solvers/MlkBiCgStab.cs index 6c6dd918..558977a6 100644 --- a/src/Numerics/LinearAlgebra/Single/Solvers/MlkBiCgStab.cs +++ b/src/Numerics/LinearAlgebra/Single/Solvers/MlkBiCgStab.cs @@ -32,7 +32,6 @@ using System; using System.Collections.Generic; using System.Diagnostics; using MathNet.Numerics.Distributions; -using MathNet.Numerics.LinearAlgebra.Single.Solvers.Preconditioners; using MathNet.Numerics.LinearAlgebra.Solvers; using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; @@ -347,7 +346,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers if (_preconditioner == null) { - _preconditioner = new UnitPreconditioner(); + _preconditioner = new UnitPreconditioner(); } _preconditioner.Initialize(matrix); diff --git a/src/Numerics/LinearAlgebra/Single/Solvers/TFQMR.cs b/src/Numerics/LinearAlgebra/Single/Solvers/TFQMR.cs index a301c518..908781d0 100644 --- a/src/Numerics/LinearAlgebra/Single/Solvers/TFQMR.cs +++ b/src/Numerics/LinearAlgebra/Single/Solvers/TFQMR.cs @@ -29,7 +29,6 @@ // using System; -using MathNet.Numerics.LinearAlgebra.Single.Solvers.Preconditioners; using MathNet.Numerics.LinearAlgebra.Solvers; using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; @@ -259,7 +258,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers if (_preconditioner == null) { - _preconditioner = new UnitPreconditioner(); + _preconditioner = new UnitPreconditioner(); } _preconditioner.Initialize(matrix); diff --git a/src/Numerics/LinearAlgebra/Single/Solvers/Preconditioners/UnitPreconditioner.cs b/src/Numerics/LinearAlgebra/Solvers/UnitPreconditioner.cs similarity index 92% rename from src/Numerics/LinearAlgebra/Single/Solvers/Preconditioners/UnitPreconditioner.cs rename to src/Numerics/LinearAlgebra/Solvers/UnitPreconditioner.cs index ead99b7e..d66c218b 100644 --- a/src/Numerics/LinearAlgebra/Single/Solvers/Preconditioners/UnitPreconditioner.cs +++ b/src/Numerics/LinearAlgebra/Solvers/UnitPreconditioner.cs @@ -29,17 +29,16 @@ // using System; -using MathNet.Numerics.LinearAlgebra.Solvers; using MathNet.Numerics.Properties; -namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.Preconditioners +namespace MathNet.Numerics.LinearAlgebra.Solvers { /// /// A unit preconditioner. This preconditioner does not actually do anything /// it is only used when running an without /// a preconditioner. /// - internal sealed class UnitPreconditioner : IPreConditioner + internal sealed class UnitPreconditioner : IPreConditioner where T : struct, IEquatable, IFormattable { /// /// The coefficient matrix on which this preconditioner operates. @@ -55,7 +54,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.Preconditioners /// /// If is . /// If is not a square matrix. - public void Initialize(Matrix matrix) + public void Initialize(Matrix matrix) { if (matrix == null) { @@ -88,7 +87,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.Preconditioners /// If the size of is different the number of rows of the coefficient matrix. /// /// - public void Approximate(Vector rhs, Vector lhs) + public void Approximate(Vector rhs, Vector lhs) { if (rhs == null) { @@ -117,7 +116,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.Preconditioners /// /// If the size of is different the number of rows of the coefficient matrix. /// - public Vector Approximate(Vector rhs) + public Vector Approximate(Vector rhs) { if (rhs == null) { @@ -129,7 +128,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.Preconditioners throw new ArgumentException(Resources.ArgumentMatrixDimensions); } - var result = new DenseVector(rhs.Count); + var result = Vector.Builder.DenseVector(rhs.Count); Approximate(rhs, result); return result; } diff --git a/src/Numerics/Numerics.csproj b/src/Numerics/Numerics.csproj index ca49cf2d..d9049a98 100644 --- a/src/Numerics/Numerics.csproj +++ b/src/Numerics/Numerics.csproj @@ -246,7 +246,6 @@ - @@ -273,7 +272,6 @@ - @@ -316,7 +314,6 @@ - @@ -348,7 +345,7 @@ Code - + diff --git a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Preconditioners/UnitPreconditionerTest.cs b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Preconditioners/UnitPreconditionerTest.cs index 403c71b5..029d5839 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Preconditioners/UnitPreconditionerTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Preconditioners/UnitPreconditionerTest.cs @@ -26,7 +26,6 @@ using MathNet.Numerics.LinearAlgebra; using MathNet.Numerics.LinearAlgebra.Complex; -using MathNet.Numerics.LinearAlgebra.Complex.Solvers.Preconditioners; using MathNet.Numerics.LinearAlgebra.Solvers; using NUnit.Framework; @@ -51,7 +50,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Precondi /// New preconditioner instance. internal override IPreConditioner CreatePreconditioner() { - return new UnitPreconditioner(); + return new UnitPreconditioner(); } /// @@ -63,7 +62,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Precondi /// Result vector. protected override void CheckResult(IPreConditioner preconditioner, SparseMatrix matrix, Vector vector, Vector result) { - Assert.AreEqual(typeof(UnitPreconditioner), preconditioner.GetType(), "#01"); + Assert.AreEqual(typeof(UnitPreconditioner), preconditioner.GetType(), "#01"); // Unit preconditioner is doing nothing. Vector and result should be equal for (var i = 0; i < vector.Count; i++) diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Preconditioners/UnitPreconditionerTest.cs b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Preconditioners/UnitPreconditionerTest.cs index 078a76d6..9b19c68a 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Preconditioners/UnitPreconditionerTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Preconditioners/UnitPreconditionerTest.cs @@ -26,7 +26,6 @@ using MathNet.Numerics.LinearAlgebra; using MathNet.Numerics.LinearAlgebra.Complex32; -using MathNet.Numerics.LinearAlgebra.Complex32.Solvers.Preconditioners; using MathNet.Numerics.LinearAlgebra.Solvers; using NUnit.Framework; @@ -46,7 +45,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Precon /// New preconditioner instance. internal override IPreConditioner CreatePreconditioner() { - return new UnitPreconditioner(); + return new UnitPreconditioner(); } /// @@ -58,7 +57,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Precon /// Result vector. protected override void CheckResult(IPreConditioner preconditioner, SparseMatrix matrix, Vector vector, Vector result) { - Assert.AreEqual(typeof(UnitPreconditioner), preconditioner.GetType(), "#01"); + Assert.AreEqual(typeof(UnitPreconditioner), preconditioner.GetType(), "#01"); // Unit preconditioner is doing nothing. Vector and result should be equal for (var i = 0; i < vector.Count; i++) diff --git a/src/UnitTests/LinearAlgebraTests/Double/Solvers/Preconditioners/UnitPreconditionerTest.cs b/src/UnitTests/LinearAlgebraTests/Double/Solvers/Preconditioners/UnitPreconditionerTest.cs index 88963b1f..1fda50cd 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/Solvers/Preconditioners/UnitPreconditionerTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/Solvers/Preconditioners/UnitPreconditionerTest.cs @@ -44,7 +44,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Precondit /// New preconditioner instance. internal override IPreConditioner CreatePreconditioner() { - return new UnitPreconditioner(); + return new UnitPreconditioner(); } /// @@ -56,7 +56,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Precondit /// Result vector. protected override void CheckResult(IPreConditioner preconditioner, SparseMatrix matrix, Vector vector, Vector result) { - Assert.AreEqual(typeof(UnitPreconditioner), preconditioner.GetType(), "#01"); + Assert.AreEqual(typeof(UnitPreconditioner), preconditioner.GetType(), "#01"); // Unit preconditioner is doing nothing. Vector and result should be equal for (var i = 0; i < vector.Count; i++) diff --git a/src/UnitTests/LinearAlgebraTests/Single/Solvers/Preconditioners/UnitPreconditionerTest.cs b/src/UnitTests/LinearAlgebraTests/Single/Solvers/Preconditioners/UnitPreconditionerTest.cs index d84793c4..3c350f5d 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/Solvers/Preconditioners/UnitPreconditionerTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/Solvers/Preconditioners/UnitPreconditionerTest.cs @@ -44,7 +44,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Precondit /// New preconditioner instance. internal override IPreConditioner CreatePreconditioner() { - return new UnitPreconditioner(); + return new UnitPreconditioner(); } /// @@ -56,7 +56,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Precondit /// Result vector. protected override void CheckResult(IPreConditioner preconditioner, SparseMatrix matrix, Vector vector, Vector result) { - Assert.AreEqual(typeof(UnitPreconditioner), preconditioner.GetType(), "#01"); + Assert.AreEqual(typeof(UnitPreconditioner), preconditioner.GetType(), "#01"); // Unit preconditioner is doing nothing. Vector and result should be equal for (var i = 0; i < vector.Count; i++)