changeset 5893:d73ffe42f2c8

[project @ 2006-07-16 07:48:19 by jwe]
author jwe
date Sun, 16 Jul 2006 07:49:03 +0000
parents 13aa80fc7839
children acf8b96ca9c9
files liboctave/CSparse.cc liboctave/ChangeLog liboctave/MatrixType.cc liboctave/SparseCmplxLU.cc liboctave/SparsedbleLU.cc liboctave/dSparse.cc liboctave/oct-spparms.cc liboctave/oct-spparms.h liboctave/sparse-base-chol.cc src/DLD-FUNCTIONS/spchol.cc src/DLD-FUNCTIONS/spparms.cc
diffstat 11 files changed, 270 insertions(+), 143 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/CSparse.cc
+++ b/liboctave/CSparse.cc
@@ -1061,11 +1061,11 @@
       double *control = Control.fortran_vec ();
       UMFPACK_ZNAME (defaults) (control);
 
-      double tmp = Voctave_sparse_controls.get_key ("spumoni");
+      double tmp = octave_sparse_params::get_key ("spumoni");
       if (!xisnan (tmp))
 	Control (UMFPACK_PRL) = tmp;
 
-      tmp = Voctave_sparse_controls.get_key ("piv_tol");
+      tmp = octave_sparse_params::get_key ("piv_tol");
       if (!xisnan (tmp))
 	{
 	  Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp;
@@ -1073,7 +1073,7 @@
 	}
 
       // Set whether we are allowed to modify Q or not
-      tmp = Voctave_sparse_controls.get_key ("autoamd");
+      tmp = octave_sparse_params::get_key ("autoamd");
       if (!xisnan (tmp))
 	Control (UMFPACK_FIXQ) = tmp;
 
@@ -5544,10 +5544,10 @@
   double *control = Control.fortran_vec ();
   UMFPACK_ZNAME (defaults) (control);
 
-  double tmp = Voctave_sparse_controls.get_key ("spumoni");
+  double tmp = octave_sparse_params::get_key ("spumoni");
   if (!xisnan (tmp))
     Control (UMFPACK_PRL) = tmp;
-  tmp = Voctave_sparse_controls.get_key ("piv_tol");
+  tmp = octave_sparse_params::get_key ("piv_tol");
   if (!xisnan (tmp))
     {
       Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp;
@@ -5555,7 +5555,7 @@
     }
 
   // Set whether we are allowed to modify Q or not
-  tmp = Voctave_sparse_controls.get_key ("autoamd");
+  tmp = octave_sparse_params::get_key ("autoamd");
   if (!xisnan (tmp))
     Control (UMFPACK_FIXQ) = tmp;
 
@@ -5675,7 +5675,7 @@
 	  CHOLMOD_NAME(start) (cm);
 	  cm->prefer_zomplex = false;
 
-	  double spu = Voctave_sparse_controls.get_key ("spumoni");
+	  double spu = octave_sparse_params::get_key ("spumoni");
 	  if (spu == 0.)
 	    {
 	      cm->print = -1;
@@ -5932,7 +5932,7 @@
 	  CHOLMOD_NAME(start) (cm);
 	  cm->prefer_zomplex = false;
 
-	  double spu = Voctave_sparse_controls.get_key ("spumoni");
+	  double spu = octave_sparse_params::get_key ("spumoni");
 	  if (spu == 0.)
 	    {
 	      cm->print = -1;
@@ -6240,7 +6240,7 @@
 	  CHOLMOD_NAME(start) (cm);
 	  cm->prefer_zomplex = false;
 
-	  double spu = Voctave_sparse_controls.get_key ("spumoni");
+	  double spu = octave_sparse_params::get_key ("spumoni");
 	  if (spu == 0.)
 	    {
 	      cm->print = -1;
@@ -6479,7 +6479,7 @@
 	  CHOLMOD_NAME(start) (cm);
 	  cm->prefer_zomplex = false;
 
-	  double spu = Voctave_sparse_controls.get_key ("spumoni");
+	  double spu = octave_sparse_params::get_key ("spumoni");
 	  if (spu == 0.)
 	    {
 	      cm->print = -1;
--- a/liboctave/ChangeLog
+++ b/liboctave/ChangeLog
@@ -1,3 +1,15 @@
+2006-07-16  John W. Eaton  <jwe@octave.org>
+
+	* oct-spparms.h, oct-spparms.cc (class octave_sparse_params):
+	Rename from SparseParams.  Use same implementation method as other
+	singleton classes in Octave.  Change all uses of
+	Voctave_sparse_controls to use static functions from
+	octave_sparse_params class instead.
+
+	* oct-spparms.h, oct-spparms.cc (SparseParams::set_key,
+	SparseParams::get_key): Pass std::string arg by const reference,
+	not const value.
+
 2006-07-15  John W. Eaton  <jwe@octave.org>
 
 	* data-conv.cc: Instantiante swap_bytes templates here.
--- a/liboctave/MatrixType.cc
+++ b/liboctave/MatrixType.cc
@@ -37,7 +37,7 @@
 
 MatrixType::MatrixType (void)
   : typ (MatrixType::Unknown),
-    sp_bandden (Voctave_sparse_controls.get_key ("bandden")),
+    sp_bandden (octave_sparse_params::get_key ("bandden")),
     bandden (0), upper_band (0), lower_band (0), dense (false),
     full (false), nperm (0), perm (0) { }
 
@@ -184,11 +184,11 @@
   octave_idx_type nm = (ncols < nrows ? ncols : nrows);
   octave_idx_type nnz = a.nzmax ();
 
-  if (Voctave_sparse_controls.get_key ("spumoni") != 0.)
+  if (octave_sparse_params::get_key ("spumoni") != 0.)
     (*current_liboctave_warning_handler) 
       ("Calculating Sparse Matrix Type");
 
-  sp_bandden = Voctave_sparse_controls.get_key ("bandden");
+  sp_bandden = octave_sparse_params::get_key ("bandden");
   bool maybe_hermitian = false;
   typ = MatrixType::Full;
 
@@ -510,12 +510,12 @@
   octave_idx_type nm = (ncols < nrows ? ncols : nrows);
   octave_idx_type nnz = a.nzmax ();
 
-  if (Voctave_sparse_controls.get_key ("spumoni") != 0.)  full = true;
+  if (octave_sparse_params::get_key ("spumoni") != 0.)  full = true;
 
     (*current_liboctave_warning_handler) 
       ("Calculating Sparse Matrix Type");
 
-  sp_bandden = Voctave_sparse_controls.get_key ("bandden");
+  sp_bandden = octave_sparse_params::get_key ("bandden");
   bool maybe_hermitian = false;
   typ = MatrixType::Full;
 
@@ -828,7 +828,7 @@
 }
 MatrixType::MatrixType (const matrix_type t, bool _full)
   : typ (MatrixType::Unknown),
-    sp_bandden (Voctave_sparse_controls.get_key ("bandden")),
+    sp_bandden (octave_sparse_params::get_key ("bandden")),
     bandden (0), upper_band (0), lower_band (0),
     dense (false), full (_full), nperm (0), perm (0)
 {
@@ -844,7 +844,7 @@
 MatrixType::MatrixType (const matrix_type t, const octave_idx_type np,
 			const octave_idx_type *p, bool _full)
   : typ (MatrixType::Unknown),
-    sp_bandden (Voctave_sparse_controls.get_key ("bandden")),
+    sp_bandden (octave_sparse_params::get_key ("bandden")),
     bandden (0), upper_band (0), lower_band (0),
     dense (false), full (_full), nperm (0), perm (0)
 {
@@ -863,7 +863,7 @@
 MatrixType::MatrixType (const matrix_type t, const octave_idx_type ku,
 			const octave_idx_type kl, bool _full)
   : typ (MatrixType::Unknown),
-    sp_bandden (Voctave_sparse_controls.get_key ("bandden")),
+    sp_bandden (octave_sparse_params::get_key ("bandden")),
     bandden (0), upper_band (0), lower_band (0),
     dense (false), full (_full), nperm (0), perm (0)
 {
@@ -914,10 +914,10 @@
 MatrixType::type (bool quiet)
 {
   if (typ != MatrixType::Unknown && (full ||
-      sp_bandden == Voctave_sparse_controls.get_key ("bandden")))
+      sp_bandden == octave_sparse_params::get_key ("bandden")))
     {
       if (!quiet &&
-	  Voctave_sparse_controls.get_key ("spumoni") != 0.)
+	  octave_sparse_params::get_key ("spumoni") != 0.)
   	(*current_liboctave_warning_handler) 
   	  ("Using Cached Matrix Type");
       
@@ -925,7 +925,7 @@
     }
 
   if (typ != MatrixType::Unknown && 
-      Voctave_sparse_controls.get_key ("spumoni") != 0.)
+      octave_sparse_params::get_key ("spumoni") != 0.)
     (*current_liboctave_warning_handler) 
       ("Invalidating Matrix Type");
 
@@ -938,9 +938,9 @@
 MatrixType::type (const SparseMatrix &a)
 {
   if (typ != MatrixType::Unknown && (full ||
-      sp_bandden == Voctave_sparse_controls.get_key ("bandden")))
+      sp_bandden == octave_sparse_params::get_key ("bandden")))
     {
-      if (Voctave_sparse_controls.get_key ("spumoni") != 0.)
+      if (octave_sparse_params::get_key ("spumoni") != 0.)
   	(*current_liboctave_warning_handler) 
   	  ("Using Cached Matrix Type");
       
@@ -971,9 +971,9 @@
 MatrixType::type (const SparseComplexMatrix &a)
 {
   if (typ != MatrixType::Unknown && (full || 
-      sp_bandden == Voctave_sparse_controls.get_key ("bandden")))
+      sp_bandden == octave_sparse_params::get_key ("bandden")))
     {
-      if (Voctave_sparse_controls.get_key ("spumoni") != 0.)
+      if (octave_sparse_params::get_key ("spumoni") != 0.)
   	(*current_liboctave_warning_handler) 
   	  ("Using Cached Matrix Type");
       
@@ -1004,7 +1004,7 @@
 {
   if (typ != MatrixType::Unknown)
     {
-      if (Voctave_sparse_controls.get_key ("spumoni") != 0.)
+      if (octave_sparse_params::get_key ("spumoni") != 0.)
   	(*current_liboctave_warning_handler) 
   	  ("Using Cached Matrix Type");
       
@@ -1031,7 +1031,7 @@
 {
   if (typ != MatrixType::Unknown)
     {
-      if (Voctave_sparse_controls.get_key ("spumoni") != 0.)
+      if (octave_sparse_params::get_key ("spumoni") != 0.)
   	(*current_liboctave_warning_handler) 
   	  ("Using Cached Matrix Type");
       
@@ -1056,7 +1056,7 @@
 void
 MatrixType::info () const
 {
-  if (Voctave_sparse_controls.get_key ("spumoni") != 0.)
+  if (octave_sparse_params::get_key ("spumoni") != 0.)
     {
       if (typ == MatrixType::Unknown)
 	(*current_liboctave_warning_handler) 
--- a/liboctave/SparseCmplxLU.cc
+++ b/liboctave/SparseCmplxLU.cc
@@ -52,7 +52,7 @@
   double *control = Control.fortran_vec ();
   UMFPACK_ZNAME (defaults) (control);
 
-  double tmp = Voctave_sparse_controls.get_key ("spumoni");
+  double tmp = octave_sparse_params::get_key ("spumoni");
   if (!xisnan (tmp))
     Control (UMFPACK_PRL) = tmp;
   if (piv_thres >= 0.)
@@ -63,7 +63,7 @@
     }
   else
     {
-      tmp = Voctave_sparse_controls.get_key ("piv_tol");
+      tmp = octave_sparse_params::get_key ("piv_tol");
       if (!xisnan (tmp))
 	{
 	  Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp;
@@ -72,7 +72,7 @@
     }
 
   // Set whether we are allowed to modify Q or not
-  tmp = Voctave_sparse_controls.get_key ("autoamd");
+  tmp = octave_sparse_params::get_key ("autoamd");
   if (!xisnan (tmp))
     Control (UMFPACK_FIXQ) = tmp;
 
@@ -240,7 +240,7 @@
       double *control = Control.fortran_vec ();
       UMFPACK_ZNAME (defaults) (control);
 
-      double tmp = Voctave_sparse_controls.get_key ("spumoni");
+      double tmp = octave_sparse_params::get_key ("spumoni");
       if (!xisnan (tmp))
 	Control (UMFPACK_PRL) = tmp;
       if (piv_thres >= 0.)
@@ -251,7 +251,7 @@
 	}
       else
 	{
-	  tmp = Voctave_sparse_controls.get_key ("piv_tol");
+	  tmp = octave_sparse_params::get_key ("piv_tol");
 	  if (!xisnan (tmp))
 	    {
 	      Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp;
@@ -267,7 +267,7 @@
 	Control (UMFPACK_FIXQ) = 1.0;
       else
 	{
-	  tmp = Voctave_sparse_controls.get_key ("autoamd");
+	  tmp = octave_sparse_params::get_key ("autoamd");
 	  if (!xisnan (tmp))
 	    Control (UMFPACK_FIXQ) = tmp;
 	}
--- a/liboctave/SparsedbleLU.cc
+++ b/liboctave/SparsedbleLU.cc
@@ -51,7 +51,7 @@
   double *control = Control.fortran_vec ();
   UMFPACK_DNAME (defaults) (control);
 
-  double tmp = Voctave_sparse_controls.get_key ("spumoni");
+  double tmp = octave_sparse_params::get_key ("spumoni");
   if (!xisnan (tmp))
     Control (UMFPACK_PRL) = tmp;
 
@@ -63,7 +63,7 @@
     }
   else
     {
-      tmp = Voctave_sparse_controls.get_key ("piv_tol");
+      tmp = octave_sparse_params::get_key ("piv_tol");
       if (!xisnan (tmp))
 	{
 	  Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp;
@@ -72,7 +72,7 @@
     }
 
   // Set whether we are allowed to modify Q or not
-  tmp = Voctave_sparse_controls.get_key ("autoamd");
+  tmp = octave_sparse_params::get_key ("autoamd");
   if (!xisnan (tmp))
     Control (UMFPACK_FIXQ) = tmp;
 
@@ -228,7 +228,7 @@
       double *control = Control.fortran_vec ();
       UMFPACK_DNAME (defaults) (control);
 
-      double tmp = Voctave_sparse_controls.get_key ("spumoni");
+      double tmp = octave_sparse_params::get_key ("spumoni");
       if (!xisnan (tmp))
 	Control (UMFPACK_PRL) = tmp;
       if (piv_thres >= 0.)
@@ -239,7 +239,7 @@
 	}
       else
 	{
-	  tmp = Voctave_sparse_controls.get_key ("piv_tol");
+	  tmp = octave_sparse_params::get_key ("piv_tol");
 	  if (!xisnan (tmp))
 	    {
 	      Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp;
@@ -256,7 +256,7 @@
 	Control (UMFPACK_FIXQ) = 1.0;
       else
 	{
-	  tmp = Voctave_sparse_controls.get_key ("autoamd");
+	  tmp = octave_sparse_params::get_key ("autoamd");
 	  if (!xisnan (tmp))
 	    Control (UMFPACK_FIXQ) = tmp;
 	}
--- a/liboctave/dSparse.cc
+++ b/liboctave/dSparse.cc
@@ -1137,11 +1137,11 @@
       double *control = Control.fortran_vec ();
       UMFPACK_DNAME (defaults) (control);
 
-      double tmp = Voctave_sparse_controls.get_key ("spumoni");
+      double tmp = octave_sparse_params::get_key ("spumoni");
       if (!xisnan (tmp))
 	Control (UMFPACK_PRL) = tmp;
 
-      tmp = Voctave_sparse_controls.get_key ("piv_tol");
+      tmp = octave_sparse_params::get_key ("piv_tol");
       if (!xisnan (tmp))
 	{
 	  Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp;
@@ -1149,7 +1149,7 @@
 	}
 
       // Set whether we are allowed to modify Q or not
-      tmp = Voctave_sparse_controls.get_key ("autoamd");
+      tmp = octave_sparse_params::get_key ("autoamd");
       if (!xisnan (tmp))
 	Control (UMFPACK_FIXQ) = tmp;
 
@@ -5765,10 +5765,10 @@
   double *control = Control.fortran_vec ();
   UMFPACK_DNAME (defaults) (control);
 
-  double tmp = Voctave_sparse_controls.get_key ("spumoni");
+  double tmp = octave_sparse_params::get_key ("spumoni");
   if (!xisnan (tmp))
     Control (UMFPACK_PRL) = tmp;
-  tmp = Voctave_sparse_controls.get_key ("piv_tol");
+  tmp = octave_sparse_params::get_key ("piv_tol");
   if (!xisnan (tmp))
     {
       Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp;
@@ -5776,7 +5776,7 @@
     }
 
   // Set whether we are allowed to modify Q or not
-  tmp = Voctave_sparse_controls.get_key ("autoamd");
+  tmp = octave_sparse_params::get_key ("autoamd");
   if (!xisnan (tmp))
     Control (UMFPACK_FIXQ) = tmp;
 
@@ -5893,7 +5893,7 @@
 	  CHOLMOD_NAME(start) (cm);
 	  cm->prefer_zomplex = false;
 
-	  double spu = Voctave_sparse_controls.get_key ("spumoni");
+	  double spu = octave_sparse_params::get_key ("spumoni");
 	  if (spu == 0.)
 	    {
 	      cm->print = -1;
@@ -6124,7 +6124,7 @@
 	  CHOLMOD_NAME(start) (cm);
 	  cm->prefer_zomplex = false;
 
-	  double spu = Voctave_sparse_controls.get_key ("spumoni");
+	  double spu = octave_sparse_params::get_key ("spumoni");
 	  if (spu == 0.)
 	    {
 	      cm->print = -1;
@@ -6403,7 +6403,7 @@
 	  CHOLMOD_NAME(start) (cm);
 	  cm->prefer_zomplex = false;
 
-	  double spu = Voctave_sparse_controls.get_key ("spumoni");
+	  double spu = octave_sparse_params::get_key ("spumoni");
 	  if (spu == 0.)
 	    {
 	      cm->print = -1;
@@ -6654,7 +6654,7 @@
 	  CHOLMOD_NAME(start) (cm);
 	  cm->prefer_zomplex = false;
 
-	  double spu = Voctave_sparse_controls.get_key ("spumoni");
+	  double spu = octave_sparse_params::get_key ("spumoni");
 	  if (spu == 0.)
 	    {
 	      cm->print = -1;
--- a/liboctave/oct-spparms.cc
+++ b/liboctave/oct-spparms.cc
@@ -20,97 +20,189 @@
 
 */
 
-#include "config.h"
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "lo-error.h"
 #include "lo-ieee.h"
 
 #include "oct-spparms.h"
 
-SparseParams Voctave_sparse_controls;
+octave_sparse_params *octave_sparse_params::instance = 0;
+
+bool
+octave_sparse_params::instance_ok (void)
+{
+  bool retval = true;
+
+  if (! instance)
+    instance = new octave_sparse_params ();
+
+  if (! instance)
+    {
+      (*current_liboctave_error_handler)
+	("unable to create octave_sparse_params object!");
+
+      retval = false;
+    }
+
+  return retval;
+}
+
+void
+octave_sparse_params::defaults (void)
+{
+  if (instance_ok ())
+    instance->do_defaults ();
+}
 
 void
-SparseParams::defaults (void)
+octave_sparse_params::tight (void)
+{
+  if (instance_ok ())
+    instance->do_tight ();
+}
+
+string_vector
+octave_sparse_params::get_keys (void)
+{
+  return instance_ok () ? instance->do_get_keys () : string_vector ();
+}
+
+ColumnVector
+octave_sparse_params::get_vals (void)
+{
+  return instance_ok () ? instance->do_get_vals () : ColumnVector ();
+}
+
+bool
+octave_sparse_params::set_vals (const NDArray& vals)
 {
-  Voctave_sparse_controls (0) = 0;    // spumoni
-  Voctave_sparse_controls (1) = 1;    // ths_rel
-  Voctave_sparse_controls (2) = 1;    // ths_abs
-  Voctave_sparse_controls (3) = 0;    // exact_d
-  Voctave_sparse_controls (4) = 3;    // supernd
-  Voctave_sparse_controls (5) = 3;    // rreduce
-  Voctave_sparse_controls (6) = 0.5;  // wh_frac
-  Voctave_sparse_controls (7) = 1;    // autommd
-  Voctave_sparse_controls (8) = 1;    // autoamd
-  Voctave_sparse_controls (9) = 0.1;  // piv_tol
-  Voctave_sparse_controls (10) = 0.5; // bandden
-  Voctave_sparse_controls (11) = 1;   // umfpack
+  return instance_ok () ? instance->do_set_vals (vals) : false;
+}
+
+bool
+octave_sparse_params::set_key (const std::string& key, const double& val)
+{
+  return instance_ok () ? instance->do_set_key (key, val) : false;
+}
+
+double
+octave_sparse_params::get_key (const std::string& key)
+{
+  return instance_ok () ? instance->do_get_key (key) : octave_NaN;
+}
+
+void
+octave_sparse_params::print_info (std::ostream& os, const std::string& prefix)
+{
+  if (instance_ok ())
+    instance->do_print_info (os, prefix);
 }
 
 void
-SparseParams::tight (void)
+octave_sparse_params::do_defaults (void)
 {
-  Voctave_sparse_controls (0) = 0;    // spumoni
-  Voctave_sparse_controls (1) = 1;    // ths_rel
-  Voctave_sparse_controls (2) = 0;    // ths_abs
-  Voctave_sparse_controls (3) = 1;    // exact_d
-  Voctave_sparse_controls (4) = 1;    // supernd
-  Voctave_sparse_controls (5) = 1;    // rreduce
-  Voctave_sparse_controls (6) = 0.5;  // wh_frac
-  Voctave_sparse_controls (7) = 1;    // autommd
-  Voctave_sparse_controls (8) = 1;    // autoamd
-  Voctave_sparse_controls (9) = 0.1;  // piv_tol
-  Voctave_sparse_controls (10) = 0.5; // bandden
-  Voctave_sparse_controls (11) = 1;   // umfpack
+  params(0) = 0;    // spumoni
+  params(1) = 1;    // ths_rel
+  params(2) = 1;    // ths_abs
+  params(3) = 0;    // exact_d
+  params(4) = 3;    // supernd
+  params(5) = 3;    // rreduce
+  params(6) = 0.5;  // wh_frac
+  params(7) = 1;    // autommd
+  params(8) = 1;    // autoamd
+  params(9) = 0.1;  // piv_tol
+  params(10) = 0.5; // bandden
+  params(11) = 1;   // umfpack
+}
+
+void
+octave_sparse_params::do_tight (void)
+{
+  params(0) = 0;    // spumoni
+  params(1) = 1;    // ths_rel
+  params(2) = 0;    // ths_abs
+  params(3) = 1;    // exact_d
+  params(4) = 1;    // supernd
+  params(5) = 1;    // rreduce
+  params(6) = 0.5;  // wh_frac
+  params(7) = 1;    // autommd
+  params(8) = 1;    // autoamd
+  params(9) = 0.1;  // piv_tol
+  params(10) = 0.5; // bandden
+  params(11) = 1;   // umfpack
 }
   
 void
-SparseParams::init_keys (void)
+octave_sparse_params::init_keys (void)
 {
-  keys (0) = "spumoni";
-  keys (1) = "ths_rel";
-  keys (2) = "ths_abs";
-  keys (3) = "exact_d";
-  keys (4) = "supernd";
-  keys (5) = "rreduce";
-  keys (6) = "wh_frac";
-  keys (7) = "autommd";
-  keys (8) = "autoamd";
-  keys (9) = "piv_tol";
-  keys (10) = "bandden";
-  keys (11) = "umfpack";
-}
-
-SparseParams& 
-SparseParams::operator = (const SparseParams& a)
-{
-  for (int i = 0; i < OCTAVE_SPARSE_CONTROLS_SIZE; i++)
-    params (i) = a.params (i);
-
-  return *this;
+  keys(0) = "spumoni";
+  keys(1) = "ths_rel";
+  keys(2) = "ths_abs";
+  keys(3) = "exact_d";
+  keys(4) = "supernd";
+  keys(5) = "rreduce";
+  keys(6) = "wh_frac";
+  keys(7) = "autommd";
+  keys(8) = "autoamd";
+  keys(9) = "piv_tol";
+  keys(10) = "bandden";
+  keys(11) = "umfpack";
 }
 
 bool
-SparseParams::set_key (const std::string key, const double& val)
+octave_sparse_params::do_set_vals (const NDArray& vals)
+{
+  octave_idx_type len = vals.length ();
+
+  if (len > OCTAVE_SPARSE_CONTROLS_SIZE)
+    {
+      (*current_liboctave_error_handler)
+	("octave_sparse_params::do_set_vals: too many values");
+
+      return false;
+    }
+  else
+    {
+      for (int i = 0; i < len; i++)
+	params(i) = vals(i);
+
+      return true;
+    }
+}
+
+bool
+octave_sparse_params::do_set_key (const std::string& key, const double& val)
 {
   for (int i = 0; i < OCTAVE_SPARSE_CONTROLS_SIZE; i++)
-    if (keys (i) == key)
-      {
-	params(i) = val;
-	return true;
-      }
+    {
+      if (keys (i) == key)
+	{
+	  params(i) = val;
+	  return true;
+	}
+    }
+
   return false;
 }
 
 double
-SparseParams::get_key (const std::string key)
+octave_sparse_params::do_get_key (const std::string& key)
 {
   for (int i = 0; i < OCTAVE_SPARSE_CONTROLS_SIZE; i++)
-    if (keys (i) == key)
+    {
+      if (keys (i) == key)
 	return params(i);
+    }
 
   return octave_NaN;
 }
 
 void
-SparseParams::print_info (std::ostream& os, const std::string& prefix) const
+octave_sparse_params::do_print_info (std::ostream& os,
+				     const std::string& prefix) const
 {
   for (int i = 0; i < OCTAVE_SPARSE_CONTROLS_SIZE; i++)
     os << prefix << keys(i) << ": " << params(i) << "\n";
--- a/liboctave/oct-spparms.h
+++ b/liboctave/oct-spparms.h
@@ -30,45 +30,69 @@
 
 #include "str-vec.h"
 #include "dColVector.h"
+#include "dNDArray.h"
 
 #define OCTAVE_SPARSE_CONTROLS_SIZE 12
 
 class
-SparseParams
+octave_sparse_params
 {
- public:
-  SparseParams (void) : params (ColumnVector (OCTAVE_SPARSE_CONTROLS_SIZE)), 
-    keys (string_vector (OCTAVE_SPARSE_CONTROLS_SIZE)) 
-    { defaults (); init_keys (); }
-  
-  void defaults (void);
+protected:
 
-  void tight (void);
-  
-  SparseParams& operator = (const SparseParams& a);
+  octave_sparse_params (void)
+    : params (OCTAVE_SPARSE_CONTROLS_SIZE),
+      keys (OCTAVE_SPARSE_CONTROLS_SIZE) 
+  {
+    init_keys ();
+    do_defaults ();
+  }
+
+public:
+
+  static bool instance_ok (void);
+
+  static void defaults (void);
+
+  static void tight (void);
   
-  double& operator () (int n) { return params (n); }
-  double operator () (int n) const { return params (n); }
+  static string_vector get_keys (void);
 
-  string_vector get_keys (void) const { return keys; }
+  static ColumnVector get_vals (void);
 
-  ColumnVector get_vals (void) const { return params; }
+  static bool set_vals (const NDArray& vals);
 
-  bool set_key (const std::string key, const double& val);
+  static bool set_key (const std::string& key, const double& val);
 
-  double get_key (const std::string key);
+  static double get_key (const std::string& key);
 
-  void print_info (std::ostream& os, const std::string& prefix) const;
-  
- private:
-  void init_keys (void);
+  static void print_info (std::ostream& os, const std::string& prefix);
+
+private:
 
   ColumnVector params;
 
   string_vector keys;
-};
+
+  static octave_sparse_params *instance;
+
+  void do_defaults (void);
+
+  void do_tight (void);
+  
+  string_vector do_get_keys (void) const { return keys; }
+
+  ColumnVector do_get_vals (void) const { return params; }
 
-extern SparseParams Voctave_sparse_controls;
+  bool do_set_vals (const NDArray& vals);
+
+  bool do_set_key (const std::string& key, const double& val);
+
+  double do_get_key (const std::string& key);
+
+  void do_print_info (std::ostream& os, const std::string& prefix) const;
+  
+  void init_keys (void);
+};
 
 #endif
 
--- a/liboctave/sparse-base-chol.cc
+++ b/liboctave/sparse-base-chol.cc
@@ -99,7 +99,7 @@
   CHOLMOD_NAME(start) (cm);
   cm->prefer_zomplex = false;
 
-  double spu = Voctave_sparse_controls.get_key ("spumoni");
+  double spu = octave_sparse_params::get_key ("spumoni");
   if (spu == 0.)
     {
       cm->print = -1;
--- a/src/DLD-FUNCTIONS/spchol.cc
+++ b/src/DLD-FUNCTIONS/spchol.cc
@@ -398,7 +398,7 @@
   cholmod_common *cm = &Common;
   CHOLMOD_NAME(start) (cm);
 
-  double spu = Voctave_sparse_controls.get_key ("spumoni");
+  double spu = octave_sparse_params::get_key ("spumoni");
   if (spu == 0.)
     {
       cm->print = -1;
--- a/src/DLD-FUNCTIONS/spparms.cc
+++ b/src/DLD-FUNCTIONS/spparms.cc
@@ -91,13 +91,13 @@
   if (nargin == 0)
     {
       if (nargout == 0)
-	Voctave_sparse_controls.print_info (octave_stdout, "");
+	octave_sparse_params::print_info (octave_stdout, "");
       else if (nargout == 1)
-	retval(0) =  Voctave_sparse_controls.get_vals ();
+	retval(0) =  octave_sparse_params::get_vals ();
       else if (nargout == 2)
 	{
-	  retval (0) = Voctave_sparse_controls.get_keys ();
-	  retval (1) = Voctave_sparse_controls.get_vals ();
+	  retval (0) = octave_sparse_params::get_keys ();
+	  retval (1) = octave_sparse_params::get_vals ();
 	}
       else
 	error ("spparms: too many output arguments"); 
@@ -112,12 +112,12 @@
 	    str [i] = tolower (str [i]);
 
 	  if (str == "defaults")
-	    Voctave_sparse_controls.defaults ();
+	    octave_sparse_params::defaults ();
 	  else if (str == "tight")
-	    Voctave_sparse_controls.tight ();
+	    octave_sparse_params::tight ();
 	  else
 	    {
-	      double val = Voctave_sparse_controls.get_key (str);
+	      double val = octave_sparse_params::get_key (str);
 	      if (xisnan (val))
 		error ("spparams: unrecognized key");
 	      else
@@ -133,8 +133,7 @@
 	  else if (vals.numel () > OCTAVE_SPARSE_CONTROLS_SIZE)
 	    error ("spparams: too many elements in values vector");
 	  else
-	    for (int i = 0; i < vals.length (); i++)
-	      Voctave_sparse_controls (i) = vals (i);
+	    octave_sparse_params::set_vals (vals);
 	}
     }
   else if (nargin == 2)
@@ -149,7 +148,7 @@
 	    error ("spparms: second argument must be a real scalar");
           else if (str == "umfpack")
 	    warning ("spparms: request to disable umfpack solvers ignored");
-	  else if (!Voctave_sparse_controls.set_key (str, val))
+	  else if (!octave_sparse_params::set_key (str, val))
 	    error ("spparms: key not found");
 	}
       else