nan(2,2)^(1/2) segfaults octave

View: New views
3 Messages — Rating Filter:   Alert me  

nan(2,2)^(1/2) segfaults octave

by G.. :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

octave:1> nan(2,2)^(1/2)
error: EIG: matrix contains Inf or NaN values
panic: Segmentation fault -- stopping myself...
Segmentation fault


G.

----------------------------------------------------------------------
GNU Octave Version 3.0.0
GNU Octave License: GNU General Public License
Operating System: Linux 2.4.18-nec3.4p1.045 #1 SMP Mon Apr 9 16:57:17 JST 2007 ia64
----------------------------------------------------------------------

Re: nan(2,2)^(1/2) segfaults octave

by David Bateman :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

G.. wrote:
> octave:1> nan(2,2)^(1/2)
> error: EIG: matrix contains Inf or NaN values
> panic: Segmentation fault -- stopping myself...
> Segmentation fault
>
>
> G.
>
>  

It doesn't appear to in the 3.1.x tree at the moment.. However, I
haven't checked if this is also fixed in the 3.0.x tree.. I can confirm
that it crashes 3.0.0

D.



--
David Bateman                                David.Bateman@...
Motorola Labs - Paris                        +33 1 69 35 48 04 (Ph)
Parc Les Algorithmes, Commune de St Aubin    +33 6 72 01 06 33 (Mob)
91193 Gif-Sur-Yvette FRANCE                  +33 1 69 35 77 01 (Fax)

The information contained in this communication has been classified as:

[x] General Business Information
[ ] Motorola Internal Use Only
[ ] Motorola Confidential Proprietary

_______________________________________________
Bug-octave mailing list
Bug-octave@...
https://www.cae.wisc.edu/mailman/listinfo/bug-octave

Re: nan(2,2)^(1/2) segfaults octave

by John W. Eaton :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On 11-Mar-2008, David Bateman wrote:

| G.. wrote:
| > octave:1> nan(2,2)^(1/2)
| > error: EIG: matrix contains Inf or NaN values
| > panic: Segmentation fault -- stopping myself...
| > Segmentation fault
| >
| >
| > G.
| >
| >  
|
| It doesn't appear to in the 3.1.x tree at the moment.. However, I
| haven't checked if this is also fixed in the 3.0.x tree.. I can confirm
| that it crashes 3.0.0

I checked in the following change to check for errors after computing
eigenvalues.

Thanks,

jwe



# HG changeset patch
# User John W. Eaton <jwe@...>
# Date 1205246973 14400
# Node ID 91f8446ce4ae9085763313060d576bdb8208e0cf
# Parent  ba8fcc115fee525b479d94ac5a53115ecf7ee257
handle possible error from EIG

diff --git a/src/ChangeLog b/src/ChangeLog
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,9 @@ 2008-03-10  John W. Eaton  <jwe@...
+2008-03-11  John W. Eaton  <jwe@...>
+
+ * DLD-FUNCTIONS/eig.cc (Feig): Handle possible error from EIG.
+ * DLD-FUNCTIONS/qp.cc (qp, Fqp): Likewise.
+ * xpow.cc (xpow): Likewise.
+
 2008-03-10  John W. Eaton  <jwe@...>
 
  * mex.cc (mxCreateLogicalScalar): Argument is now mxLogical.
