Wildmeshing Toolkit
Loading...
Searching...
No Matches
EnergySum.hpp
1#pragma once
2
3#include <polysolve/nonlinear/Problem.hpp>
4#include <wmtk/Types.hpp>
5
6namespace wmtk::optimization {
7
8class EnergySum : public polysolve::nonlinear::Problem
9{
10public:
11 using Problem = polysolve::nonlinear::Problem;
12
13 using typename Problem::Scalar;
14 using typename Problem::THessian;
15 using typename Problem::TVector;
16
20 EnergySum() = default;
21
25 void add_energy(const std::shared_ptr<Problem>& energy, const double weight = 1);
26
27 double value(const TVector& x) override;
28 void gradient(const TVector& x, TVector& gradv) override;
29 void hessian(const TVector& x, THessian& hessian) override
30 {
31 log_and_throw_error("Sparse functions do not exist, use dense solver");
32 }
33 void hessian(const TVector& x, MatrixXd& hessian) override;
34
35 void solution_changed(const TVector& new_x) override;
36
37 bool is_step_valid(const TVector& x0, const TVector& x1) override;
38
39private:
40 std::vector<std::shared_ptr<Problem>> m_energies;
41 std::vector<double> m_weights;
42};
43
44} // namespace wmtk::optimization
Definition EnergySum.hpp:9
void add_energy(const std::shared_ptr< Problem > &energy, const double weight=1)
Add an energy term to the sum of energies.
Definition EnergySum.cpp:7
EnergySum()=default
A weighted sum of multiple energies.