Package: libeigen3-dev
Version: 3.1.0-1
Severity: normal
Tags: patch

Dear Maintainer,

the bug can be demonstrated using Hauke's example from
http://forum.kde.nl/viewtopic.php?f=74&t=98871 (see enclosed file). The call to
Spline2d::derivative<1> is an extension of Hauke's example inserted
by me.  This call makes this example fail to compile:

---8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<----
$ LANG=C g++ -I/usr/include/eigen3/ eigen-spline-example-from-hauke.cpp
In file included from /usr/include/eigen3/Eigen/Core:300:0,
                 from eigen-spline-example-from-hauke.cpp:4:
/usr/include/eigen3/Eigen/src/Core/PlainObjectBase.h: In instantiation of
'static void Eigen::PlainObjectBase<Derived>::_check_template_params() [with
Derived = Eigen::Array<double, 1, -1, 0, 1, 2>]':
/usr/include/eigen3/Eigen/src/Core/Array.h:127:7:   required from
'Eigen::Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::Array()
[with _Scalar = double; int _Rows = 1; int _Cols = -1; int _Options = 0; int
_MaxRows = 1; int _MaxCols = 2]'
/usr/include/eigen3/unsupported/Eigen/src/Splines/Spline.h:339:70:   required
from 'typename Eigen::SplineTraits<Eigen::Spline<Scalar, Dim, Degree>,
DerivativeOrder>::DerivativeType Eigen::Spline<Scalar, Dim,
Degree>::derivatives(Eigen::Spline<Scalar, Dim, Degree>::Scalar,
Eigen::DenseIndex) const [with int DerivativeOrder = 1; _Scalar = double; int
_Dim = 1; int _Degree = -1; typename Eigen::SplineTraits<Eigen::Spline<Scalar,
Dim, Degree>, DerivativeOrder>::DerivativeType = Eigen::Array<double, 1, -1, 0,
1, 2>; Eigen::Spline<Scalar, Dim, Degree>::Scalar = double; Eigen::DenseIndex =
int]'
eigen-spline-example-from-hauke.cpp:37:98:   required from here
/usr/include/eigen3/Eigen/src/Core/PlainObjectBase.h:654:7: error:
'INVALID_MATRIX_TEMPLATE_PARAMETERS' is not a member of
'Eigen::internal::static_assertion<false>'
---8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<----

This bug can be fixed by changing in
/usr/include/eigen3/unsupported/Eigen/src/Splines/SplineFwd.h the
DerivativeType from ColMajor to RowMajor (see enclosed patch for details).
With this change everything compiles fine:

---8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<----
$ LANG=C g++ -I/usr/include/eigen3/ -include SplineFwd.h eigen-spline-example-
from-hauke.cpp && echo $?
0
---8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<----









-- System Information:
Debian Release: 7.3
  APT prefers proposed-updates
  APT policy: (500, 'proposed-updates'), (500, 'stable')
Architecture: i386 (i686)

Kernel: Linux 3.2.0-4-686-pae (SMP w/2 CPU cores)
Locale: LANG=de_DE.utf8, LC_CTYPE=de_DE.utf8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

libeigen3-dev depends on no packages.

libeigen3-dev recommends no packages.

Versions of packages libeigen3-dev suggests:
ii  libeigen3-doc  3.1.0-1
    #include <vector>
    #include <iostream>

    #include <Eigen/Core>
    #include <unsupported/Eigen/Splines>

    using namespace Eigen;

    double uvalue(double x, double low, double high)
    {
      return (x - low)/(high-low);
    }

    VectorXd uvalues(VectorXd xvals)
    {
      const double low = xvals.minCoeff();
      const double high = xvals.maxCoeff();
      for (int i=0; i<xvals.size(); ++i)
      {
        xvals(i) = uvalue(xvals(i), low, high);
      }
      return xvals;
    }

    int main(int argc, char* argv[])
    {
      typedef Spline<double,1> Spline2d;

      const VectorXd xvals = (VectorXd(5) << 1,2,3,4,6).finished();
      const VectorXd yvals = xvals.array().square();
      const Spline2d spline = SplineFitting<Spline2d>::Interpolate(yvals.transpose(), 3, uvalues(xvals).transpose());

      const double step = 0.1;
      for (double x = 1; x < 6 + 0.5*step; x += step)
      {
	const double uv = uvalue(x, xvals.minCoeff(), xvals.maxCoeff());
        std::cout << "(" << x << "," << spline(uv).transpose() << "," << spline.derivatives<1>(uv) << ")\n";
      }
      std::cout << std::endl;
    }
--- /usr/include/eigen3/unsupported/Eigen/src/Splines/SplineFwd.h	2012-06-23 19:29:21.000000000 +0200
+++ ./SplineFwd.h	2014-01-10 00:54:22.872994299 +0100
@@ -82,7 +82,7 @@
       typedef Array<_Scalar,Dynamic,Dynamic,RowMajor,NumOfDerivativesAtCompileTime,OrderAtCompileTime> BasisDerivativeType;
       
       /** \brief The data type used to store the spline's derivative values. */      
-      typedef Array<_Scalar,_Dim,Dynamic,ColMajor,_Dim,NumOfDerivativesAtCompileTime> DerivativeType;
+      typedef Array<_Scalar,_Dim,Dynamic,RowMajor,_Dim,NumOfDerivativesAtCompileTime> DerivativeType;
     };
 
     /** \brief 2D float B-spline with dynamic degree. */

Reply via email to