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 "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