diff src/DLD-FUNCTIONS/besselj.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 120f3135952f
children 9d080df0c843
line wrap: on
line diff
--- a/src/DLD-FUNCTIONS/besselj.cc	Wed May 14 18:09:56 2008 +0200
+++ b/src/DLD-FUNCTIONS/besselj.cc	Sun Apr 27 22:34:17 2008 +0200
@@ -116,6 +116,43 @@
   return retval;
 }
 
+static inline FloatMatrix
+int_array2_to_float_matrix (const Array2<octave_idx_type>& a)
+{
+  octave_idx_type nr = a.rows ();
+  octave_idx_type nc = a.cols ();
+
+  FloatMatrix retval (nr, nc);
+
+  for (octave_idx_type j = 0; j < nc; j++)
+    for (octave_idx_type i = 0; i < nr; i++)
+      {
+	OCTAVE_QUIT;
+
+	retval(i,j) = static_cast<float> (a(i,j));
+      }
+
+  return retval;
+}
+
+static inline FloatNDArray
+int_arrayN_to_float_array (const ArrayN<octave_idx_type>& a)
+{
+  dim_vector dv = a.dims ();
+  int nel = dv.numel ();
+
+  FloatNDArray retval (dv);
+
+  for (int i = 0; i < nel; i++)
+    {
+      OCTAVE_QUIT;
+      
+      retval(i) = static_cast<float> (a(i));
+    }
+
+  return retval;
+}
+
 static void
 gripe_bessel_arg (const char *fn, const char *arg)
 {
@@ -137,92 +174,146 @@
       octave_value alpha_arg = args(0);
       octave_value x_arg = args(1);
 
-      if (alpha_arg.is_scalar_type ())
+      if (alpha_arg.is_single_type () || x_arg.is_single_type ())
 	{
-	  double alpha = args(0).double_value ();
-
-	  if (! error_state)
+	  if (alpha_arg.is_scalar_type ())
 	    {
-	      if (x_arg.is_scalar_type ())
-		{
-		  Complex x = x_arg.complex_value ();
-
-		  if (! error_state)
-		    {
-		      octave_idx_type ierr;
-		      octave_value result;
-
-		      DO_BESSEL (type, alpha, x, scaled, ierr, result);
-
-		      if (nargout > 1)
-			retval(1) = static_cast<double> (ierr);
-
-		      retval(0) = result;
-		    }
-		  else
-		    gripe_bessel_arg (fn, "second");
-		}
-	      else
-		{
-		  ComplexNDArray x = x_arg.complex_array_value ();
-
-		  if (! error_state)
-		    {
-		      ArrayN<octave_idx_type> ierr;
-		      octave_value result;
-
-		      DO_BESSEL (type, alpha, x, scaled, ierr, result);
-
-		      if (nargout > 1)
-			retval(1) = int_arrayN_to_array (ierr);
-
-		      retval(0) = result;
-		    }
-		  else
-		    gripe_bessel_arg (fn, "second");
-		}
-	    }
-	  else
-	    gripe_bessel_arg (fn, "first");
-	}
-      else
-	{
-	  dim_vector dv0 = args(0).dims ();
-	  dim_vector dv1 = args(1).dims ();
-	  
-	  bool args0_is_row_vector = (dv0 (1) == dv0.numel ());
-	  bool args1_is_col_vector = (dv1 (0) == dv1.numel ());
-
-	  if (args0_is_row_vector && args1_is_col_vector)
-	    {
-	      RowVector ralpha = args(0).row_vector_value ();
+	      float alpha = args(0).float_value ();
 
 	      if (! error_state)
 		{
-		  ComplexColumnVector cx = 
-		    x_arg.complex_column_vector_value ();
-
-		  if (! error_state)
+		  if (x_arg.is_scalar_type ())
 		    {
-		      Array2<octave_idx_type> ierr;
-		      octave_value result;
+		      FloatComplex x = x_arg.float_complex_value ();
+
+		      if (! error_state)
+			{
+			  octave_idx_type ierr;
+			  octave_value result;
 
-		      DO_BESSEL (type, ralpha, cx, scaled, ierr, result);
-		      
-		      if (nargout > 1)
-			retval(1) = int_array2_to_matrix (ierr);
+			  DO_BESSEL (type, alpha, x, scaled, ierr, result);
+
+			  if (nargout > 1)
+			    retval(1) = static_cast<float> (ierr);
 
-		      retval(0) = result;
+			  retval(0) = result;
+			}
+		      else
+			gripe_bessel_arg (fn, "second");
 		    }
 		  else
-		    gripe_bessel_arg (fn, "second");
+		    {
+		      FloatComplexNDArray x = x_arg.float_complex_array_value ();
+
+		      if (! error_state)
+			{
+			  ArrayN<octave_idx_type> ierr;
+			  octave_value result;
+
+			  DO_BESSEL (type, alpha, x, scaled, ierr, result);
+
+			  if (nargout > 1)
+			    retval(1) = int_arrayN_to_float_array (ierr);
+
+			  retval(0) = result;
+			}
+		      else
+			gripe_bessel_arg (fn, "second");
+		    }
 		}
 	      else
 		gripe_bessel_arg (fn, "first");
 	    }
 	  else
 	    {
-	      NDArray alpha = args(0).array_value ();
+	      dim_vector dv0 = args(0).dims ();
+	      dim_vector dv1 = args(1).dims ();
+
+	      bool args0_is_row_vector = (dv0 (1) == dv0.numel ());
+	      bool args1_is_col_vector = (dv1 (0) == dv1.numel ());
+
+	      if (args0_is_row_vector && args1_is_col_vector)
+		{
+		  FloatRowVector ralpha = args(0).float_row_vector_value ();
+
+		  if (! error_state)
+		    {
+		      FloatComplexColumnVector cx = 
+			x_arg.float_complex_column_vector_value ();
+
+		      if (! error_state)
+			{
+			  Array2<octave_idx_type> ierr;
+			  octave_value result;
+
+			  DO_BESSEL (type, ralpha, cx, scaled, ierr, result);
+
+			  if (nargout > 1)
+			    retval(1) = int_array2_to_float_matrix (ierr);
+
+			  retval(0) = result;
+			}
+		      else
+			gripe_bessel_arg (fn, "second");
+		    }
+		  else
+		    gripe_bessel_arg (fn, "first");
+		}
+	      else
+		{
+		  FloatNDArray alpha = args(0).float_array_value ();
+
+		  if (! error_state)
+		    {
+		      if (x_arg.is_scalar_type ())
+			{
+			  FloatComplex x = x_arg.float_complex_value ();
+
+			  if (! error_state)
+			    {
+			      ArrayN<octave_idx_type> ierr;
+			      octave_value result;
+
+			      DO_BESSEL (type, alpha, x, scaled, ierr, result);
+
+			      if (nargout > 1)
+				retval(1) = int_arrayN_to_float_array (ierr);
+
+			      retval(0) = result;
+			    }
+			  else
+			    gripe_bessel_arg (fn, "second");
+			}
+		      else
+			{
+			  FloatComplexNDArray x = x_arg.float_complex_array_value ();
+
+			  if (! error_state)
+			    {
+			      ArrayN<octave_idx_type> ierr;
+			      octave_value result;
+			  
+			      DO_BESSEL (type, alpha, x, scaled, ierr, result);
+			  
+			      if (nargout > 1)
+				retval(1) = int_arrayN_to_float_array (ierr);
+
+			      retval(0) = result;
+			    }
+			  else
+			    gripe_bessel_arg (fn, "second");
+			}
+		    }
+		  else
+		    gripe_bessel_arg (fn, "first");
+		}
+	    }
+	}
+      else
+	{
+	  if (alpha_arg.is_scalar_type ())
+	    {
+	      double alpha = args(0).double_value ();
 
 	      if (! error_state)
 		{
@@ -232,6 +323,25 @@
 
 		      if (! error_state)
 			{
+			  octave_idx_type ierr;
+			  octave_value result;
+
+			  DO_BESSEL (type, alpha, x, scaled, ierr, result);
+
+			  if (nargout > 1)
+			    retval(1) = static_cast<double> (ierr);
+
+			  retval(0) = result;
+			}
+		      else
+			gripe_bessel_arg (fn, "second");
+		    }
+		  else
+		    {
+		      ComplexNDArray x = x_arg.complex_array_value ();
+
+		      if (! error_state)
+			{
 			  ArrayN<octave_idx_type> ierr;
 			  octave_value result;
 
@@ -245,28 +355,93 @@
 		      else
 			gripe_bessel_arg (fn, "second");
 		    }
-		  else
+		}
+	      else
+		gripe_bessel_arg (fn, "first");
+	    }
+	  else
+	    {
+	      dim_vector dv0 = args(0).dims ();
+	      dim_vector dv1 = args(1).dims ();
+
+	      bool args0_is_row_vector = (dv0 (1) == dv0.numel ());
+	      bool args1_is_col_vector = (dv1 (0) == dv1.numel ());
+
+	      if (args0_is_row_vector && args1_is_col_vector)
+		{
+		  RowVector ralpha = args(0).row_vector_value ();
+
+		  if (! error_state)
 		    {
-		      ComplexNDArray x = x_arg.complex_array_value ();
+		      ComplexColumnVector cx = 
+			x_arg.complex_column_vector_value ();
 
 		      if (! error_state)
 			{
-			  ArrayN<octave_idx_type> ierr;
+			  Array2<octave_idx_type> ierr;
 			  octave_value result;
-			  
-			  DO_BESSEL (type, alpha, x, scaled, ierr, result);
-			  
+
+			  DO_BESSEL (type, ralpha, cx, scaled, ierr, result);
+
 			  if (nargout > 1)
-			    retval(1) = int_arrayN_to_array (ierr);
-			  
+			    retval(1) = int_array2_to_matrix (ierr);
+
 			  retval(0) = result;
 			}
 		      else
 			gripe_bessel_arg (fn, "second");
 		    }
+		  else
+		    gripe_bessel_arg (fn, "first");
 		}
 	      else
-		gripe_bessel_arg (fn, "first");
+		{
+		  NDArray alpha = args(0).array_value ();
+
+		  if (! error_state)
+		    {
+		      if (x_arg.is_scalar_type ())
+			{
+			  Complex x = x_arg.complex_value ();
+
+			  if (! error_state)
+			    {
+			      ArrayN<octave_idx_type> ierr;
+			      octave_value result;
+
+			      DO_BESSEL (type, alpha, x, scaled, ierr, result);
+
+			      if (nargout > 1)
+				retval(1) = int_arrayN_to_array (ierr);
+
+			      retval(0) = result;
+			    }
+			  else
+			    gripe_bessel_arg (fn, "second");
+			}
+		      else
+			{
+			  ComplexNDArray x = x_arg.complex_array_value ();
+
+			  if (! error_state)
+			    {
+			      ArrayN<octave_idx_type> ierr;
+			      octave_value result;
+			  
+			      DO_BESSEL (type, alpha, x, scaled, ierr, result);
+			  
+			      if (nargout > 1)
+				retval(1) = int_arrayN_to_array (ierr);
+
+			      retval(0) = result;
+			    }
+			  else
+			    gripe_bessel_arg (fn, "second");
+			}
+		    }
+		  else
+		    gripe_bessel_arg (fn, "first");
+		}
 	    }
 	}
     }
