Program listing for file numerics/src/tools/Newton_methods.h

Program listing for file numerics/src/tools/Newton_methods.h#

  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