Wildmeshing Toolkit
Loading...
Searching...
No Matches
EnvelopeEnergy.hpp
1#pragma once
2
3#include <polysolve/nonlinear/Problem.hpp>
4#include <wmtk/Types.hpp>
5#include <wmtk/envelope/Envelope.hpp>
6
7namespace wmtk::optimization {
8
9class EnvelopeEnergy2D : public polysolve::nonlinear::Problem
10{
11public:
12 using typename polysolve::nonlinear::Problem::Scalar;
13 using typename polysolve::nonlinear::Problem::THessian;
14 using typename polysolve::nonlinear::Problem::TVector;
15
21 const std::shared_ptr<SampleEnvelope>& envelope,
22 const double weight = 1,
23 bool check_step_validity = true);
24
25 double value(const TVector& x) override;
26 void gradient(const TVector& x, TVector& gradv) override;
27 void hessian(const TVector& x, THessian& hessian) override
28 {
29 log_and_throw_error("Sparse functions do not exist, use dense solver");
30 }
31 void hessian(const TVector& x, MatrixXd& hessian) override;
32
33 void solution_changed(const TVector& new_x) override;
34
35 bool is_step_valid(const TVector& x0, const TVector& x1) override;
36
37private:
38 std::shared_ptr<SampleEnvelope> m_envelope;
39 double m_weight;
40 bool m_check_step_validity;
41};
42
43class EnvelopeEnergy3D : public polysolve::nonlinear::Problem
44{
45public:
46 using typename polysolve::nonlinear::Problem::Scalar;
47 using typename polysolve::nonlinear::Problem::THessian;
48 using typename polysolve::nonlinear::Problem::TVector;
49
55 const std::shared_ptr<SampleEnvelope>& envelope,
56 const double weight = 1,
57 bool check_step_validity = true);
58
59 double value(const TVector& x) override;
60 void gradient(const TVector& x, TVector& gradv) override;
61 void hessian(const TVector& x, THessian& hessian) override
62 {
63 log_and_throw_error("Sparse functions do not exist, use dense solver");
64 }
65 void hessian(const TVector& x, MatrixXd& hessian) override;
66
67 void solution_changed(const TVector& new_x) override;
68
69 bool is_step_valid(const TVector& x0, const TVector& x1) override;
70
71private:
72 std::shared_ptr<SampleEnvelope> m_envelope;
73 double m_weight;
74 bool m_check_step_validity;
75};
76
77} // namespace wmtk::optimization
Definition EnvelopeEnergy.hpp:10
Definition EnvelopeEnergy.hpp:44