This forum has been archived. All content is frozen. Please use KDE Discuss instead.

SparseLU with long double - compilation error

Tags: None
(comma "," separated)
flargen
Registered Member
Posts
3
Karma
0
Using the minimal test program below, with both Eigen 3.3 and the latest Hg head (as of today), I receive the following compilation error with GCC 6.3 (on Linux):

Code: Select all
In file included from ./Eigen/SparseLU:44:0,
                 from mat_test.cpp:2:
./Eigen/src/SparseLU/SparseLU.h: In instantiation of ‘void Eigen::SparseLUMatrixUReturnType<MatrixLType, MatrixUType>::solveInPlace(Eigen::MatrixBase<OtherDerived>&) const [with Dest = Eigen::Matrix<double, -1, 1>; MatrixLType = Eigen::internal::MappedSuperNodalMatrix<long double, int>; MatrixUType = Eigen::MappedSparseMatrix<long double, 0, int>]’:
./Eigen/src/SparseLU/SparseLU.h:234:7:   required from ‘bool Eigen::SparseLU<_MatrixType, _OrderingType>::_solve_impl(const Eigen::MatrixBase<OtherDerived>&, Eigen::MatrixBase<OtherDerived>&) const [with Rhs = Eigen::Matrix<double, -1, 1>; Dest = Eigen::Matrix<double, -1, 1>; _MatrixType = Eigen::SparseMatrix<long double, 0, int>; _OrderingType = Eigen::COLAMDOrdering<int>]’
./Eigen/src/Core/Solve.h:147:5:   required from ‘static void Eigen::internal::Assignment<DstXprType, Eigen::Solve<DecType, RhsType>, Eigen::internal::assign_op<Scalar, Scalar>, Eigen::internal::Dense2Dense>::run(DstXprType&, const SrcXprType&, const Eigen::internal::assign_op<Scalar, Scalar>&) [with DstXprType = Eigen::Matrix<double, -1, 1>; DecType = Eigen::SparseLU<Eigen::SparseMatrix<long double, 0, int> >; RhsType = Eigen::Matrix<double, -1, 1>; Scalar = double; Eigen::internal::Assignment<DstXprType, Eigen::Solve<DecType, RhsType>, Eigen::internal::assign_op<Scalar, Scalar>, Eigen::internal::Dense2Dense>::SrcXprType = Eigen::Solve<Eigen::SparseLU<Eigen::SparseMatrix<long double, 0, int> >, Eigen::Matrix<double, -1, 1> >]’
./Eigen/src/Core/AssignEvaluator.h:836:49:   required from ‘void Eigen::internal::call_assignment_no_alias(Dst&, const Src&, const Func&) [with Dst = Eigen::Matrix<double, -1, 1>; Src = Eigen::Solve<Eigen::SparseLU<Eigen::SparseMatrix<long double, 0, int> >, Eigen::Matrix<double, -1, 1> >; Func = Eigen::internal::assign_op<double, double>]’
./Eigen/src/Core/AssignEvaluator.h:804:27:   required from ‘void Eigen::internal::call_assignment(Dst&, const Src&, const Func&, typename Eigen::internal::enable_if<(! Eigen::internal::evaluator_assume_aliasing<Src>::value), void*>::type) [with Dst = Eigen::Matrix<double, -1, 1>; Src = Eigen::Solve<Eigen::SparseLU<Eigen::SparseMatrix<long double, 0, int> >, Eigen::Matrix<double, -1, 1> >; Func = Eigen::internal::assign_op<double, double>; typename Eigen::internal::enable_if<(! Eigen::internal::evaluator_assume_aliasing<Src>::value), void*>::type = void*]’
./Eigen/src/Core/AssignEvaluator.h:782:18:   required from ‘void Eigen::internal::call_assignment(Dst&, const Src&) [with Dst = Eigen::Matrix<double, -1, 1>; Src = Eigen::Solve<Eigen::SparseLU<Eigen::SparseMatrix<long double, 0, int> >, Eigen::Matrix<double, -1, 1> >]’
./Eigen/src/Core/PlainObjectBase.h:710:32:   required from ‘Derived& Eigen::PlainObjectBase<Derived>::_set(const Eigen::DenseBase<OtherDerived>&) [with OtherDerived = Eigen::Solve<Eigen::SparseLU<Eigen::SparseMatrix<long double, 0, int> >, Eigen::Matrix<double, -1, 1> >; Derived = Eigen::Matrix<double, -1, 1>]’
./Eigen/src/Core/Matrix.h:225:24:   required from ‘Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>& Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::operator=(const Eigen::DenseBase<OtherDerived>&) [with OtherDerived = Eigen::Solve<Eigen::SparseLU<Eigen::SparseMatrix<long double, 0, int> >, Eigen::Matrix<double, -1, 1> >; _Scalar = double; int _Rows = -1; int _Cols = 1; int _Options = 0; int _MaxRows = -1; int _MaxCols = 1]’
mat_test.cpp:31:30:   required from here
./Eigen/src/SparseLU/SparseLU.h:751:139: error: no matching function for call to ‘Eigen::Map<Eigen::Matrix<long double, -1, 1, 0, -1, 1>, 0, Eigen::OuterStride<> >::Map(Eigen::DenseCoeffsBase<Eigen::Matrix<double, -1, 1>, 1>::Scalar*, Eigen::Index&, Eigen::Index&, Eigen::OuterStride<>)’
         Map< Matrix<Scalar,Dynamic,Dest::ColsAtCompileTime, ColMajor>, 0, OuterStride<> > U (&(X(fsupc,0)), nsupc, nrhs, OuterStride<>(n) );
                                                                                                                                           ^
