Hi,
Lately I am using Boost.Units quite intensively for defining lots of
thermodynamic functions. The other day I needed a root finding algorithm
that can work on one of these functions. I look at couple of libraries,and I ended up rolling and adaptor that adimensionalizes the function
on Boost.Units quantities, etc, etc.
Then I though, hey! we have Boost.Math tools, even root finding
algorithms, and these functions are *very* generic as Boost is supposed to
be. And I found the function:
boost::math::tools::bracket_and_solve_root
which has the perfect underlying algorithm for the application.
I started programming and after several compilation errors I realized
that, as happened before, the functions are not generic enough. For
example the arguments are
bracket_and_solve_root(
F f,
const T& guess,
const T& factor,
bool rising,
Tol tol,
boost::uintmax_t& max_iter);
in my case "guess" is an argument type of type
boost::units::quantity<si::meter> but then "factor" has to be a
*different* type. For this function to be generic one need that factor
is of new type parameter.
In my opinion the function should be
template<typename F, typename T, typename Fact, typename Tol>
bracket_and_solve_root(
F f,
const T& guess,
const T& factor,
bool rising,
Tol tol,
boost::uintmax_t& max_iter);
to begin with (and then there is a chain of other internal changes).
What do you think? should I open a bug ticket?
Let's put it in more abstract way: T*T=T should not be a requirement for a root algorithm to work.
Once and for all, can we give a name to the model type of which
Boost.Units quantity models for? so the library writers stop assuming
that T*T=T for numeric values and can improve half-way generic libraries?
Other numeric libraries that suffer from this deficiency are Boost.Accumulators, Boost.Geometry, and Boost.Interval among the ones I tried. I think this issues should be addressed, not only to make them work with Boost.Units but also to bring those libraries to a higher level of generality.
Just an opinion.
Thank you,
Alfredo