Skip to content

Commit

Permalink
Added OSQPSettings as argument to init_linsys_solver()
Browse files Browse the repository at this point in the history
  • Loading branch information
gbanjac committed Oct 5, 2019
1 parent a38b889 commit 4f18fc0
Show file tree
Hide file tree
Showing 11 changed files with 64 additions and 65 deletions.
4 changes: 2 additions & 2 deletions docs/contributing/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -75,10 +75,10 @@ The linear system solver object is defined in :code:`mysolver.h` as follows
};
// Initialize mysolver solver
c_int init_linsys_solver_mysolver(mysolver_solver ** s, const csc * P, const csc * A, c_float sigma, c_float * rho_vec, c_int polish);
c_int init_linsys_solver_mysolver(mysolver_solver ** s, const csc * P, const csc * A, c_float * rho_vec, OSQPSettings *settings, c_int polish);
// Solve linear system and store result in b
c_int solve_linsys_mysolver(mysolver_solver * s, c_float * b);
c_int solve_linsys_mysolver(mysolver_solver * s, c_float * b, c_int admm_iter);
// Update linear system solver matrices
c_int update_linsys_solver_matrices_mysolver(mysolver_solver * s, const csc *P, const csc *A);
Expand Down
3 changes: 2 additions & 1 deletion include/auxil.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ void swap_vectors(OSQPVectorf **a,

/**
* Update x_tilde and z_tilde variable (first ADMM step)
* @param solver Solver
* @param solver Solver
* @param admm_iter Current ADMM iteration
*/
void update_xz_tilde(OSQPSolver *solver, c_int admm_iter);

Expand Down
16 changes: 7 additions & 9 deletions include/lin_sys.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,20 +32,18 @@ c_int unload_linsys_solver(enum linsys_solver_type linsys_solver);
* @param s Pointer to linear system solver structure
* @param P Cost function matrix
* @param A Constraint matrix
* @param sigma Algorithm parameter
* @param rho_vec Algorithm parameter
* @param linsys_solver Linear system solver
* @param settings Solver settings
* @param polish 0/1 depending whether we are allocating for
*polishing or not
* @return Exitflag for error (0 if no errors)
*/
c_int init_linsys_solver(LinSysSolver **s,
const OSQPMatrix *P,
const OSQPMatrix *A,
c_float sigma,
const OSQPVectorf *rho_vec,
enum linsys_solver_type linsys_solver,
c_int polish);
c_int init_linsys_solver(LinSysSolver **s,
const OSQPMatrix *P,
const OSQPMatrix *A,
const OSQPVectorf *rho_vec,
OSQPSettings *settings,
c_int polish);

# ifdef __cplusplus
}
Expand Down
16 changes: 8 additions & 8 deletions lin_sys/direct/pardiso/pardiso_interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,23 +73,23 @@ void free_linsys_solver_pardiso(pardiso_solver *s) {


// Initialize factorization structure
c_int init_linsys_solver_pardiso(pardiso_solver ** sp,
const OSQPMatrix * P,
const OSQPMatrix * A,
c_float sigma,
const OSQPVectorf * rho_vec,
c_int polish){
c_int init_linsys_solver_pardiso(pardiso_solver **sp,
const OSQPMatrix *P,
const OSQPMatrix *A,
const OSQPVectorf *rho_vec,
OSQPSettings *settings,
c_int polish) {

c_int i; // loop counter
c_int nnzKKT; // Number of nonzeros in KKT
// Define Variables
c_int n_plus_m; // n_plus_m dimension
c_float* rhov; //used for direct access to rho_vec data when polish=false

c_float sigma = settings->sigma;

// Allocate private structure to store KKT factorization
pardiso_solver *s;
s = c_calloc(1, sizeof(pardiso_solver));
pardiso_solver *s = c_calloc(1, sizeof(pardiso_solver));
*sp = s;

// Size of KKT
Expand Down
14 changes: 7 additions & 7 deletions lin_sys/direct/pardiso/pardiso_interface.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,17 +81,17 @@ struct pardiso {
* @param s Pointer to a private structure
* @param P Cost function matrix (upper triangular form)
* @param A Constraints matrix
* @param sigma Algorithm parameter. If polish, then sigma = delta.
* @param rho_vec Algorithm parameter. If polish, then rho_vec = OSQP_NULL.
* @param settings Solver settings
* @param polish Flag whether we are initializing for polish or not
* @return Exitflag for error (0 if no errors)
*/
c_int init_linsys_solver_pardiso(pardiso_solver ** sp,
const OSQPMatrix * P,
const OSQPMatrix * A,
c_float sigma,
const OSQPVectorf * rho_vec,
c_int polish);
c_int init_linsys_solver_pardiso(pardiso_solver **sp,
const OSQPMatrix *P,
const OSQPMatrix *A,
const OSQPVectorf *rho_vec,
OSQPSettings *settings,
c_int polish);


/**
Expand Down
17 changes: 9 additions & 8 deletions lin_sys/direct/qdldl/qdldl_interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -167,22 +167,23 @@ static c_int permute_KKT(csc ** KKT, qdldl_solver * p, c_int Pnz, c_int Anz, c_i


// Initialize LDL Factorization structure
c_int init_linsys_solver_qdldl(qdldl_solver ** sp,
const OSQPMatrix* P,
const OSQPMatrix* A,
c_float sigma,
const OSQPVectorf* rho_vec,
c_int polish){
c_int init_linsys_solver_qdldl(qdldl_solver **sp,
const OSQPMatrix *P,
const OSQPMatrix *A,
const OSQPVectorf *rho_vec,
OSQPSettings *settings,
c_int polish) {

// Define Variables
csc * KKT_temp; // Temporary KKT pointer
c_int i; // Loop counter
c_int n_plus_m; // Define n_plus_m dimension
c_float* rhov; //used for direct access to rho_vec data when polish=false

c_float sigma = settings->sigma;

// Allocate private structure to store KKT factorization
qdldl_solver *s;
s = c_calloc(1, sizeof(qdldl_solver));
qdldl_solver *s = c_calloc(1, sizeof(qdldl_solver));
*sp = s;

// Size of KKT
Expand Down
14 changes: 7 additions & 7 deletions lin_sys/direct/qdldl/qdldl_interface.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,17 +85,17 @@ struct qdldl {
* @param s Pointer to a private structure
* @param P Cost function matrix (upper triangular form)
* @param A Constraints matrix
* @param sigma Algorithm parameter. If polish, then sigma = delta.
* @param rho_vec Algorithm parameter. If polish, then rho_vec = OSQP_NULL.
* @param settings Solver settings
* @param polish Flag whether we are initializing for polish or not
* @return Exitflag for error (0 if no errors)
*/
c_int init_linsys_solver_qdldl(qdldl_solver ** sp,
const OSQPMatrix * P,
const OSQPMatrix * A,
c_float sigma,
const OSQPVectorf* rho_vec,
c_int polish);
c_int init_linsys_solver_qdldl(qdldl_solver **sp,
const OSQPMatrix *P,
const OSQPMatrix *A,
const OSQPVectorf *rho_vec,
OSQPSettings *settings,
c_int polish);

/**
* Solve linear system and store result in b
Expand Down
22 changes: 11 additions & 11 deletions src/lin_sys.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,23 +53,23 @@ c_int unload_linsys_solver(enum linsys_solver_type linsys_solver) {

// Initialize linear system solver structure
// NB: Only the upper triangular part of P is filled
c_int init_linsys_solver(LinSysSolver **s,
const OSQPMatrix *P,
const OSQPMatrix *A,
c_float sigma,
const OSQPVectorf *rho_vec,
enum linsys_solver_type linsys_solver,
c_int polish) {
switch (linsys_solver) {
c_int init_linsys_solver(LinSysSolver **s,
const OSQPMatrix *P,
const OSQPMatrix *A,
const OSQPVectorf *rho_vec,
OSQPSettings *settings,
c_int polish) {

switch (settings->linsys_solver) {
case QDLDL_SOLVER:
return init_linsys_solver_qdldl((qdldl_solver **)s, P, A, sigma, rho_vec, polish);
return init_linsys_solver_qdldl((qdldl_solver **)s, P, A, rho_vec, settings, polish);

# ifdef ENABLE_MKL_PARDISO
case MKL_PARDISO_SOLVER:
return init_linsys_solver_pardiso((pardiso_solver **)s, P, A, sigma, rho_vec, polish);
return init_linsys_solver_pardiso((pardiso_solver **)s, P, A, rho_vec, settings, polish);

# endif /* ifdef ENABLE_MKL_PARDISO */
default: // QDLDL
return init_linsys_solver_qdldl((qdldl_solver **)s, P, A, sigma, rho_vec, polish);
return init_linsys_solver_qdldl((qdldl_solver **)s, P, A, rho_vec, settings, polish);
}
}
6 changes: 2 additions & 4 deletions src/osqp_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -241,10 +241,8 @@ c_int osqp_setup(OSQPSolver** solverp,
if (load_linsys_solver(settings->linsys_solver)) return osqp_error(OSQP_LINSYS_SOLVER_LOAD_ERROR);

// Initialize linear system solver structure
exitflag = init_linsys_solver(&(work->linsys_solver), work->data->P, work->data->A,
settings->sigma,
work->rho_vec,
settings->linsys_solver, 0);
exitflag = init_linsys_solver(&(work->linsys_solver), work->data->P, work->data->A,
work->rho_vec, solver->settings, 0);

if (exitflag) {
return osqp_error(exitflag);
Expand Down
3 changes: 1 addition & 2 deletions src/polish.c
Original file line number Diff line number Diff line change
Expand Up @@ -229,8 +229,7 @@ c_int polish(OSQPSolver *solver) {

// Form and factorize reduced KKT
exitflag = init_linsys_solver(&plsh, work->data->P, work->pol->Ared,
settings->delta, OSQP_NULL,
settings->linsys_solver, 1);
OSQP_NULL, settings, 1);

if (exitflag) {
// Polishing failed
Expand Down
14 changes: 8 additions & 6 deletions tests/solve_linsys/test_solve_linsys.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@ static const char* test_solveKKT() {
solve_linsys_sols_data *data = generate_problem_solve_linsys_sols_data();

// Settings
settings->rho = data->test_solve_KKT_rho;
settings->sigma = data->test_solve_KKT_sigma;
settings->rho = data->test_solve_KKT_rho;
settings->sigma = data->test_solve_KKT_sigma;
settings->linsys_solver = LINSYS_SOLVER;

// Set rho_vec
m = data->test_solve_KKT_A->m;
Expand All @@ -32,7 +33,7 @@ static const char* test_solveKKT() {
A = OSQPMatrix_new_from_csc(data->test_solve_KKT_A, 0);

// Form and factorize KKT matrix
exitflag = init_linsys_solver(&s, Pu, A, settings->sigma, rho_vec, LINSYS_SOLVER, 0);
exitflag = init_linsys_solver(&s, Pu, A, rho_vec, settings, 0);

// Solve KKT x = b via LDL given factorization
rhs = OSQPVectorf_new(data->test_solve_KKT_rhs, m+n);
Expand Down Expand Up @@ -68,8 +69,9 @@ static char* test_solveKKT_pardiso() {
solve_linsys_sols_data *data = generate_problem_solve_linsys_sols_data();

// Settings
settings->rho = data->test_solve_KKT_rho;
settings->sigma = data->test_solve_KKT_sigma;
settings->rho = data->test_solve_KKT_rho;
settings->sigma = data->test_solve_KKT_sigma;
settings->linsys_solver = MKL_PARDISO_SOLVER;

// Set rho_vec
m = data->test_solve_KKT_A->m;
Expand All @@ -87,7 +89,7 @@ static char* test_solveKKT_pardiso() {
exitflag == 0);

// Form and factorize KKT matrix
exitflag = init_linsys_solver(&s, Pu, A, settings->sigma, rho_vec, MKL_PARDISO_SOLVER, 0);
exitflag = init_linsys_solver(&s, Pu, A, rho_vec, settings, 0);

// Solve KKT x = b via LDL given factorization
rhs = OSQPVectorf_new(data->test_solve_KKT_rhs, m+n);
Expand Down

0 comments on commit 4f18fc0

Please sign in to comment.