In file included from ./Eigen/Core:471:0,
                 from ./Eigen/SparseCore:11,
                 from mat_test.cpp:1:
./Eigen/src/Core/Map.h:149:12: note: candidate: Eigen::Map<MatrixType, MapOptions, StrideType>::Map(Eigen::Map<MatrixType, MapOptions, StrideType>::PointerArgType, Eigen::Index, Eigen::Index, const StrideType&) [with PlainObjectType = Eigen::Matrix<long double, -1, 1, 0, -1, 1>; int MapOptions = 0; StrideType = Eigen::OuterStride<>; Eigen::Map<MatrixType, MapOptions, StrideType>::PointerArgType = long double*; Eigen::Index = long int]
     inline Map(PointerArgType dataPtr, Index rows, Index cols, const StrideType& stride = StrideType())
            ^~~
./Eigen/src/Core/Map.h:149:12: note:   no known conversion for argument 1 from ‘Eigen::DenseCoeffsBase<Eigen::Matrix<double, -1, 1>, 1>::Scalar* {aka double*}’ to ‘Eigen::Map<Eigen::Matrix<long double, -1, 1, 0, -1, 1>, 0, Eigen::OuterStride<> >::PointerArgType {aka long double*}’
./Eigen/src/Core/Map.h:135:12: note: candidate: Eigen::Map<MatrixType, MapOptions, StrideType>::Map(Eigen::Map<MatrixType, MapOptions, StrideType>::PointerArgType, Eigen::Index, const StrideType&) [with PlainObjectType = Eigen::Matrix<long double, -1, 1, 0, -1, 1>; int MapOptions = 0; StrideType = Eigen::OuterStride<>; Eigen::Map<MatrixType, MapOptions, StrideType>::PointerArgType = long double*; Eigen::Index = long int]
     inline Map(PointerArgType dataPtr, Index size, const StrideType& stride = StrideType())
            ^~~
