跳到主要内容
版本:v0.6.0 (beta)

兼容性变更与升级指南

该文档介绍了v0.6.0版本对v0.5.2的兼容性变更与迁移方法.

外部C/C++函数支持

在v0.6.0版本中, 若矩阵被识别成稀疏矩阵, 则需要在外部C/C++函数中按照稀疏矩阵的存储方式编写代码. 见建模接口 > 外部C/C++函数支持 > 稀疏与稠密矩阵了解更多细节.

例如下面的例子:

vehicle.py
ineq_spy_jac = \
[[1, 1, 0, 0, 0, 0, 0],
[1, 0, 1, 0, 0, 0, 0],
[1, 0, 0, 1, 0, 0, 0],
[1, 0, 0, 0, 1, 0, 0]]
ineq_spy_hess = \
[[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0]]
ineq = external_general_inequality(dim = 4, sparsity_jacobian=ineq_spy_jac, sparsity_hessian=ineq_spy_hess)
prob.inequality(ineq)

在v0.5.2版本中, 该Jacobian为稠密矩阵, 在填充Jacobian时按照稠密矩阵的存储方式编写代码:

vehicle_prob_ext.c.template
void vehicle_g(const Vehicle_SolverInfo *_solverinfo, 
const Vehicle_Problem *_prob,
const double _var[7],
const double _zg[4],
double _g[4], double _jac_g[28], double _hess[28])
{
if (_g != NULL) {
/* define constraint here */
}
if (_jac_g != NULL) {
// _jac_g[0]: partial g[0] / partial var[0]
// _jac_g[1]: partial g[1] / partial var[0]
// _jac_g[2]: partial g[2] / partial var[0]
// _jac_g[3]: partial g[3] / partial var[0]
// _jac_g[4]: partial g[0] / partial var[1]
// _jac_g[9]: partial g[1] / partial var[2]
// _jac_g[14]: partial g[2] / partial var[3]
// _jac_g[19]: partial g[3] / partial var[4]
}

if (_hess != NULL) {
/* define Hessian increment here */
}
}

在v0.6.0版本中, 该Jacobian矩阵被识别成稀疏矩阵, 在填充Jacobian时只需要按照列优先方式顺序填充非零元素:

vehicle_prob_ext.c.template
void vehicle_g(const Vehicle_SolverInfo *_solverinfo, 
const Vehicle_Problem *_prob,
const double _var[7],
const double _zg[4],
double _g[4], double _jac_g[8], double _hess[28])
{
if (_g != NULL) {
/* define constraint here */
}

if (_jac_g != NULL) {
// _jac_g[0]: partial g[0] / partial var[0]
// _jac_g[1]: partial g[1] / partial var[0]
// _jac_g[2]: partial g[2] / partial var[0]
// _jac_g[3]: partial g[3] / partial var[0]
// _jac_g[4]: partial g[0] / partial var[1]
// _jac_g[5]: partial g[1] / partial var[2]
// _jac_g[6]: partial g[2] / partial var[3]
// _jac_g[7]: partial g[3] / partial var[4]
}

if (_hess != NULL) {
/* define Hessian increment here */
}
}