cmscp.h 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. #pragma once
  2. #include <string.h>
  3. #include <stdlib.h>
  4. /* 宏定义 */
  5. #define INF 1.0E30
  6. #define malloc malloc
  7. #define FREE free
  8. /* 变量类型定义 */
  9. typedef struct cmscp_floatDemat { // 浮点型稠密矩阵
  10. int m; // 行
  11. int n; // 列
  12. double* v; // 逐列存储矩阵的每一个元素
  13. }cmscp_floatDemat;
  14. typedef struct intDemat { // 整数型稠密矩阵
  15. int m; // 行
  16. int n; // 列
  17. int* v; // 逐列存储矩阵的每一个元素
  18. }intDemat;
  19. typedef struct cmscp_crsSpmat { // 行压缩存储格式
  20. int m;// 行
  21. int n;// 列
  22. int* ptrRow;// 每行首个非零元素位置
  23. int* idxCol;// 非零元素列坐标
  24. double* v;// 逐行存储矩阵的每一个非零元素
  25. }cmscp_crsSpmat;
  26. typedef struct cmscp_ccsSpmat {// 列压缩存储格式
  27. int m;// 行
  28. int n;// 列
  29. int* ptrCol;// 每列首个非零元素位置
  30. int* idxRow;// 非零元素行坐标
  31. double* v;// 逐列存储矩阵的每一个非零元素
  32. }cmscp_ccsSpmat;
  33. typedef struct cmscp_trajInfo { // 轨迹信息变量结构体
  34. double initialtime;
  35. double finaltime;
  36. cmscp_floatDemat* state;
  37. cmscp_floatDemat* control;
  38. double* parameter;
  39. }cmscp_trajInfo;
  40. typedef struct cmscp_stopInfo {
  41. int isStop;
  42. double absTol;
  43. }cmscp_stopInfo;
  44. typedef struct cmscp_trustInfo {
  45. int numState;
  46. }cmscp_trustInfo;
  47. /* 序列凸优化算法 */
  48. typedef struct cmscp_solverInfo {
  49. char* name;
  50. int maxit;
  51. double abstol;
  52. double reltol;
  53. double feastol;
  54. int verbose;
  55. }cmscp_solverInfo;
  56. typedef struct cmscp_scp {
  57. int maxIter;
  58. int cntIter;
  59. double* obj;
  60. cmscp_solverInfo* solver;
  61. }cmscp_scp;
  62. /* 问题约束边界结构体 */
  63. typedef struct cmscp_boundscale {
  64. double lower;
  65. double upper;
  66. }cmscp_boundscale;
  67. typedef struct cmscp_boundvec {
  68. double* lower;
  69. double* upper;
  70. }cmscp_boundvec;
  71. typedef struct cmscp_boundcone {
  72. cmscp_boundvec* nl;
  73. double* soc;
  74. }cmscp_boundcone;
  75. typedef struct cmscp_boundPhase {
  76. cmscp_boundscale* initialtime;
  77. cmscp_boundscale* finaltime;
  78. cmscp_boundvec* initialstate;
  79. cmscp_boundvec* state;
  80. cmscp_boundvec* finalstate;
  81. cmscp_boundvec* control;
  82. cmscp_boundvec* parameter;
  83. cmscp_boundcone* path;
  84. cmscp_boundcone* endpoint;
  85. cmscp_boundcone* linkage;
  86. }cmscp_boundPhase;
  87. typedef struct cmscp_bound {
  88. cmscp_boundPhase** phase;
  89. cmscp_boundcone* event;
  90. }cmscp_bound;
  91. /* 问题维数结构体 */
  92. typedef struct cmscp_dimension1 {
  93. int n;
  94. int* q;
  95. }cmscp_dimension1;
  96. typedef struct cmscp_dimension2 {
  97. int nl;
  98. cmscp_dimension1* soc;
  99. }cmscp_dimension2;
  100. typedef struct cmscp_dimensionPhase {
  101. int state;
  102. int control;
  103. int parameter;
  104. cmscp_dimension2* path;
  105. cmscp_dimension2* endpoint;
  106. cmscp_dimension2* linkage;
  107. }cmscp_dimensionPhase;
  108. typedef struct cmscp_dimension {
  109. cmscp_dimensionPhase** phase;
  110. cmscp_dimension2* event;
  111. }cmscp_dimension;
  112. /* 问题信赖域结构体 */
  113. typedef struct cmscp_trustWeihgt {
  114. double initialtime;
  115. double finaltime;
  116. double* state;
  117. double* control;
  118. double* parameter;
  119. }cmscp_trustWeihgt;
  120. typedef struct cmscp_trustPhase {
  121. cmscp_trustWeihgt* weight;
  122. double hardRadius;
  123. double softPenaWeight;
  124. }cmscp_trustPhase;
  125. typedef struct cmscp_trust {
  126. char* model;
  127. double merit;
  128. cmscp_trustPhase** phase;
  129. }cmscp_trust;
  130. /* 问题函数名称结构体 */
  131. typedef struct cmscp_contInput {
  132. void* auxdata;
  133. double* state;
  134. double* control;
  135. double* parameter;
  136. }cmscp_contInput;
  137. typedef struct cmscp_endpInput {
  138. void* auxdata;
  139. double initialtime;
  140. double* initialstate;
  141. double finaltime;
  142. double* finalstate;
  143. double* parameter;
  144. }cmscp_endpInput;
  145. typedef struct cmscp_linkInput {
  146. void* auxdata; // auxdata是辅助参数,与问题相关,事先不确定其类型
  147. double leftFinTime;
  148. double* leftFinState;
  149. double* leftParameter;
  150. double rightIniTime;
  151. double* rightIniState;
  152. double* rightParameter;
  153. }cmscp_linkInput;
  154. typedef struct cmscp_objEventInputPhase {
  155. double initialtime;
  156. double finaltime;
  157. double* initialstate;
  158. double* finalstate;
  159. double* parameter;
  160. }cmscp_objEventInputPhase;
  161. typedef struct cmscp_objEventInput {
  162. void* auxdata; // auxdata是辅助参数,与问题相关,事先不确定其类型
  163. cmscp_objEventInputPhase** phase;
  164. }cmscp_objEventInput;
  165. typedef void (*cmscp_continuous)(double*, double*, cmscp_contInput*);
  166. typedef void (*cmscp_endpoint)(double*, cmscp_endpInput*);
  167. typedef void (*cmscp_linkage)(double*, cmscp_linkInput*);
  168. typedef void (*cmscp_objEvent)(double*, double*, cmscp_objEventInput*);
  169. typedef void (*cmscp_objEventDepend)(intDemat*);
  170. typedef void (*cmscp_contDepend)(intDemat*, int, void*);
  171. typedef void (*cmscp_endpDepend)(intDemat*, int, void*);
  172. typedef void (*cmscp_linkDepend)(intDemat*, int, void*);
  173. typedef void (*cmscp_getIniRefTraj)(cmscp_trajInfo**, void*);
  174. typedef int* (*cmscp_stopCondition)(int, cmscp_trajInfo**, cmscp_trajInfo**, void*);
  175. typedef void (*cmscp_updateMeshInfo)(int, cmscp_trajInfo**, cmscp_trajInfo**, void*);
  176. typedef void (*cmscp_updateTrustInfo)(int, cmscp_trajInfo**, cmscp_trajInfo**, void*);
  177. typedef void (*cmscp_updateRefTraj)(cmscp_trajInfo**, cmscp_trajInfo**, void*);
  178. typedef struct cmscp_functionsPhase {
  179. cmscp_continuous continuous;
  180. cmscp_endpoint endpoint;
  181. cmscp_linkage linkage;
  182. }cmscp_functionsPhase;
  183. typedef struct cmscp_functions {
  184. /* 各段函数 */
  185. cmscp_functionsPhase** phase;
  186. /* 目标函数和事件函数 */
  187. cmscp_objEvent objEvent;
  188. /* 手动稀疏模式所需相关性函数 */
  189. cmscp_objEventDepend objEventDepend;
  190. cmscp_contDepend contDepend;
  191. cmscp_endpDepend endpDepend;
  192. cmscp_linkDepend linkDepend;
  193. /* 序列线性化所需函数 */
  194. cmscp_getIniRefTraj getIniRefTraj;
  195. cmscp_stopCondition stopCondition;
  196. cmscp_updateMeshInfo updateMeshInfo;
  197. cmscp_updateTrustInfo updateTrustInfo;
  198. cmscp_updateRefTraj updateRefTraj;
  199. }cmscp_functions;
  200. /* 每段的离散点 */
  201. typedef struct cmscp_mesh {
  202. int num;
  203. double* node;
  204. }cmscp_mesh;
  205. /* 问题设置参数结构体 */
  206. typedef struct cmscp_setup {
  207. void* auxdata; // 不确定类型,用空指针
  208. int numPhase; // 分段数
  209. char* sparseModel; // 稀疏模式
  210. double derStep; // 求导步长
  211. cmscp_scp* scpInfo; // 序列凸优化参数
  212. //cmscp_functions* functions;
  213. cmscp_mesh** oldMesh;
  214. cmscp_mesh** mesh;
  215. cmscp_trust* trust;
  216. cmscp_dimension* dimension;
  217. cmscp_functions* functions;
  218. cmscp_bound* bounds;
  219. }cmscp_setup;
  220. int cmscp(cmscp_trajInfo** optTraj, cmscp_setup* setup);