diff --git a/src/Numerics/Algorithms/LinearAlgebra/ILinearAlgebraProvider.cs b/src/Numerics/Algorithms/LinearAlgebra/ILinearAlgebraProvider.cs
index 1c40850a..3930b9de 100644
--- a/src/Numerics/Algorithms/LinearAlgebra/ILinearAlgebraProvider.cs
+++ b/src/Numerics/Algorithms/LinearAlgebra/ILinearAlgebraProvider.cs
@@ -25,415 +25,10 @@
// INITIAL DRAFT MISSING EXCEPTION SPECIFICATIONS
namespace MathNet.Numerics.Algorithms.LinearAlgebra
{
- ///
- /// How to transpose a matrix.
- ///
- public enum Transpose
- {
- ///
- /// Don't transpose a matrix.
- ///
- DontTranspose = 111,
-
- ///
- /// Transpose a matrix.
- ///
- Transpose = 112,
-
- ///
- /// Conjugate transpose a complex matrix.
- ///
- /// If a conjugate transpose is used with a real matrix, then the matrix is just transposed.
- ConjugateTranspose = 113
- }
-
- ///
- /// Types of matrix norms.
- ///
- public enum Norm : byte
- {
- ///
- /// The 1-norm.
- ///
- OneNorm = (byte)'1',
-
- ///
- /// The Frobenius norm.
- ///
- FrobeniusNorm = (byte)'f',
-
- ///
- /// The infinity norm.
- ///
- InfinityNorm = (byte)'i',
-
- ///
- /// The largest absolute value norm.
- ///
- LargestAbsoluteValue = (byte)'m'
- }
-
///
/// Interface to linear algebra algorithms that work off 1-D arrays.
///
- public interface ILinearAlgebraProvider
+ public interface ILinearAlgebraProvider : ILinearAlgebraProvider
{
- ///
- /// Queries the provider for the optimal, workspace block size
- /// for the given routine.
- ///
- /// Name of the method to query.
- /// -1 if the provider cannot compute the workspace size; otherwise
- /// the suggested block size.
- int QueryWorkspaceBlockSize(string methodName);
-
- ///
- /// Adds a scaled vector to another: y += alpha*x.
- ///
- /// The vector to update.
- /// The value to scale by.
- /// The vector to add to .
- /// This is equivalent to the AXPY BLAS routine.
- void AddVectorToScaledVector(double[] y, double alpha, double[] x);
-
- ///
- /// Scales an array. Can be used to scale a vector and a matrix.
- ///
- /// The scalar.
- /// The values to scale.
- /// This is equivalent to the SCAL BLAS routine.
- void ScaleArray(double alpha, double[] x);
-
- ///
- /// Computes the dot product of x and y.
- ///
- /// The vector x.
- /// The vector y.
- /// The dot product of x and y.
- /// This is equivalent to the DOT BLAS routine.
- double DotProduct(double[] x, double[] y);
-
- ///
- /// Does a point wise add of two arrays z = x + y. This can be used
- /// to add vectors or matrices.
- ///
- /// The array x.
- /// The array y.
- /// The result of the addition.
- /// There is no equivalent BLAS routine, but many libraries
- /// provide optimized (parallel and/or vectorized) versions of this
- /// routine.
- void AddArrays(double[] x, double[] y, double[] result);
-
- ///
- /// Does a point wise subtraction of two arrays z = x - y. This can be used
- /// to subtract vectors or matrices.
- ///
- /// The array x.
- /// The array y.
- /// The result of the subtraction.
- /// There is no equivalent BLAS routine, but many libraries
- /// provide optimized (parallel and/or vectorized) versions of this
- /// routine.
- void SubtractArrays(double[] x, double[] y, double[] result);
-
- ///
- /// Does a point wise multiplication of two arrays z = x * y. This can be used
- /// to multiple elements of vectors or matrices.
- ///
- /// The array x.
- /// The array y.
- /// The result of the point wise multiplication.
- /// There is no equivalent BLAS routine, but many libraries
- /// provide optimized (parallel and/or vectorized) versions of this
- /// routine.
- void PointWiseMultiplyArrays(double[] x, double[] y, double[] result);
-
- ///
- /// Computes the requested of the matrix.
- ///
- /// The type of norm to compute.
- /// The matrix to compute the norm from.
- ///
- /// The requested of the matrix.
- ///
- double MatrixNorm(Norm norm, double[] matrix);
-
- ///
- /// Computes the requested of the matrix.
- ///
- /// The type of norm to compute.
- /// The matrix to compute the norm from.
- /// The work array. Only used when
- /// and needs to be have a length of at least M (number of rows of .
- ///
- /// The requested of the matrix.
- ///
- double MatrixNorm(Norm norm, double[] matrix, double[] work);
-
- ///
- /// Multiples two matrices. result = x * y
- ///
- /// The x matrix.
- /// The y matrix.
- /// Where to store the result of the multiplication.
- /// This is a simplified version of the BLAS GEMM routine with alpha
- /// set to 1.0 and beta set to 0.0, and x and y are not transposed.
- void MatrixMultiply(double[] x, double[] y, double[] result);
-
- ///
- /// Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c
- ///
- /// How to transpose the matrix.
- /// How to transpose the matrix.
- /// The value to scale matrix.
- /// The a matrix.
- /// The b matrix
- /// The value to scale the matrix.
- /// The c matrix.
- void MatrixMultiplyWithUpdate(Transpose transposeA, Transpose transposeB, double alpha, double[] a, double[] b, double beta, double[] c);
-
- ///
- /// Computes the LU factorization of A.
- ///
- /// An m by n matrix. The matrix is overwritten with the
- /// the LU factorization On exit.
- /// On exit, it contains the pivot indices. The size
- /// of the array must be min(m,n).
- /// This is equivalent to the GETRF LAPACK routine.
- void LUFactor(double[] a, int[] ipiv);
-
- ///
- /// Computes the inverse of matrix using LU factorization.
- ///
- /// The N by N matrix to invert. Contains the inverse On exit.
- /// This is equivalent to the GETRF and GETRI LAPACK routines.
- void LUInverse(double[] a);
-
- ///
- /// Computes the inverse of a previously factored matrix.
- ///
- /// The LU factored N by N matrix. Contains the inverse On exit.
- /// The pivot indices of .
- /// This is equivalent to the GETRI LAPACK routine.
- void LUInverseFactored(double[] a, int[] ipiv);
-
- ///
- /// Computes the inverse of matrix using LU factorization.
- ///
- /// The N by N matrix to invert. Contains the inverse On exit.
- /// The work array. The array must have a length of at least N,
- /// but should be N*blocksize. The blocksize is machine dependent. Use
- /// to determine the optimal size of the work array. On exit, work[0] contains the optimal
- /// work size value.
- /// This is equivalent to the GETRF and GETRI LAPACK routines.
- void LUInverse(double[] a, double[] work);
-
- ///
- /// Computes the inverse of a previously factored matrix.
- ///
- /// The LU factored N by N matrix. Contains the inverse On exit.
- /// The pivot indices of .
- /// The work array. The array must have a length of at least N,
- /// but should be N*blocksize. The blocksize is machine dependent. Use
- /// to determine the optimal size of the work array. On exit, work[0] contains the optimal
- /// work size value.
- /// This is equivalent to the GETRI LAPACK routine.
- void LUInverseFactored(double[] a, int[] ipiv, double[] work);
-
- ///
- /// Solves A*X=B for X using LU factorization.
- ///
- /// The number of columns of B.
- /// The square matrix A.
- /// The B matrix.
- /// This is equivalent to the GETRF and GETRS LAPACK routines.
- void LUSolve(int columnsOfB, double[] a, double[] b);
-
- ///
- /// Solves A*X=B for X using a previously factored A matrix.
- ///
- /// The number of columns of B.
- /// The factored A matrix.
- /// The pivot indices of .
- /// The B matrix.
- /// This is equivalent to the GETRS LAPACK routine.
- void LUSolveFactored(int columnsOfB, double[] a, int ipiv, double[] b);
-
- ///
- /// Solves A*X=B for X using LU factorization.
- ///
- /// How to transpose the matrix.
- /// The number of columns of B.
- /// The square matrix A.
- /// The B matrix.
- /// This is equivalent to the GETRF and GETRS LAPACK routines.
- void LUSolve(Transpose transposeA, int columnsOfB, double[] a, double[] b);
-
- ///
- /// Solves A*X=B for X using a previously factored A matrix.
- ///
- /// How to transpose the matrix.
- /// The number of columns of B.
- /// The factored A matrix.
- /// The pivot indices of .
- /// The B matrix.
- /// This is equivalent to the GETRS LAPACK routine.
- void LUSolveFactored(Transpose transposeA, int columnsOfB, double[] a, int ipiv, double[] b);
-
- ///
- /// Computes the Cholesky factorization of A.
- ///
- /// On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the
- /// the Cholesky factorization.
- /// This is equivalent to the POTRF LAPACK routine.
- void CholeskyFactor(double[] a);
-
- ///
- /// Solves A*X=B for X using Cholesky factorization.
- ///
- /// The number of columns of B.
- /// The square, positive definite matrix A.
- /// The B matrix.
- /// This is equivalent to the POTRF add POTRS LAPACK routines.
- void CholeskySolve(int columnsOfB, double[] a, double[] b);
-
- ///
- /// Solves A*X=B for X using a previously factored A matrix.
- ///
- /// The number of columns of B.
- /// The factored A matrix.
- /// The B matrix.
- /// This is equivalent to the POTRS LAPACK routine.
- void CholeskySolveFactored(int columnsOfB, double[] a, double[] b);
-
- ///
- /// Computes the QR factorization of A.
- ///
- /// On entry, it is the M by N A matrix to factor. On exit,
- /// it is overwritten with the R matrix of the QR factorization.
- /// On exit, A M by M matrix that holds the Q matrix of the
- /// QR factorization.
- /// This is similar to the GEQRF and ORGQR LAPACK routines.
- void QRFactor(double[] r, double[] q);
-
- ///
- /// Computes the QR factorization of A.
- ///
- /// On entry, it is the M by N A matrix to factor. On exit,
- /// it is overwritten with the R matrix of the QR factorization.
- /// On exit, A M by M matrix that holds the Q matrix of the
- /// QR factorization.
- /// The work array. The array must have a length of at least N,
- /// but should be N*blocksize. The blocksize is machine dependent. Use
- /// to determine the optimal size of the work array. On exit, work[0] contains the optimal
- /// work size value.
- /// This is similar to the GEQRF and ORGQR LAPACK routines.
- void QRFactor(double[] r, double[] q, double[] work);
-
- ///
- /// Solves A*X=B for X using QR factorization of A.
- ///
- /// The number of columns of B.
- /// On entry, it is the M by N A matrix to factor. On exit,
- /// it is overwritten with the R matrix of the QR factorization.
- /// On exit, A M by M matrix that holds the Q matrix of the
- /// QR factorization.
- /// The B matrix.
- /// On exit, the solution matrix.
- void QRSolve(int columnsOfB, double[] r, double[] q, double[] b, double[] x);
-
- ///
- /// Solves A*X=B for X using QR factorization of A.
- ///
- /// The number of columns of B.
- /// On entry, it is the M by N A matrix to factor. On exit,
- /// it is overwritten with the R matrix of the QR factorization.
- /// On exit, A M by M matrix that holds the Q matrix of the
- /// QR factorization.
- /// The B matrix.
- /// On exit, the solution matrix.
- /// The work array. The array must have a length of at least N,
- /// but should be N*blocksize. The blocksize is machine dependent. Use
- /// to determine the optimal size of the work array. On exit, work[0] contains the optimal
- /// work size value.
- void QRSolve(int columnsOfB, double[] r, double[] q, double[] b, double[] x, double[] work);
-
- ///
- /// Solves A*X=B for X using a previously QR factored matrix.
- ///
- /// The number of columns of B.
- /// The Q matrix obtained by calling .
- /// The R matrix obtained by calling .
- /// The B matrix.
- /// On exit, the solution matrix.
- void QRSolveFactored(int columnsOfB, double[] q, double[] r, double[] b, double[] x);
-
- ///
- /// Computes the singular value decomposition of A.
- ///
- /// Compute the singular U and VT vectors or not.
- /// On entry, the M by N matrix to decompose. On exit, A may be overwritten.
- /// The singular values of A in ascending value.
- /// If is true, on exit U contains the left
- /// singular vectors.
- /// If is true, on exit VT contains the transposed
- /// right singular vectors.
- /// This is equivalent to the GESVD LAPACK routine.
- void SinguarValueDecomposition(bool computeVectors, double[] a, double[] s, double[] u, double[] vt);
-
- ///
- /// Computes the singular value decomposition of A.
- ///
- /// Compute the singular U and VT vectors or not.
- /// On entry, the M by N matrix to decompose. On exit, A may be overwritten.
- /// The singular values of A in ascending value.
- /// If is true, on exit U contains the left
- /// singular vectors.
- /// If is true, on exit VT contains the transposed
- /// right singular vectors.
- /// The work array. For real matrices, the work array should be at least
- /// Max(3*Min(M, N) + Max(M, N), 5*Min(M,N)). For complex matrices, 2*Min(M, N) + Max(M, N).
- /// On exit, work[0] contains the optimal work size value.
- ///
- /// This is equivalent to the GESVD LAPACK routine.
- void SingularValueDecomposition(bool computeVectors, double[] a, double[] s, double[] u, double[] vt, double[] work);
-
- ///
- /// Solves A*X=B for X using the singular value decomposition of A.
- ///
- /// On entry, the M by N matrix to decompose. On exit, A may be overwritten.
- /// The singular values of A in ascending value.
- /// On exit U contains the left singular vectors.
- /// On exit VT contains the transposed right singular vectors.
- /// The B matrix.
- /// On exit, the solution matrix.
- void SvdSolve(double[] a, double[] s, double[] u, double[] vt, double[] b, double[] x);
-
- ///
- /// Solves A*X=B for X using the singular value decomposition of A.
- ///
- /// On entry, the M by N matrix to decompose. On exit, A may be overwritten.
- /// The singular values of A in ascending value.
- /// On exit U contains the left singular vectors.
- /// On exit VT contains the transposed right singular vectors.
- /// The B matrix.
- /// On exit, the solution matrix.
- /// The work array. For real matrices, the work array should be at least
- /// Max(3*Min(M, N) + Max(M, N), 5*Min(M,N)). For complex matrices, 2*Min(M, N) + Max(M, N).
- /// On exit, work[0] contains the optimal work size value.
- ///
- void SvdSolve(double[] a, double[] s, double[] u, double[] vt, double[] b, double[] x, double[] work);
-
- ///
- /// Solves A*X=B for X using a previously SVD decomposed matrix.
- ///
- /// The number of columns of B.
- /// The s values returned by .
- /// The left singular vectors returned by .
- /// The right singular vectors returned by .
- /// The B matrix.
- /// On exit, the solution matrix.
- void SvdSolveFactored(int columnsOfB, double[] s, double[] u, double[] vt, double[] b, double[] x);
}
}
diff --git a/src/Numerics/Numerics.csproj b/src/Numerics/Numerics.csproj
index 08307a18..52b1c4ba 100644
--- a/src/Numerics/Numerics.csproj
+++ b/src/Numerics/Numerics.csproj
@@ -45,6 +45,7 @@
+