PolyFEM
Loading...
Searching...
No Matches
TargetForms.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <polyfem/Common.hpp>
8
9#include <Eigen/Core>
10#include <igl/AABB.h>
11
12#include <memory>
13#include <utility>
14#include <cassert>
15#include <map>
16#include <set>
17#include <string>
18#include <vector>
19
20namespace polyfem::solver
21{
23 {
24 public:
25 TargetForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const State> state, std::shared_ptr<const DiffCache> diff_cache, const json &args)
26 : SpatialIntegralForm(variable_to_simulations, std::move(state), std::move(diff_cache), args)
27 {
29
30 auto tmp_ids = args["surface_selection"].get<std::vector<int>>();
31 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
32 }
33 ~TargetForm() = default;
34
35 virtual std::string name() const override { return "target"; }
36
37 void set_reference(const std::shared_ptr<const State> &target_state, std::shared_ptr<const DiffCache> target_diff_cache, const std::set<int> &reference_cached_body_ids); // target is another simulation solution
38 void set_reference(const Eigen::VectorXd &disp) { target_disp = disp; } // target is a constant displacement
39 void set_reference(const json &func, const json &grad_func); // target is a lambda function depending on deformed position
40 void set_active_dimension(const std::vector<bool> &mask) { active_dimension_mask = mask; }
41
42 protected:
44
45 std::shared_ptr<const State> target_state_;
46 std::shared_ptr<const DiffCache> target_diff_cache_;
47 std::map<int, int> e_to_ref_e_;
48
49 std::vector<bool> active_dimension_mask;
50 Eigen::VectorXd target_disp;
51
52 bool have_target_func = false;
54 std::array<utils::ExpressionValue, 3> target_func_grad;
55 };
56
58 {
59 public:
60 SDFTargetForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const State> state, std::shared_ptr<const DiffCache> diff_cache, const json &args)
61 : SpatialIntegralForm(variable_to_simulations, std::move(state), std::move(diff_cache), args)
62 {
64
65 auto tmp_ids = args["surface_selection"].get<std::vector<int>>();
66 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
67 }
68
69 virtual std::string name() const override { return "sdf-target"; }
70
71 void solution_changed_step(const int time_step, const Eigen::VectorXd &new_x) override;
72 void set_bspline_target(const Eigen::MatrixXd &control_points, const Eigen::VectorXd &knots, const double delta);
73 void set_bspline_target(const Eigen::MatrixXd &control_points, const Eigen::VectorXd &knots_u, const Eigen::VectorXd &knots_v, const double delta);
74
75 protected:
77
78 private:
79 void compute_distance(const Eigen::MatrixXd &point, double &distance) const;
80
81 int dim;
82 double delta_;
83
84 Eigen::MatrixXd t_or_uv_sampling;
85 Eigen::MatrixXd point_sampling;
87
88 std::unique_ptr<LazyCubicInterpolator> interpolation_fn;
89 };
90
92 {
93 public:
94 MeshTargetForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const State> state, std::shared_ptr<const DiffCache> diff_cache, const json &args)
95 : SpatialIntegralForm(variable_to_simulations, std::move(state), std::move(diff_cache), args)
96 {
98
99 auto tmp_ids = args["surface_selection"].get<std::vector<int>>();
100 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
101 }
102
103 virtual std::string name() const override { return "mesh-target"; }
104
105 void solution_changed_step(const int time_step, const Eigen::VectorXd &new_x) override;
106 void set_surface_mesh_target(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, const double delta);
107
108 protected:
110
111 private:
112 int dim;
113 double delta_;
114
115 Eigen::MatrixXd V_;
116 Eigen::MatrixXi F_;
117 igl::AABB<Eigen::MatrixXd, 3> tree_;
118
119 std::unique_ptr<LazyCubicInterpolator> interpolation_fn;
120 };
121
123 {
124 public:
125 NodeTargetForm(std::shared_ptr<const State> state, std::shared_ptr<const DiffCache> diff_cache, const VariableToSimulationGroup &variable_to_simulations, const json &args);
126 NodeTargetForm(std::shared_ptr<const State> state, std::shared_ptr<const DiffCache> diff_cache, const VariableToSimulationGroup &variable_to_simulations, const std::vector<int> &active_nodes_, const Eigen::MatrixXd &target_vertex_positions_);
127 ~NodeTargetForm() = default;
128
129 std::string name() const override { return "node-target"; }
130
131 Eigen::VectorXd compute_adjoint_rhs_step(const int time_step, const Eigen::VectorXd &x, const State &state, const DiffCache &diff_cache) const override;
132 double value_unweighted_step(const int time_step, const Eigen::VectorXd &x) const override;
133 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
134
135 protected:
136 std::shared_ptr<const State> state_;
137 std::shared_ptr<const DiffCache> diff_cache_;
138
139 Eigen::MatrixXd target_vertex_positions;
140 std::vector<int> active_nodes;
141 };
142
144 {
145 public:
146 BarycenterTargetForm(const VariableToSimulationGroup &variable_to_simulations, const json &args, const std::shared_ptr<State> &state1, std::shared_ptr<const DiffCache> diff_cache1, const std::shared_ptr<State> &state2, std::shared_ptr<const DiffCache> diff_cache2);
147
148 Eigen::VectorXd compute_adjoint_rhs_step(const int time_step, const Eigen::VectorXd &x, const State &state, const DiffCache &diff_cache) const override;
149 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
150 double value_unweighted_step(const int time_step, const Eigen::VectorXd &x) const override;
151
152 private:
153 std::vector<std::unique_ptr<PositionForm>> center1, center2;
154 int dim;
155 };
156
158 {
159 public:
160 MinTargetDistForm(const VariableToSimulationGroup &variable_to_simulations, const std::vector<int> &steps, const Eigen::VectorXd &target, const json &args, const std::shared_ptr<State> &state, std::shared_ptr<const DiffCache> diff_cache);
161 virtual ~MinTargetDistForm() = default;
162
163 Eigen::MatrixXd compute_adjoint_rhs(const Eigen::VectorXd &x, const State &state, const DiffCache &diff_cache) const override;
164 void compute_partial_gradient(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
165
166 protected:
167 double value_unweighted(const Eigen::VectorXd &x) const override;
168
169 private:
170 static double eval1(Eigen::VectorXd &x)
171 {
172 return 1. / x.array().inverse().sum();
173 }
174 static Eigen::VectorXd eval1_grad(Eigen::VectorXd &x)
175 {
176 return x.array().pow(-2.0) * pow(eval1(x), 2);
177 }
178
179 double eval2(Eigen::VectorXd &x) const
180 {
181 assert(x.size() == dim + 1);
182 double out = 0;
183 for (int d = 0; d < dim; d++)
184 out += pow(x(d) / x(dim) - target_(d), 2);
185 return out;
186 }
187 Eigen::VectorXd eval2_grad(Eigen::VectorXd &x) const
188 {
189 Eigen::VectorXd g = Eigen::VectorXd::Zero(dim + 1);
190 for (int d = 0; d < dim; d++)
191 {
192 const double tmp = 2 * (x(d) / x(dim) - target_(d));
193 g(d) += tmp / x(dim);
194 g(dim) += tmp * (-x(d) / x(dim) / x(dim));
195 }
196 return g;
197 }
198
199 const std::vector<int> steps_;
200 const Eigen::VectorXd target_;
201
202 int dim;
203 std::vector<std::unique_ptr<StaticForm>> objs;
204 };
205} // namespace polyfem::solver
int V
int x
Storage for additional data required by differntial code.
Definition DiffCache.hpp:21
main class that contains the polyfem solver and all its state
Definition State.hpp:113
std::vector< std::unique_ptr< PositionForm > > center1
std::vector< std::unique_ptr< PositionForm > > center2
Eigen::VectorXd compute_adjoint_rhs_step(const int time_step, const Eigen::VectorXd &x, const State &state, const DiffCache &diff_cache) const override
void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
double value_unweighted_step(const int time_step, const Eigen::VectorXd &x) const override
void solution_changed_step(const int time_step, const Eigen::VectorXd &new_x) override
IntegrableFunctional get_integral_functional() const override
MeshTargetForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr< const State > state, std::shared_ptr< const DiffCache > diff_cache, const json &args)
igl::AABB< Eigen::MatrixXd, 3 > tree_
virtual std::string name() const override
void set_surface_mesh_target(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, const double delta)
std::unique_ptr< LazyCubicInterpolator > interpolation_fn
static double eval1(Eigen::VectorXd &x)
double eval2(Eigen::VectorXd &x) const
std::vector< std::unique_ptr< StaticForm > > objs
void compute_partial_gradient(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
double value_unweighted(const Eigen::VectorXd &x) const override
Compute the value of the form.
const std::vector< int > steps_
static Eigen::VectorXd eval1_grad(Eigen::VectorXd &x)
virtual ~MinTargetDistForm()=default
Eigen::MatrixXd compute_adjoint_rhs(const Eigen::VectorXd &x, const State &state, const DiffCache &diff_cache) const override
Eigen::VectorXd eval2_grad(Eigen::VectorXd &x) const
std::string name() const override
std::shared_ptr< const DiffCache > diff_cache_
double value_unweighted_step(const int time_step, const Eigen::VectorXd &x) const override
void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
std::shared_ptr< const State > state_
Eigen::MatrixXd target_vertex_positions
Eigen::VectorXd compute_adjoint_rhs_step(const int time_step, const Eigen::VectorXd &x, const State &state, const DiffCache &diff_cache) const override
void compute_distance(const Eigen::MatrixXd &point, double &distance) const
virtual std::string name() const override
void set_bspline_target(const Eigen::MatrixXd &control_points, const Eigen::VectorXd &knots, const double delta)
std::unique_ptr< LazyCubicInterpolator > interpolation_fn
void solution_changed_step(const int time_step, const Eigen::VectorXd &new_x) override
IntegrableFunctional get_integral_functional() const override
SDFTargetForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr< const State > state, std::shared_ptr< const DiffCache > diff_cache, const json &args)
void set_integral_type(const SpatialIntegralType type)
std::shared_ptr< const State > target_state_
IntegrableFunctional get_integral_functional() const override
std::shared_ptr< const DiffCache > target_diff_cache_
std::array< utils::ExpressionValue, 3 > target_func_grad
utils::ExpressionValue target_func
std::map< int, int > e_to_ref_e_
std::vector< bool > active_dimension_mask
void set_reference(const Eigen::VectorXd &disp)
TargetForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr< const State > state, std::shared_ptr< const DiffCache > diff_cache, const json &args)
virtual std::string name() const override
void set_reference(const std::shared_ptr< const State > &target_state, std::shared_ptr< const DiffCache > target_diff_cache, const std::set< int > &reference_cached_body_ids)
void set_active_dimension(const std::vector< bool > &mask)
A collection of VariableToSimulation.
nlohmann::json json
Definition Common.hpp:9