From 550d56c88439ddb53f1af9ca0a991f0de12f322a Mon Sep 17 00:00:00 2001 From: Jong Hyun Kim Date: Sun, 3 May 2020 16:49:12 +0900 Subject: [PATCH] Sparse Solver: change the enums' values to the values defined by MKL DSS. --- src/NativeProviders/MKL/dss.c | 70 ++++--------------- .../double/SparseSolverProviderTests.cs | 12 ++-- src/Numerics/Providers/Experimental.cs | 16 ++--- .../SparseSolver/ISparseSolverProvider.cs | 39 +++++++---- .../Mkl/MklSparseSolverProvider.Complex.cs | 16 +++++ .../Mkl/MklSparseSolverProvider.Complex32.cs | 16 +++++ .../Mkl/MklSparseSolverProvider.Double.cs | 16 +++++ .../Mkl/MklSparseSolverProvider.Single.cs | 16 +++++ 8 files changed, 119 insertions(+), 82 deletions(-) diff --git a/src/NativeProviders/MKL/dss.c b/src/NativeProviders/MKL/dss.c index f73a58a6..21838774 100644 --- a/src/NativeProviders/MKL/dss.c +++ b/src/NativeProviders/MKL/dss.c @@ -14,20 +14,15 @@ extern "C" { _MKL_DSS_HANDLE_t handle; dss_int error; - dss_int opt = MKL_DSS_MSG_LVL_WARNING + MKL_DSS_TERM_LVL_ERROR + MKL_DSS_ZERO_BASED_INDEXING + MKL_DSS_AUTO_ORDER + MKL_DSS_SINGLE_PRECISION; - if (systemType) opt += MKL_DSS_TRANSPOSE_SOLVE; // solve a transposed system, A'x = b + dss_int opt = MKL_DSS_MSG_LVL_WARNING + MKL_DSS_TERM_LVL_ERROR + MKL_DSS_ZERO_BASED_INDEXING + MKL_DSS_AUTO_ORDER; + opt += systemType; // Initialize the solver error = dss_create(handle, opt); if (error != MKL_DSS_SUCCESS) return error; // Define the non-zero structure of the matrix - dss_int sym = (matrixStructure == 0) - ? MKL_DSS_SYMMETRIC_STRUCTURE - : (matrixStructure == 1) - ? MKL_DSS_SYMMETRIC - : MKL_DSS_NON_SYMMETRIC; - error = dss_define_structure(handle, sym, rowIdx, nRows, nCols, colPtr, nnz); + error = dss_define_structure(handle, matrixStructure, rowIdx, nRows, nCols, colPtr, nnz); if (error != MKL_DSS_SUCCESS) return error; // Reorder the matrix @@ -35,10 +30,7 @@ extern "C" { if (error != MKL_DSS_SUCCESS) return error; // Factor the matrix - dss_int type = (matrixType == 0) - ? MKL_DSS_POSITIVE_DEFINITE - : MKL_DSS_INDEFINITE; - error = dss_factor_real(handle, type, values); + error = dss_factor_real(handle, matrixType, values); if (error != MKL_DSS_SUCCESS) return error; // Get the solution vector @@ -58,19 +50,14 @@ extern "C" { dss_int error; dss_int opt = MKL_DSS_MSG_LVL_WARNING + MKL_DSS_TERM_LVL_ERROR + MKL_DSS_ZERO_BASED_INDEXING + MKL_DSS_AUTO_ORDER; - if (systemType) opt += MKL_DSS_TRANSPOSE_SOLVE; // solve a transposed system, A'x = b + opt += systemType; // Initialize the solver error = dss_create(handle, opt); if (error != MKL_DSS_SUCCESS) return error; // Define the non-zero structure of the matrix - dss_int sym = (matrixStructure == 0) - ? MKL_DSS_SYMMETRIC_STRUCTURE - : (matrixStructure == 1) - ? MKL_DSS_SYMMETRIC - : MKL_DSS_NON_SYMMETRIC; - error = dss_define_structure(handle, sym, rowIdx, nRows, nCols, colPtr, nnz); + error = dss_define_structure(handle, matrixStructure, rowIdx, nRows, nCols, colPtr, nnz); if (error != MKL_DSS_SUCCESS) return error; // Reorder the matrix @@ -78,10 +65,7 @@ extern "C" { if (error != MKL_DSS_SUCCESS) return error; // Factor the matrix - dss_int type = (matrixType == 0) - ? MKL_DSS_POSITIVE_DEFINITE - : MKL_DSS_INDEFINITE; - error = dss_factor_real(handle, type, values); + error = dss_factor_real(handle, matrixType, values); if (error != MKL_DSS_SUCCESS) return error; // Get the solution vector @@ -100,21 +84,15 @@ extern "C" { _MKL_DSS_HANDLE_t handle; dss_int error; - dss_int opt = MKL_DSS_MSG_LVL_WARNING + MKL_DSS_TERM_LVL_ERROR + MKL_DSS_ZERO_BASED_INDEXING + MKL_DSS_AUTO_ORDER + MKL_DSS_SINGLE_PRECISION; - if (systemType == 1) opt += MKL_DSS_CONJUGATE_SOLVE; // solve a conjugate transposed system, A¢Óx = b - else if(systemType == 2) opt += MKL_DSS_TRANSPOSE_SOLVE; // solve a transposed system, A'x = b + dss_int opt = MKL_DSS_MSG_LVL_WARNING + MKL_DSS_TERM_LVL_ERROR + MKL_DSS_ZERO_BASED_INDEXING + MKL_DSS_AUTO_ORDER; + opt += systemType; // Initialize the solver error = dss_create(handle, opt); if (error != MKL_DSS_SUCCESS) return error; // Define the non-zero structure of the matrix - dss_int sym = (matrixStructure == 0) - ? MKL_DSS_SYMMETRIC_STRUCTURE_COMPLEX - : (matrixStructure == 1) - ? MKL_DSS_SYMMETRIC_COMPLEX - : MKL_DSS_NON_SYMMETRIC_COMPLEX; - error = dss_define_structure(handle, sym, rowIdx, nRows, nCols, colPtr, nnz); + error = dss_define_structure(handle, matrixStructure, rowIdx, nRows, nCols, colPtr, nnz); if (error != MKL_DSS_SUCCESS) return error; // Reorder the matrix @@ -122,14 +100,7 @@ extern "C" { if (error != MKL_DSS_SUCCESS) return error; // Factor the matrix - dss_int type = (matrixType == 0) - ? MKL_DSS_POSITIVE_DEFINITE - : (matrixType == 1) - ? MKL_DSS_INDEFINITE - : (matrixType == 2) - ? MKL_DSS_HERMITIAN_POSITIVE_DEFINITE - : MKL_DSS_HERMITIAN_INDEFINITE; - error = dss_factor_complex(handle, type, values); + error = dss_factor_complex(handle, matrixType, values); if (error != MKL_DSS_SUCCESS) return error; // Get the solution vector @@ -149,20 +120,14 @@ extern "C" { dss_int error; dss_int opt = MKL_DSS_MSG_LVL_WARNING + MKL_DSS_TERM_LVL_ERROR + MKL_DSS_ZERO_BASED_INDEXING + MKL_DSS_AUTO_ORDER; - if (systemType == 1) opt += MKL_DSS_CONJUGATE_SOLVE; // solve a conjugate transposed system, A¢Óx = b - else if (systemType == 2) opt += MKL_DSS_TRANSPOSE_SOLVE; // solve a transposed system, A'x = b + opt += systemType; // Initialize the solver error = dss_create(handle, opt); if (error != MKL_DSS_SUCCESS) return error; // Define the non-zero structure of the matrix - dss_int sym = (matrixStructure == 0) - ? MKL_DSS_SYMMETRIC_STRUCTURE_COMPLEX - : (matrixStructure == 1) - ? MKL_DSS_SYMMETRIC_COMPLEX - : MKL_DSS_NON_SYMMETRIC_COMPLEX; - error = dss_define_structure(handle, sym, rowIdx, nRows, nCols, colPtr, nnz); + error = dss_define_structure(handle, matrixStructure, rowIdx, nRows, nCols, colPtr, nnz); if (error != MKL_DSS_SUCCESS) return error; // Reorder the matrix @@ -170,14 +135,7 @@ extern "C" { if (error != MKL_DSS_SUCCESS) return error; // Factor the matrix - dss_int type = (matrixType == 0) - ? MKL_DSS_POSITIVE_DEFINITE - : (matrixType == 1) - ? MKL_DSS_INDEFINITE - : (matrixType == 2) - ? MKL_DSS_HERMITIAN_POSITIVE_DEFINITE - : MKL_DSS_HERMITIAN_INDEFINITE; - error = dss_factor_complex(handle, type, values); + error = dss_factor_complex(handle, matrixType, values); if (error != MKL_DSS_SUCCESS) return error; // Get the solution vector diff --git a/src/Numerics.Tests/Providers/SparseSolver/double/SparseSolverProviderTests.cs b/src/Numerics.Tests/Providers/SparseSolver/double/SparseSolverProviderTests.cs index 66c54038..0bc86a34 100644 --- a/src/Numerics.Tests/Providers/SparseSolver/double/SparseSolverProviderTests.cs +++ b/src/Numerics.Tests/Providers/SparseSolver/double/SparseSolverProviderTests.cs @@ -15,7 +15,7 @@ namespace MathNet.Numerics.UnitTests.Providers.SparseSolver.Double /// /// Base class for sparse solver provider tests. /// - [TestFixture, Category("LAProvider")] + [TestFixture, Category("SparseSolverProvider")] public class SparseSolverProviderTests { readonly double[] _b4 = { 1.0, 2.0, 3.0, 4.0}; @@ -51,7 +51,7 @@ namespace MathNet.Numerics.UnitTests.Providers.SparseSolver.Double var xactual = new double[rowCount]; - var error = SparseSolverControl.Provider.Solve(DssMatrixStructure.Symmetric, DssMatrixType.PositiveDefinite, DssSystemType.NonTransposed, + var error = SparseSolverControl.Provider.Solve(DssMatrixStructure.Symmetric, DssMatrixType.PositiveDefinite, DssSystemType.DontTranspose, rowCount, columnCount, valueCount, rowPointers, columnIndices, values, 1, _b5, xactual); @@ -83,7 +83,7 @@ namespace MathNet.Numerics.UnitTests.Providers.SparseSolver.Double var xactual = new double[rowCount]; - var error = SparseSolverControl.Provider.Solve(DssMatrixStructure.Nonsymmetric, DssMatrixType.Indefinite, DssSystemType.NonTransposed, + var error = SparseSolverControl.Provider.Solve(DssMatrixStructure.Nonsymmetric, DssMatrixType.Indefinite, DssSystemType.DontTranspose, rowCount, columnCount, valueCount, rowPointers, columnIndices, values, 1, _b5, xactual); @@ -115,7 +115,7 @@ namespace MathNet.Numerics.UnitTests.Providers.SparseSolver.Double var xactual = new double[rowCount]; - var error = SparseSolverControl.Provider.Solve(DssMatrixStructure.Nonsymmetric, DssMatrixType.Indefinite, DssSystemType.NonTransposed, + var error = SparseSolverControl.Provider.Solve(DssMatrixStructure.Nonsymmetric, DssMatrixType.Indefinite, DssSystemType.DontTranspose, rowCount, columnCount, valueCount, rowPointers, columnIndices, values, 1, _b4, xactual); @@ -150,7 +150,7 @@ namespace MathNet.Numerics.UnitTests.Providers.SparseSolver.Double var b = Identity.ToColumnMajorArray(); var Xactual = new double[rowCount * columnCount]; - var error = SparseSolverControl.Provider.Solve(DssMatrixStructure.Symmetric, DssMatrixType.PositiveDefinite, DssSystemType.NonTransposed, + var error = SparseSolverControl.Provider.Solve(DssMatrixStructure.Symmetric, DssMatrixType.PositiveDefinite, DssSystemType.DontTranspose, rowCount, columnCount, valueCount, rowPointers, columnIndices, values, Identity.ColumnCount, b, Xactual); @@ -520,7 +520,7 @@ namespace MathNet.Numerics.UnitTests.Providers.SparseSolver.Double var rhs = Rhs.ToArray(); var solution = new double[rowCount]; - SparseSolverControl.Provider.Solve(DssMatrixStructure.Symmetric, DssMatrixType.Indefinite, DssSystemType.NonTransposed, + SparseSolverControl.Provider.Solve(DssMatrixStructure.Symmetric, DssMatrixType.Indefinite, DssSystemType.DontTranspose, rowCount, columnCount, valueCount, rowPointers, columnIndices, values, 1, rhs, solution); diff --git a/src/Numerics/Providers/Experimental.cs b/src/Numerics/Providers/Experimental.cs index 4c332bc6..7d4231c9 100644 --- a/src/Numerics/Providers/Experimental.cs +++ b/src/Numerics/Providers/Experimental.cs @@ -84,7 +84,7 @@ namespace MathNet.Numerics var rhs = input.ToArray(); var solution = new float[rowCount]; - var error = SparseSolverControl.Provider.Solve(DssMatrixStructure.Nonsymmetric, DssMatrixType.Indefinite, DssSystemType.NonTransposed, + var error = SparseSolverControl.Provider.Solve(DssMatrixStructure.Nonsymmetric, DssMatrixType.Indefinite, DssSystemType.DontTranspose, rowCount, columnCount, valueCount, rowPointers, columnIndices, values, 1, rhs, solution); @@ -132,7 +132,7 @@ namespace MathNet.Numerics var rhs = input.ToArray(); var solution = new double[rowCount]; - var error = SparseSolverControl.Provider.Solve(DssMatrixStructure.Nonsymmetric, DssMatrixType.Indefinite, DssSystemType.NonTransposed, + var error = SparseSolverControl.Provider.Solve(DssMatrixStructure.Nonsymmetric, DssMatrixType.Indefinite, DssSystemType.DontTranspose, rowCount, columnCount, valueCount, rowPointers, columnIndices, values, 1, rhs, solution); @@ -180,7 +180,7 @@ namespace MathNet.Numerics var rhs = input.ToArray(); var solution = new Complex32[rowCount]; - var error = SparseSolverControl.Provider.Solve(DssMatrixStructure.Nonsymmetric, DssMatrixType.Indefinite, DssSystemType.NonTransposed, + var error = SparseSolverControl.Provider.Solve(DssMatrixStructure.Nonsymmetric, DssMatrixType.Indefinite, DssSystemType.DontTranspose, rowCount, columnCount, valueCount, rowPointers, columnIndices, values, 1, rhs, solution); @@ -228,7 +228,7 @@ namespace MathNet.Numerics var rhs = input.ToArray(); var solution = new Complex[rowCount]; - var error = SparseSolverControl.Provider.Solve(DssMatrixStructure.Nonsymmetric, DssMatrixType.Indefinite, DssSystemType.NonTransposed, + var error = SparseSolverControl.Provider.Solve(DssMatrixStructure.Nonsymmetric, DssMatrixType.Indefinite, DssSystemType.DontTranspose, rowCount, columnCount, valueCount, rowPointers, columnIndices, values, 1, rhs, solution); @@ -279,7 +279,7 @@ namespace MathNet.Numerics var solution = new float[rowCount * nRhs]; - var error = SparseSolverControl.Provider.Solve(DssMatrixStructure.Nonsymmetric, DssMatrixType.Indefinite, DssSystemType.NonTransposed, + var error = SparseSolverControl.Provider.Solve(DssMatrixStructure.Nonsymmetric, DssMatrixType.Indefinite, DssSystemType.DontTranspose, rowCount, columnCount, valueCount, rowPointers, columnIndices, values, nRhs, rhs, solution); @@ -328,7 +328,7 @@ namespace MathNet.Numerics var solution = new double[rowCount * nRhs]; - var error = SparseSolverControl.Provider.Solve(DssMatrixStructure.Nonsymmetric, DssMatrixType.Indefinite, DssSystemType.NonTransposed, + var error = SparseSolverControl.Provider.Solve(DssMatrixStructure.Nonsymmetric, DssMatrixType.Indefinite, DssSystemType.DontTranspose, rowCount, columnCount, valueCount, rowPointers, columnIndices, values, nRhs, rhs, solution); @@ -377,7 +377,7 @@ namespace MathNet.Numerics var solution = new Complex32[rowCount * nRhs]; - var error = SparseSolverControl.Provider.Solve(DssMatrixStructure.Nonsymmetric, DssMatrixType.Indefinite, DssSystemType.NonTransposed, + var error = SparseSolverControl.Provider.Solve(DssMatrixStructure.Nonsymmetric, DssMatrixType.Indefinite, DssSystemType.DontTranspose, rowCount, columnCount, valueCount, rowPointers, columnIndices, values, nRhs, rhs, solution); @@ -426,7 +426,7 @@ namespace MathNet.Numerics var solution = new Complex[rowCount * nRhs]; - var error = SparseSolverControl.Provider.Solve(DssMatrixStructure.Nonsymmetric, DssMatrixType.Indefinite, DssSystemType.NonTransposed, + var error = SparseSolverControl.Provider.Solve(DssMatrixStructure.Nonsymmetric, DssMatrixType.Indefinite, DssSystemType.DontTranspose, rowCount, columnCount, valueCount, rowPointers, columnIndices, values, nRhs, rhs, solution); diff --git a/src/Numerics/Providers/SparseSolver/ISparseSolverProvider.cs b/src/Numerics/Providers/SparseSolver/ISparseSolverProvider.cs index 1be09d98..5e7ccc94 100644 --- a/src/Numerics/Providers/SparseSolver/ISparseSolverProvider.cs +++ b/src/Numerics/Providers/SparseSolver/ISparseSolverProvider.cs @@ -2,37 +2,52 @@ namespace MathNet.Numerics.Providers.SparseSolver { + /// + /// Structure option. + /// public enum DssMatrixStructure : int { - SymmetricStructure = 0, - Symmetric = 1, - Nonsymmetric = 2 + Symmetric = 536870976, + SymmetricStructure = 536871040, + Nonsymmetric = 536871104, + SymmetricComplex = 536871168, + SymmetricStructureComplex = 536871232, + NonsymmetricComplex = 536871296, } + /// + /// Factorization option. + /// public enum DssMatrixType : int { - PositiveDefinite = 0, - Indefinite = 1, - HermitianPositiveDefinite = 2, - HermitianIndefinite = 3 + PositiveDefinite = 134217792, + Indefinite = 134217856, + HermitianPositiveDefinite = 134217920, + HermitianIndefinite = 134217984 } + /// + /// Solver step's substitution. + /// public enum DssSystemType : int { /// /// Solve a system, Ax = b. /// - NonTransposed = 0, + DontTranspose = 0, /// - /// Solve a conjugate transposed system, A†x = b + /// Solve a transposed system, A'x = b /// - ConjugateTransposed = 1, + Transpose = 262144, /// - /// Solve a transposed system, A'x = b + /// Solve a conjugate transposed system, A†x = b /// - Transposed = 2 + ConjugateTranspose = 524288, } + /// + /// Status values + /// public enum DssStatus : int { /// diff --git a/src/Numerics/Providers/SparseSolver/Mkl/MklSparseSolverProvider.Complex.cs b/src/Numerics/Providers/SparseSolver/Mkl/MklSparseSolverProvider.Complex.cs index 35356f30..d64554a0 100644 --- a/src/Numerics/Providers/SparseSolver/Mkl/MklSparseSolverProvider.Complex.cs +++ b/src/Numerics/Providers/SparseSolver/Mkl/MklSparseSolverProvider.Complex.cs @@ -13,6 +13,22 @@ namespace MathNet.Numerics.Providers.SparseSolver.Mkl /// internal partial class MklSparseSolverProvider { + /// + /// Solves sparse linear systems of equations, AX = B. + /// + /// The symmetricity of the matrix. For a symmetric matrix, only upper ot lower triangular matrix is used. + /// The definiteness of the matrix. + /// The type of the systems. + /// The number of rows of matrix. + /// The number of columns of matrix. + /// The number of non zero elements of matrix. + /// The array containing the row indices of the existing rows. + /// The array containing the column indices of the non-zero values + /// The array that contains the non-zero elements of matrix. No diagonal element can be ommitted. + /// The number of columns of the right hand side matrix. + /// The right hand side matrix + /// The left hand side matrix + /// The status of the solver. [SecuritySafeCritical] public override DssStatus Solve(DssMatrixStructure matrixStructure, DssMatrixType matrixType, DssSystemType systemType, int rowCount, int columnCount, int nonZerosCount, int[] rowPointers, int[] columnIndices, Complex[] values, diff --git a/src/Numerics/Providers/SparseSolver/Mkl/MklSparseSolverProvider.Complex32.cs b/src/Numerics/Providers/SparseSolver/Mkl/MklSparseSolverProvider.Complex32.cs index 05382bf7..4c7af106 100644 --- a/src/Numerics/Providers/SparseSolver/Mkl/MklSparseSolverProvider.Complex32.cs +++ b/src/Numerics/Providers/SparseSolver/Mkl/MklSparseSolverProvider.Complex32.cs @@ -12,6 +12,22 @@ namespace MathNet.Numerics.Providers.SparseSolver.Mkl /// internal partial class MklSparseSolverProvider { + /// + /// Solves sparse linear systems of equations, AX = B. + /// + /// The symmetricity of the matrix. For a symmetric matrix, only upper ot lower triangular matrix is used. + /// The definiteness of the matrix. + /// The type of the systems. + /// The number of rows of matrix. + /// The number of columns of matrix. + /// The number of non zero elements of matrix. + /// The array containing the row indices of the existing rows. + /// The array containing the column indices of the non-zero values + /// The array that contains the non-zero elements of matrix. No diagonal element can be ommitted. + /// The number of columns of the right hand side matrix. + /// The right hand side matrix + /// The left hand side matrix + /// The status of the solver. [SecuritySafeCritical] public override DssStatus Solve(DssMatrixStructure matrixStructure, DssMatrixType matrixType, DssSystemType systemType, int rowCount, int columnCount, int nonZerosCount, int[] rowPointers, int[] columnIndices, Complex32[] values, diff --git a/src/Numerics/Providers/SparseSolver/Mkl/MklSparseSolverProvider.Double.cs b/src/Numerics/Providers/SparseSolver/Mkl/MklSparseSolverProvider.Double.cs index 83f40873..f1563f4e 100644 --- a/src/Numerics/Providers/SparseSolver/Mkl/MklSparseSolverProvider.Double.cs +++ b/src/Numerics/Providers/SparseSolver/Mkl/MklSparseSolverProvider.Double.cs @@ -12,6 +12,22 @@ namespace MathNet.Numerics.Providers.SparseSolver.Mkl /// internal partial class MklSparseSolverProvider { + /// + /// Solves sparse linear systems of equations, AX = B. + /// + /// The symmetricity of the matrix. For a symmetric matrix, only upper ot lower triangular matrix is used. + /// The definiteness of the matrix. + /// The type of the systems. + /// The number of rows of matrix. + /// The number of columns of matrix. + /// The number of non zero elements of matrix. + /// The array containing the row indices of the existing rows. + /// The array containing the column indices of the non-zero values + /// The array that contains the non-zero elements of matrix. No diagonal element can be ommitted. + /// The number of columns of the right hand side matrix. + /// The right hand side matrix + /// The left hand side matrix + /// The status of the solver. [SecuritySafeCritical] public override DssStatus Solve(DssMatrixStructure matrixStructure, DssMatrixType matrixType, DssSystemType systemType, int rowCount, int columnCount, int nonZerosCount, int[] rowPointers, int[] columnIndices, double[] values, diff --git a/src/Numerics/Providers/SparseSolver/Mkl/MklSparseSolverProvider.Single.cs b/src/Numerics/Providers/SparseSolver/Mkl/MklSparseSolverProvider.Single.cs index dff0f5d8..475e0da7 100644 --- a/src/Numerics/Providers/SparseSolver/Mkl/MklSparseSolverProvider.Single.cs +++ b/src/Numerics/Providers/SparseSolver/Mkl/MklSparseSolverProvider.Single.cs @@ -12,6 +12,22 @@ namespace MathNet.Numerics.Providers.SparseSolver.Mkl /// internal partial class MklSparseSolverProvider { + /// + /// Solves sparse linear systems of equations, AX = B. + /// + /// The symmetricity of the matrix. For a symmetric matrix, only upper ot lower triangular matrix is used. + /// The definiteness of the matrix. + /// The type of the systems. + /// The number of rows of matrix. + /// The number of columns of matrix. + /// The number of non zero elements of matrix. + /// The array containing the row indices of the existing rows. + /// The array containing the column indices of the non-zero values + /// The array that contains the non-zero elements of matrix. No diagonal element can be ommitted. + /// The number of columns of the right hand side matrix. + /// The right hand side matrix + /// The left hand side matrix + /// The status of the solver. [SecuritySafeCritical] public override DssStatus Solve(DssMatrixStructure matrixStructure, DssMatrixType matrixType, DssSystemType systemType, int rowCount, int columnCount, int nonZerosCount, int[] rowPointers, int[] columnIndices, float[] values,