blob: 9560d5ecbf4e26e77aabb315a78257adf560378f [file] [log] [blame]
#ifndef KKT_H
# define KKT_H
# ifdef __cplusplus
extern "C" {
# endif // ifdef __cplusplus
# include "types.h"
# ifndef EMBEDDED
# include "cs.h"
/**
* Form square symmetric KKT matrix of the form
*
* [P + param1 I, A';
* A -diag(param2)]
*
* NB: Only the upper triangular part is stuffed!
*
*
* If Pdiag_idx is not OSQP_NULL, it saves the index of the diagonal
* elements of P there and the number of diagonal elements in Pdiag_n.
*
* Similarly, if rhotoKKT is not null,
* it saves where the values of param2 go in the final KKT matrix
*
* NB: Pdiag_idx needs to be freed!
*
* @param P cost matrix (already just upper triangular part)
* @param A linear constraint matrix
* @param format CSC (0) or CSR (1)
* @param param1 regularization parameter
* @param param2 regularization parameter (vector)
* @param PtoKKT (modified) index mapping from elements of P to KKT matrix
* @param AtoKKT (modified) index mapping from elements of A to KKT matrix
* @param Pdiag_idx (modified) Address of the index of diagonal elements in P
* @param Pdiag_n (modified) Address to the number of diagonal elements in P
* @param param2toKKT (modified) index mapping from param2 to elements of
*KKT
* @return return status flag
*/
csc* form_KKT(const csc *P,
const csc *A,
c_int format,
c_float param1,
c_float *param2,
c_int *PtoKKT,
c_int *AtoKKT,
c_int **Pdiag_idx,
c_int *Pdiag_n,
c_int *param2toKKT);
# endif // ifndef EMBEDDED
# if EMBEDDED != 1
/**
* Update KKT matrix using the elements of P
*
* @param KKT KKT matrix in CSC form (upper-triangular)
* @param P P matrix in CSC form (upper-triangular)
* @param PtoKKT Vector of pointers from P->x to KKT->x
* @param param1 Parameter added to the diagonal elements of P
* @param Pdiag_idx Index of diagonal elements in P->x
* @param Pdiag_n Number of diagonal elements of P
*/
void update_KKT_P(csc *KKT,
const csc *P,
const c_int *PtoKKT,
const c_float param1,
const c_int *Pdiag_idx,
const c_int Pdiag_n);
/**
* Update KKT matrix using the elements of A
*
* @param KKT KKT matrix in CSC form (upper-triangular)
* @param A A matrix in CSC form (upper-triangular)
* @param AtoKKT Vector of pointers from A->x to KKT->x
*/
void update_KKT_A(csc *KKT,
const csc *A,
const c_int *AtoKKT);
/**
* Update KKT matrix with new param2
*
* @param KKT KKT matrix
* @param param2 Parameter of the KKT matrix (vector)
* @param param2toKKT index where param2 enters in the KKT matrix
* @param m number of constraints
*/
void update_KKT_param2(csc *KKT,
const c_float *param2,
const c_int *param2toKKT,
const c_int m);
# endif // EMBEDDED != 1
# ifdef __cplusplus
}
# endif // ifdef __cplusplus
#endif // ifndef KKT_H