boostorg / boostorg/odeint

value_type cannot have an explicit contructor

Open
#57 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
55
Forks
59
PR merge metrics
No merged PRs in 30d

Description

There are many places in odeint similar to the following (taken from `runge_kutta_dopri5.hpp`):

```
stepper_base_type::m_algebra.for_each3( m_x_tmp.m_v , in , dxdt_in ,
typename operations_type::template scale_sum2< value_type , time_type >( 1.0 , dt*b21 ) );

```

Unfortunately, if `value_type`'s constructor is marked `explicit`, this will fail. I ran into this trying to use a [ceres a jet type](https://github.com/ceres-solver/ceres-solver/blob/master/include/ceres/jet.h#L223) for the scalars here for the purpose of automatic differentiation.

It seems like it would be more robust to use something like
```
const value_type one{1.0};
```
in these scenarios instead of the raw `1.0`. And if I make that change, the ceres jet type works correctly.

I would be willing to work on a PR if this is a change the maintainers would accept.

Contributor guide

No contributing guide indexed for this repository

Research direction

Start with the example in runge_kutta_dopri5.hpp and search odeint for similar scale_sum constructions using raw 1.0 values. Check how these expressions behave with an explicit value_type constructor, then verify that the affected code supports the ceres Jet type without breaking existing scalar types.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
backend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.