changeset 7193:cbdee3da62bd

[project @ 2007-11-26 22:20:25 by dbateman]
author dbateman
date Mon, 26 Nov 2007 22:20:25 +0000
parents 10b8361ff085
children a927a2871a93
files src/ChangeLog src/ov-base.cc src/ov-base.h src/ov-bool-sparse.cc src/ov-cx-sparse.cc src/ov-re-sparse.cc
diffstat 6 files changed, 107 insertions(+), 49 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Mon Nov 26 21:44:54 2007 +0000
+++ b/src/ChangeLog	Mon Nov 26 22:20:25 2007 +0000
@@ -1,5 +1,17 @@
 2007-11-26  David Bateman  <dbateman@free.fr>
 
+	* ov-base.cc (Vsparse_auto_mutate, Fsparse_auto_mutate): New
+	internal variable and built-in function to set it.
+	* ov-base.h (extern bool Vsparse_auto_mutate): Export internal
+	variable to other functions.
+	* ov-re-sparse.cc (octave_sparse_matrix::try_narrowing_conversion
+	(void)), ov-cx-sparse.cc 
+	(octave_sparse_complex_matrix::try_narrowing_conversion (void)), 
+	ov-bool-sparse.cc
+	(octave_sparse_bool_matrix::try_narrowing_conversion (void)):
+	Use Vsparse_auto_mutate flag to determine whether to convert
+	sparse matrices to full matrices if that saves space.
+
 	* DLD-FUNCTIONS/minmax.cc (MINMAX_DOUBLE_BODY): New version of
 	MINMAX_BODY macro without the initialization.
 	(MINMAX_INT_BODY): Macro for min/max for the integer types
--- a/src/ov-base.cc	Mon Nov 26 21:44:54 2007 +0000
+++ b/src/ov-base.cc	Mon Nov 26 22:20:25 2007 +0000
@@ -65,6 +65,10 @@
 // semicolon has been appended to each statement).
 static bool Vsilent_functions = false;
 
+// TRUE means to perform automatic sparse to real mutation if there
+// is memory to be saved
+bool Vsparse_auto_mutate = false;
+
 octave_value
 octave_base_value::squeeze (void) const
 {
@@ -1131,6 +1135,30 @@
   return SET_INTERNAL_VARIABLE (silent_functions);
 }
 
