Program listing for file numerics/src/tools/Newton_methods.h#
Return to documentation for this file
1#ifndef NEWTON_METHODS_H
2#define NEWTON_METHODS_H
3
4
5
6#include <stddef.h>
7
8#include "NumericsFwd.h"
9#include "SiconosConfig.h"
10#ifndef __cplusplus
11#include <stdbool.h>
12#endif
13
14typedef void (*compute_F_ptr)(void *data_opaque, double *z, double *F);
15typedef void (*compute_F_merit_ptr)(void *data_opaque, double *z, double *F, double *F_merit);
16
17
18typedef struct {
19 compute_F_ptr compute_F;
20 compute_F_merit_ptr compute_F_merit;
21 void (*compute_H)(void *data_opaque, double *z, double *w, double *workV1, double *workV2,
22 NumericsMatrix *H);
23 void (*compute_error)(void *data_opaque, double *z, double *w, double *nabla_theta,
24 double tol, double *err);
25 void (*compute_RHS_desc)(
26 void *data_opaque, double *z, double *w,
27 double *F_desc);
28 void (*compute_H_desc)(
29 void *data_opaque, double *z, double *w, double *workV1, double *workV2,
30 NumericsMatrix *H_desc);
31 int (*compute_descent_direction)(
32 void *data_opaque, double *z, double *w, double *descent_dir,
33 SolverOptions *options);
34 void (*compute_JacTheta_merit)(
35 void *data_opaque, double *z, double *w, double *F_merit, double *workV,
36 double *JacThetaF_merit,
37 SolverOptions *options);
38 void *(*get_set_from_problem_data)(
39 void *problem);
40 int (*ls_failure_fn)(void *problem, double *z, double *w, double *descent_dir, double err,
41 size_t status);
42} functions_LSA;
43
44
45#define NEWTON_STATS_ITERATION 1
46
47
48typedef struct {
49 int id;
50 double merit_value;
51 double alpha;
52 unsigned int status;
53} newton_stats;
54
55
56typedef struct {
57 double p;
58 double sigma;
59 double rho;
60 bool keep_H;
61 bool check_dir_quality;
62} newton_LSA_param;
63
64
65typedef struct {
66 NumericsMatrix *H;
67} newton_LSA_data;
68
69enum NEWTON_SOLVER { SICONOS_NEWTON_LSA = 10000 };
70
71extern const char *const SICONOS_NEWTON_LSA_STR;
72
73enum SICONOS_NEWTON_IPARAM {
74
75 SICONOS_IPARAM_LSA_NONMONOTONE_LS = 3,
76 SICONOS_IPARAM_LSA_NONMONOTONE_LS_M = 4,
77 SICONOS_IPARAM_LSA_FORCE_ARCSEARCH = 5,
78 SICONOS_IPARAM_LSA_SEARCH_CRITERION = 6,
79 SICONOS_IPARAM_STOPPING_CRITERION = 10
80};
81
82enum SICONOS_STOPPING_CRITERION {
83 SICONOS_STOPPING_CRITERION_RESIDU = 0,
84 SICONOS_STOPPING_CRITERION_STATIONARITY = 1,
85 SICONOS_STOPPING_CRITERION_RESIDU_AND_STATIONARITY = 2,
86 SICONOS_STOPPING_CRITERION_USER_ROUTINE = 3
87};
88
89enum SICONOS_GOLDSTEIN_IPARAM { SICONOS_IPARAM_GOLDSTEIN_ITERMAX = 7 };
90
91enum SICONOS_NMS_IPARAM {
92
93 SICONOS_IPARAM_NMS_WATCHDOG_TYPE = 7,
94 SICONOS_IPARAM_NMS_PROJECTED_GRADIENT_TYPE = 8,
95 SICONOS_IPARAM_NMS_N_MAX = 9
96};
97
98enum SICONOS_NEWTON_DPARAM {
99
100 SICONOS_DPARAM_LSA_ALPHA_MIN = 2,
101 SICONOS_DPARAM_GOLDSTEIN_C = 3,
102 SICONOS_DPARAM_GOLDSTEIN_ALPHAMAX = 4
103};
104
105enum SICONOS_NMS_DPARAM {
106
107 SICONOS_DPARAM_NMS_DELTA = 2,
108 SICONOS_DPARAM_NMS_DELTA_VAR = 3,
109 SICONOS_DPARAM_NMS_SIGMA = 4,
110 SICONOS_DPARAM_NMS_ALPHA_MIN_WATCHDOG = 5,
111 SICONOS_DPARAM_NMS_ALPHA_MIN_PGRAD = 6,
112 SICONOS_DPARAM_NMS_MERIT_INCR = 7
113};
114
115
116#define NEWTON_STATS_NEWTON_STEP 1
117#define NEWTON_STATS_DESC_DIR 2
118
119#if defined(__cplusplus) && !defined(BUILD_AS_CPP)
120extern "C" {
121#endif
122
123
124void newton_LSA(unsigned n, double *z, double *w, int *info, void *data,
125 SolverOptions *options, functions_LSA *functions);
126
127
128static inline void init_lsa_functions(functions_LSA *functions, compute_F_ptr compute_F,
129 compute_F_merit_ptr merit_function) {
130 functions->compute_F = compute_F;
131 functions->compute_F_merit = merit_function;
132 functions->compute_H = NULL;
133 functions->compute_error = NULL;
134 functions->compute_RHS_desc = NULL;
135 functions->compute_H_desc = NULL;
136 functions->compute_descent_direction = NULL;
137 functions->compute_JacTheta_merit = NULL;
138 functions->get_set_from_problem_data = NULL;
139 functions->ls_failure_fn = NULL;
140}
141
142
143void set_lsa_params_data(SolverOptions *options, NumericsMatrix *mat);
144
145
146void newton_LSA_free_solverOptions(SolverOptions *options);
147
148
149void newton_lsa_set_default(SolverOptions *options);
150
151
152#if defined(__cplusplus) && !defined(BUILD_AS_CPP)
153}
154#endif
155
156#endif