1 /* Siconos is a program dedicated to modeling, simulation and control
2 * of non smooth dynamical systems.
3 *
4 * Copyright 2021 INRIA.
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18
19 #include "Newton_methods.h" // for functions_LSA, init_...
20 #include "NumericsFwd.h" // for VariationalInequality
21 #include "Qi_merit.h" // for Jac_F_Qi, phi_Qi
22 #include "SiconosSets.h" // for box_constraints
23 #include "SolverOptions.h" // for SolverOptions
24 #include "VI_Newton.h" // for VI_compute_F, VI_com...
25 #include "VariationalInequality.h" // for VariationalInequality
26 #include "VariationalInequality_Solvers.h" // for variationalInequalit...
27 #include "VariationalInequality_computeError.h" // for variationalInequalit...
28
VI_compute_F(void * data_opaque,double * x,double * F)29 void VI_compute_F(void* data_opaque, double* x, double* F)
30 {
31 VariationalInequality* problem = (VariationalInequality*) data_opaque;
32 problem->F(problem, problem->size, x, F);
33 }
34
VI_compute_error_box(void * data_opaque,double * x,double * F,double * Jac_F_merit,double tol,double * err)35 void VI_compute_error_box(void* data_opaque, double* x, double* F, double* Jac_F_merit, double tol, double* err)
36 {
37 VariationalInequality* problem = (VariationalInequality*) data_opaque;
38 variationalInequality_compute_error_box(problem, x, F, tol, err);
39 }
40
VI_compute_F_box_Qi(void * data_opaque,double * x,double * F,double * Fbox)41 void VI_compute_F_box_Qi(void* data_opaque, double* x, double* F, double* Fbox)
42 {
43 VariationalInequality* problem = (VariationalInequality*) data_opaque;
44 phi_Qi(problem->size, x, F, Fbox, ((box_constraints*) problem->set)->lb, ((box_constraints*) problem->set)->ub);
45 }
46
VI_compute_H_box_Qi(void * data_opaque,double * x,double * F,double * workV1,double * workV2,NumericsMatrix * H)47 void VI_compute_H_box_Qi(void* data_opaque, double* x, double* F, double* workV1, double* workV2, NumericsMatrix* H)
48 {
49 VariationalInequality* problem = (VariationalInequality*) data_opaque;
50 problem->compute_nabla_F(problem, problem->size, x, problem->nabla_F);
51
52 Jac_F_Qi(problem->size, x, F, workV1, workV2, problem->nabla_F, ((box_constraints*) problem->set)->lb, ((box_constraints*) problem->set)->ub, H);
53 }
54
55 void* vi_get_set(void* problem); /*XXX */
56
variationalInequality_box_newton_QiLSA(VariationalInequality * problem,double * x,double * F,int * info,SolverOptions * options)57 void variationalInequality_box_newton_QiLSA(VariationalInequality* problem, double *x, double *F, int* info, SolverOptions* options)
58 {
59 functions_LSA functions_QiLSA;
60 init_lsa_functions(&functions_QiLSA, &VI_compute_F, &VI_compute_F_box_Qi);
61 functions_QiLSA.compute_H = &VI_compute_H_box_Qi;
62 functions_QiLSA.compute_error = &VI_compute_error_box;
63 functions_QiLSA.get_set_from_problem_data = &vi_get_set;
64
65
66 set_lsa_params_data(options, problem->nabla_F);
67 newton_LSA(problem->size, x, F, info, (void *)problem, options, &functions_QiLSA);
68 }
69
70
variationalInequality_BOX_QI_set_default(SolverOptions * options)71 void variationalInequality_BOX_QI_set_default(SolverOptions* options)
72 {
73 options->iparam[SICONOS_IPARAM_STOPPING_CRITERION] = SICONOS_STOPPING_CRITERION_USER_ROUTINE;
74 options->iparam[SICONOS_IPARAM_LSA_NONMONOTONE_LS] = 0;
75 options->iparam[SICONOS_IPARAM_LSA_NONMONOTONE_LS_M] = 0;
76 options->iparam[SICONOS_IPARAM_LSA_FORCE_ARCSEARCH] = 1;
77 options->dparam[SICONOS_DPARAM_LSA_ALPHA_MIN] = 1e-16;
78 }
79