@@ -459,8 +634,6 @@
 
       int kind = 0;
 
-      ComplexNDArray z;
-
       if (nargin > 1)
 	{
 	  kind = args(0).int_value ();
@@ -476,25 +649,52 @@
 
       if (! error_state)
 	{
-	  z = args(nargin == 1 ? 0 : 1).complex_array_value ();
+	  int idx = nargin == 1 ? 0 : 1;
 
-	  if (! error_state)
+	  if (args (idx).is_single_type ())
 	    {
-	      ArrayN<octave_idx_type> ierr;
-	      octave_value result;
+	      FloatComplexNDArray z = args(idx).float_complex_array_value ();
+
+	      if (! error_state)
+		{
+		  ArrayN<octave_idx_type> ierr;
+		  octave_value result;
 
-	      if (kind > 1)
-		result = biry (z, kind == 3, scale, ierr);
-	      else
-		result = airy (z, kind == 1, scale, ierr);
+		  if (kind > 1)
+		    result = biry (z, kind == 3, scale, ierr);
+		  else
+		    result = airy (z, kind == 1, scale, ierr);
 
-	      if (nargout > 1)
-		retval(1) = int_arrayN_to_array (ierr);
+		  if (nargout > 1)
+		    retval(1) = int_arrayN_to_float_array (ierr);
 
-	      retval(0) = result;
+		  retval(0) = result;
+		}
+	      else
+		error ("airy: expecting complex matrix for Z");
 	    }
 	  else
-	    error ("airy: expecting complex matrix for Z");
+	    {
+	      ComplexNDArray z = args(idx).complex_array_value ();
+
+	      if (! error_state)
+		{
+		  ArrayN<octave_idx_type> ierr;
+		  octave_value result;
+
+		  if (kind > 1)
+		    result = biry (z, kind == 3, scale, ierr);
+		  else
+		    result = airy (z, kind == 1, scale, ierr);
+
+		  if (nargout > 1)
+		    retval(1) = int_arrayN_to_array (ierr);
+
+		  retval(0) = result;
+		}
+	      else
+		error ("airy: expecting complex matrix for Z");
+	    }
 	}
     }
   else