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