24 template<
class K,
class Allocator>
25 auto polynomialDerivativeCoefficients(
const std::vector<K, Allocator>& coefficients) {
26 if (coefficients.size()==0)
27 return std::vector<K, Allocator>();
28 std::vector<K, Allocator> dpCoefficients(coefficients.size()-1);
29 for (
size_t i=1; i<coefficients.size(); ++i)
30 dpCoefficients[i-1] = coefficients[i]*K(i);
31 return dpCoefficients;
36 template<
class K, std::
size_t n>
37 auto polynomialDerivativeCoefficients(
const std::array<K, n>& coefficients) {
42 std::array<K, n-1> dpCoefficients;
43 for (
size_t i=1; i<coefficients.size(); ++i)
44 dpCoefficients[i-1] = coefficients[i]*K(i);
45 return dpCoefficients;
54 template<
class I, I i0, I... i,
class J, J j0, J... j>
55 auto polynomialDerivativeCoefficientsHelper(std::integer_sequence<I, i0, i...>, std::integer_sequence<J, j0, j...>) {
56 return std::integer_sequence<I, i*I(j)...>();
61 template<
class I, I... i>
62 auto polynomialDerivativeCoefficients(std::integer_sequence<I, i...> coefficients) {
63 if constexpr (
sizeof...(i)==0)
66 return polynomialDerivativeCoefficientsHelper(coefficients, std::make_index_sequence<
sizeof...(i)>());
72 auto polynomialDerivativeCoefficients(
const std::tuple<T...>& coefficients) {
73 if constexpr (
sizeof...(T)==0)
83 auto mult = Dune::Hybrid::hybridFunctor(std::multiplies());
84 return Dune::unpackIntegerSequence([&](
auto... i) {
85 using signed_type = std::conditional_t<std::is_same_v<std::size_t, long unsigned int>,
86 long signed int,
signed int>;
87 return std::tuple(mult(std::get<i+1>(coefficients), std::integral_constant<signed_type, i+1>()) ...);
88 }, std::make_index_sequence<
sizeof...(T)-1>());
122template<
class K,
class C=std::vector<K>>
126 struct IsIntegerSequence :
public std::false_type {};
128 template<
class I, I... i>
129 struct IsIntegerSequence<std::integer_sequence<I, i...>> :
public std::true_type {};
155 auto n = Dune::Hybrid::size(coefficients_);
156 Dune::Hybrid::forEach(Dune::range(n), [&](
auto i) {
157 y += Dune::Hybrid::elementAt(coefficients_, i) * std::pow(x,
int(i));
165 if constexpr (IsIntegerSequence<Coefficients>::value)
182 auto derivativeCoefficients = Impl::polynomialDerivativeCoefficients(p.
coefficients());
183 using DerivativeCoefficients =
decltype(derivativeCoefficients);
190 return coefficients_;
202template<
class K, std::
size_t n>
205template<
class K, K... ci>
225template<
class K,
class Coefficients>
240template<
class K,
class C>