diff --git a/src/DLD-FUNCTIONS/__qp__.cc b/src/DLD-FUNCTIONS/__qp__.cc
--- a/src/DLD-FUNCTIONS/__qp__.cc
+++ b/src/DLD-FUNCTIONS/__qp__.cc
@@ -137,6 +137,13 @@ qp (const Matrix& H, const ColumnVector&
   // Computing the ???
 
   EIG eigH (H);
+
+  if (error_state)
+    {
+      error ("qp: failed to compute eigenvalues of H");
+      return -1;
+    }
+
   ColumnVector eigenvalH = real (eigH.eigenvalues ());
   Matrix eigenvecH = real (eigH.eigenvectors ());
   double minReal = eigenvalH.min ();
@@ -275,6 +282,13 @@ qp (const Matrix& H, const ColumnVector&
       // Searching for the most negative curvature.
 
       EIG eigrH (rH);
+
+      if (error_state)
+ {
+  error ("qp: failed to compute eigenvalues of rH");
+  return -1;
+ }
+
       ColumnVector eigenvalrH = real (eigrH.eigenvalues ());
       Matrix eigenvecrH = real (eigrH.eigenvectors ());
       double mRrH = eigenvalrH.min ();
@@ -496,10 +510,15 @@ Undocumented internal function.\n\
 
   int info = qp (H, q, Aeq, beq, Ain, bin, maxit, x, lambda, iter);
 
-  retval(3) = iter;
-  retval(2) = info;
-  retval(1) = lambda;
-  retval(0) = x;
+  if (! error_state)
+    {
+      retval(3) = iter;
+      retval(2) = info;
+      retval(1) = lambda;
+      retval(0) = x;
+    }
+  else
+    error ("qp: internal error");
  }
       else
  error ("__qp__: invalid arguments");
diff --git a/src/DLD-FUNCTIONS/eig.cc b/src/DLD-FUNCTIONS/eig.cc
--- a/src/DLD-FUNCTIONS/eig.cc
+++ b/src/DLD-FUNCTIONS/eig.cc
@@ -101,18 +101,21 @@ The eigenvalues returned by @code{eig} a
       return retval;
     }
 
-  if (nargout == 0 || nargout == 1)
+  if (! error_state)
     {
-      retval(0) = result.eigenvalues ();
-    }
-  else
-    {
-      // Blame it on Matlab.
+      if (nargout == 0 || nargout == 1)
+ {
+  retval(0) = result.eigenvalues ();
+ }
+      else
+ {
+  // Blame it on Matlab.
 
-      ComplexDiagMatrix d (result.eigenvalues ());
+  ComplexDiagMatrix d (result.eigenvalues ());
 
-      retval(1) = d;
-      retval(0) = result.eigenvectors ();
+  retval(1) = d;
+  retval(0) = result.eigenvectors ();
+ }
     }
 
   return retval;
diff --git a/src/xpow.cc b/src/xpow.cc
--- a/src/xpow.cc
+++ b/src/xpow.cc
@@ -101,20 +101,26 @@ xpow (double a, const Matrix& b)
   else
     {
       EIG b_eig (b);
-      ComplexColumnVector lambda (b_eig.eigenvalues ());
-      ComplexMatrix Q (b_eig.eigenvectors ());
 
-      for (octave_idx_type i = 0; i < nr; i++)
+      if (! error_state)
  {
-  Complex elt = lambda (i);
-  if (std::imag (elt) == 0.0)
-    lambda (i) = std::pow (a, std::real (elt));
-  else
-    lambda (i) = std::pow (a, elt);
+  ComplexColumnVector lambda (b_eig.eigenvalues ());
+  ComplexMatrix Q (b_eig.eigenvectors ());
+
+  for (octave_idx_type i = 0; i < nr; i++)
+    {
+      Complex elt = lambda(i);
+      if (std::imag (elt) == 0.0)
+ lambda(i) = std::pow (a, std::real (elt));
+      else
+ lambda(i) = std::pow (a, elt);
+    }
+  ComplexDiagMatrix D (lambda);
+
+  retval = ComplexMatrix (Q * D * Q.inverse ());
  }
-      ComplexDiagMatrix D (lambda);
-
-      retval = ComplexMatrix (Q * D * Q.inverse ());
+      else
+ error ("xpow: matrix diagonalization failed");
     }
 
   return retval;
