PolyFEM
Loading...
Searching...
No Matches
Parametrization.cpp
Go to the documentation of this file.
1#include "Parametrization.hpp"
3
4namespace polyfem::solver
5{
6 Eigen::VectorXd Parametrization::inverse_eval(const Eigen::VectorXd &y)
7 {
8 log_and_throw_adjoint_error("Not supported");
9 return Eigen::VectorXd();
10 }
11
12 int CompositeParametrization::size(const int x_size) const
13 {
14 int cur_size = x_size;
15 for (const auto &p : parametrizations_)
16 cur_size = p->size(cur_size);
17
18 return cur_size;
19 }
20
21 Eigen::VectorXd CompositeParametrization::inverse_eval(const Eigen::VectorXd &y)
22 {
23 if (parametrizations_.empty())
24 return y;
25
26 Eigen::VectorXd x = y;
27 for (int i = parametrizations_.size() - 1; i >= 0; i--)
28 {
29 x = parametrizations_[i]->inverse_eval(x);
30 }
31
32 return x;
33 }
34
35 Eigen::VectorXd CompositeParametrization::eval(const Eigen::VectorXd &x) const
36 {
37 if (parametrizations_.empty())
38 return x;
39
40 Eigen::VectorXd y = x;
41 for (const auto &p : parametrizations_)
42 {
43 y = p->eval(y);
44 }
45
46 return y;
47 }
48 Eigen::VectorXd CompositeParametrization::apply_jacobian(const Eigen::VectorXd &grad_full, const Eigen::VectorXd &x) const
49 {
50 Eigen::VectorXd gradv = grad_full;
51
52 if (parametrizations_.empty())
53 return gradv;
54
55 std::vector<Eigen::VectorXd> ys;
56 auto y = x;
57 for (const auto &p : parametrizations_)
58 {
59 ys.emplace_back(y);
60 y = p->eval(y);
61 }
62
63 for (int i = parametrizations_.size() - 1; i >= 0; --i)
64 gradv = parametrizations_[i]->apply_jacobian(gradv, ys[i]);
65
66 return gradv;
67 }
68} // namespace polyfem::solver
int y
int x
int size(const int x_size) const override
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad_full, const Eigen::VectorXd &x) const override
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override
const std::vector< std::shared_ptr< Parametrization > > parametrizations_
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
virtual Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y)
void log_and_throw_adjoint_error(const std::string &msg)
Definition Logger.cpp:77