File numerics/src/LCP/pivot-utils.h#
Go to the source code of this file
some functions used in one or more solver, mainly related to Lemke’s algorithm
Defines
-
PIVOT_PATHSEARCH_SUCCESS#
Functions
-
int pivot_init_lemke(double *mat, unsigned int dim)#
find the first leaving variable for Lemke’s algorithm
- Parameters:
mat – the matrix
dim – the dimension of the problem
- Returns:
the index of the blocking variable
-
int pivot_init_pathsearch(unsigned dim, double *mat, unsigned *t_indx)#
find the first leaving variable for the pathsearch algorithm
- Parameters:
dim – the dimension of the problem
mat – the matrix
t_indx – [out] the index of t in the basis (needed since block < 0 is possible and meaningful)
- Returns:
the index of the blocking (leaving) variable
-
int pivot_selection_lemke(double *mat, unsigned dim, unsigned drive, unsigned aux_index)#
find the leaving variable for Lemke’s algorithm
- Parameters:
mat – the matrix; we only use the columns of basic variable and the covering vector of the entering variable
dim – dimension of the problem
drive – the driving variable
aux_index – index of auxillary variable in the current basis
- Returns:
the leaving (or blocking) variable
-
int pivot_selection_lemke2(unsigned n, double *col_drive, double *q_tilde, double *lexico_mat, unsigned aux_indx, double lexico_tol)#
find the leaving variable for Lemke’s algorithm
- Parameters:
n – dimension of the problem pivots)
col_drive – column of the driving variable (contains all the possible pivots)
q_tilde – solution of the linear system
lexico_mat – matrix for the lexico ordering
aux_indx – index of auxillary variable in the current basis
lexico_tol – the tolerance on the lexicographic comparison
- Returns:
the leaving (or blocking) variable
-
int pivot_selection_lemke3(unsigned n, double *col_drive, double *q_tilde, double *lexico_col, unsigned *basis, unsigned *candidate_indx, SN_lumod_dense_data *lumod_data, unsigned aux_indx, double lexico_tol)#
find the leaving variable for Lemke’s algorithm
- Parameters:
n – dimension of the problem
col_drive – column of the driving variable (contains all the possible pivots)
q_tilde – solution of the linear system
lexico_col – column for the lexico ordering
basis – current basis
candidate_indx – array for storing the possible candidate indexes
lumod_data – data for the BLU update
aux_indx – index of auxillary variable in the current basis
lexico_tol – the tolerance on the lexicographic comparison
- Returns:
the leaving (or blocking) variable
-
int pivot_selection_pathsearch(double *mat, unsigned dim, unsigned drive, unsigned t_indx)#
find the leaving variable in a path search procedure.
The code is almost the same as in pivot_selection_lemke, except that we also check if it is possible to set t = 1.
- Parameters:
mat – the matrix (we only use the columns of basic variable and the covering vector of the entering variable
dim – dimension of the problem
drive – the driving or entering variable
t_indx – the index of the t variable in the basis
- Returns:
the leaving (or blocking) variable
-
void init_M_lemke(double *mat, double *M, unsigned int dim, unsigned int size_x, double *q, double *d)#
Initialize the matrix for Lemke’s algorithm as [ q | Id | -d | -M ] with d_i = 1 if i < size_x if the argument d is NULL.
Otherwise take d from the arguments
- Parameters:
mat – column-major matrix to fill
M – M matrix from the LCP formulation
dim – dimension of the problem
size_x – for the classical Lemke’s algorithm, this is set to dim. Its value is different when we solve an AVI using Cao and Ferris method
q – vector from the LCP formulation
d – covering vector for the auxiliary variable, possibly NULL
-
void do_pivot_driftless(double *mat, unsigned int dim, unsigned int dim2, unsigned int block, unsigned int drive)#
Do the pivot <block, drive>, driftless version.
- Parameters:
mat – the matrix to update
dim – the number of rows
dim2 – the number of columns
block – the blocking or leaving variable
drive – the driving or entering variable
-
void do_pivot_driftless2(double *mat, unsigned int dim, unsigned int dim2, unsigned int block, unsigned int drive)#
Do the pivot <block, drive>, driftless version.
- Parameters:
mat – the matrix to update
dim – the number of rows
dim2 – the number of columns
block – the blocking or leaving variable
drive – the driving or entering variable
-
void do_pivot(double *mat, unsigned int dim, unsigned int dim2, unsigned int block, unsigned int drive)#
Do the pivot <block, drive>, standart version.
- Parameters:
mat – the matrix to update
dim – the number of rows
dim2 – the number of columns
block – the blocking or leaving variable
drive – the driving or entering variable
-
void do_pivot_lumod(SN_lumod_dense_data *lumod_data, NumericsMatrix *M, double *q_tilde, double *lexico_mat, double *col_drive, double *col_tilde, unsigned *basis, unsigned block, unsigned drive)#
Do the pivot <block, drive> with block-LU updates.
- Parameters:
lumod_data – lumod data
M – the LCP matrix
q_tilde – the modified q vector: it is the current of the variables currently in the basis
lexico_mat – matrix for the lexicographic ordering
col_drive – column of the driving variable
col_tilde – Solution to H x = col
basis – current basis
block – the blocking or leaving variable
drive – the driving or entering variable
-
void lcp_pivot_diagnose_info(int info)#
print a diagnostic of the info value
- Parameters:
info – the value given by the algorithm
-
int pivot_selection_bard(double *mat, unsigned int dim)#
-
int pivot_selection_least_index(double *mat, unsigned int dim)#
- void init_M_bard (double *restrict mat, double *restrict M, unsigned int dim, double *restrict q)
- void init_M_least_index (double *restrict mat, double *restrict M, unsigned int dim, double *restrict q)
- int init_M_lemke_warm_start (int n, double *restrict u, double *restrict mat, double *restrict M, double *restrict q, int *restrict basis, double *restrict cov_vec)
-
const char *basis_to_name(unsigned nb, unsigned n)#
-
unsigned basis_to_number(unsigned nb, unsigned n)#