Mixed Linear Complementarity Problems (MLCP)#
Problem statement#
Find \((z,w)\) such that:
\(u, w_{1}\) are vectors of size n.
\(v, w_{2}\) are vectors of size m.
Another storage is also possible for the MLCP problem:
Try \((u,v,w)\) such that:
\(\left\lbrace \begin{array}{l} A u + Cv +a =0\\ D u + Bv +b = w \\ 0 \le v \perp w \ge 0\\ \end{array} \right.\)
where A is an ( \(n \times n\) ) matrix, B is an ( \(m \times m\) ) matrix, C is an ( \(n \times m\) ) matrix,
D is an ( \(m \times n\) ) matrix, a and u is an ( \(n\) ) vectors b,v and w is an ( \(m\) ) vectors.
Implementation in numerics#
Structure to define the problem: MixedLinearComplementarityProblem
.
The generic driver for all MLCPs is mlcp_driver()
.
Solvers list MLCP_SOLVER
MLCP solvers must be initialized before any call of the driver. Here is the standard sequence of calls:
Initialize the solver with
mlcp_driver_init()
.Solve the problemt with
mlcp_driver()
.Reset the solver with
mlcp_driver_reset()
.
Error computation#
The criterion is based on :
with \(x_{+} = max(0,x)\) and \(x_{-} = max(0,-x)\).
mlcp_compute_error()
returns 0 if \(error \leq tolerance\), else 1.A call to this function updates the content of the input vector w with \(Mz + q\).
MLCP available solvers#
Projected Gauss-Seidel (SICONOS_MLCP_PGS
)#
Projected Gauss-Seidel, a basic Projected Gauss-Seidel solver for MLCP.
driver: mlcp_pgs()
parameters:
iparam[SICONOS_IPARAM_MAX_ITER] = 1000
iparam[SICONOS_IPARAM_MLCP_PGS_EXPLICIT] = 0, 1 for implicit.
dparam[SICONOS_DPARAM_TOL] = 1e-6
Projected Gauss-Seidel, SBM (SICONOS_MLCP_PGS_SBM
)#
Gauss-Seidel with sparse-block storage.
driver: mlcp_pgs_sbm()
parameters:
iparam[SICONOS_IPARAM_MAX_ITER] = 1000
dparam[SICONOS_DPARAM_TOL] = 1e-6
internal solver : :enumerate:`SICONOS_LCP_PGS`.
out * iparam[SICONOS_IPARAM_MLCP_PGS_SUM_ITER], sum of local number of iterations (output from local_driver) * dparam[SICONOS_DPARAM_MLCP_PGS_SUM_ERRORS] sum of local errors (output from local_driver)
Regularized Projected Gauss-Seidel (SICONOS_MLCP_RPGS
)#
Regularized Projected Gauss-Seidel, solver for MLCP, able to handle with matrices with null diagonal terms
driver: mlcp_rpgs()
parameters:
iparam[SICONOS_IPARAM_MAX_ITER] = 10000
dparam[SICONOS_DPARAM_TOL] = 1e-6
dparam[SICONOS_DPARAM_MLCP_RHO] = 0.5
PSOR (SICONOS_MLCP_PSOR
)#
Projected Succesive over relaxation solver.
driver: mlcp_psor()
parameters:
iparam[SICONOS_IPARAM_MAX_ITER] = 1000
dparam[SICONOS_DPARAM_TOL] = 1e-6
dparam[SICONOS_DPARAM_MLCP_OMEGA] = 2
RPSOR (SICONOS_MLCP_RPSOR
)#
Regularized projected successive overrelaxation method.
driver: mlcp_rpsor()
parameters:
iparam[SICONOS_IPARAM_MAX_ITER] = 1000
dparam[SICONOS_DPARAM_TOL] = 1e-6
dparam[SICONOS_DPARAM_MLCP_OMEGA] = 2
dparam[SICONOS_DPARAM_MLCP_RHO] = 0.5
PATH (Ferris) solver (SICONOS_MLCP_PATH
)#
Path (Ferris) Solver.
Works only if Siconos has been built with path support (if PathFerris or PathVI has been found, see :ref:`siconos_install_guide`)
driver: mlcp_path()
parameters * dparam[SICONOS_DPARAM_TOL] = 1e-12
Enumerative solver (SICONOS_MLCP_ENUM
)#
Brute-force method which tries every possible solution.
driver: mlcp_enum()
parameters:
iparam[SICONOS_IPARAM_MAX_ITER] = 10000
iparam[SICONOS_IPARAM_MLCP_ENUM_USE_DGELS] = 0 (0 : use dgesv, 1: use dgels)
dparam[SICONOS_DPARAM_TOL] = 1e-12
PATH + enum solver (SICONOS_MLCP_PATH_ENUM
)#
First try with Path (Ferris) Solver then use enum if the solver failed.
Works only if Siconos has been built with path support (if PathFerris or PathVI has been found, see :ref:`siconos_install_guide`)
driver: mlcp_path_enum()
parameters : same as SICONOS_MLCP_ENUM
.
Direct + enum solver (SICONOS_MLCP_DIRECT_ENUM
)#
First try direct method and then use enum if the solver failed.
driver: mlcp_direct_enum()
parameters:
iparam[SICONOS_IPARAM_MAX_ITER] = 10000
dparam[SICONOS_DPARAM_TOL] = 1e-12
dparam[SICONOS_IPARAM_MLCP_ENUM_USE_DGELS] = 0;
dparam[SICONOS_DPARAM_MLCP_SIGN_TOL_POS] = 1e-12: A positive value, tolerance to consider that complementarity holds.
dparam[SICONOS_DPARAM_MLCP_SIGN_TOL_NEG] = 1e-12: A positive value, tolerance to consider that a var is negative.
iparam[SICONOS_IPARAM_MLCP_NUMBER_OF_CONFIGURATIONS] = 3 : Number of registered configurations.
iparam[SICONOS_IPARAM_MLCP_UPDATE_REQUIRED] = 0;
iparam[7] (out): Number of case the direct solved failed.
Simplex solver (SICONOS_MLCP_SIMPLEX
)#
driver: mlcp_simplex()
parameters:
iparam[SICONOS_IPARAM_MAX_ITER] = 10000
dparam[SICONOS_DPARAM_TOL] = 1e-12
Direct/Simplex solver (SICONOS_MLCP_DIRECT_SIMPLEX
)#
Try direct method and switch to simplex if it fails.
driver: mlcp_direct_simplex()
parameters:
iparam[SICONOS_IPARAM_MAX_ITER] = 10000
dparam[SICONOS_DPARAM_TOL] = 1e-12
dparam[SICONOS_DPARAM_MLCP_SIGN_TOL_POS] = 1e-12: A positive value, tolerance to consider that complementarity holds.
dparam[SICONOS_DPARAM_MLCP_SIGN_TOL_NEG] = 1e-12: A positive value, tolerance to consider that a var is negative.
iparam[SICONOS_IPARAM_MLCP_NUMBER_OF_CONFIGURATIONS] = 3;
iparam[SICONOS_IPARAM_MLCP_UPDATE_REQUIRED] = 0;
iparam[7] (out): Number of case the direct solved failed.
Direct/Path solver (SICONOS_MLCP_DIRECT_PATH
)#
Try direct method and switch to Path if it fails.
driver: mlcp_direct_path()
parameters:
iparam[SICONOS_IPARAM_MAX_ITER] = 10000
dparam[SICONOS_DPARAM_TOL] = 1e-12
dparam[SICONOS_DPARAM_MLCP_SIGN_TOL_POS] = 1e-12: A positive value, tolerance to consider that complementarity holds.
dparam[SICONOS_DPARAM_MLCP_SIGN_TOL_NEG] = 1e-12: A positive value, tolerance to consider that a var is negative.
iparam[SICONOS_IPARAM_MLCP_NUMBER_OF_CONFIGURATIONS] = 3;
iparam[SICONOS_IPARAM_MLCP_UPDATE_REQUIRED] = 0;
iparam[7] (out): Number of case the direct solved failed.
Direct/Path/enum solver (SICONOS_MLCP_DIRECT_PATH_ENUM
)#
Try direct then switch to PATH and finish with enum.
driver: mlcp_direct_path_enum()
parameters:
iparam[SICONOS_IPARAM_MAX_ITER] = 10000
dparam[SICONOS_DPARAM_TOL] = 1e-12
dparam[SICONOS_DPARAM_MLCP_SIGN_TOL_POS] = 1e-12: A positive value, tolerance to consider that complementarity holds.
dparam[SICONOS_DPARAM_MLCP_SIGN_TOL_NEG] = 1e-12: A positive value, tolerance to consider that a var is negative.
iparam[SICONOS_IPARAM_MLCP_NUMBER_OF_CONFIGURATIONS] = 3;
iparam[SICONOS_IPARAM_MLCP_UPDATE_REQUIRED] = 0;
iparam[SICONOS_IPARAM_MLCP_ENUM_USE_DGELS] = 0 (0 : use dgesv, 1: use dgels)
iparam[7] (out): Number of case the direct solved failed.
Nonsmooth Newton solver, Fisher-Burmeister (SICONOS_MLCP_FB
)#
driver: mlcp_FB()
parameters:
iparam[SICONOS_IPARAM_MAX_ITER] = 10000
dparam[SICONOS_DPARAM_TOL] = 1e-12
Direct + Nonsmooth Newton solver, Fisher-Burmeister (SICONOS_MLCP_DIRECT_FB
)#
Try direct solver then switch to Fisher-Burmeister.
driver: mlcp_direct_FB()
parameters:
iparam[SICONOS_IPARAM_MAX_ITER] = 10000
dparam[SICONOS_DPARAM_TOL] = 1e-12
iparam[SICONOS_IPARAM_MLCP_NUMBER_OF_CONFIGURATIONS]
dparam[SICONOS_DPARAM_MLCP_SIGN_TOL_NEG];
dparam[SICONOS_DPARAM_MLCP_SIGN_TOL_POS];
iparam[SICONOS_IPARAM_MLCP_UPDATE_REQUIRED]
return iparam[7] for iters