./Eigen/src/Core/Map.h:135:12: note:   candidate expects 3 arguments, 4 provided
./Eigen/src/Core/Map.h:122:21: note: candidate: Eigen::Map<MatrixType, MapOptions, StrideType>::Map(Eigen::Map<MatrixType, MapOptions, StrideType>::PointerArgType, const StrideType&) [with PlainObjectType = Eigen::Matrix<long double, -1, 1, 0, -1, 1>; int MapOptions = 0; StrideType = Eigen::OuterStride<>; Eigen::Map<MatrixType, MapOptions, StrideType>::PointerArgType = long double*]
     explicit inline Map(PointerArgType dataPtr, const StrideType& stride = StrideType())
                     ^~~
./Eigen/src/Core/Map.h:122:21: note:   candidate expects 2 arguments, 4 provided
./Eigen/src/Core/Map.h:88:79: note: candidate: Eigen::Map<Eigen::Matrix<long double, -1, 1, 0, -1, 1>, 0, Eigen::OuterStride<> >::Map(const Eigen::Map<Eigen::Matrix<long double, -1, 1, 0, -1, 1>, 0, Eigen::OuterStride<> >&)
 template<typename PlainObjectType, int MapOptions, typename StrideType> class Map
                                                                               ^~~
./Eigen/src/Core/Map.h:88:79: note:   candidate expects 1 argument, 4 provided
In file included from ./Eigen/SparseLU:29:0,
                 from mat_test.cpp:2:
./Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h: In instantiation of ‘void Eigen::internal::MappedSuperNodalMatrix<_Scalar, _StorageIndex>::solveInPlace(Eigen::MatrixBase<OtherDerived>&) const [with Dest = Eigen::Matrix<double, -1, 1>; _Scalar = long double; _StorageIndex = int]’:
./Eigen/src/SparseLU/SparseLU.h:714:5:   required from ‘void Eigen::SparseLUMatrixLReturnType<MappedSparseMatrixType>::solveInPlace(Eigen::MatrixBase<OtherDerived>&) const [with Dest = Eigen::Matrix<double, -1, 1>; MappedSupernodalType = Eigen::internal::MappedSuperNodalMatrix<long double, int>]’
./Eigen/src/SparseLU/SparseLU.h:233:7:   required from ‘bool Eigen::SparseLU<_MatrixType, _OrderingType>::_solve_impl(const Eigen::MatrixBase<OtherDerived>&, Eigen::MatrixBase<OtherDerived>&) const [with Rhs = Eigen::Matrix<double, -1, 1>; Dest = Eigen::Matrix<double, -1, 1>; _MatrixType = Eigen::SparseMatrix<long double, 0, int>; _OrderingType = Eigen::COLAMDOrdering<int>]’
./Eigen/src/Core/Solve.h:147:5:   required from ‘static void Eigen::internal::Assignment<DstXprType, Eigen::Solve<DecType, RhsType>, Eigen::internal::assign_op<Scalar, Scalar>, Eigen::internal::Dense2Dense>::run(DstXprType&, const SrcXprType&, const Eigen::internal::assign_op<Scalar, Scalar>&) [with DstXprType = Eigen::Matrix<double, -1, 1>; DecType = Eigen::SparseLU<Eigen::SparseMatrix<long double, 0, int> >; RhsType = Eigen::Matrix<double, -1, 1>; Scalar = double; Eigen::internal::Assignment<DstXprType, Eigen::Solve<DecType, RhsType>, Eigen::internal::assign_op<Scalar, Scalar>, Eigen::internal::Dense2Dense>::SrcXprType = Eigen::Solve<Eigen::SparseLU<Eigen::SparseMatrix<long double, 0, int> >, Eigen::Matrix<double, -1, 1> >]’
./Eigen/src/Core/AssignEvaluator.h:836:49:   required from ‘void Eigen::internal::call_assignment_no_alias(Dst&, const Src&, const Func&) [with Dst = Eigen::Matrix<double, -1, 1>; Src = Eigen::Solve<Eigen::SparseLU<Eigen::SparseMatrix<long double, 0, int> >, Eigen::Matrix<double, -1, 1> >; Func = Eigen::internal::assign_op<double, double>]’
./Eigen/src/Core/AssignEvaluator.h:804:27:   required from ‘void Eigen::internal::call_assignment(Dst&, const Src&, const Func&, typename Eigen::internal::enable_if<(! Eigen::internal::evaluator_assume_aliasing<Src>::value), void*>::type) [with Dst = Eigen::Matrix<double, -1, 1>; Src = Eigen::Solve<Eigen::SparseLU<Eigen::SparseMatrix<long double, 0, int> >, Eigen::Matrix<double, -1, 1> >; Func = Eigen::internal::assign_op<double, double>; typename Eigen::internal::enable_if<(! Eigen::internal::evaluator_assume_aliasing<Src>::value), void*>::type = void*]’
./Eigen/src/Core/AssignEvaluator.h:782:18:   required from ‘void Eigen::internal::call_assignment(Dst&, const Src&) [with Dst = Eigen::Matrix<double, -1, 1>; Src = Eigen::Solve<Eigen::SparseLU<Eigen::SparseMatrix<long double, 0, int> >, Eigen::Matrix<double, -1, 1> >]’
./Eigen/src/Core/PlainObjectBase.h:710:32:   required from ‘Derived& Eigen::PlainObjectBase<Derived>::_set(const Eigen::DenseBase<OtherDerived>&) [with OtherDerived = Eigen::Solve<Eigen::SparseLU<Eigen::SparseMatrix<long double, 0, int> >, Eigen::Matrix<double, -1, 1> >; Derived = Eigen::Matrix<double, -1, 1>]’
./Eigen/src/Core/Matrix.h:225:24:   required from ‘Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>& Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::operator=(const Eigen::DenseBase<OtherDerived>&) [with OtherDerived = Eigen::Solve<Eigen::SparseLU<Eigen::SparseMatrix<long double, 0, int> >, Eigen::Matrix<double, -1, 1> >; _Scalar = double; int _Rows = -1; int _Cols = 1; int _Options = 0; int _MaxRows = -1; int _MaxCols = 1]’
mat_test.cpp:31:30:   required from here
./Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h:274:139: error: no matching function for call to ‘Eigen::Map<Eigen::Matrix<long double, -1, 1, 0, -1, 1>, 0, Eigen::OuterStride<> >::Map(Eigen::DenseCoeffsBase<Eigen::Matrix<double, -1, 1>, 1>::Scalar*, Eigen::Index&, Eigen::Index&, Eigen::OuterStride<>)’
         Map< Matrix<Scalar,Dynamic,Dest::ColsAtCompileTime, ColMajor>, 0, OuterStride<> > U (&(X(fsupc,0)), nsupc, nrhs, OuterStride<>(n) );
                                                                                                                                           ^
In file included from ./Eigen/Core:471:0,
                 from ./Eigen/SparseCore:11,
                 from mat_test.cpp:1:
./Eigen/src/Core/Map.h:149:12: note: candidate: Eigen::Map<MatrixType, MapOptions, StrideType>::Map(Eigen::Map<MatrixType, MapOptions, StrideType>::PointerArgType, Eigen::Index, Eigen::Index, const StrideType&) [with PlainObjectType = Eigen::Matrix<long double, -1, 1, 0, -1, 1>; int MapOptions = 0; StrideType = Eigen::OuterStride<>; Eigen::Map<MatrixType, MapOptions, StrideType>::PointerArgType = long double*; Eigen::Index = long int]
     inline Map(PointerArgType dataPtr, Index rows, Index cols, const StrideType& stride = StrideType())
            ^~~
