diff src/DLD-FUNCTIONS/max.cc @ 7789:82be108cc558

First attempt at single precision tyeps * * * corrections to qrupdate single precision routines * * * prefer demotion to single over promotion to double * * * Add single precision support to log2 function * * * Trivial PROJECT file update * * * Cache optimized hermitian/transpose methods * * * Add tests for tranpose/hermitian and ChangeLog entry for new transpose code
author David Bateman <dbateman@free.fr>
date Sun, 27 Apr 2008 22:34:17 +0200
parents a168157f08ee
children 9d080df0c843
line wrap: on
line diff
--- a/src/DLD-FUNCTIONS/max.cc	Wed May 14 18:09:56 2008 +0200
+++ b/src/DLD-FUNCTIONS/max.cc	Sun Apr 27 22:34:17 2008 +0200
@@ -217,6 +217,183 @@
     } \
 }
 
+#define MINMAX_SINGLE_BODY(FCN) \
+{ \
+  bool single_arg = (nargin == 1) || (arg2.is_empty() && nargin == 3);	\
+ \
+  if (single_arg && (nargout == 1 || nargout == 0)) \
+    { \
+      if (arg1.is_real_type ()) \
+	{ \
+	  FloatNDArray m = arg1.float_array_value (); \
+ \
+	  if (! error_state) \
+	    { \
+	      FloatNDArray n = m. FCN (dim); \
+	      retval(0) = n; \
+	    } \
+	} \
+      else if (arg1.is_complex_type ()) \
+	{ \
+	  FloatComplexNDArray m = arg1.float_complex_array_value (); \
+ \
+	  if (! error_state) \
+	    { \
+	      FloatComplexNDArray n = m. FCN (dim); \
+	      retval(0) = n; \
+	    } \
+	} \
+      else \
+	gripe_wrong_type_arg (#FCN, arg1); \
+    } \
+  else if (single_arg && nargout == 2) \
+    { \
+      ArrayN<octave_idx_type> index; \
+ \
+      if (arg1.is_real_type ()) \
+	{ \
+	  FloatNDArray m = arg1.float_array_value (); \
+ \
+	  if (! error_state) \
+	    { \
+	      FloatNDArray n = m. FCN (index, dim);	\
+	      retval(0) = n; \
+	    } \
+	} \
+      else if (arg1.is_complex_type ()) \
+	{ \
+	  FloatComplexNDArray m = arg1.float_complex_array_value (); \
+ \
+	  if (! error_state) \
+	    { \
+	      FloatComplexNDArray n = m. FCN (index, dim);	\
+	      retval(0) = n; \
+	    } \
+	} \
+      else \
+	gripe_wrong_type_arg (#FCN, arg1); \
+ \
+      octave_idx_type len = index.numel (); \
+ \
+      if (len > 0) \
+	{ \
+	  float nan_val = lo_ieee_nan_value (); \
+ \
+	  FloatNDArray idx (index.dims ()); \
+ \
+	  for (octave_idx_type i = 0; i < len; i++) \
+	    { \
+	      OCTAVE_QUIT; \
+	      octave_idx_type tmp = index.elem (i) + 1; \
+	      idx.elem (i) = (tmp <= 0) \
+		? nan_val : static_cast<float> (tmp); \
+	    } \
+ \
+	  retval(1) = idx; \
+	} \
+      else \
+	retval(1) = FloatNDArray (); \
+    } \
+  else \
+    { \
+      int arg1_is_scalar = arg1.is_scalar_type (); \
+      int arg2_is_scalar = arg2.is_scalar_type (); \
+ \
+      int arg1_is_complex = arg1.is_complex_type (); \
+      int arg2_is_complex = arg2.is_complex_type (); \
+ \
+      if (arg1_is_scalar) \
+	{ \
+	  if (arg1_is_complex || arg2_is_complex) \
+	    { \
+	      FloatComplex c1 = arg1.float_complex_value (); \
+	      FloatComplexNDArray m2 = arg2.float_complex_array_value (); \
+	      if (! error_state) \
+		{ \
+		  FloatComplexNDArray result = FCN (c1, m2); \
+		  if (! error_state) \
+		    retval(0) = result; \
+		} \
+	    } \
+	  else \
+	    { \
+	      float d1 = arg1.float_value (); \
+	      FloatNDArray m2 = arg2.float_array_value (); \
+ \
+	      if (! error_state) \
+		{ \
+		  FloatNDArray result = FCN (d1, m2); \
+		  if (! error_state) \
+		    retval(0) = result; \
+		} \
+	    } \
+	} \
+      else if (arg2_is_scalar) \
+	{ \
+	  if (arg1_is_complex || arg2_is_complex) \
+	    { \
+	      FloatComplexNDArray m1 = arg1.float_complex_array_value (); \
+ \
+	      if (! error_state) \
+		{ \
+		  FloatComplex c2 = arg2.float_complex_value (); \
+		  FloatComplexNDArray result = FCN (m1, c2); \
+		  if (! error_state) \
+		    retval(0) = result; \
+		} \
+	    } \
+	  else \
+	    { \
+	      FloatNDArray m1 = arg1.float_array_value (); \
+ \
+	      if (! error_state) \
+		{ \
+		  float d2 = arg2.float_value (); \
+		  FloatNDArray result = FCN (m1, d2); \
+		  if (! error_state) \
+		    retval(0) = result; \
+		} \
+	    } \
+	} \
+      else \
+	{ \
+	  if (arg1_is_complex || arg2_is_complex) \
+	    { \
+	      FloatComplexNDArray m1 = arg1.float_complex_array_value (); \
+ \
+	      if (! error_state) \
+		{ \
+		  FloatComplexNDArray m2 = arg2.float_complex_array_value (); \
+ \
+		  if (! error_state) \
+		    { \
+		      FloatComplexNDArray result = FCN (m1, m2); \
+		      if (! error_state) \
+			retval(0) = result; \
+		    } \
+		} \
+	    } \
+	  else \
+	    { \
+	      FloatNDArray m1 = arg1.float_array_value (); \
+ \
+	      if (! error_state) \
+		{ \
+		  FloatNDArray m2 = arg2.float_array_value (); \
+ \
+		  if (! error_state) \
+		    { \
+		      FloatNDArray result = FCN (m1, m2); \
+		      if (! error_state) \
+			retval(0) = result; \
+		    } \
+		} \
+	    } \
+	} \
+    } \
+}
+
+
 #define MINMAX_INT_BODY(FCN, TYP) \
  { \
   bool single_arg = (nargin == 1) || (arg2.is_empty() && nargin == 3);	\
@@ -541,6 +718,8 @@
     } \
   else if (arg1.is_sparse_type ()) \
     MINMAX_SPARSE_BODY (FCN) \
+  else if (arg1.is_single_type ()) \
+    MINMAX_SINGLE_BODY (FCN) \
   else \
     MINMAX_DOUBLE_BODY (FCN) \
  \