Skip to content
Snippets Groups Projects
Commit 1d2c3138 authored by Emmanuel Labourasse's avatar Emmanuel Labourasse
Browse files

add derivation feature

parent 00eea8e2
No related branches found
No related tags found
No related merge requests found
...@@ -161,7 +161,7 @@ class PolynomialP ...@@ -161,7 +161,7 @@ class PolynomialP
size_t total_degree = relative_pos[0] + relative_pos[1]; size_t total_degree = relative_pos[0] + relative_pos[1];
absolute_position = total_degree * (total_degree + 1) / 2 + relative_pos[1]; absolute_position = total_degree * (total_degree + 1) / 2 + relative_pos[1];
} else { } else {
throw UnexpectedError("Not yet Available in 3D"); throw NotImplementedError("Not yet Available in 3D");
// static_assert(Dimension == 3); // static_assert(Dimension == 3);
// size_t total_degree = relative_pos[0] + relative_pos[1] + relative_pos[2]; // size_t total_degree = relative_pos[0] + relative_pos[1] + relative_pos[2];
// return (total_degree + 1) * (total_degree + 2) * (total_degree + 3) / 6 + relative_pos[1]; // return (total_degree + 1) * (total_degree + 2) * (total_degree + 3) / 6 + relative_pos[1];
...@@ -191,7 +191,7 @@ class PolynomialP ...@@ -191,7 +191,7 @@ class PolynomialP
size_t total_degree = relative_pos[0] + relative_pos[1]; size_t total_degree = relative_pos[0] + relative_pos[1];
absolute_position = total_degree * (total_degree + 1) / 2 + relative_pos[1]; absolute_position = total_degree * (total_degree + 1) / 2 + relative_pos[1];
} else { } else {
throw UnexpectedError("Not yet Available in 3D"); throw NotImplementedError("Not yet Available in 3D");
// static_assert(Dimension == 3); // static_assert(Dimension == 3);
// size_t total_degree = relative_pos[0] + relative_pos[1] + relative_pos[2]; // size_t total_degree = relative_pos[0] + relative_pos[1] + relative_pos[2];
// return (total_degree + 1) * (total_degree + 2) * (total_degree + 3) / 6 + relative_pos[1]; // return (total_degree + 1) * (total_degree + 2) * (total_degree + 3) / 6 + relative_pos[1];
...@@ -203,7 +203,7 @@ class PolynomialP ...@@ -203,7 +203,7 @@ class PolynomialP
PUGS_INLINE PUGS_INLINE
constexpr double constexpr double
absolute_position(const TinyVector<Dimension, size_t> relative_pos) absolute_position(const TinyVector<Dimension, size_t> relative_pos) const
{ {
size_t total_degree = 0; size_t total_degree = 0;
for (size_t i = 0; i < Dimension; ++i) { for (size_t i = 0; i < Dimension; ++i) {
...@@ -220,7 +220,7 @@ class PolynomialP ...@@ -220,7 +220,7 @@ class PolynomialP
size_t total_degree = relative_pos[0] + relative_pos[1]; size_t total_degree = relative_pos[0] + relative_pos[1];
abs_pos = total_degree * (total_degree + 1) / 2 + relative_pos[1]; abs_pos = total_degree * (total_degree + 1) / 2 + relative_pos[1];
} else { } else {
throw UnexpectedError("Not yet Available in 3D"); throw NotImplementedError("Not yet Available in 3D");
// static_assert(Dimension == 3); // static_assert(Dimension == 3);
// size_t total_degree = relative_pos[0] + relative_pos[1] + relative_pos[2]; // size_t total_degree = relative_pos[0] + relative_pos[1] + relative_pos[2];
// return (total_degree + 1) * (total_degree + 2) * (total_degree + 3) / 6 + relative_pos[1]; // return (total_degree + 1) * (total_degree + 2) * (total_degree + 3) / 6 + relative_pos[1];
...@@ -257,7 +257,7 @@ class PolynomialP ...@@ -257,7 +257,7 @@ class PolynomialP
value += valuex; value += valuex;
} }
} else { } else {
throw UnexpectedError("Not yet Available in 3D"); throw NotImplementedError("Not yet Available in 3D");
} }
return value; return value;
...@@ -276,45 +276,50 @@ class PolynomialP ...@@ -276,45 +276,50 @@ class PolynomialP
} }
} }
// PUGS_INLINE constexpr auto PUGS_INLINE constexpr auto
// derivative(const PolynomialP& P, const size_t var) derivative(const size_t var) const
// { {
// TinyVector<size_coef> coefs(zero); const auto P = *this;
// PolynomialP<N, Dimension> Q(coefs); TinyVector<size_coef> coefs(zero);
// if constexpr (N == 0) { PolynomialP<N, Dimension> Q(coefs);
// return Q; if constexpr (N == 0) {
// } else { return Q;
// Assert(var < Dimension, } else {
// "You can not derive a polynomial with respect to a variable of rank greater than the dimension"); Assert(var < Dimension,
// if constexpr (Dimension == 1) { "You can not derive a polynomial with respect to a variable of rank greater than the dimension");
// for (size_t i = 0; i < size_coef; ++i) { if constexpr (Dimension == 1) {
// coefs[i] = double(i + 1) * P.coefficients()[i + 1]; for (size_t i = 0; i < size_coef; ++i) {
// } coefs[i] = double(i + 1) * P.coefficients()[i + 1];
// return Q; }
// } else if constexpr (Dimension == 2) { return Q;
// if (var == 0) { } else if constexpr (Dimension == 2) {
// for (size_t i = 0; i < N; ++i) { if (var == 0) {
// for (size_t j = 0; j < N; ++i) { for (size_t i = 0; i < N; ++i) {
// TinyVector<Dimension, size_t> relative_pos(i, j); for (size_t j = 0; j < N - i; ++j) {
// TinyVector<Dimension, size_t> relative_posp(i + 1, j); TinyVector<Dimension, size_t> relative_pos(i, j);
// Q[relative_pos] = double(i + 1) * P[relative_posp]; TinyVector<Dimension, size_t> relative_posp(i + 1, j);
// } size_t absolute_position = Q.absolute_position(relative_pos);
// } size_t absolute_positionp = P.absolute_position(relative_posp);
// } else { Q.coefficients()[absolute_position] = double(i + 1) * m_coefficients[absolute_positionp];
// for (size_t i = 0; i < N; ++i) { }
// for (size_t j = 0; j < N; ++i) { }
// TinyVector<Dimension, size_t> relative_pos(i, j); } else {
// TinyVector<Dimension, size_t> relative_posp(i, j + 1); for (size_t i = 0; i < N; ++i) {
// Q[relative_pos] = double(j + 1) * P[relative_posp]; for (size_t j = 0; j < N - i; ++j) {
// } TinyVector<Dimension, size_t> relative_pos(i, j);
// } TinyVector<Dimension, size_t> relative_posp(i, j + 1);
// } size_t absolute_position = Q.absolute_position(relative_pos);
// return Q; size_t absolute_positionp = P.absolute_position(relative_posp);
// } else { Q.coefficients()[absolute_position] = double(j + 1) * m_coefficients[absolute_positionp];
// throw UnexpectedError("Not yet Available in 3D"); }
// } }
// } }
// } return Q;
} else {
throw UnexpectedError("Not yet Available in 3D");
}
}
}
PUGS_INLINE constexpr PolynomialP() noexcept = default; PUGS_INLINE constexpr PolynomialP() noexcept = default;
~PolynomialP() = default; ~PolynomialP() = default;
......
...@@ -119,6 +119,19 @@ TEST_CASE("PolynomialP", "[analysis]") ...@@ -119,6 +119,19 @@ TEST_CASE("PolynomialP", "[analysis]")
REQUIRE(Q(pos) == -24); REQUIRE(Q(pos) == -24);
} }
SECTION("derivation")
{
TinyVector<6> coef(1, -2, 10, 7, 2, 9);
TinyVector<6> coef2(-2, 14, 2, 0, 0, 0);
TinyVector<6> coef3(10, 2, 18, 0, 0, 0);
PolynomialP<2, 2> P(coef);
PolynomialP<2, 2> Q(coef2);
PolynomialP<2, 2> R(coef3);
REQUIRE(Q == P.derivative(0));
REQUIRE(R == P.derivative(1));
}
// // SECTION("product") // // SECTION("product")
// { // {
// Polynomial<2> P(2, 3, 4); // Polynomial<2> P(2, 3, 4);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment