proxsuite-nlp  0.11.0
A primal-dual augmented Lagrangian-type solver for nonlinear programming on manifolds.
 
Loading...
Searching...
No Matches
pdal.hxx
Go to the documentation of this file.
1
3#pragma once
4
6
7namespace proxsuite {
8namespace nlp {
9template <typename Scalar>
10ALMeritFunctionTpl<Scalar>::ALMeritFunctionTpl(const Problem &prob,
11 const Scalar &beta)
12 : beta_(beta), problem_(prob) {}
13
14template <typename Scalar>
15Scalar ALMeritFunctionTpl<Scalar>::evaluate(const ConstVectorRef & /*x*/,
16 const std::vector<VectorRef> &lams,
17 Workspace &workspace) const {
18 Scalar res = workspace.objective_value;
19 // value c(x) + \mu\lambda_e
20 const auto &pd_scv = workspace.shift_cstr_pdal;
21 for (std::size_t i = 0; i < workspace.numblocks; i++) {
22 const ConstraintObject &cstr = problem_.getConstraint(i);
23 Scalar mu = cstr.set_->mu();
24 VectorXs scv_tmp = pd_scv[i];
25 res += 2.0 * cstr.set_->computeMoreauEnvelope(pd_scv[i], scv_tmp);
26 res += mu * lams[i].squaredNorm() / 4.0;
27 }
28 return res;
29}
30
31template <typename Scalar>
32void ALMeritFunctionTpl<Scalar>::computeGradient(
33 const std::vector<VectorRef> &lams, Workspace &workspace) const {
34 workspace.merit_gradient = workspace.objective_gradient;
35 workspace.merit_gradient.noalias() +=
36 workspace.data_jacobians.transpose() * workspace.data_lams_pdal;
37 workspace.merit_dual_gradient.setZero();
38 for (std::size_t i = 0; i < workspace.numblocks; i++) {
39 const ConstraintObject &cstr = problem_.getConstraint(i);
40 Scalar mu = cstr.set_->mu();
41 problem_.getSegment(workspace.merit_dual_gradient, i).noalias() +=
42 beta_ * mu * (lams[i] - workspace.lams_pdal[i]);
43 }
44}
45
46} // namespace nlp
47} // namespace proxsuite
Main package namespace.
Definition bcl-params.hpp:5