PolyFEM
Loading...
Searching...
No Matches
CompositeForms.hpp
Go to the documentation of this file.
1#pragma once
2
4
5#include <Eigen/Core>
6
7#include <cassert>
8#include <memory>
9#include <vector>
10
11namespace polyfem::solver
12{
14 {
15 public:
18
19 private:
20 double compose(const Eigen::VectorXd &inputs) const override;
21 Eigen::VectorXd compose_grad(const Eigen::VectorXd &inputs) const override;
22 };
23
25 {
26 public:
27 NegativeCompositeForm(const std::shared_ptr<AdjointForm> &form) : CompositeForm({form}) {}
29
30 private:
31 double compose(const Eigen::VectorXd &inputs) const override
32 {
33 assert(inputs.size() == 1);
34 return -inputs(0);
35 }
36 Eigen::VectorXd compose_grad(const Eigen::VectorXd &inputs) const override
37 {
38 assert(inputs.size() == 1);
39 return Eigen::VectorXd::Constant(1, 1, -1.);
40 }
41 };
42
44 {
45 public:
46 PlusConstCompositeForm(const std::shared_ptr<AdjointForm> &form, const double alpha) : CompositeForm({form}), alpha_(alpha) {}
48
49 private:
50 const double alpha_;
51
52 double compose(const Eigen::VectorXd &inputs) const override
53 {
54 assert(inputs.size() == 1);
55 return alpha_ + inputs(0);
56 }
57 Eigen::VectorXd compose_grad(const Eigen::VectorXd &inputs) const override
58 {
59 assert(inputs.size() == 1);
60 return Eigen::VectorXd::Constant(1, 1, 1.);
61 }
62 };
63
65 {
66 public:
67 LogCompositeForm(const std::shared_ptr<AdjointForm> &form) : CompositeForm({form}) {}
69
70 private:
71 double compose(const Eigen::VectorXd &inputs) const override
72 {
73 assert(inputs.size() == 1);
74 return std::log(inputs(0));
75 }
76 Eigen::VectorXd compose_grad(const Eigen::VectorXd &inputs) const override
77 {
78 assert(inputs.size() == 1);
79 return Eigen::VectorXd::Constant(1, 1, 1. / inputs(0));
80 }
81 };
82
84 {
85 public:
86 InequalityConstraintForm(const std::vector<std::shared_ptr<AdjointForm>> &forms, const Eigen::Vector2d &bounds, const double power = 2);
88
89 private:
90 double compose(const Eigen::VectorXd &inputs) const override;
91 Eigen::VectorXd compose_grad(const Eigen::VectorXd &inputs) const override;
92
93 const double power_;
94 const Eigen::Vector2d bounds_;
95 };
96
97 class PowerForm : public CompositeForm
98 {
99 public:
100 PowerForm(const std::shared_ptr<AdjointForm> &form, const double power) : CompositeForm({form}), power_(power) {}
102
103 private:
104 double compose(const Eigen::VectorXd &inputs) const override { return pow(inputs(0), power_); }
105 Eigen::VectorXd compose_grad(const Eigen::VectorXd &inputs) const override
106 {
107 Eigen::VectorXd x(1);
108 x(0) = power_ * pow(inputs(0), power_ - 1);
109 return x;
110 }
111
112 const double power_;
113 };
114
116 {
117 public:
118 DivideForm(const std::vector<std::shared_ptr<AdjointForm>> &forms) : CompositeForm(forms) { assert(forms.size() == 2); }
120
121 private:
122 double compose(const Eigen::VectorXd &inputs) const override { return inputs(0) / inputs(1); }
123 Eigen::VectorXd compose_grad(const Eigen::VectorXd &inputs) const override
124 {
125 Eigen::VectorXd x(2);
126 x << 1. / inputs(1), -inputs(0) / pow(inputs(1), 2);
127 return x;
128 }
129 };
130} // 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)