@@ -144,20 +150,26 @@ xpow (double a, const ComplexMatrix& b)
   else
     {
       EIG b_eig (b);
-      ComplexColumnVector lambda (b_eig.eigenvalues ());
-      ComplexMatrix Q (b_eig.eigenvectors ());
 
-      for (octave_idx_type i = 0; i < nr; i++)
+      if (! error_state)
  {
-  Complex elt = lambda (i);
-  if (std::imag (elt) == 0.0)
-    lambda (i) = std::pow (a, std::real (elt));
-  else
-    lambda (i) = std::pow (a, elt);
+  ComplexColumnVector lambda (b_eig.eigenvalues ());
+  ComplexMatrix Q (b_eig.eigenvectors ());
+
+  for (octave_idx_type i = 0; i < nr; i++)
+    {
+      Complex elt = lambda(i);
+      if (std::imag (elt) == 0.0)
+ lambda(i) = std::pow (a, std::real (elt));
+      else
+ lambda(i) = std::pow (a, elt);
+    }
+  ComplexDiagMatrix D (lambda);
+
+  retval = ComplexMatrix (Q * D * Q.inverse ());
  }
-      ComplexDiagMatrix D (lambda);
-
-      retval = ComplexMatrix (Q * D * Q.inverse ());
+      else
+ error ("xpow: matrix diagonalization failed");
     }
 
   return retval;
@@ -228,15 +240,21 @@ xpow (const Matrix& a, double b)
       else
  {
   EIG a_eig (a);
-  ComplexColumnVector lambda (a_eig.eigenvalues ());
-  ComplexMatrix Q (a_eig.eigenvectors ());
 
-  for (octave_idx_type i = 0; i < nr; i++)
-    lambda (i) = std::pow (lambda (i), b);
+  if (! error_state)
+    {
+      ComplexColumnVector lambda (a_eig.eigenvalues ());
+      ComplexMatrix Q (a_eig.eigenvectors ());
 
-  ComplexDiagMatrix D (lambda);
+      for (octave_idx_type i = 0; i < nr; i++)
+ lambda(i) = std::pow (lambda(i), b);
 
-  retval = ComplexMatrix (Q * D * Q.inverse ());
+      ComplexDiagMatrix D (lambda);
+
+      retval = ComplexMatrix (Q * D * Q.inverse ());
+    }
+  else
+    error ("xpow: matrix diagonalization failed");
  }
     }
 
@@ -257,15 +275,21 @@ xpow (const Matrix& a, const Complex& b)
   else
     {
       EIG a_eig (a);
-      ComplexColumnVector lambda (a_eig.eigenvalues ());
-      ComplexMatrix Q (a_eig.eigenvectors ());
 
-      for (octave_idx_type i = 0; i < nr; i++)
- lambda (i) = std::pow (lambda (i), b);
+      if (! error_state)
+ {
+  ComplexColumnVector lambda (a_eig.eigenvalues ());
+  ComplexMatrix Q (a_eig.eigenvectors ());
 
-      ComplexDiagMatrix D (lambda);
+  for (octave_idx_type i = 0; i < nr; i++)
+    lambda(i) = std::pow (lambda(i), b);
 
-      retval = ComplexMatrix (Q * D * Q.inverse ());
+  ComplexDiagMatrix D (lambda);
+
+  retval = ComplexMatrix (Q * D * Q.inverse ());
+ }
+      else
+ error ("xpow: matrix diagonalization failed");
     }
 
   return retval;
@@ -299,20 +323,26 @@ xpow (const Complex& a, const Matrix& b)
   else
     {
       EIG b_eig (b);
-      ComplexColumnVector lambda (b_eig.eigenvalues ());
-      ComplexMatrix Q (b_eig.eigenvectors ());
 
-      for (octave_idx_type i = 0; i < nr; i++)
+      if (! error_state)
  {
-  Complex elt = lambda (i);
-  if (std::imag (elt) == 0.0)
-    lambda (i) = std::pow (a, std::real (elt));
-  else
-    lambda (i) = std::pow (a, elt);
+  ComplexColumnVector lambda (b_eig.eigenvalues ());
+  ComplexMatrix Q (b_eig.eigenvectors ());
+
+  for (octave_idx_type i = 0; i < nr; i++)
+    {
+      Complex elt = lambda(i);
+      if (std::imag (elt) == 0.0)
+ lambda(i) = std::pow (a, std::real (elt));
+      else
+ lambda(i) = std::pow (a, elt);
+    }
+  ComplexDiagMatrix D (lambda);
+
+  retval = ComplexMatrix (Q * D * Q.inverse ());
  }
-      ComplexDiagMatrix D (lambda);
-
-      retval = ComplexMatrix (Q * D * Q.inverse ());
+      else
+ error ("xpow: matrix diagonalization failed");
     }
 
   return retval;
