Skip to content

Commit efd79f7

Browse files
author
Teseo Schneider
committed
added projected and not reg newton
1 parent 8bff213 commit efd79f7

File tree

4 files changed

+64
-13
lines changed

4 files changed

+64
-13
lines changed

nonlinear-solver-spec.json

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
[{
1+
[
2+
{
23
"pointer": "/",
34
"default": null,
45
"type": "object",
@@ -129,7 +130,8 @@
129130
"reg_weight_max",
130131
"reg_weight_inc",
131132
"force_psd_projection",
132-
"use_psd_projection"
133+
"use_psd_projection",
134+
"use_psd_projection_in_regularized"
133135
],
134136
"doc": "Options for Newton."
135137
},
@@ -169,6 +171,12 @@
169171
"type": "bool",
170172
"doc": "Use PSD as fallback using second order solvers (i.e., Newton's method)."
171173
},
174+
{
175+
"pointer": "/Newton/use_psd_projection_in_regularized",
176+
"default": true,
177+
"type": "bool",
178+
"doc": "Use PSD in regularized Newton."
179+
},
172180
{
173181
"pointer": "/ADAM",
174182
"default": null,
@@ -290,7 +298,7 @@
290298
"optional": [
291299
"residual_tolerance"
292300
],
293-
"doc": "Options for Newton."
301+
"doc": "Options for projected Newton."
294302
},
295303
{
296304
"pointer": "/solver/*",
@@ -305,7 +313,22 @@
305313
"reg_weight_max",
306314
"reg_weight_inc"
307315
],
308-
"doc": "Options for Newton."
316+
"doc": "Options for regularized Newton."
317+
},
318+
{
319+
"pointer": "/solver/*",
320+
"type": "object",
321+
"type_name": "RegularizedProjectedNewton",
322+
"required": [
323+
"type"
324+
],
325+
"optional": [
326+
"residual_tolerance",
327+
"reg_weight_min",
328+
"reg_weight_max",
329+
"reg_weight_inc"
330+
],
331+
"doc": "Options for regularized projected Newton."
309332
},
310333
{
311334
"pointer": "/solver/*",
@@ -329,7 +352,7 @@
329352
"optional": [
330353
"residual_tolerance"
331354
],
332-
"doc": "Options for Newton."
355+
"doc": "Options for projected Newton."
333356
},
334357
{
335358
"pointer": "/solver/*",
@@ -344,7 +367,22 @@
344367
"reg_weight_max",
345368
"reg_weight_inc"
346369
],
347-
"doc": "Options for Newton."
370+
"doc": "Options for regularized Newton."
371+
},
372+
{
373+
"pointer": "/solver/*",
374+
"type": "object",
375+
"type_name": "DenseRegularizedProjectedNewton",
376+
"required": [
377+
"type"
378+
],
379+
"optional": [
380+
"residual_tolerance",
381+
"reg_weight_min",
382+
"reg_weight_max",
383+
"reg_weight_inc"
384+
],
385+
"doc": "Options for projected regularized Newton."
348386
},
349387
{
350388
"pointer": "/solver/*",
@@ -429,6 +467,8 @@
429467
"DenseProjectedNewton",
430468
"RegularizedNewton",
431469
"DenseRegularizedNewton",
470+
"RegularizedProjectedNewton",
471+
"DenseRegularizedProjectedNewton",
432472
"GradientDescent",
433473
"StochasticGradientDescent",
434474
"ADAM",

src/polysolve/nonlinear/Solver.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,11 @@ namespace polysolve::nonlinear
4949
}
5050
else if (solver_name == "DenseRegularizedNewton")
5151
{
52-
return std::make_shared<RegularizedNewton>(false, solver_params, linear_solver_params, characteristic_length, logger);
52+
return std::make_shared<RegularizedNewton>(false, false, solver_params, linear_solver_params, characteristic_length, logger);
53+
}
54+
else if (solver_name == "DenseRegularizedProjectedNewton")
55+
{
56+
return std::make_shared<RegularizedNewton>(false, true, solver_params, linear_solver_params, characteristic_length, logger);
5357
}
5458

