|
Ublas : |
Subject: [ublas] A regression and a few ublas modifications for consideration
From: Jesse Perla (jesseperla_at_[hidden])
Date: 2010-02-19 11:14:03
The following are based on boost version 1.42 code. Sorry, I am not competent
enough to create patches to the trunk, but the changes are pretty small.
0) A while back we had discussed adding overload resolution to the matrix/vector
expressions involving scalars in order to implement operator*, etc.
The solution was to add an enable_if see line 2942ish of matrix_expression.hpp
The code committed to 1.42 was to test with:
enable_if< is_convertible<T1, typename E2::value_type >
But this ended up breaking an auto-differentiation library I was using...
Templated AD libraries will often have their own, arithmetic type which will
record operations of the type * a double, etc. for a matrix multiplication by
a scalar, etc. But you can't convert between them!
My quick fix was to change the enable_if to the following:
typename enable_if< is_arithmetic<T1>
Of course, this could get fancier and ensure that operator *(T1, value_type)
exists, but I don't think it is essential.
...I think that this is an important since arithmetic operations between
the types do not imply convertibility
1) While vector<> has an explicit on its constructor with the size,
bounded_vector does not. See line 551 of vector.hpp or so
I added an explicit and it solved some awful problems with automatic casting
2) While vector<> has a constructor that takes a size and then a value to
initialize with, bounded_vector does not. I added in the following constructor
for this operation and for consistency:
bounded_vector (size_type size, const value_type &value):
vector_type (size)
{std::fill(begin(), end(), value);}