13#ifndef INCLUDE_PIPAL_ACCEPTANCE_HXX
14#define INCLUDE_PIPAL_ACCEPTANCE_HXX
26 template <
typename Real>
29 static constexpr Real EPS{std::numeric_limits<Real>::epsilon()};
39 Real f{z.
f}, phi{z.
phi};
59 Real
const tmp_min{std::min(p.
ls_frac, z.
mu)};
61 ftb += (z.
r1 < tmp_min*r1).count() + (z.
r2 < tmp_min*r2).count();
64 ftb += (z.
s1 < tmp_min*s1).count() + (z.
s2 < tmp_min*s2).count();
71 this->
setPrimals(x, r1, r2, s1, s2, lE, lI, z.
f, z.
cE, z.
cI, z.
phi);
77 this->
setPrimals(x, r1, r2, s1, s2, lE, lI, f, cE, cI, phi);
83 this->
setPrimals(x, r1, r2, s1, s2, lE, lI, f, cE, cI, phi);
99 template <
typename Real>
102 static constexpr Real INF{std::numeric_limits<Real>::infinity()};
118 Real min_1{INF}, min_2{INF};
119 if (idx_r1.size() > 0) {min_1 = (((frac - 1.0)*z.
r1(idx_r1))/d.
r1(idx_r1)).minCoeff();}
120 if (idx_r2.size() > 0) {min_2 = (((frac - 1.0)*z.
r2(idx_r2))/d.
r2(idx_r2)).minCoeff();}
121 a.
p0 = std::min(a.
p0, std::min(min_1, min_2));
125 Real min_1{INF}, min_2{INF};
126 if (idx_s1.size() > 0) {min_1 = (((frac - 1.0)*z.
s1(idx_s1))/d.
s1(idx_s1)).minCoeff();}
127 if (idx_s2.size() > 0) {min_2 = (((frac - 1.0)*z.
s2(idx_s2))/d.
s2(idx_s2)).minCoeff();}
128 a.
p0 = std::min(a.
p0, std::min(min_1, min_2));
140 Real min_1{INF}, min_2{INF};
141 if (idx_l.size() > 0) {min_1 = (((frac - 1.0)*(1.0 + z.
lE(idx_l)))/d.
lE(idx_l)).minCoeff();}
142 if (idx_g.size() > 0) {min_2 = (((1.0 - frac)*(1.0 - z.
lE(idx_g)))/d.
lE(idx_g)).minCoeff();}
143 a.
d = std::min(a.
d, std::min(min_1, min_2));
147 Real min_1{INF}, min_2{INF};
148 if (idx_l.size() > 0) {min_1 = (((frac - 1.0)* z.
lI(idx_l)) /d.
lI(idx_l)).minCoeff();}
149 if (idx_g.size() > 0) {min_2 = (((1.0 - frac)*(1.0 - z.
lI(idx_g)))/d.
lI(idx_g)).minCoeff();}
150 a.
d = std::min(a.
d, std::min(min_1, min_2));
164 template <
typename Real>
175 Real rho{z.
rho}, rho_temp{z.
rho_};
178 while (rho < rho_temp)
187 Real phi{z.
phi}, f{z.
f};
204 Real
const tmp_min{std::min(p.
ls_frac, z.
mu)};
206 ftb += (z.
r1 < tmp_min*r1).count() + (z.
r2 < tmp_min*r2).count();
209 ftb += (z.
s1 < tmp_min*s1).count() + (z.
s2 < tmp_min*s2).count();
216 this->
setPrimals(x, r1, r2, s1, s2, lE, lI, z.
f, z.
cE, z.
cI, z.
phi);
222 this->
setPrimals(x, r1, r2, s1, s2, lE, lI, f, cE, cI, phi);
228 this->
setPrimals(x, r1, r2, s1, s2, lE, lI, f, cE, cI, phi);
252 template <
typename Real>
267 if (b == 2) {a.
s =
true;}
283 template <
typename Real>
294 Real f{z.
f}, phi{z.
phi}, v{z.
v};
311 Real
const tmp_min{std::min(p.
ls_frac, z.
mu)};
313 ftb += (z.
r1 < tmp_min*r1).count() + (z.
r2 < tmp_min*r2).count();
316 ftb += (z.
s1 < tmp_min*s1).count() + (z.
s2 < tmp_min*s2).count();
323 this->
setPrimals(x, r1, r2, s1, s2, lE, lI, z.
f, z.
cE, z.
cI, z.
phi);
329 this->
setPrimals(x, r1, r2, s1, s2, lE, lI, f, cE, cI, phi);
335 this->
setPrimals(x, r1, r2, s1, s2, lE, lI, f, z.
cE, z.
cI, phi);
341 this->
setPrimals(x, r1, r2, s1, s2, lE, lI, f, cE, cI, phi);
360 a.
p*ds2+d.
s2.matrix(), a.
d*dlE+d.
lE.matrix(), a.
d*dlI+d.
lI.matrix(), (a.
p*dx+d.
x).norm(),
361 std::sqrt((a.
d*dlE+d.
lE.matrix()).matrix().squaredNorm() + (a.
d*dlI+d.
lI.matrix()).squaredNorm()));
376 Real
const tmp_min{std::min(p.
ls_frac, z.
mu)};
378 ftb += (z.
r1 < tmp_min*r1).count() + (z.
r2 < tmp_min*r2).count();
381 ftb += (z.
s1 < tmp_min*s1).count() + (z.
s2 < tmp_min*s2).count();
388 this->
setPrimals(x, r1, r2, s1, s2, lE, lI, z.
f, z.
cE, z.
cI, z.
phi);
394 this->
setPrimals(x, r1, r2, s1, s2, lE, lI, f, cE, cI, phi);
400 this->
setPrimals(x, r1, r2, s1, s2, lE, lI, f, cE, cI, phi);
404 this->
setDirection(dx, dr1, dr2, ds1, ds2, dlE, dlI, dx_norm, dl_norm);
void evalMerit()
Compute the merit function value for the current iterate.
Definition Iterate.hxx:524
void setRho(Real const rho)
Set penalty parameter rho.
Definition Solver.hxx:132
Acceptance< Real > m_acceptance
Definition Solver.hxx:43
Real evalViolation(Array< Real > const &cE, Array< Real > const &cI) const
Compute the 1-norm feasibility violation from equality/inequality values.
Definition Iterate.hxx:1027
Input< Real > m_input
Definition Solver.hxx:44
Direction< Real > m_direction
Definition Solver.hxx:45
void backtracking()
Backtracking line search.
Definition Acceptance.hxx:27
void evalNewtonRhs()
Build the right-hand side vector for the Newton system.
Definition Iterate.hxx:647
Iterate< Real > m_iterate
Definition Solver.hxx:46
void evalSlacks()
Compute internal slack variables from current iterate.
Definition Iterate.hxx:737
void updatePoint()
Apply a step to the primal and dual variables of the iterate.
Definition Iterate.hxx:1003
Integer secondOrderCorrection()
Second-order correction (SOC).
Definition Acceptance.hxx:284
Parameter< Real > m_parameter
Definition Solver.hxx:48
void setPrimals(Vector< Real > const &x, Array< Real > const &r1, Array< Real > const &r2, Array< Real > const &s1, Array< Real > const &s2, Array< Real > const &lE, Array< Real > const &lI, Real const f, Array< Real > const &cE, Array< Real > const &cI, Real const phi)
Set primal/dual blocks and associated quantities on an iterate.
Definition Iterate.hxx:861
void evalNewtonStep()
Recover direction components from the Newton system solution.
Definition Direction.hxx:166
void fractionToBoundary()
Fraction-to-boundary rule for primal and dual variables.
Definition Acceptance.hxx:100
void setDirection(Vector< Real > const &dx, Vector< Real > const &dr1, Vector< Real > const &dr2, Vector< Real > const &ds1, Vector< Real > const &ds2, Vector< Real > const &dlE, Vector< Real > const &dlI, Real const dx_norm, Real const dl_norm)
Populate a Direction object from its component vectors.
Definition Direction.hxx:457
Integer fullStepCheck()
Full-step check for trial penalty parameters.
Definition Acceptance.hxx:165
void evalFunctions()
Evaluate objective and constraint functions at the current iterate.
Definition Iterate.hxx:125
void lineSearch()
Line-search driver.
Definition Acceptance.hxx:253
Namespace for the Pipal library.
Definition Acceptance.hxx:16
Eigen::Array< Integer, Eigen::Dynamic, 1 > Indices
Definition Types.hxx:117
static Indices find(Mask const &mask)
Select elements from a vector based on a boolean mask.
Definition Types.hxx:133
PIPAL_DEFAULT_INTEGER_TYPE Integer
The Integer type as used for the API.
Definition Types.hxx:110
Eigen::Array< Real, Eigen::Dynamic, 1 > Array
Definition Types.hxx:115
Eigen::Vector< Real, Eigen::Dynamic > Vector
Definition Types.hxx:112
Class for managing the acceptance criteria of the solver.
Definition Types.hxx:486
bool s
Definition Types.hxx:490
Real d
Definition Types.hxx:489
Real p
Definition Types.hxx:488
Real p0
Definition Types.hxx:487
Class for managing the current search direction of the solver.
Definition Types.hxx:446
Real l_norm
Definition Types.hxx:456
Array< Real > s2
Definition Types.hxx:454
Real qtred
Definition Types.hxx:460
Real x_norm
Definition Types.hxx:448
Array< Real > lI
Definition Types.hxx:455
Array< Real > r2
Definition Types.hxx:451
Array< Real > r1
Definition Types.hxx:450
Array< Real > lE
Definition Types.hxx:452
Vector< Real > x
Definition Types.hxx:447
Array< Real > s1
Definition Types.hxx:453
Class for managing the current iterate of the solver.
Definition Types.hxx:377
Real rho
Definition Types.hxx:381
Array< Real > cE
Definition Types.hxx:389
Real v
Definition Types.hxx:401
Real mu
Definition Types.hxx:383
Array< Real > lI
Definition Types.hxx:398
Real rho_
Definition Types.hxx:382
Array< Real > r1
Definition Types.hxx:387
Vector< Real > x
Definition Types.hxx:380
Array< Real > s2
Definition Types.hxx:394
Array< Real > lE
Definition Types.hxx:392
Array< Real > cI
Definition Types.hxx:395
Real f
Definition Types.hxx:384
Integer err
Definition Types.hxx:411
Array< Real > s1
Definition Types.hxx:393
Array< Real > r2
Definition Types.hxx:388
Real phi
Definition Types.hxx:404
Internal parameters for the solver algorithm.
Definition Types.hxx:229
static constexpr Real ls_thresh
Definition Types.hxx:236
static constexpr Real rho_factor
Definition Types.hxx:245
static constexpr Real ls_factor
Definition Types.hxx:235
static constexpr Real ls_frac
Definition Types.hxx:237