From 9cb892562e946fc52cce48c3f6dc3e23a97fb85c Mon Sep 17 00:00:00 2001 From: Tyler Steele Date: Wed, 9 Oct 2019 17:30:02 -0400 Subject: [PATCH 1/2] exposing eigen's direct and iterative sparse system solvers --- bindings/ffi_eigen_bindings.ml | 56 +++++++++++++++++++++ eigen/eigen_spmat_c.ml | 14 ++++++ eigen/eigen_spmat_d.ml | 14 ++++++ eigen/eigen_spmat_s.ml | 14 ++++++ eigen/eigen_spmat_z.ml | 14 ++++++ eigen/ffi_eigen_bindings.ml | 56 +++++++++++++++++++++ eigen_cpp/lib/eigen_spmat.h | 28 +++++++++++ eigen_cpp/lib/eigen_spmat_c.cpp | 86 +++++++++++++++++++++++++++++++++ eigen_cpp/lib/eigen_spmat_d.cpp | 85 ++++++++++++++++++++++++++++++++ eigen_cpp/lib/eigen_spmat_s.cpp | 85 ++++++++++++++++++++++++++++++++ eigen_cpp/lib/eigen_spmat_z.cpp | 85 ++++++++++++++++++++++++++++++++ eigen_cpp/lib/sparse_solver.cpp | 86 +++++++++++++++++++++++++++++++++ eigen_cpp/lib/sparse_solver.h | 27 +++++++++++ 13 files changed, 650 insertions(+) create mode 100644 eigen_cpp/lib/sparse_solver.cpp create mode 100644 eigen_cpp/lib/sparse_solver.h diff --git a/bindings/ffi_eigen_bindings.ml b/bindings/ffi_eigen_bindings.ml index 651b1f0..7b47555 100644 --- a/bindings/ffi_eigen_bindings.ml +++ b/bindings/ffi_eigen_bindings.ml @@ -308,6 +308,20 @@ module Bindings (F : Cstubs.FOREIGN) = struct let ml_eigen_print = foreign "c_eigen_spmat_s_print" (ptr c_spmat_s @-> returning void) + let ml_eigen_sparse_LU = foreign "c_eigen_spmat_s_sparse_LU" (ptr c_spmat_s @-> ptr c_spmat_s @-> returning (ptr_opt c_spmat_s)) + + let ml_eigen_sparse_QR = foreign "c_eigen_spmat_s_sparse_QR" (ptr c_spmat_s @-> ptr c_spmat_s @-> returning (ptr_opt c_spmat_s)) + + let ml_eigen_simplicial_LLT = foreign "c_eigen_spmat_s_simplicial_LLT" (ptr c_spmat_s @-> ptr c_spmat_s @-> returning (ptr_opt c_spmat_s)) + + let ml_eigen_simplicial_LDLT = foreign "c_eigen_spmat_s_simplicial_LDLT" (ptr c_spmat_s @-> ptr c_spmat_s @-> returning (ptr_opt c_spmat_s)) + + let ml_eigen_conjugate_gradient = foreign "c_eigen_spmat_s_conjugate_gradient" (ptr c_spmat_s @-> ptr c_spmat_s @-> returning (ptr_opt c_spmat_s)) + + let ml_eigen_least_squares_conjugate_gradient = foreign "c_eigen_spmat_s_least_squares_conjugate_gradient" (ptr c_spmat_s @-> ptr c_spmat_s @-> returning (ptr_opt c_spmat_s)) + + let ml_eigen_BiCGSTAB = foreign "c_eigen_spmat_s_BiCGSTAB" (ptr c_spmat_s @-> ptr c_spmat_s @-> returning (ptr_opt c_spmat_s)) + end @@ -425,6 +439,20 @@ module Bindings (F : Cstubs.FOREIGN) = struct let ml_eigen_print = foreign "c_eigen_spmat_d_print" (ptr c_spmat_d @-> returning void) + let ml_eigen_sparse_LU = foreign "c_eigen_spmat_d_sparse_LU" (ptr c_spmat_d @-> ptr c_spmat_d @-> returning (ptr_opt c_spmat_d)) + + let ml_eigen_sparse_QR = foreign "c_eigen_spmat_d_sparse_QR" (ptr c_spmat_d @-> ptr c_spmat_d @-> returning (ptr_opt c_spmat_d)) + + let ml_eigen_simplicial_LLT = foreign "c_eigen_spmat_d_simplicial_LLT" (ptr c_spmat_d @-> ptr c_spmat_d @-> returning (ptr_opt c_spmat_d)) + + let ml_eigen_simplicial_LDLT = foreign "c_eigen_spmat_d_simplicial_LDLT" (ptr c_spmat_d @-> ptr c_spmat_d @-> returning (ptr_opt c_spmat_d)) + + let ml_eigen_conjugate_gradient = foreign "c_eigen_spmat_d_conjugate_gradient" (ptr c_spmat_d @-> ptr c_spmat_d @-> returning (ptr_opt c_spmat_d)) + + let ml_eigen_least_squares_conjugate_gradient = foreign "c_eigen_spmat_d_least_squares_conjugate_gradient" (ptr c_spmat_d @-> ptr c_spmat_d @-> returning (ptr_opt c_spmat_d)) + + let ml_eigen_BiCGSTAB = foreign "c_eigen_spmat_d_BiCGSTAB" (ptr c_spmat_d @-> ptr c_spmat_d @-> returning (ptr_opt c_spmat_d)) + end @@ -532,6 +560,20 @@ module Bindings (F : Cstubs.FOREIGN) = struct let ml_eigen_print = foreign "c_eigen_spmat_c_print" (ptr c_spmat_c @-> returning void) + let ml_eigen_sparse_LU = foreign "c_eigen_spmat_c_sparse_LU" (ptr c_spmat_c @-> ptr c_spmat_c @-> returning (ptr_opt c_spmat_c)) + + let ml_eigen_sparse_QR = foreign "c_eigen_spmat_c_sparse_QR" (ptr c_spmat_c @-> ptr c_spmat_c @-> returning (ptr_opt c_spmat_c)) + + let ml_eigen_simplicial_LLT = foreign "c_eigen_spmat_c_simplicial_LLT" (ptr c_spmat_c @-> ptr c_spmat_c @-> returning (ptr_opt c_spmat_c)) + + let ml_eigen_simplicial_LDLT = foreign "c_eigen_spmat_c_simplicial_LDLT" (ptr c_spmat_c @-> ptr c_spmat_c @-> returning (ptr_opt c_spmat_c)) + + let ml_eigen_conjugate_gradient = foreign "c_eigen_spmat_c_conjugate_gradient" (ptr c_spmat_c @-> ptr c_spmat_c @-> returning (ptr_opt c_spmat_c)) + + let ml_eigen_least_squares_conjugate_gradient = foreign "c_eigen_spmat_c_least_squares_conjugate_gradient" (ptr c_spmat_c @-> ptr c_spmat_c @-> returning (ptr_opt c_spmat_c)) + + let ml_eigen_BiCGSTAB = foreign "c_eigen_spmat_c_BiCGSTAB" (ptr c_spmat_c @-> ptr c_spmat_c @-> returning (ptr_opt c_spmat_c)) + end @@ -639,6 +681,20 @@ module Bindings (F : Cstubs.FOREIGN) = struct let ml_eigen_print = foreign "c_eigen_spmat_z_print" (ptr c_spmat_z @-> returning void) + let ml_eigen_sparse_LU = foreign "c_eigen_spmat_z_sparse_LU" (ptr c_spmat_z @-> ptr c_spmat_z @-> returning (ptr_opt c_spmat_z)) + + let ml_eigen_sparse_QR = foreign "c_eigen_spmat_z_sparse_QR" (ptr c_spmat_z @-> ptr c_spmat_z @-> returning (ptr_opt c_spmat_z)) + + let ml_eigen_simplicial_LLT = foreign "c_eigen_spmat_z_simplicial_LLT" (ptr c_spmat_z @-> ptr c_spmat_z @-> returning (ptr_opt c_spmat_z)) + + let ml_eigen_simplicial_LDLT = foreign "c_eigen_spmat_z_simplicial_LDLT" (ptr c_spmat_z @-> ptr c_spmat_z @-> returning (ptr_opt c_spmat_z)) + + let ml_eigen_conjugate_gradient = foreign "c_eigen_spmat_z_conjugate_gradient" (ptr c_spmat_z @-> ptr c_spmat_z @-> returning (ptr_opt c_spmat_z)) + + let ml_eigen_least_squares_conjugate_gradient = foreign "c_eigen_spmat_z_least_squares_conjugate_gradient" (ptr c_spmat_z @-> ptr c_spmat_z @-> returning (ptr_opt c_spmat_z)) + + let ml_eigen_BiCGSTAB = foreign "c_eigen_spmat_z_BiCGSTAB" (ptr c_spmat_z @-> ptr c_spmat_z @-> returning (ptr_opt c_spmat_z)) + end diff --git a/eigen/eigen_spmat_c.ml b/eigen/eigen_spmat_c.ml index 39746ed..6ede754 100644 --- a/eigen/eigen_spmat_c.ml +++ b/eigen/eigen_spmat_c.ml @@ -115,3 +115,17 @@ let neg x = ml_eigen_neg x let sqrt x = ml_eigen_sqrt x let print x = ml_eigen_print x + +let sparse_LU a b = ml_eigen_sparse_LU a b + +let sparse_QR a b = ml_eigen_sparse_QR a b + +let simplicial_LLT a b = ml_eigen_simplicial_LLT a b + +let simplicial_LDLT a b = ml_eigen_simplicial_LDLT a b + +let conjugate_gradient a b = ml_eigen_conjugate_gradient a b + +let least_squares_conjugate_gradient a b = ml_eigen_least_squares_conjugate_gradient a b + +let biCGSTAB a b = ml_eigen_BiCGSTAB a b diff --git a/eigen/eigen_spmat_d.ml b/eigen/eigen_spmat_d.ml index 0a581a6..e435dc4 100644 --- a/eigen/eigen_spmat_d.ml +++ b/eigen/eigen_spmat_d.ml @@ -125,3 +125,17 @@ let neg x = ml_eigen_neg x let sqrt x = ml_eigen_sqrt x let print x = ml_eigen_print x + +let sparse_LU a b = ml_eigen_sparse_LU a b + +let sparse_QR a b = ml_eigen_sparse_QR a b + +let simplicial_LLT a b = ml_eigen_simplicial_LLT a b + +let simplicial_LDLT a b = ml_eigen_simplicial_LDLT a b + +let conjugate_gradient a b = ml_eigen_conjugate_gradient a b + +let least_squares_conjugate_gradient a b = ml_eigen_least_squares_conjugate_gradient a b + +let biCGSTAB a b = ml_eigen_BiCGSTAB a b diff --git a/eigen/eigen_spmat_s.ml b/eigen/eigen_spmat_s.ml index 7a05fca..a282ce1 100644 --- a/eigen/eigen_spmat_s.ml +++ b/eigen/eigen_spmat_s.ml @@ -125,3 +125,17 @@ let neg x = ml_eigen_neg x let sqrt x = ml_eigen_sqrt x let print x = ml_eigen_print x + +let sparse_LU a b = ml_eigen_sparse_LU a b + +let sparse_QR a b = ml_eigen_sparse_QR a b + +let simplicial_LLT a b = ml_eigen_simplicial_LLT a b + +let simplicial_LDLT a b = ml_eigen_simplicial_LDLT a b + +let conjugate_gradient a b = ml_eigen_conjugate_gradient a b + +let least_squares_conjugate_gradient a b = ml_eigen_least_squares_conjugate_gradient a b + +let biCGSTAB a b = ml_eigen_BiCGSTAB a b diff --git a/eigen/eigen_spmat_z.ml b/eigen/eigen_spmat_z.ml index a6fcd15..5987753 100644 --- a/eigen/eigen_spmat_z.ml +++ b/eigen/eigen_spmat_z.ml @@ -115,3 +115,17 @@ let neg x = ml_eigen_neg x let sqrt x = ml_eigen_sqrt x let print x = ml_eigen_print x + +let sparse_LU a b = ml_eigen_sparse_LU a b + +let sparse_QR a b = ml_eigen_sparse_QR a b + +let simplicial_LLT a b = ml_eigen_simplicial_LLT a b + +let simplicial_LDLT a b = ml_eigen_simplicial_LDLT a b + +let conjugate_gradient a b = ml_eigen_conjugate_gradient a b + +let least_squares_conjugate_gradient a b = ml_eigen_least_squares_conjugate_gradient a b + +let biCGSTAB a b = ml_eigen_BiCGSTAB a b diff --git a/eigen/ffi_eigen_bindings.ml b/eigen/ffi_eigen_bindings.ml index bb02e44..c1c77bd 100644 --- a/eigen/ffi_eigen_bindings.ml +++ b/eigen/ffi_eigen_bindings.ml @@ -308,6 +308,20 @@ module Bindings (F : Ctypes.FOREIGN) = struct let ml_eigen_print = foreign "c_eigen_spmat_s_print" (ptr c_spmat_s @-> returning void) + let ml_eigen_sparse_LU = foreign "c_eigen_spmat_s_sparse_LU" (ptr c_spmat_s @-> ptr c_spmat_s @-> returning (ptr_opt c_spmat_s)) + + let ml_eigen_sparse_QR = foreign "c_eigen_spmat_s_sparse_QR" (ptr c_spmat_s @-> ptr c_spmat_s @-> returning (ptr_opt c_spmat_s)) + + let ml_eigen_simplicial_LLT = foreign "c_eigen_spmat_s_simplicial_LLT" (ptr c_spmat_s @-> ptr c_spmat_s @-> returning (ptr_opt c_spmat_s)) + + let ml_eigen_simplicial_LDLT = foreign "c_eigen_spmat_s_simplicial_LDLT" (ptr c_spmat_s @-> ptr c_spmat_s @-> returning (ptr_opt c_spmat_s)) + + let ml_eigen_conjugate_gradient = foreign "c_eigen_spmat_s_conjugate_gradient" (ptr c_spmat_s @-> ptr c_spmat_s @-> returning (ptr_opt c_spmat_s)) + + let ml_eigen_least_squares_conjugate_gradient = foreign "c_eigen_spmat_s_least_squares_conjugate_gradient" (ptr c_spmat_s @-> ptr c_spmat_s @-> returning (ptr_opt c_spmat_s)) + + let ml_eigen_BiCGSTAB = foreign "c_eigen_spmat_s_BiCGSTAB" (ptr c_spmat_s @-> ptr c_spmat_s @-> returning (ptr_opt c_spmat_s)) + end @@ -425,6 +439,20 @@ module Bindings (F : Ctypes.FOREIGN) = struct let ml_eigen_print = foreign "c_eigen_spmat_d_print" (ptr c_spmat_d @-> returning void) + let ml_eigen_sparse_LU = foreign "c_eigen_spmat_d_sparse_LU" (ptr c_spmat_d @-> ptr c_spmat_d @-> returning (ptr_opt c_spmat_d)) + + let ml_eigen_sparse_QR = foreign "c_eigen_spmat_d_sparse_QR" (ptr c_spmat_d @-> ptr c_spmat_d @-> returning (ptr_opt c_spmat_d)) + + let ml_eigen_simplicial_LLT = foreign "c_eigen_spmat_d_simplicial_LLT" (ptr c_spmat_d @-> ptr c_spmat_d @-> returning (ptr_opt c_spmat_d)) + + let ml_eigen_simplicial_LDLT = foreign "c_eigen_spmat_d_simplicial_LDLT" (ptr c_spmat_d @-> ptr c_spmat_d @-> returning (ptr_opt c_spmat_d)) + + let ml_eigen_conjugate_gradient = foreign "c_eigen_spmat_d_conjugate_gradient" (ptr c_spmat_d @-> ptr c_spmat_d @-> returning (ptr_opt c_spmat_d)) + + let ml_eigen_least_squares_conjugate_gradient = foreign "c_eigen_spmat_d_least_squares_conjugate_gradient" (ptr c_spmat_d @-> ptr c_spmat_d @-> returning (ptr_opt c_spmat_d)) + + let ml_eigen_BiCGSTAB = foreign "c_eigen_spmat_d_BiCGSTAB" (ptr c_spmat_d @-> ptr c_spmat_d @-> returning (ptr_opt c_spmat_d)) + end @@ -532,6 +560,20 @@ module Bindings (F : Ctypes.FOREIGN) = struct let ml_eigen_print = foreign "c_eigen_spmat_c_print" (ptr c_spmat_c @-> returning void) + let ml_eigen_sparse_LU = foreign "c_eigen_spmat_c_sparse_LU" (ptr c_spmat_c @-> ptr c_spmat_c @-> returning (ptr_opt c_spmat_c)) + + let ml_eigen_sparse_QR = foreign "c_eigen_spmat_c_sparse_QR" (ptr c_spmat_c @-> ptr c_spmat_c @-> returning (ptr_opt c_spmat_c)) + + let ml_eigen_simplicial_LLT = foreign "c_eigen_spmat_c_simplicial_LLT" (ptr c_spmat_c @-> ptr c_spmat_c @-> returning (ptr_opt c_spmat_c)) + + let ml_eigen_simplicial_LDLT = foreign "c_eigen_spmat_c_simplicial_LDLT" (ptr c_spmat_c @-> ptr c_spmat_c @-> returning (ptr_opt c_spmat_c)) + + let ml_eigen_conjugate_gradient = foreign "c_eigen_spmat_c_conjugate_gradient" (ptr c_spmat_c @-> ptr c_spmat_c @-> returning (ptr_opt c_spmat_c)) + + let ml_eigen_least_squares_conjugate_gradient = foreign "c_eigen_spmat_c_least_squares_conjugate_gradient" (ptr c_spmat_c @-> ptr c_spmat_c @-> returning (ptr_opt c_spmat_c)) + + let ml_eigen_BiCGSTAB = foreign "c_eigen_spmat_c_BiCGSTAB" (ptr c_spmat_c @-> ptr c_spmat_c @-> returning (ptr_opt c_spmat_c)) + end @@ -639,6 +681,20 @@ module Bindings (F : Ctypes.FOREIGN) = struct let ml_eigen_print = foreign "c_eigen_spmat_z_print" (ptr c_spmat_z @-> returning void) + let ml_eigen_sparse_LU = foreign "c_eigen_spmat_z_sparse_LU" (ptr c_spmat_z @-> ptr c_spmat_z @-> returning (ptr_opt c_spmat_z)) + + let ml_eigen_sparse_QR = foreign "c_eigen_spmat_z_sparse_QR" (ptr c_spmat_z @-> ptr c_spmat_z @-> returning (ptr_opt c_spmat_z)) + + let ml_eigen_simplicial_LLT = foreign "c_eigen_spmat_z_simplicial_LLT" (ptr c_spmat_z @-> ptr c_spmat_z @-> returning (ptr_opt c_spmat_z)) + + let ml_eigen_simplicial_LDLT = foreign "c_eigen_spmat_z_simplicial_LDLT" (ptr c_spmat_z @-> ptr c_spmat_z @-> returning (ptr_opt c_spmat_z)) + + let ml_eigen_conjugate_gradient = foreign "c_eigen_spmat_z_conjugate_gradient" (ptr c_spmat_z @-> ptr c_spmat_z @-> returning (ptr_opt c_spmat_z)) + + let ml_eigen_least_squares_conjugate_gradient = foreign "c_eigen_spmat_z_least_squares_conjugate_gradient" (ptr c_spmat_z @-> ptr c_spmat_z @-> returning (ptr_opt c_spmat_z)) + + let ml_eigen_BiCGSTAB = foreign "c_eigen_spmat_z_BiCGSTAB" (ptr c_spmat_z @-> ptr c_spmat_z @-> returning (ptr_opt c_spmat_z)) + end diff --git a/eigen_cpp/lib/eigen_spmat.h b/eigen_cpp/lib/eigen_spmat.h index 8c80ded..195e2dd 100644 --- a/eigen_cpp/lib/eigen_spmat.h +++ b/eigen_cpp/lib/eigen_spmat.h @@ -87,6 +87,13 @@ typedef int64_t INDEX; struct c_spmat_s* c_eigen_spmat_s_neg(struct c_spmat_s *m); struct c_spmat_s* c_eigen_spmat_s_sqrt(struct c_spmat_s *m); void c_eigen_spmat_s_print(struct c_spmat_s *m); + struct c_spmat_s* c_eigen_spmat_s_sparse_LU(struct c_spmat_s *a, struct c_spmat_s *b); + struct c_spmat_s* c_eigen_spmat_s_sparse_QR(struct c_spmat_s *a, struct c_spmat_s *b); + struct c_spmat_s* c_eigen_spmat_s_simplicial_LLT(struct c_spmat_s *a, struct c_spmat_s *b); + struct c_spmat_s* c_eigen_spmat_s_simplicial_LDLT(struct c_spmat_s *a, struct c_spmat_s *b); + struct c_spmat_s* c_eigen_spmat_s_conjugate_gradient(struct c_spmat_s *a, struct c_spmat_s *b); + struct c_spmat_s* c_eigen_spmat_s_least_squares_conjugate_gradient(struct c_spmat_s *a, struct c_spmat_s *b); + struct c_spmat_s* c_eigen_spmat_s_BiCGSTAB(struct c_spmat_s *a, struct c_spmat_s *b); /**************************** SparseMatrix_D ****************************/ @@ -147,6 +154,13 @@ typedef int64_t INDEX; struct c_spmat_d* c_eigen_spmat_d_neg(struct c_spmat_d *m); struct c_spmat_d* c_eigen_spmat_d_sqrt(struct c_spmat_d *m); void c_eigen_spmat_d_print(struct c_spmat_d *m); + struct c_spmat_d* c_eigen_spmat_d_sparse_LU(struct c_spmat_d *a, struct c_spmat_d *b); + struct c_spmat_d* c_eigen_spmat_d_sparse_QR(struct c_spmat_d *a, struct c_spmat_d *b); + struct c_spmat_d* c_eigen_spmat_d_simplicial_LLT(struct c_spmat_d *a, struct c_spmat_d *b); + struct c_spmat_d* c_eigen_spmat_d_simplicial_LDLT(struct c_spmat_d *a, struct c_spmat_d *b); + struct c_spmat_d* c_eigen_spmat_d_conjugate_gradient(struct c_spmat_d *a, struct c_spmat_d *b); + struct c_spmat_d* c_eigen_spmat_d_least_squares_conjugate_gradient(struct c_spmat_d *a, struct c_spmat_d *b); + struct c_spmat_d* c_eigen_spmat_d_BiCGSTAB(struct c_spmat_d *a, struct c_spmat_d *b); /**************************** SparseMatrix_C ****************************/ @@ -202,6 +216,13 @@ typedef int64_t INDEX; struct c_spmat_c* c_eigen_spmat_c_neg(struct c_spmat_c *m); struct c_spmat_c* c_eigen_spmat_c_sqrt(struct c_spmat_c *m); void c_eigen_spmat_c_print(struct c_spmat_c *m); + struct c_spmat_c* c_eigen_spmat_c_sparse_LU(struct c_spmat_c *a, struct c_spmat_c *b); + struct c_spmat_c* c_eigen_spmat_c_sparse_QR(struct c_spmat_c *a, struct c_spmat_c *b); + struct c_spmat_c* c_eigen_spmat_c_simplicial_LLT(struct c_spmat_c *a, struct c_spmat_c *b); + struct c_spmat_c* c_eigen_spmat_c_simplicial_LDLT(struct c_spmat_c *a, struct c_spmat_c *b); + struct c_spmat_c* c_eigen_spmat_c_conjugate_gradient(struct c_spmat_c *a, struct c_spmat_c *b); + struct c_spmat_c* c_eigen_spmat_c_least_squares_conjugate_gradient(struct c_spmat_c *a, struct c_spmat_c *b); + struct c_spmat_c* c_eigen_spmat_c_BiCGSTAB(struct c_spmat_c *a, struct c_spmat_c *b); /**************************** SparseMatrix_Z ****************************/ @@ -257,6 +278,13 @@ typedef int64_t INDEX; struct c_spmat_z* c_eigen_spmat_z_neg(struct c_spmat_z *m); struct c_spmat_z* c_eigen_spmat_z_sqrt(struct c_spmat_z *m); void c_eigen_spmat_z_print(struct c_spmat_z *m); + struct c_spmat_z* c_eigen_spmat_z_sparse_LU(struct c_spmat_z *a, struct c_spmat_z *b); + struct c_spmat_z* c_eigen_spmat_z_sparse_QR(struct c_spmat_z *a, struct c_spmat_z *b); + struct c_spmat_z* c_eigen_spmat_z_simplicial_LLT(struct c_spmat_z *a, struct c_spmat_z *b); + struct c_spmat_z* c_eigen_spmat_z_simplicial_LDLT(struct c_spmat_z *a, struct c_spmat_z *b); + struct c_spmat_z* c_eigen_spmat_z_conjugate_gradient(struct c_spmat_z *a, struct c_spmat_z *b); + struct c_spmat_z* c_eigen_spmat_z_least_squares_conjugate_gradient(struct c_spmat_z *a, struct c_spmat_z *b); + struct c_spmat_z* c_eigen_spmat_z_BiCGSTAB(struct c_spmat_z *a, struct c_spmat_z *b); #ifdef __cplusplus diff --git a/eigen_cpp/lib/eigen_spmat_c.cpp b/eigen_cpp/lib/eigen_spmat_c.cpp index 0bfa832..23be895 100644 --- a/eigen_cpp/lib/eigen_spmat_c.cpp +++ b/eigen_cpp/lib/eigen_spmat_c.cpp @@ -3,9 +3,13 @@ * Copyright (c) 2016-2017 Liang Wang */ +#include "sparse_solver.h" + /******************** pointer conversion ********************/ typedef SparseMatrix spmat_c; +typedef SparseMatrix col_major_spmat_c; + inline spmat_c& c_to_eigen(c_spmat_c* ptr) { @@ -444,3 +448,85 @@ void c_eigen_spmat_c_print(c_spmat_c *m) { std::cout << c_to_eigen(m) << std::endl; } + +c_spmat_c* c_eigen_spmat_c_sparse_LU(c_spmat_c *c_coefficients, c_spmat_c *c_observations) +{ + SparseSolver, + spmat_c, + dsmat_c, + spmat_c_elt, + c_spmat_c, + c_dsmat_c> ss(c_coefficients, c_observations); + return ss.solve(); +} + +c_spmat_c* c_eigen_spmat_c_sparse_QR(c_spmat_c *c_coefficients, c_spmat_c *c_observations) +{ + SparseSolver >, + spmat_c, + dsmat_c, + spmat_c_elt, + c_spmat_c, + c_dsmat_c> ss(c_coefficients, c_observations); + return ss.solve(); +} + +c_spmat_c* c_eigen_spmat_c_simplicial_LLT(c_spmat_c *c_coefficients, + c_spmat_c *c_observations) +{ + SparseSolver, + spmat_c, + dsmat_c, + spmat_c_elt, + c_spmat_c, + c_dsmat_c> ss(c_coefficients, c_observations); + return ss.solve(); +} + +c_spmat_c* c_eigen_spmat_c_simplicial_LDLT(c_spmat_c *c_coefficients, + c_spmat_c *c_observations) +{ + SparseSolver, + spmat_c, + dsmat_c, + spmat_c_elt, + c_spmat_c, + c_dsmat_c> ss(c_coefficients, c_observations); + return ss.solve(); +} + +c_spmat_c* c_eigen_spmat_c_conjugate_gradient(c_spmat_c *c_coefficients, + c_spmat_c *c_observations) +{ + SparseSolver, + spmat_c, + dsmat_c, + spmat_c_elt, + c_spmat_c, + c_dsmat_c> ss(c_coefficients, c_observations); + return ss.solve(); +} + +c_spmat_c* c_eigen_spmat_c_least_squares_conjugate_gradient(c_spmat_c *c_coefficients, + c_spmat_c *c_observations) +{ + SparseSolver, + spmat_c, + dsmat_c, + spmat_c_elt, + c_spmat_c, + c_dsmat_c> ss(c_coefficients, c_observations); + return ss.solve(); +} + +c_spmat_c* c_eigen_spmat_c_BiCGSTAB(c_spmat_c *c_coefficients, + c_spmat_c *c_observations) +{ + SparseSolver, + spmat_c, + dsmat_c, + spmat_c_elt, + c_spmat_c, + c_dsmat_c> ss(c_coefficients, c_observations); + return ss.solve(); +} diff --git a/eigen_cpp/lib/eigen_spmat_d.cpp b/eigen_cpp/lib/eigen_spmat_d.cpp index b81a101..ac4c112 100644 --- a/eigen_cpp/lib/eigen_spmat_d.cpp +++ b/eigen_cpp/lib/eigen_spmat_d.cpp @@ -3,10 +3,13 @@ * Copyright (c) 2016-2017 Liang Wang */ +#include "sparse_solver.h" /******************** pointer conversion ********************/ typedef SparseMatrix spmat_d; +typedef SparseMatrix col_major_spmat_d; + inline spmat_d& c_to_eigen(c_spmat_d* ptr) { @@ -436,3 +439,85 @@ void c_eigen_spmat_d_print(c_spmat_d *m) { std::cout << c_to_eigen(m) << std::endl; } + +c_spmat_d* c_eigen_spmat_d_sparse_LU(c_spmat_d *c_coefficients, c_spmat_d *c_observations) +{ + SparseSolver, + spmat_d, + dsmat_d, + spmat_d_elt, + c_spmat_d, + c_dsmat_d> ss(c_coefficients, c_observations); + return ss.solve(); +} + +c_spmat_d* c_eigen_spmat_d_sparse_QR(c_spmat_d *c_coefficients, c_spmat_d *c_observations) +{ + SparseSolver >, + spmat_d, + dsmat_d, + spmat_d_elt, + c_spmat_d, + c_dsmat_d> ss(c_coefficients, c_observations); + return ss.solve(); +} + +c_spmat_d* c_eigen_spmat_d_simplicial_LLT(c_spmat_d *c_coefficients, + c_spmat_d *c_observations) +{ + SparseSolver, + spmat_d, + dsmat_d, + spmat_d_elt, + c_spmat_d, + c_dsmat_d> ss(c_coefficients, c_observations); + return ss.solve(); +} + +c_spmat_d* c_eigen_spmat_d_simplicial_LDLT(c_spmat_d *c_coefficients, + c_spmat_d *c_observations) +{ + SparseSolver, + spmat_d, + dsmat_d, + spmat_d_elt, + c_spmat_d, + c_dsmat_d> ss(c_coefficients, c_observations); + return ss.solve(); +} + +c_spmat_d* c_eigen_spmat_d_conjugate_gradient(c_spmat_d *c_coefficients, + c_spmat_d *c_observations) +{ + SparseSolver, + spmat_d, + dsmat_d, + spmat_d_elt, + c_spmat_d, + c_dsmat_d> ss(c_coefficients, c_observations); + return ss.solve(); +} + +c_spmat_d* c_eigen_spmat_d_least_squares_conjugate_gradient(c_spmat_d *c_coefficients, + c_spmat_d *c_observations) +{ + SparseSolver, + spmat_d, + dsmat_d, + spmat_d_elt, + c_spmat_d, + c_dsmat_d> ss(c_coefficients, c_observations); + return ss.solve(); +} + +c_spmat_d* c_eigen_spmat_d_BiCGSTAB(c_spmat_d *c_coefficients, + c_spmat_d *c_observations) +{ + SparseSolver, + spmat_d, + dsmat_d, + spmat_d_elt, + c_spmat_d, + c_dsmat_d> ss(c_coefficients, c_observations); + return ss.solve(); +} diff --git a/eigen_cpp/lib/eigen_spmat_s.cpp b/eigen_cpp/lib/eigen_spmat_s.cpp index 57e842d..8b3ec3a 100644 --- a/eigen_cpp/lib/eigen_spmat_s.cpp +++ b/eigen_cpp/lib/eigen_spmat_s.cpp @@ -3,10 +3,13 @@ * Copyright (c) 2016-2017 Liang Wang */ +#include "sparse_solver.h" /******************** pointer conversion ********************/ typedef SparseMatrix spmat_s; +typedef SparseMatrix col_major_spmat_s; + inline spmat_s& c_to_eigen(c_spmat_s* ptr) { @@ -436,3 +439,85 @@ void c_eigen_spmat_s_print(c_spmat_s *m) { std::cout << c_to_eigen(m) << std::endl; } + +c_spmat_s* c_eigen_spmat_s_sparse_LU(c_spmat_s *c_coefficients, c_spmat_s *c_observations) +{ + SparseSolver, + spmat_s, + dsmat_s, + spmat_s_elt, + c_spmat_s, + c_dsmat_s> ss(c_coefficients, c_observations); + return ss.solve(); +} + +c_spmat_s* c_eigen_spmat_s_sparse_QR(c_spmat_s *c_coefficients, c_spmat_s *c_observations) +{ + SparseSolver >, + spmat_s, + dsmat_s, + spmat_s_elt, + c_spmat_s, + c_dsmat_s> ss(c_coefficients, c_observations); + return ss.solve(); +} + +c_spmat_s* c_eigen_spmat_s_simplicial_LLT(c_spmat_s *c_coefficients, + c_spmat_s *c_observations) +{ + SparseSolver, + spmat_s, + dsmat_s, + spmat_s_elt, + c_spmat_s, + c_dsmat_s> ss(c_coefficients, c_observations); + return ss.solve(); +} + +c_spmat_s* c_eigen_spmat_s_simplicial_LDLT(c_spmat_s *c_coefficients, + c_spmat_s *c_observations) +{ + SparseSolver, + spmat_s, + dsmat_s, + spmat_s_elt, + c_spmat_s, + c_dsmat_s> ss(c_coefficients, c_observations); + return ss.solve(); +} + +c_spmat_s* c_eigen_spmat_s_conjugate_gradient(c_spmat_s *c_coefficients, + c_spmat_s *c_observations) +{ + SparseSolver, + spmat_s, + dsmat_s, + spmat_s_elt, + c_spmat_s, + c_dsmat_s> ss(c_coefficients, c_observations); + return ss.solve(); +} + +c_spmat_s* c_eigen_spmat_s_least_squares_conjugate_gradient(c_spmat_s *c_coefficients, + c_spmat_s *c_observations) +{ + SparseSolver, + spmat_s, + dsmat_s, + spmat_s_elt, + c_spmat_s, + c_dsmat_s> ss(c_coefficients, c_observations); + return ss.solve(); +} + +c_spmat_s* c_eigen_spmat_s_BiCGSTAB(c_spmat_s *c_coefficients, + c_spmat_s *c_observations) +{ + SparseSolver, + spmat_s, + dsmat_s, + spmat_s_elt, + c_spmat_s, + c_dsmat_s> ss(c_coefficients, c_observations); + return ss.solve(); +} diff --git a/eigen_cpp/lib/eigen_spmat_z.cpp b/eigen_cpp/lib/eigen_spmat_z.cpp index c4b6955..fe9822f 100644 --- a/eigen_cpp/lib/eigen_spmat_z.cpp +++ b/eigen_cpp/lib/eigen_spmat_z.cpp @@ -3,10 +3,13 @@ * Copyright (c) 2016-2017 Liang Wang */ +#include "sparse_solver.h" /******************** pointer conversion ********************/ typedef SparseMatrix spmat_z; +typedef SparseMatrix col_major_spmat_z; + inline spmat_z& c_to_eigen(c_spmat_z* ptr) { @@ -444,3 +447,85 @@ void c_eigen_spmat_z_print(c_spmat_z *m) { std::cout << c_to_eigen(m) << std::endl; } + +c_spmat_z* c_eigen_spmat_z_sparse_LU(c_spmat_z *c_coefficients, c_spmat_z *c_observations) +{ + SparseSolver, + spmat_z, + dsmat_z, + spmat_z_elt, + c_spmat_z, + c_dsmat_z> ss(c_coefficients, c_observations); + return ss.solve(); +} + +c_spmat_z* c_eigen_spmat_z_sparse_QR(c_spmat_z *c_coefficients, c_spmat_z *c_observations) +{ + SparseSolver >, + spmat_z, + dsmat_z, + spmat_z_elt, + c_spmat_z, + c_dsmat_z> ss(c_coefficients, c_observations); + return ss.solve(); +} + +c_spmat_z* c_eigen_spmat_z_simplicial_LLT(c_spmat_z *c_coefficients, + c_spmat_z *c_observations) +{ + SparseSolver, + spmat_z, + dsmat_z, + spmat_z_elt, + c_spmat_z, + c_dsmat_z> ss(c_coefficients, c_observations); + return ss.solve(); +} + +c_spmat_z* c_eigen_spmat_z_simplicial_LDLT(c_spmat_z *c_coefficients, + c_spmat_z *c_observations) +{ + SparseSolver, + spmat_z, + dsmat_z, + spmat_z_elt, + c_spmat_z, + c_dsmat_z> ss(c_coefficients, c_observations); + return ss.solve(); +} + +c_spmat_z* c_eigen_spmat_z_conjugate_gradient(c_spmat_z *c_coefficients, + c_spmat_z *c_observations) +{ + SparseSolver, + spmat_z, + dsmat_z, + spmat_z_elt, + c_spmat_z, + c_dsmat_z> ss(c_coefficients, c_observations); + return ss.solve(); +} + +c_spmat_z* c_eigen_spmat_z_least_squares_conjugate_gradient(c_spmat_z *c_coefficients, + c_spmat_z *c_observations) +{ + SparseSolver, + spmat_z, + dsmat_z, + spmat_z_elt, + c_spmat_z, + c_dsmat_z> ss(c_coefficients, c_observations); + return ss.solve(); +} + +c_spmat_z* c_eigen_spmat_z_BiCGSTAB(c_spmat_z *c_coefficients, + c_spmat_z *c_observations) +{ + SparseSolver, + spmat_z, + dsmat_z, + spmat_z_elt, + c_spmat_z, + c_dsmat_z> ss(c_coefficients, c_observations); + return ss.solve(); +} diff --git a/eigen_cpp/lib/sparse_solver.cpp b/eigen_cpp/lib/sparse_solver.cpp new file mode 100644 index 0000000..6d80ffc --- /dev/null +++ b/eigen_cpp/lib/sparse_solver.cpp @@ -0,0 +1,86 @@ +#include "sparse_solver.h" + +bool report_error(Eigen::ComputationInfo info) { + switch(info) { + case NumericalIssue: + std::cerr << "Solver Failed: Numerical Issue (prerequisites not met)" << std::endl; + return true; + case NoConvergence: + std::cerr << "Solver Failed: Did not converge" << std::endl; + return true; + case InvalidInput: + std::cerr << "Solver Failed: Invalid input" << std::endl; + return true; + case Success: + default: + return false; + } + } + +template +spmat& SparseSolver +::c_to_eigen(c_spmat* ptr) +{ + return *reinterpret_cast(ptr); +} + +template +c_spmat* SparseSolver +::eigen_to_c(spmat& ref) +{ + return reinterpret_cast(&ref); +} + +template +SparseSolver +::SparseSolver(c_spmat *c_coefficients, c_spmat *c_observations) +{ + spmat row_major_coeffs = c_to_eigen(c_coefficients).pruned(); + spmat row_major_observ = c_to_eigen(c_observations).pruned(); + + coefficients = new col_major_spmat(row_major_coeffs); + observations = new col_major_spmat(row_major_observ); + + coefficients->makeCompressed(); + observations->makeCompressed(); + + solver.compute(*coefficients); +} + +template +SparseSolver +::~SparseSolver() +{ + delete coefficients; + delete observations; +} + +template +c_spmat* SparseSolver::solve() +{ + col_major_spmat col_major_solution; + spmat* row_major_solution; + c_spmat* c_solution; + + if(report_error(SparseSolver::solver.info())) { return NULL; } + col_major_solution = SparseSolver::solver.solve(*observations); + row_major_solution = new spmat(col_major_solution); + if(report_error(SparseSolver::solver.info())) { return NULL; } + c_solution = eigen_to_c(*row_major_solution); + return c_solution; +} diff --git a/eigen_cpp/lib/sparse_solver.h b/eigen_cpp/lib/sparse_solver.h new file mode 100644 index 0000000..1feb491 --- /dev/null +++ b/eigen_cpp/lib/sparse_solver.h @@ -0,0 +1,27 @@ +#ifndef _SPARSE_SOLVER_H_ +#define _SPARSE_SOLVER_H_ + +template +class SparseSolver +{ + typedef SparseMatrix col_major_spmat; + + private: + col_major_spmat* coefficients; + col_major_spmat* observations; + spmat& c_to_eigen(c_spmat*); + c_spmat* eigen_to_c(spmat&); + + public: + Solver solver; + SparseSolver(c_spmat *c_coefficients, c_spmat *c_observations); + ~SparseSolver(); + c_spmat* solve(); +}; + +#include "sparse_solver.cpp" + +#endif From 31466a0eca02be9622026c92c891b2d0dcced8f8 Mon Sep 17 00:00:00 2001 From: Tyler Steele Date: Thu, 10 Oct 2019 10:27:11 -0400 Subject: [PATCH 2/2] remove extra type params --- eigen_cpp/lib/eigen_spmat_c.cpp | 28 +++++++--------------------- eigen_cpp/lib/eigen_spmat_d.cpp | 28 +++++++--------------------- eigen_cpp/lib/eigen_spmat_s.cpp | 28 +++++++--------------------- eigen_cpp/lib/eigen_spmat_z.cpp | 28 +++++++--------------------- 4 files changed, 28 insertions(+), 84 deletions(-) diff --git a/eigen_cpp/lib/eigen_spmat_c.cpp b/eigen_cpp/lib/eigen_spmat_c.cpp index 23be895..1719798 100644 --- a/eigen_cpp/lib/eigen_spmat_c.cpp +++ b/eigen_cpp/lib/eigen_spmat_c.cpp @@ -453,10 +453,8 @@ c_spmat_c* c_eigen_spmat_c_sparse_LU(c_spmat_c *c_coefficients, c_spmat_c *c_obs { SparseSolver, spmat_c, - dsmat_c, spmat_c_elt, - c_spmat_c, - c_dsmat_c> ss(c_coefficients, c_observations); + c_spmat_c> ss(c_coefficients, c_observations); return ss.solve(); } @@ -464,10 +462,8 @@ c_spmat_c* c_eigen_spmat_c_sparse_QR(c_spmat_c *c_coefficients, c_spmat_c *c_obs { SparseSolver >, spmat_c, - dsmat_c, spmat_c_elt, - c_spmat_c, - c_dsmat_c> ss(c_coefficients, c_observations); + c_spmat_c> ss(c_coefficients, c_observations); return ss.solve(); } @@ -476,10 +472,8 @@ c_spmat_c* c_eigen_spmat_c_simplicial_LLT(c_spmat_c *c_coefficients, { SparseSolver, spmat_c, - dsmat_c, spmat_c_elt, - c_spmat_c, - c_dsmat_c> ss(c_coefficients, c_observations); + c_spmat_c> ss(c_coefficients, c_observations); return ss.solve(); } @@ -488,10 +482,8 @@ c_spmat_c* c_eigen_spmat_c_simplicial_LDLT(c_spmat_c *c_coefficients, { SparseSolver, spmat_c, - dsmat_c, spmat_c_elt, - c_spmat_c, - c_dsmat_c> ss(c_coefficients, c_observations); + c_spmat_c> ss(c_coefficients, c_observations); return ss.solve(); } @@ -500,10 +492,8 @@ c_spmat_c* c_eigen_spmat_c_conjugate_gradient(c_spmat_c *c_coefficients, { SparseSolver, spmat_c, - dsmat_c, spmat_c_elt, - c_spmat_c, - c_dsmat_c> ss(c_coefficients, c_observations); + c_spmat_c> ss(c_coefficients, c_observations); return ss.solve(); } @@ -512,10 +502,8 @@ c_spmat_c* c_eigen_spmat_c_least_squares_conjugate_gradient(c_spmat_c *c_coeffic { SparseSolver, spmat_c, - dsmat_c, spmat_c_elt, - c_spmat_c, - c_dsmat_c> ss(c_coefficients, c_observations); + c_spmat_c> ss(c_coefficients, c_observations); return ss.solve(); } @@ -524,9 +512,7 @@ c_spmat_c* c_eigen_spmat_c_BiCGSTAB(c_spmat_c *c_coefficients, { SparseSolver, spmat_c, - dsmat_c, spmat_c_elt, - c_spmat_c, - c_dsmat_c> ss(c_coefficients, c_observations); + c_spmat_c> ss(c_coefficients, c_observations); return ss.solve(); } diff --git a/eigen_cpp/lib/eigen_spmat_d.cpp b/eigen_cpp/lib/eigen_spmat_d.cpp index ac4c112..fb2a0bb 100644 --- a/eigen_cpp/lib/eigen_spmat_d.cpp +++ b/eigen_cpp/lib/eigen_spmat_d.cpp @@ -444,10 +444,8 @@ c_spmat_d* c_eigen_spmat_d_sparse_LU(c_spmat_d *c_coefficients, c_spmat_d *c_obs { SparseSolver, spmat_d, - dsmat_d, spmat_d_elt, - c_spmat_d, - c_dsmat_d> ss(c_coefficients, c_observations); + c_spmat_d> ss(c_coefficients, c_observations); return ss.solve(); } @@ -455,10 +453,8 @@ c_spmat_d* c_eigen_spmat_d_sparse_QR(c_spmat_d *c_coefficients, c_spmat_d *c_obs { SparseSolver >, spmat_d, - dsmat_d, spmat_d_elt, - c_spmat_d, - c_dsmat_d> ss(c_coefficients, c_observations); + c_spmat_d> ss(c_coefficients, c_observations); return ss.solve(); } @@ -467,10 +463,8 @@ c_spmat_d* c_eigen_spmat_d_simplicial_LLT(c_spmat_d *c_coefficients, { SparseSolver, spmat_d, - dsmat_d, spmat_d_elt, - c_spmat_d, - c_dsmat_d> ss(c_coefficients, c_observations); + c_spmat_d> ss(c_coefficients, c_observations); return ss.solve(); } @@ -479,10 +473,8 @@ c_spmat_d* c_eigen_spmat_d_simplicial_LDLT(c_spmat_d *c_coefficients, { SparseSolver, spmat_d, - dsmat_d, spmat_d_elt, - c_spmat_d, - c_dsmat_d> ss(c_coefficients, c_observations); + c_spmat_d> ss(c_coefficients, c_observations); return ss.solve(); } @@ -491,10 +483,8 @@ c_spmat_d* c_eigen_spmat_d_conjugate_gradient(c_spmat_d *c_coefficients, { SparseSolver, spmat_d, - dsmat_d, spmat_d_elt, - c_spmat_d, - c_dsmat_d> ss(c_coefficients, c_observations); + c_spmat_d> ss(c_coefficients, c_observations); return ss.solve(); } @@ -503,10 +493,8 @@ c_spmat_d* c_eigen_spmat_d_least_squares_conjugate_gradient(c_spmat_d *c_coeffic { SparseSolver, spmat_d, - dsmat_d, spmat_d_elt, - c_spmat_d, - c_dsmat_d> ss(c_coefficients, c_observations); + c_spmat_d> ss(c_coefficients, c_observations); return ss.solve(); } @@ -515,9 +503,7 @@ c_spmat_d* c_eigen_spmat_d_BiCGSTAB(c_spmat_d *c_coefficients, { SparseSolver, spmat_d, - dsmat_d, spmat_d_elt, - c_spmat_d, - c_dsmat_d> ss(c_coefficients, c_observations); + c_spmat_d> ss(c_coefficients, c_observations); return ss.solve(); } diff --git a/eigen_cpp/lib/eigen_spmat_s.cpp b/eigen_cpp/lib/eigen_spmat_s.cpp index 8b3ec3a..4113975 100644 --- a/eigen_cpp/lib/eigen_spmat_s.cpp +++ b/eigen_cpp/lib/eigen_spmat_s.cpp @@ -444,10 +444,8 @@ c_spmat_s* c_eigen_spmat_s_sparse_LU(c_spmat_s *c_coefficients, c_spmat_s *c_obs { SparseSolver, spmat_s, - dsmat_s, spmat_s_elt, - c_spmat_s, - c_dsmat_s> ss(c_coefficients, c_observations); + c_spmat_s> ss(c_coefficients, c_observations); return ss.solve(); } @@ -455,10 +453,8 @@ c_spmat_s* c_eigen_spmat_s_sparse_QR(c_spmat_s *c_coefficients, c_spmat_s *c_obs { SparseSolver >, spmat_s, - dsmat_s, spmat_s_elt, - c_spmat_s, - c_dsmat_s> ss(c_coefficients, c_observations); + c_spmat_s> ss(c_coefficients, c_observations); return ss.solve(); } @@ -467,10 +463,8 @@ c_spmat_s* c_eigen_spmat_s_simplicial_LLT(c_spmat_s *c_coefficients, { SparseSolver, spmat_s, - dsmat_s, spmat_s_elt, - c_spmat_s, - c_dsmat_s> ss(c_coefficients, c_observations); + c_spmat_s> ss(c_coefficients, c_observations); return ss.solve(); } @@ -479,10 +473,8 @@ c_spmat_s* c_eigen_spmat_s_simplicial_LDLT(c_spmat_s *c_coefficients, { SparseSolver, spmat_s, - dsmat_s, spmat_s_elt, - c_spmat_s, - c_dsmat_s> ss(c_coefficients, c_observations); + c_spmat_s> ss(c_coefficients, c_observations); return ss.solve(); } @@ -491,10 +483,8 @@ c_spmat_s* c_eigen_spmat_s_conjugate_gradient(c_spmat_s *c_coefficients, { SparseSolver, spmat_s, - dsmat_s, spmat_s_elt, - c_spmat_s, - c_dsmat_s> ss(c_coefficients, c_observations); + c_spmat_s> ss(c_coefficients, c_observations); return ss.solve(); } @@ -503,10 +493,8 @@ c_spmat_s* c_eigen_spmat_s_least_squares_conjugate_gradient(c_spmat_s *c_coeffic { SparseSolver, spmat_s, - dsmat_s, spmat_s_elt, - c_spmat_s, - c_dsmat_s> ss(c_coefficients, c_observations); + c_spmat_s> ss(c_coefficients, c_observations); return ss.solve(); } @@ -515,9 +503,7 @@ c_spmat_s* c_eigen_spmat_s_BiCGSTAB(c_spmat_s *c_coefficients, { SparseSolver, spmat_s, - dsmat_s, spmat_s_elt, - c_spmat_s, - c_dsmat_s> ss(c_coefficients, c_observations); + c_spmat_s> ss(c_coefficients, c_observations); return ss.solve(); } diff --git a/eigen_cpp/lib/eigen_spmat_z.cpp b/eigen_cpp/lib/eigen_spmat_z.cpp index fe9822f..50e5d02 100644 --- a/eigen_cpp/lib/eigen_spmat_z.cpp +++ b/eigen_cpp/lib/eigen_spmat_z.cpp @@ -452,10 +452,8 @@ c_spmat_z* c_eigen_spmat_z_sparse_LU(c_spmat_z *c_coefficients, c_spmat_z *c_obs { SparseSolver, spmat_z, - dsmat_z, spmat_z_elt, - c_spmat_z, - c_dsmat_z> ss(c_coefficients, c_observations); + c_spmat_z> ss(c_coefficients, c_observations); return ss.solve(); } @@ -463,10 +461,8 @@ c_spmat_z* c_eigen_spmat_z_sparse_QR(c_spmat_z *c_coefficients, c_spmat_z *c_obs { SparseSolver >, spmat_z, - dsmat_z, spmat_z_elt, - c_spmat_z, - c_dsmat_z> ss(c_coefficients, c_observations); + c_spmat_z> ss(c_coefficients, c_observations); return ss.solve(); } @@ -475,10 +471,8 @@ c_spmat_z* c_eigen_spmat_z_simplicial_LLT(c_spmat_z *c_coefficients, { SparseSolver, spmat_z, - dsmat_z, spmat_z_elt, - c_spmat_z, - c_dsmat_z> ss(c_coefficients, c_observations); + c_spmat_z> ss(c_coefficients, c_observations); return ss.solve(); } @@ -487,10 +481,8 @@ c_spmat_z* c_eigen_spmat_z_simplicial_LDLT(c_spmat_z *c_coefficients, { SparseSolver, spmat_z, - dsmat_z, spmat_z_elt, - c_spmat_z, - c_dsmat_z> ss(c_coefficients, c_observations); + c_spmat_z> ss(c_coefficients, c_observations); return ss.solve(); } @@ -499,10 +491,8 @@ c_spmat_z* c_eigen_spmat_z_conjugate_gradient(c_spmat_z *c_coefficients, { SparseSolver, spmat_z, - dsmat_z, spmat_z_elt, - c_spmat_z, - c_dsmat_z> ss(c_coefficients, c_observations); + c_spmat_z> ss(c_coefficients, c_observations); return ss.solve(); } @@ -511,10 +501,8 @@ c_spmat_z* c_eigen_spmat_z_least_squares_conjugate_gradient(c_spmat_z *c_coeffic { SparseSolver, spmat_z, - dsmat_z, spmat_z_elt, - c_spmat_z, - c_dsmat_z> ss(c_coefficients, c_observations); + c_spmat_z> ss(c_coefficients, c_observations); return ss.solve(); } @@ -523,9 +511,7 @@ c_spmat_z* c_eigen_spmat_z_BiCGSTAB(c_spmat_z *c_coefficients, { SparseSolver, spmat_z, - dsmat_z, spmat_z_elt, - c_spmat_z, - c_dsmat_z> ss(c_coefficients, c_observations); + c_spmat_z> ss(c_coefficients, c_observations); return ss.solve(); }