1 #ifndef KKT_H 2 # define KKT_H 3 4 # ifdef __cplusplus 5 extern "C" { 6 # endif // ifdef __cplusplus 7 8 # include "types.h" 9 10 # ifndef EMBEDDED 11 12 # include "cs.h" 13 14 /** 15 * Form square symmetric KKT matrix of the form 16 * 17 * [P + param1 I, A'; 18 * A -diag(param2)] 19 * 20 * NB: Only the upper triangular part is stuffed! 21 * 22 * 23 * If Pdiag_idx is not OSQP_NULL, it saves the index of the diagonal 24 * elements of P there and the number of diagonal elements in Pdiag_n. 25 * 26 * Similarly, if rhotoKKT is not null, 27 * it saves where the values of param2 go in the final KKT matrix 28 * 29 * NB: Pdiag_idx needs to be freed! 30 * 31 * @param P cost matrix (already just upper triangular part) 32 * @param A linear constraint matrix 33 * @param format CSC (0) or CSR (1) 34 * @param param1 regularization parameter 35 * @param param2 regularization parameter (vector) 36 * @param PtoKKT (modified) index mapping from elements of P to KKT matrix 37 * @param AtoKKT (modified) index mapping from elements of A to KKT matrix 38 * @param Pdiag_idx (modified) Address of the index of diagonal elements in P 39 * @param Pdiag_n (modified) Address to the number of diagonal elements in P 40 * @param param2toKKT (modified) index mapping from param2 to elements of 41 *KKT 42 * @return return status flag 43 */ 44 csc* form_KKT(const csc *P, 45 const csc *A, 46 c_int format, 47 c_float param1, 48 c_float *param2, 49 c_int *PtoKKT, 50 c_int *AtoKKT, 51 c_int **Pdiag_idx, 52 c_int *Pdiag_n, 53 c_int *param2toKKT); 54 # endif // ifndef EMBEDDED 55 56 57 # if EMBEDDED != 1 58 59 /** 60 * Update KKT matrix using the elements of P 61 * 62 * @param KKT KKT matrix in CSC form (upper-triangular) 63 * @param P P matrix in CSC form (upper-triangular) 64 * @param PtoKKT Vector of pointers from P->x to KKT->x 65 * @param param1 Parameter added to the diagonal elements of P 66 * @param Pdiag_idx Index of diagonal elements in P->x 67 * @param Pdiag_n Number of diagonal elements of P 68 */ 69 void update_KKT_P(csc *KKT, 70 const csc *P, 71 const c_int *PtoKKT, 72 const c_float param1, 73 const c_int *Pdiag_idx, 74 const c_int Pdiag_n); 75 76 77 /** 78 * Update KKT matrix using the elements of A 79 * 80 * @param KKT KKT matrix in CSC form (upper-triangular) 81 * @param A A matrix in CSC form (upper-triangular) 82 * @param AtoKKT Vector of pointers from A->x to KKT->x 83 */ 84 void update_KKT_A(csc *KKT, 85 const csc *A, 86 const c_int *AtoKKT); 87 88 89 /** 90 * Update KKT matrix with new param2 91 * 92 * @param KKT KKT matrix 93 * @param param2 Parameter of the KKT matrix (vector) 94 * @param param2toKKT index where param2 enters in the KKT matrix 95 * @param m number of constraints 96 */ 97 void update_KKT_param2(csc *KKT, 98 const c_float *param2, 99 const c_int *param2toKKT, 100 const c_int m); 101 102 # endif // EMBEDDED != 1 103 104 105 # ifdef __cplusplus 106 } 107 # endif // ifdef __cplusplus 108 109 #endif // ifndef KKT_H 110