Boost logo

Boost :

Subject: Re: [boost] compilation errors with ublas / cppad
From: Oleg Labutin (ol.labutin_at_[hidden])
Date: 2015-11-30 10:28:29


#include <cppad/cppad.hpp>
#include <boost/numeric/ublas/lu.hpp>

typedef CppAD::AD<double> my_dbl;

namespace boost {
    namespace numeric {
        namespace ublas
        {
            template<class M>
            class sparse_matrix_element;

            template<class T, class L, std::size_t IB, class IA, class TA>
            class compressed_matrix;

            template<class T, class ALLOC>
            class unbounded_array;

            namespace detail {

                template <typename Left, typename Base>
                inline bool operator < (Left const& left, CppAD::AD<Base>
const& right)
                {
                    return left. operator my_dbl() < right;
                }
            }
        }
    }
}

int main() {

    boost::numeric::ublas::matrix<my_dbl> a(3, 3);
    boost::numeric::ublas::permutation_matrix<int> pert(3);

    const int singular = lu_factorize(a, pert);

    return 0;
}

2015-11-24 20:22 GMT+02:00 Peter Caspers <pcaspers1973_at_[hidden]>:

> Hi,
>
> I think this has been asked before, but since I am not aware of any
> answer, I would like to bring up the topic again:
>
> When using CppAD::AD<double> with boost ublas, certain compilation
> errors show up. I attach a small example (ublas_cppad.cpp) and the
> (start of the) error messages I get (compilation_errors.txt, produced
> with boost 1.59.0, g++ 4.9.3, CppAD-20151124).
>
> The problem is in matrix_assign.hpp; when changing
>
> template<class E1, class E2, class S>
> BOOST_UBLAS_INLINE
> bool equals (const matrix_expression<E1> &e1, const
> matrix_expression<E2> &e2, S epsilon, S min_norm) {
> return norm_inf (e1 - e2) < epsilon *
> std::max<S> (std::max<S> (norm_inf (e1), norm_inf
> (e2)), min_norm);
> }
>
> to
>
> template<class E1, class E2, class S>
> BOOST_UBLAS_INLINE
> bool equals (const matrix_expression<E1> &e1, const
> matrix_expression<E2> &e2, S epsilon, S min_norm) {
> S tmp = norm_inf (e1 - e2);
> return tmp < epsilon *
> std::max<S> (std::max<S> (norm_inf (e1), norm_inf
> (e2)), min_norm);
> }
>
> the example code compiles without errors. Can someone point out, how
> this should be fixed (either on boost or CppAD side)? In general, are
> there requirements for a type T to cooperate with ublas matrices one
> should be aware of?
>
> Thank you
> Peter
>
>
> _______________________________________________
> Unsubscribe & other changes:
> http://lists.boost.org/mailman/listinfo.cgi/boost
>


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk