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:
26 const VariableToSimulationGroup &variable_to_simulations,
27 std::shared_ptr<const varform::DifferentiableVarForm> varform,
28 std::shared_ptr<const DiffCache> diff_cache,
29 const json &args,
30 const io::ResourceIO &resources)
31 : SpatialIntegralForm(variable_to_simulations, std::move(varform), std::move(diff_cache), args), resources_(resources)
32 {
34
35 auto tmp_ids = args["surface_selection"].get<std::vector<int>>();
36 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
37 }
38 ~TargetForm() = default;
39
40 virtual std::string name() const override { return "target"; }
41 // target is another simulation solution
42 void set_reference(const std::shared_ptr<const varform::DifferentiableVarForm> &target_varform, std::shared_ptr<const DiffCache> target_diff_cache, const std::set<int> &reference_cached_body_ids);
43 // target is a constant displacement
44 void set_reference(const Eigen::VectorXd &disp) { target_disp = disp; }
45 // target is a lambda function depending on deformed position
46 void set_reference(const json &func, const json &grad_func);
47 void set_active_dimension(const std::vector<bool> &mask) { active_dimension_mask = mask; }
48
49 protected:
51
52 std::shared_ptr<const varform::DifferentiableVarForm> target_varform_;
53 std::shared_ptr<const DiffCache> target_diff_cache_;
54 std::map<int, int> e_to_ref_e_;
55
56 std::vector<bool> active_dimension_mask;
57 Eigen::VectorXd target_disp;
58
59 bool have_target_func = false;
61 std::array<utils::ExpressionValue, 3> target_func_grad;
63 };
64
66 {
67 public:
68 SDFTargetForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const varform::DifferentiableVarForm> varform, std::shared_ptr<const DiffCache> diff_cache, const json &args)
69 : SpatialIntegralForm(variable_to_simulations, std::move(varform), std::move(diff_cache), args)
70 {
72
73 auto tmp_ids = args["surface_selection"].get<std::vector<int>>();
74 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
75 }
76
77 virtual std::string name() const override { return "sdf-target"; }
78
79 void solution_changed_step(const int time_step, const Eigen::VectorXd &new_x) override;
80 void set_bspline_target(const Eigen::MatrixXd &control_points, const Eigen::VectorXd &knots, const double delta);
81 void set_bspline_target(const Eigen::MatrixXd &control_points, const Eigen::VectorXd &knots_u, const Eigen::VectorXd &knots_v, const double delta);
82
83 protected:
85
86 private:
87 void compute_distance(const Eigen::MatrixXd &point, double &distance) const;
88
89 int dim;
90 double delta_;
91
92 Eigen::MatrixXd t_or_uv_sampling;
93 Eigen::MatrixXd point_sampling;
95
96 std::unique_ptr<LazyCubicInterpolator> interpolation_fn;
97 };
98
100 {
101 public:
102 MeshTargetForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const varform::DifferentiableVarForm> varform, std::shared_ptr<const DiffCache> diff_cache, const json &args)
103 : SpatialIntegralForm(variable_to_simulations, std::move(varform), std::move(diff_cache), args)
104 {
106
107 auto tmp_ids = args["surface_selection"].get<std::vector<int>>();
108 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
109 }
110
111 virtual std::string name() const override { return "mesh-target"; }
112
113 void solution_changed_step(const int time_step, const Eigen::VectorXd &new_x) override;
114 void set_surface_mesh_target(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, const double delta);
115
116 protected:
118
119 private:
120 int dim;
121 double delta_;
122
123 Eigen::MatrixXd V_;
124 Eigen::MatrixXi F_;
125 igl::AABB<Eigen::MatrixXd, 3> tree_;
126
127 std::unique_ptr<LazyCubicInterpolator> interpolation_fn;
128 };
129
131 {
132 public:
133 NodeTargetForm(std::shared_ptr<const varform::DifferentiableVarForm> varform, std::shared_ptr<const DiffCache> diff_cache, const VariableToSimulationGroup &variable_to_simulations, const json &args, const io::ResourceIO &resources);
134 NodeTargetForm(std::shared_ptr<const varform::DifferentiableVarForm> varform, std::shared_ptr<const DiffCache> diff_cache, const VariableToSimulationGroup &variable_to_simulations, const std::vector<int> &active_nodes_, const Eigen::MatrixXd &target_vertex_positions_);
135 ~NodeTargetForm() = default;
136
137 std::string name() const override { return "node-target"; }
138
139 Eigen::VectorXd compute_adjoint_rhs_step(const int time_step, const Eigen::VectorXd &x, const varform::DifferentiableVarForm &varform, const DiffCache &diff_cache) const override;
140 double value_unweighted_step(const int time_step, const Eigen::VectorXd &x) const override;
141 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
142
143 protected:
144 std::shared_ptr<const varform::DifferentiableVarForm> varform_;
145 std::shared_ptr<const DiffCache> diff_cache_;
146
147 Eigen::MatrixXd target_vertex_positions;
148 std::vector<int> active_nodes;
149 };
150
152 {
153 public:
154 BarycenterTargetForm(const VariableToSimulationGroup &variable_to_simulations, const json &args, const std::shared_ptr<varform::DifferentiableVarForm> &varform1, std::shared_ptr<const DiffCache> diff_cache1, const std::shared_ptr<varform::DifferentiableVarForm> &varform2, std::shared_ptr<const DiffCache> diff_cache2);
155
156 Eigen::VectorXd compute_adjoint_rhs_step(const int time_step, const Eigen::VectorXd &x, const varform::DifferentiableVarForm &varform, const DiffCache &diff_cache) const override;
157 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
158 double value_unweighted_step(const int time_step, const Eigen::VectorXd &x) const override;
159
160 private:
161 std::vector<std::unique_ptr<PositionForm>> center1, center2;
162 int dim;
163 };
164
166 {
167 public:
168 MinTargetDistForm(const VariableToSimulationGroup &variable_to_simulations, const std::vector<int> &steps, const Eigen::VectorXd &target, const json &args, const std::shared_ptr<varform::DifferentiableVarForm> &varform, std::shared_ptr<const DiffCache> diff_cache);
169 virtual ~MinTargetDistForm() = default;
170
171 Eigen::MatrixXd compute_adjoint_rhs(const Eigen::VectorXd &x, const varform::DifferentiableVarForm &varform, const DiffCache &diff_cache) const override;
172 void compute_partial_gradient(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
173
174 protected:
175 double value_unweighted(const Eigen::VectorXd &x) const override;
176
177 private:
178 static double eval1(Eigen::VectorXd &x)
179 {
180 return 1. / x.array().inverse().sum();
181 }
182 static Eigen::VectorXd eval1_grad(Eigen::VectorXd &x)
183 {
184 return x.array().pow(-2.0) * pow(eval1(x), 2);
185 }
186
187 double eval2(Eigen::VectorXd &x) const
188 {
189 assert(x.size() == dim + 1);
190 double out = 0;
191 for (int d = 0; d < dim; d++)
192 out += pow(x(d) / x(dim) - target_(d), 2);
193 return out;
194 }
195 Eigen::VectorXd eval2_grad(Eigen::VectorXd &x) const
196 {
197 Eigen::VectorXd g = Eigen::VectorXd::Zero(dim + 1);
198 for (int d = 0; d < dim; d++)
199 {
200 const double tmp = 2 * (x(d) / x(dim) - target_(d));
201 g(d) += tmp / x(dim);
202 g(dim) += tmp * (-x(d) / x(dim) / x(dim));
203 }
204 return g;
205 }
206
207 const std::vector<int> steps_;
208 const Eigen::VectorXd target_;
209
210 int dim;
211 std::vector<std::unique_ptr<StaticForm>> objs;
212 };
213} // namespace polyfem::solver
int V
Eigen::RowVectorXd point
int x
Storage for additional data required by differntial code.
Definition DiffCache.hpp:22
Read-only interface to a hierarchical collection of simulation resources.
std::vector< std::unique_ptr< PositionForm > > center1
std::vector< std::unique_ptr< PositionForm > > center2
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
Eigen::VectorXd compute_adjoint_rhs_step(const int time_step, const Eigen::VectorXd &x, const varform::DifferentiableVarForm &varform, const DiffCache &diff_cache) 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 varform::DifferentiableVarForm > varform, 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 varform::DifferentiableVarForm &varform, 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
Eigen::MatrixXd target_vertex_positions
std::shared_ptr< const varform::DifferentiableVarForm > varform_
Eigen::VectorXd compute_adjoint_rhs_step(const int time_step, const Eigen::VectorXd &x, const varform::DifferentiableVarForm &varform, 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
SDFTargetForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr< const varform::DifferentiableVarForm > varform, std::shared_ptr< const DiffCache > diff_cache, const json &args)
IntegrableFunctional get_integral_functional() const override
void set_integral_type(const SpatialIntegralType type)
void set_reference(const std::shared_ptr< const varform::DifferentiableVarForm > &target_varform, std::shared_ptr< const DiffCache > target_diff_cache, const std::set< int > &reference_cached_body_ids)
std::shared_ptr< const varform::DifferentiableVarForm > target_varform_
IntegrableFunctional get_integral_functional() const override
std::shared_ptr< const DiffCache > target_diff_cache_
std::array< utils::ExpressionValue, 3 > target_func_grad
const io::ResourceIO & resources_
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)
virtual std::string name() const override
void set_active_dimension(const std::vector< bool > &mask)
TargetForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr< const varform::DifferentiableVarForm > varform, std::shared_ptr< const DiffCache > diff_cache, const json &args, const io::ResourceIO &resources)
Optimization-facing interface implemented by differentiated VarForm adapters.
nlohmann::json json
Definition Common.hpp:9