+DEFUN (sparse_auto_mutate, args, nargout,
+  "-*- texinfo -*-\n\
+@deftypefn {Built-in Function} {@var{val} =} sparse_auto_mutate ()\n\
+@deftypefnx {Built-in Function} {@var{old_val} =} sparse_auto_mutate (@var{new_val})\n\
+Query or set the internal variable that controls whether Octave will\n\
+automatically mutate sparse matrices to real matrices to save memory.\n\
+For example,\n\
+\n\
+@example\n\
+s = speye(3);\n\
+sparse_auto_mutate (false)\n\
+s (:, 1) = 1;\n\
+typeinfo (s)\n\
+@result{} sparse matrix\n\
+sparse_auto_mutate (true)\n\
+s (1, :) = 1;\n\
+typeinfo (s)\n\
+@result{} matrix\n\
+@end example\n\
+@end deftypefn")
+{
+  return SET_INTERNAL_VARIABLE (sparse_auto_mutate);
+}
+
 /*
 ;;; Local Variables: ***
 ;;; mode: C++ ***
--- a/src/ov-base.h	Mon Nov 26 21:44:54 2007 +0000
+++ b/src/ov-base.h	Mon Nov 26 22:20:25 2007 +0000
@@ -487,6 +487,10 @@
   DECLARE_OV_BASE_TYPEID_FUNCTIONS_AND_DATA
 };
 
+// TRUE means to perform automatic sparse to real mutation if there
+// is memory to be saved
+extern bool Vsparse_auto_mutate;
+
 #endif
 
 /*
--- a/src/ov-bool-sparse.cc	Mon Nov 26 21:44:54 2007 +0000
+++ b/src/ov-bool-sparse.cc	Mon Nov 26 22:20:25 2007 +0000
@@ -69,20 +69,23 @@
 {
   octave_base_value *retval = 0;
 
-  // Don't use numel, since it can overflow for very large matrices
-  // Note that for the second test, this means it becomes approximative
-  // since it involves a cast to double to avoid issues of overflow
-  if (matrix.rows () == 1 && matrix.cols () == 1)
+  if (Vsparse_auto_mutate)
     {
-      // Const copy of the matrix, so the right version of () operator used
-      const SparseBoolMatrix tmp (matrix);
+      // Don't use numel, since it can overflow for very large matrices
+      // Note that for the second test, this means it becomes approximative
+      // since it involves a cast to double to avoid issues of overflow
+      if (matrix.rows () == 1 && matrix.cols () == 1)
+	{
+	  // Const copy of the matrix, so the right version of () operator used
+	  const SparseBoolMatrix tmp (matrix);
 
-      retval = new octave_bool (tmp (0));
+	  retval = new octave_bool (tmp (0));
+	}
+      else if (matrix.cols () > 0 && matrix.rows () > 0 && 
+	       double (matrix.byte_size ()) > double (matrix.rows ()) *
+	       double (matrix.cols ()) * sizeof (bool))
+	retval = new octave_bool_matrix (matrix.matrix_value ());
     }
-  else if (matrix.cols () > 0 && matrix.rows () > 0 && 
-	   double (matrix.byte_size ()) > double (matrix.rows ()) *
-	   double (matrix.cols ()) * sizeof (bool))
-    retval = new octave_bool_matrix (matrix.matrix_value ());
 
   return retval;
 }
--- a/src/ov-cx-sparse.cc	Mon Nov 26 21:44:54 2007 +0000
+++ b/src/ov-cx-sparse.cc	Mon Nov 26 22:20:25 2007 +0000
@@ -54,37 +54,45 @@
 {
   octave_base_value *retval = 0;
 
-  int nr = matrix.rows ();
-  int nc = matrix.cols ();
+  if (Vsparse_auto_mutate)
+    {
+      int nr = matrix.rows ();
+      int nc = matrix.cols ();
 
-  // Don't use numel, since it can overflow for very large matrices
-  // Note that for the tests on matrix size, they become approximative
-  // since they involves a cast to double to avoid issues of overflow
-  if (matrix.rows () == 1 && matrix.cols () == 1)
-    {
-      // Const copy of the matrix, so the right version of () operator used
-      const SparseComplexMatrix tmp (matrix);
+      // Don't use numel, since it can overflow for very large matrices
+      // Note that for the tests on matrix size, they become approximative
+      // since they involves a cast to double to avoid issues of overflow
+      if (matrix.rows () == 1 && matrix.cols () == 1)
+	{
+	  // Const copy of the matrix, so the right version of () operator used
+	  const SparseComplexMatrix tmp (matrix);
 
-      Complex c = tmp (0, 0);
+	  Complex c = tmp (0, 0);
 
-      if (imag (c) == 0.0)
-	retval = new octave_scalar (std::real (c));
-      else
-	retval = new octave_complex (c);
+	  if (imag (c) == 0.0)
+	    retval = new octave_scalar (std::real (c));
+	  else
+	    retval = new octave_complex (c);
+	}
+      else if (nr == 0 || nc == 0)
+	retval = new octave_matrix (Matrix (nr, nc));
+      else if (matrix.all_elements_are_real ())
+	if (matrix.cols () > 0 && matrix.rows () > 0 && 
+	    double (matrix.byte_size ()) > double (matrix.rows ()) *
+	    double (matrix.cols ()) * sizeof (double))
+	  retval = new octave_matrix (::real (matrix.matrix_value ()));
+	else
+	  retval = new octave_sparse_matrix (::real (matrix));
+      else if (matrix.cols () > 0 && matrix.rows () > 0 && 
+	       double (matrix.byte_size ()) > double (matrix.rows ()) *
+	       double (matrix.cols ()) * sizeof (Complex))
+	retval = new octave_complex_matrix (matrix.matrix_value ());
     }
-  else if (nr == 0 || nc == 0)
-    retval = new octave_matrix (Matrix (nr, nc));
-  else if (matrix.all_elements_are_real ())
-    if (matrix.cols () > 0 && matrix.rows () > 0 && 
-	double (matrix.byte_size ()) > double (matrix.rows ()) *
-	double (matrix.cols ()) * sizeof (double))
-      retval = new octave_matrix (::real (matrix.matrix_value ()));
-    else
-      retval = new octave_sparse_matrix (::real (matrix));
-  else if (matrix.cols () > 0 && matrix.rows () > 0 && 
-	   double (matrix.byte_size ()) > double (matrix.rows ()) *
-	   double (matrix.cols ()) * sizeof (Complex))
-    retval = new octave_complex_matrix (matrix.matrix_value ());
+  else
+    {
+      if (matrix.all_elements_are_real ())
+	retval = new octave_sparse_matrix (::real (matrix));
+    }
     
   return retval;
 }
--- a/src/ov-re-sparse.cc	Mon Nov 26 21:44:54 2007 +0000
+++ b/src/ov-re-sparse.cc	Mon Nov 26 22:20:25 2007 +0000
@@ -67,20 +67,23 @@
 {
   octave_base_value *retval = 0;
 
-  // Don't use numel, since it can overflow for very large matrices
-  // Note that for the second test, this means it becomes approximative
-  // since it involves a cast to double to avoid issues of overflow
-  if (matrix.rows () == 1 && matrix.cols () == 1)
+  if (Vsparse_auto_mutate)
     {
-      // Const copy of the matrix, so the right version of () operator used
-      const SparseMatrix tmp (matrix);
+      // Don't use numel, since it can overflow for very large matrices
+      // Note that for the second test, this means it becomes approximative
+      // since it involves a cast to double to avoid issues of overflow
+      if (matrix.rows () == 1 && matrix.cols () == 1)
+	{
+	  // Const copy of the matrix, so the right version of () operator used
+	  const SparseMatrix tmp (matrix);
 
-      retval = new octave_scalar (tmp (0));
+	  retval = new octave_scalar (tmp (0));
+	}
+      else if (matrix.cols () > 0 && matrix.rows () > 0 && 
+	       double (matrix.byte_size ()) > double (matrix.rows ()) *
+	       double (matrix.cols ()) * sizeof (double))
+	retval = new octave_matrix (matrix.matrix_value ());
     }
-  else if (matrix.cols () > 0 && matrix.rows () > 0 && 
-	   double (matrix.byte_size ()) > double (matrix.rows ()) *
-	   double (matrix.cols ()) * sizeof (double))
-    retval = new octave_matrix (matrix.matrix_value ());
 
   return retval;
 }