./Eigen/src/Core/Map.h:149:12: note:   no known conversion for argument 1 from ‘Eigen::DenseCoeffsBase<Eigen::Matrix<double, -1, 1>, 1>::Scalar* {aka double*}’ to ‘Eigen::Map<Eigen::Matrix<long double, -1, 1, 0, -1, 1>, 0, Eigen::OuterStride<> >::PointerArgType {aka long double*}’
./Eigen/src/Core/Map.h:135:12: note: candidate: Eigen::Map<MatrixType, MapOptions, StrideType>::Map(Eigen::Map<MatrixType, MapOptions, StrideType>::PointerArgType, Eigen::Index, const StrideType&) [with PlainObjectType = Eigen::Matrix<long double, -1, 1, 0, -1, 1>; int MapOptions = 0; StrideType = Eigen::OuterStride<>; Eigen::Map<MatrixType, MapOptions, StrideType>::PointerArgType = long double*; Eigen::Index = long int]
     inline Map(PointerArgType dataPtr, Index size, const StrideType& stride = StrideType())
            ^~~
./Eigen/src/Core/Map.h:135:12: note:   candidate expects 3 arguments, 4 provided
./Eigen/src/Core/Map.h:122:21: note: candidate: Eigen::Map<MatrixType, MapOptions, StrideType>::Map(Eigen::Map<MatrixType, MapOptions, StrideType>::PointerArgType, const StrideType&) [with PlainObjectType = Eigen::Matrix<long double, -1, 1, 0, -1, 1>; int MapOptions = 0; StrideType = Eigen::OuterStride<>; Eigen::Map<MatrixType, MapOptions, StrideType>::PointerArgType = long double*]
     explicit inline Map(PointerArgType dataPtr, const StrideType& stride = StrideType())
                     ^~~
./Eigen/src/Core/Map.h:122:21: note:   candidate expects 2 arguments, 4 provided
./Eigen/src/Core/Map.h:88:79: note: candidate: Eigen::Map<Eigen::Matrix<long double, -1, 1, 0, -1, 1>, 0, Eigen::OuterStride<> >::Map(const Eigen::Map<Eigen::Matrix<long double, -1, 1, 0, -1, 1>, 0, Eigen::OuterStride<> >&)
 template<typename PlainObjectType, int MapOptions, typename StrideType> class Map
                                                                               ^~~
./Eigen/src/Core/Map.h:88:79: note:   candidate expects 1 argument, 4 provided
make: *** [Makefile:17: mat_test.o] Error 1


The exact same code compiles and runs fine if "long double" is replaced with "double".

Any idea why using long doubles here causes a compilation error? I'm not familiar enough with the Eigen codebase to make much progress following the errors.

Thanks

Minimal test:
Code: Select all
#include <Eigen/SparseCore>
#include <Eigen/SparseLU>

int main()
{
    typedef Eigen::Triplet<long double> T;

    std::vector<T> triplet_list;
    triplet_list.reserve(5);
    triplet_list.push_back(T(0,0,1.3));
    triplet_list.push_back(T(0,1,3.1));
    triplet_list.push_back(T(1,1,4.6));
    triplet_list.push_back(T(2,1,3.6));
    triplet_list.push_back(T(2,2,7.3));

    Eigen::SparseMatrix<long double> A(3,3);

    A.setFromTriplets(triplet_list.begin(), triplet_list.end());

    Eigen::VectorXd f(3);
    f(0) = 1;
    f(1) = 2;
    f(2) = 3;

    Eigen::VectorXd u(3);

    Eigen::SparseLU<Eigen::SparseMatrix<long double> > linear_solver;

    linear_solver.compute(A);

    u = linear_solver.solve(f);

    return 0;
flargen
Registered Member
Posts
3
Karma
0
Forgive my mistake - I continued to use the regular "double" vector typedefs, which is the cause of my problems. Using the proper long double matrix types for the vectors f and u seems to allow the code to compile and run.

Thanks


Bookmarks



Who is online

Registered users: abc72656, Bing [Bot], daret, Google [Bot], Sogou [Bot], Yahoo [Bot]