序列化工具
该章节介绍OPTIMake的序列化工具. 序列化工具可以将优化问题序列化存储为二进制文件, 也可以从二进制文件中反序列化读取优化问题. 该工具的典型应用场景如下:
- 问题复现: 在开发过程中, 可能需要复现某个问题的求解过程. 通过序列化工具, 可以将当前的优化问题保存为二进制文件, 可在不同平台复现与调试
- 测试防护: 在测试过程中, 可以将测试用例序列化存储为二进制文件, 作为求解的测试用例
Note
- 代码生成option中的 enable_serialization 设置为True时才会开启序列化功能, 否则会生成空函数
- 序列化与反序列化函数中存在内存的动态申请与释放
- 序列化存储的二进制文件中不包含模型的具体建模, 只包含该模型的数据, 例如参数, initial guess
以vehicle问题为例, 代码生成后, vehicle_solver.h中包含了序列化功能的如下接口函数:
- vehicle_serialization_to_buffer: 将优化问题存储至buffer变量
- vehicle_serialization_save_buffer_to_file: 将buffer变量存储至文件
- vehicle_serialization_save_to_file: 将优化问题存储至文件
- vehicle_serialization_load_from_file: 从文件中读取优化问题
序列化
序列化功能 一般在求解前调用, 这样可以将workspace中用户设置的initial guess存储下来, 共有两种模式:
- 直接将优化问题存储至二进制
- 将优化问题存储至buffer, 再将buffer存储至二进制. 典型运用场景为记录求解失败或结果异常的优化问题: 在求解前将优化问题存储至buffer, 若求解失败或结果异常再将buffer存储至二进制
下面为直接将优化问题存储至二进制文件serialization.dat的代码片段:
int save_ret = 0;
save_ret = vehicle_serialization_save_to_file(&prob, &option, &ws, "serialization.dat");
下面为将优化问题存储至buffer, 再将buffer存储至二进制的代码片段:
int save_ret = 0;
Vehicle_SerializationBuffer buffer;
vehicle_serialization_to_buffer(&prob, &option, &ws, &buffer);
save_ret = vehicle_serialization_save_buffer_to_file(&buffer, "serialization.dat");
当序列化成功时, save_ret为1, 否则save_ret为0.
反序列化
下面为读取二进制文件并求解的代码片段:
int load_ret = 0;
load_ret = vehicle_serialization_load_from_file("serialization.dat", &prob, &option, &ws);
vehicle_solve(&prob, &option, &ws, &output);
当读取成功时, load_ret为1, 否则load_ret为0 (例如读取另一个优化问题的二进制数据时).
兼容性
反序列化 (读取)工具按照应读尽读原则设计, 遵循以下约束:
- 可兼容不同求解器版本
- 模型变量, 参数的数量和顺序必须与二进制保持一致
- 模型的stage数N必须与二进制保持一致
- 模型约束 (等式, 不等式, 软硬约束)可以与二进制不一致