@@ -341,20 +371,26 @@ xpow (const Complex& a, const ComplexMat
   else
     {
       EIG b_eig (b);
-      ComplexColumnVector lambda (b_eig.eigenvalues ());
-      ComplexMatrix Q (b_eig.eigenvectors ());
 
-      for (octave_idx_type i = 0; i < nr; i++)
+      if (! error_state)
  {
-  Complex elt = lambda (i);
-  if (std::imag (elt) == 0.0)
-    lambda (i) = std::pow (a, std::real (elt));
-  else
-    lambda (i) = std::pow (a, elt);
+  ComplexColumnVector lambda (b_eig.eigenvalues ());
+  ComplexMatrix Q (b_eig.eigenvectors ());
+
+  for (octave_idx_type i = 0; i < nr; i++)
+    {
+      Complex elt = lambda(i);
+      if (std::imag (elt) == 0.0)
+ lambda(i) = std::pow (a, std::real (elt));
+      else
+ lambda(i) = std::pow (a, elt);
+    }
+  ComplexDiagMatrix D (lambda);
+
+  retval = ComplexMatrix (Q * D * Q.inverse ());
  }
-      ComplexDiagMatrix D (lambda);
-
-      retval = ComplexMatrix (Q * D * Q.inverse ());
+      else
+ error ("xpow: matrix diagonalization failed");
     }
 
   return retval;
@@ -425,15 +461,21 @@ xpow (const ComplexMatrix& a, double b)
       else
  {
   EIG a_eig (a);
-  ComplexColumnVector lambda (a_eig.eigenvalues ());
-  ComplexMatrix Q (a_eig.eigenvectors ());
 
-  for (octave_idx_type i = 0; i < nr; i++)
-    lambda (i) = std::pow (lambda (i), b);
+  if (! error_state)
+    {
+      ComplexColumnVector lambda (a_eig.eigenvalues ());
+      ComplexMatrix Q (a_eig.eigenvectors ());
 
-  ComplexDiagMatrix D (lambda);
+      for (octave_idx_type i = 0; i < nr; i++)
+ lambda(i) = std::pow (lambda(i), b);
 
-  retval = ComplexMatrix (Q * D * Q.inverse ());
+      ComplexDiagMatrix D (lambda);
+
+      retval = ComplexMatrix (Q * D * Q.inverse ());
+    }
+  else
+    error ("xpow: matrix diagonalization failed");
  }
     }
 
@@ -454,15 +496,21 @@ xpow (const ComplexMatrix& a, const Comp
   else
     {
       EIG a_eig (a);
-      ComplexColumnVector lambda (a_eig.eigenvalues ());
-      ComplexMatrix Q (a_eig.eigenvectors ());
 
-      for (octave_idx_type i = 0; i < nr; i++)
- lambda (i) = std::pow (lambda (i), b);
+      if (! error_state)
+ {
+  ComplexColumnVector lambda (a_eig.eigenvalues ());
+  ComplexMatrix Q (a_eig.eigenvectors ());
 
-      ComplexDiagMatrix D (lambda);
+  for (octave_idx_type i = 0; i < nr; i++)
+    lambda(i) = std::pow (lambda(i), b);
 
-      retval = ComplexMatrix (Q * D * Q.inverse ());
+  ComplexDiagMatrix D (lambda);
+
+  retval = ComplexMatrix (Q * D * Q.inverse ());
+ }
+      else
+ error ("xpow: matrix diagonalization failed");
     }
 
   return retval;

_______________________________________________
Bug-octave mailing list
Bug-octave@...
https://www.cae.wisc.edu/mailman/listinfo/bug-octave