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