csocp.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. /**
  2. * @file csocp.h
  3. * @brief 实现主函数和宏定义。使用时只需 #include "csocp.h"
  4. * This file implements main functions and macros
  5. * @version 0.1
  6. * @date 2021-09-17
  7. *
  8. * @copyright Copyright (c) 2021
  9. *
  10. */
  11. #ifndef __CSOCP_H__
  12. #define __CSOCP_H__
  13. #ifdef __cplusplus
  14. extern "C" {
  15. #endif
  16. #include "csocp_config.h"
  17. /** 求解状态码 Solving status */
  18. #define CSOCP_UNSTARTED 0 /**< 未求解 Solving unstarted */
  19. #define CSOCP_OPTIMAL 1 /**< 找到最优解 Found optimal solution */
  20. #define CSOCP_PRIMALINF 2 /**< 原问题不可行 Primal infeasible */
  21. #define CSOCP_DUALINF 3 /**< 对偶问题不可行 Dual infeasible */
  22. #define CSOCP_ITERLIMIT 4 /**< 到达最大迭代次数 Maximum number of iterations reached */
  23. #define CSOCP_NUMERICAL 5 /**< 搜索方向不可靠 Search direction unreliable */
  24. #define CSOCP_INTERRUPTED 6 /**< 求解器被中止 Solver interrupted */
  25. #define CSOCP_UNFINISHED 7 /**< 未求解完毕 Solve not finished */
  26. #define CSOCP_ERROR 8 /**< 求解器致命错误 Fatal error in solver */
  27. /** double类型参数 Double parameters */
  28. #define CSOCP_DBLPARAM_FEASTOL 1 /**< 原始问题/对偶问题的不可行容限 Primal/dual infeasibility tolerance */
  29. #define CSOCP_DBLPARAM_ABSTOL 2 /**< 对偶间隙的绝对容限 Absolute tolerance on duality gap */
  30. #define CSOCP_DBLPARAM_RELTOL 3 /**< 对偶间隙的相对容限 Relative tolerance on duality gap */
  31. #define CSOCP_DBLPARAM_IRFACT 4 /**< IR误差系数 Factor of IR error */
  32. #define CSOCP_DBLPARAM_LINSYSTOL 5 /**< 线性系统容差 Linear system tolerance */
  33. #define CSOCP_DBLPARAM_DELTASTAT 6 /**< 静态正则化参数 Static regularization parameter */
  34. #define CSOCP_DBLPARAM_DELTA 7 /**< 动态正则化参数 Dynamic regularization parameter */
  35. #define CSOCP_DBLPARAM_EPSILON 8 /**< epsilon容差 Epsilon tolerance */
  36. #define CSOCP_DBLPARAM_SCALETOL 9 /**< 缩放容差 Scaling tolerance */
  37. #define CSOCP_DBLPARAM_GAMMA 10 /**< 步长缩放系数 Scaling factor of step length */
  38. #define CSOCP_DBLPARAM_STEPMIN 11 /**< 允许的最小步长 Smallest step allowed */
  39. #define CSOCP_DBLPARAM_STEPMAX 12 /**< 允许的最大步长 Largest step allowed */
  40. #define CSOCP_DBLPARAM_SIGMAMIN 13 /**< 始终进行中心化的参数 Always do some centering */
  41. #define CSOCP_DBLPARAM_SIGMAMAX 14 /**< 始终不完全中心化的参数 Never fully center */
  42. /** integer类型参数 Integer parameters */
  43. #define CSOCP_INTPARAM_ITERLIMIT 1 /**< 最大迭代次数 Maximal number of iterations */
  44. #define CSOCP_INTPARAM_IRITER 2 /**< IR步数量 Number of IR steps */
  45. #define CSOCP_INTPARAM_SCALEITER 3 /**< 缩放迭代次数 Number of scaling iterations */
  46. /** double类型属性 Double attributes */
  47. #define CSOCP_DBLATTR_PRIMALOBJ 1 /**< 原问题目标函数值 Primal objective value */
  48. #define CSOCP_DBLATTR_DUALOBJ 2 /**< 对偶问题目标函数值 Dual objective value */
  49. #define CSOCP_DBLATTR_PRIMALRES 3 /**< 原始残差 Primal residual */
  50. #define CSOCP_DBLATTR_DUALRES 4 /**< 对偶残差 Dual residual */
  51. #define CSOCP_DBLATTR_PRIMALINFRES 5 /**< 原始不可行性残差 Primal residual of infeasibilities */
  52. #define CSOCP_DBLATTR_DUALINFRES 6 /**< 对偶不可行性残差 Dual residual of infeasibilities */
  53. #define CSOCP_DBLATTR_ABSGAP 7 /**< 绝对间隙 Absolute gap */
  54. #define CSOCP_DBLATTR_RELGAP 8 /**< 相对间隙 Relative gap */
  55. #define CSOCP_DBLATTR_LOADTIME 9 /**< 加载时间 Loading time */
  56. #define CSOCP_DBLATTR_SOLVETIME 10 /**< 求解时间 Solving time */
  57. /** integer类型属性 Integer attributes */
  58. #define CSOCP_INTATTR_STATUS 1 /**< 求解状态 Solving status */
  59. #define CSOCP_INTATTR_ISPINF 2 /**< 是否原问题不可行 Is primal infeasible */
  60. #define CSOCP_INTATTR_ISDINF 3 /**< 是否对偶问题不可行 Is dual infeasible */
  61. #define CSOCP_INTATTR_ITERCNT 4 /**< 迭代次数计数 Iteration counts */
  62. /** 创建优化问题 Create problem */
  63. c_int CSOCP_create(csocp_prob **p_prob);
  64. /** 建立二阶锥优化问题 Set up SOCP problem */
  65. c_int CSOCP_loadsocp(csocp_prob *prob, /**< CSOCP优化问题结构体 The CSOCP problem */
  66. c_int n, /**< 变量数量 Number of variables */
  67. c_int m, /**< 不等式约束数量 Number of inequalities */
  68. c_int p, /**< 等式约束数量 Number of equalities */
  69. c_int l, /**< 线性锥(非负象限)数量 Number of positive orthant */
  70. c_int ncones, /**< 二阶锥数量 Number of SOC cones */
  71. c_int *q, /**< 指针:二阶锥维度 Dimension for each SOC cone */
  72. c_real *Gpr, /**< 不等式约束矩阵G的element指针 Element pointer of inequality matrix */
  73. c_int *Gjc, /**< 不等式约束矩阵G的begin指针 Begin pointer of inequality matrix */
  74. c_int *Gir, /**< 不等式约束矩阵G的index指针 Index pointer of inequality matrix */
  75. c_real *Apr, /**< 等式约束矩阵A的element指针 Element pointer of equality matrix */
  76. c_int *Ajc, /**< 等式约束矩阵A的begin指针 Begin pointer of equality matrix */
  77. c_int *Air, /**< 等式约束矩阵A的index指针 Index pointer of equality matrix */
  78. c_real *c, /**< 目标函数向量c Objective costs */
  79. c_real *h, /**< 不等式约束(锥约束)的右端项 RHS of cones */
  80. c_real *b /**< 等式约束的右端项 RHS of equalities */
  81. );
  82. /** 建立二次优化问题 Set up QP problem */
  83. c_int CSOCP_loadqp(csocp_prob *prob, /**< CSOCP优化问题结构体 The CSOCP problem */
  84. c_int nCol, /**< 变量数量 Number of variables */
  85. c_int nIneqRow, /**< 不等式约束数量 Number of inequalities */
  86. c_int nEqRow, /**< 等式约束数量 Number of equalities */
  87. c_int nQElem, /**< 二次目标函数中的元素数量 Number of elements in quadratic objective */
  88. c_real *colObj, /**< 目标函数中线性部分的向量 Objective costs of linear objective */
  89. c_int *qRowIdx, /**< 二次目标函数的行索引 Row index of quadratic objective */
  90. c_int *qColIdx, /**< 二次目标函数的列索引 Column index of quadratic objective */
  91. c_real *qObjElem, /**< 二次目标函数的元素值 Elements of quadratic objective */
  92. c_int *ineqMatBeg, /**< 不等式约束矩阵的begin指针 Begin pointer of inequality matrix */
  93. c_int *ineqMatIdx, /**< 不等式约束矩阵的index指针 Index pointer of inequality matrix */
  94. c_real *ineqMatElem, /**< 不等式约束矩阵的element指针 Element pointer of inequality matrix */
  95. c_real *ineqRHS, /**< 不等式约束的右端项 RHS of inequalities */
  96. c_int *eqMatBeg, /**< 等式约束矩阵的begin指针 Begin pointer of equality matrix */
  97. c_int *eqMatIdx, /**< 等式约束矩阵的index指针 Index pointer of equality matrix */
  98. c_real *eqMatElem, /**< 等式约束矩阵的element指针 Element pointer of equality matrix */
  99. c_real *eqRHS, /**< 等式约束的右端项 RHS of equalities */
  100. c_real *colLower, /**< 每一列的下界 Lower bounds of columns */
  101. c_real *colUpper /**< 每一列的上界 Upper bounds of columns */
  102. );
  103. /** 求解优化问题 Solve problem */
  104. c_int CSOCP_solve(csocp_prob *prob /**< 指针:指向优化问题结构体 Pointer to problem */
  105. );
  106. /** 获取求解结果 Get solution */
  107. void CSOCP_getsolution(csocp_prob *prob, /**< 指针:指向优化问题结构体 Pointer to problem */
  108. c_real *x, /**< 原问题的解 Primal solution */
  109. c_real *y, /**< 对偶问题的解 Dual solution of equalties */
  110. c_real *s, /**< 不等式约束的松弛变量 Slack of inequalities */
  111. c_real *z /**< 不等式约束的对偶变量 Dual of inequalities */
  112. );
  113. /** 设置double类型的参数 Set double parameter */
  114. void CSOCP_setdblparam(csocp_prob *prob, /**< 指针:指向优化问题结构体 Pointer to problem */
  115. c_int dblparam, /**< double类型的参数 Double paramter */
  116. c_real newval /**< 新参数值 New value */
  117. );
  118. /** 设置integer类型的参数 Set integer parameter */
  119. void CSOCP_setintparam(csocp_prob *prob, /**< 指针:指向优化问题结构体 Pointer to problem */
  120. c_int intparam, /**< integer类型的参数 Integer parameter */
  121. c_int newval /**< 新参数值 New value */
  122. );
  123. /** 获取double类型的参数 Get double parameter */
  124. c_real CSOCP_getdblparam(csocp_prob *prob, /**< 指针:指向优化问题结构体 Pointer to problem */
  125. c_int dblparam /**< double类型的参数值 Double paramter */
  126. );
  127. /** 获取integer类型的参数 Get integer parameter */
  128. c_int CSOCP_getintparam(csocp_prob *prob, /**< 指针:指向优化问题结构体 Pointer to problem */
  129. c_int intparam /**< integer类型的参数 Integer parameter */
  130. );
  131. /** 获取double类型的属性 Get double attribute */
  132. c_real CSOCP_getdblattr(csocp_prob *prob, /**< 指针:指向优化问题结构体 Pointer to problem */
  133. c_int dblattr /**< double类型的属性 Double attribute */
  134. );
  135. /** 获取integer类型的属性 Get integer attribute */
  136. c_int CSOCP_getintattr(csocp_prob *prob, /**< 指针:指向优化问题结构体 Pointer to problem */
  137. c_int intattr /**< integer类型的属性 Integer attribute */
  138. );
  139. /** 析构优化问题结构体 Free problem */
  140. void CSOCP_free(csocp_prob **p_prob /**< 指针:指向优化问题结构体 Pointer to problem */
  141. );
  142. #ifdef __cplusplus
  143. }
  144. #endif
  145. #endif