Skip to content

序列化工具

该章节介绍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必须与二进制保持一致
  • 模型约束 (等式, 不等式, 软硬约束)可以与二进制不一致