5559
else if (solver_name == "Newton" || solver_name == "SparseNewton" || solver_name == "sparse_newton")
@@ -62,7 +66,11 @@ namespace polysolve::nonlinear
6266
}
6367
else if (solver_name == "RegularizedNewton")
6468
{
65-
return std::make_shared<RegularizedNewton>(true, solver_params, linear_solver_params, characteristic_length, logger);
69+
return std::make_shared<RegularizedNewton>(true, false, solver_params, linear_solver_params, characteristic_length, logger);
70+
}
71+
else if (solver_name == "RegularizedProjectedNewton")
72+
{
73+
return std::make_shared<RegularizedNewton>(true, true, solver_params, linear_solver_params, characteristic_length, logger);
6674
}
6775

6876
else if (solver_name == "LBFGS" || solver_name == "L-BFGS")

src/polysolve/nonlinear/descent_strategies/Newton.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ namespace polysolve::nonlinear
4040
const double reg_weight_min = solver_params["Newton"]["reg_weight_min"];
4141
if (reg_weight_min > 0)
4242
res.push_back(std::make_unique<RegularizedNewton>(
43-
sparse,
43+
sparse, solver_params["Newton"]["use_psd_projection_in_regularized"],
4444
reg_solver_params, linear_solver_params,
4545
characteristic_length, logger));
4646

@@ -89,11 +89,13 @@ namespace polysolve::nonlinear
8989

9090
RegularizedNewton::RegularizedNewton(
9191
const bool sparse,
92+
const bool project_to_psd,
9293
const json &solver_params,
9394
const json &linear_solver_params,
9495
const double characteristic_length,
9596
spdlog::logger &logger)
96-
: Superclass(sparse, extract_param("RegularizedNewton", "residual_tolerance", solver_params), solver_params, linear_solver_params, characteristic_length, logger)
97+
: Superclass(sparse, extract_param("RegularizedNewton", "residual_tolerance", solver_params), solver_params, linear_solver_params, characteristic_length, logger),
98+
project_to_psd(project_to_psd)
9799
{
98100
reg_weight_min = extract_param("RegularizedNewton", "reg_weight_min", solver_params);
99101
reg_weight_max = extract_param("RegularizedNewton", "reg_weight_max", solver_params);
@@ -265,7 +267,7 @@ namespace polysolve::nonlinear
265267
{
266268
if (x.size() != x_cache.size() || x != x_cache)
267269
{
268-
objFunc.set_project_to_psd(true);
270+
objFunc.set_project_to_psd(project_to_psd);
269271
objFunc.hessian(x, hessian_cache);
270272
x_cache = x;
271273
}
@@ -299,7 +301,7 @@ namespace polysolve::nonlinear
299301
Eigen::MatrixXd &hessian)
300302

301303
{
302-
objFunc.set_project_to_psd(true);
304+
objFunc.set_project_to_psd(project_to_psd);
303305
objFunc.hessian(x, hessian);
304306
if (reg_weight > 0)
305307
{

src/polysolve/nonlinear/descent_strategies/Newton.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ namespace polysolve::nonlinear
107107
public:
108108
using Superclass = Newton;
109109

110-
RegularizedNewton(const bool sparse,
110+
RegularizedNewton(const bool sparse, const bool project_to_psd,
111111
const json &solver_params,
112112
const json &linear_solver_params,
113113
const double characteristic_length,
@@ -122,6 +122,7 @@ namespace polysolve::nonlinear
122122
bool handle_error() override;
123123

124124
private:
125+
const bool project_to_psd;
125126
double reg_weight_min; // needs to be greater than zero
126127
double reg_weight_max;
127128
double reg_weight_inc;

0 commit comments

Comments
 (0)