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