PolyFEM
Loading...
Searching...
No Matches
CompositeForms.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "CompositeForm.hpp"
4
5namespace polyfem::solver
6{
8 {
9 public:
12
13 private:
14 double compose(const Eigen::VectorXd &inputs) const override;
15 Eigen::VectorXd compose_grad(const Eigen::VectorXd &inputs) const override;
16 };
17
19 {
20 public:
21 NegativeCompositeForm(const std::shared_ptr<AdjointForm> &form) : CompositeForm({form}) {}
23
24 private:
25 double compose(const Eigen::VectorXd &inputs) const override
26 {
27 assert(inputs.size() == 1);
28 return -inputs(0);
29 }
30 Eigen::VectorXd compose_grad(const Eigen::VectorXd &inputs) const override
31 {
32 assert(inputs.size() == 1);
33 return Eigen::VectorXd::Constant(1, 1, -1.);
34 }
35 };
36
38 {
39 public:
40 PlusConstCompositeForm(const std::shared_ptr<AdjointForm> &form, const double alpha) : CompositeForm({form}), alpha_(alpha) {}
42
43 private:
44 const double alpha_;
45
46 double compose(const Eigen::VectorXd &inputs) const override
47 {
48 assert(inputs.size() == 1);
49 return alpha_ + inputs(0);
50 }
51 Eigen::VectorXd compose_grad(const Eigen::VectorXd &inputs) const override
52 {
53 assert(inputs.size() == 1);
54 return Eigen::VectorXd::Constant(1, 1, 1.);
55 }
56 };
57
59 {
60 public:
61 LogCompositeForm(const std::shared_ptr<AdjointForm> &form) : CompositeForm({form}) {}
63
64 private:
65 double compose(const Eigen::VectorXd &inputs) const override
66 {
67 assert(inputs.size() == 1);
68 return std::log(inputs(0));
69 }
70 Eigen::VectorXd compose_grad(const Eigen::VectorXd &inputs) const override
71 {
72 assert(inputs.size() == 1);
73 return Eigen::VectorXd::Constant(1, 1, 1. / inputs(0));
74 }
75 };
76
78 {
79 public:
80 InequalityConstraintForm(const std::vector<std::shared_ptr<AdjointForm>> &forms, const Eigen::Vector2d &bounds, const double power = 2);
82
83 private:
84 double compose(const Eigen::VectorXd &inputs) const override;
85 Eigen::VectorXd compose_grad(const Eigen::VectorXd &inputs) const override;
86
87 const double power_;
88 const Eigen::Vector2d bounds_;
89 };
90
91 class PowerForm : public CompositeForm
92 {
93 public:
94 PowerForm(const std::shared_ptr<AdjointForm> &form, const double power) : CompositeForm({form}), power_(power) {}
96
97 private:
98 double compose(const Eigen::VectorXd &inputs) const override { return pow(inputs(0), power_); }
99 Eigen::VectorXd compose_grad(const Eigen::VectorXd &inputs) const override
100 {
101 Eigen::VectorXd x(1);
102 x(0) = power_ * pow(inputs(0), power_ - 1);
103 return x;
104 }
105
106 const double power_;
107 };
108
110 {
111 public:
112 DivideForm(const std::vector<std::shared_ptr<AdjointForm>> &forms) : CompositeForm(forms) { assert(forms.size() == 2); }
114
115 private:
116 double compose(const Eigen::VectorXd &inputs) const override { return inputs(0) / inputs(1); }
117 Eigen::VectorXd compose_grad(const Eigen::VectorXd &inputs) const override
118 {
119 Eigen::VectorXd x(2);
120 x << 1. / inputs(1), -inputs(0) / pow(inputs(1), 2);
121 return x;
122 }
123 };
124} // namespace polyfem::solver
int x
CompositeForm(const VariableToSimulationGroup &variable_to_simulations, const std::vector< std::shared_ptr< AdjointForm > > &forms)
double compose(const Eigen::VectorXd &inputs) const override
DivideForm(const std::vector< std::shared_ptr< AdjointForm > > &forms)
Eigen::VectorXd compose_grad(const Eigen::VectorXd &inputs) const override
Eigen::VectorXd compose_grad(const Eigen::VectorXd &inputs) const override
double compose(const Eigen::VectorXd &inputs) const override
double compose(const Eigen::VectorXd &inputs) const override
Eigen::VectorXd compose_grad(const Eigen::VectorXd &inputs) const override
Eigen::VectorXd compose_grad(const Eigen::VectorXd &inputs) const override
LogCompositeForm(const std::shared_ptr< AdjointForm > &form)
double compose(const Eigen::VectorXd &inputs) const override
double compose(const Eigen::VectorXd &inputs) const override
NegativeCompositeForm(const std::shared_ptr< AdjointForm > &form)
Eigen::VectorXd compose_grad(const Eigen::VectorXd &inputs) const override
Eigen::VectorXd compose_grad(const Eigen::VectorXd &inputs) const override
double compose(const Eigen::VectorXd &inputs) const override
PlusConstCompositeForm(const std::shared_ptr< AdjointForm > &form, const double alpha)
Eigen::VectorXd compose_grad(const Eigen::VectorXd &inputs) const override
double compose(const Eigen::VectorXd &inputs) const override
PowerForm(const std::shared_ptr< AdjointForm > &form, const double power)