0

我正在尝试使用 C++ Fusion 解决 Mosek 中的半定程序,并具有以下形式的约束

$$ \sum_j A_{i,j} M_j - \vec{c}_i^T \vec{y} + x \le b_i \forall i, $$ (链接到方程的图片)

其中每个 M_j 是一个半正定矩阵。目前,我正在使用 for 循环创建约束​​来对 A_{i,j} M_j 求和,并使用另一个 for 循环来添加所有约束。但是,约束的数量相当大,并且多次使用 M->constraint(...) 是迄今为止我程序中最慢的部分。我正在查看 Mosek 文档,似乎矢量化可以加速程序。但是,我正在为求和 A_{i,j} M_j 的矢量化而苦苦挣扎。每个变量的数据类型是:

A: vector < vector < Matrix::t > > 
M: vector < Variable::t >
c: vector < shared_ptr < ndarray < int,1 > > >
y: Variable::t
x: Variable::t
b: vector < int >  

我尝试在 A 和 M 上使用 new_array_ptr,然后使用 Expr::add 和 Expr::dot,但这些都不起作用。任何有关矢量化或加速 M->constraint(...) 的帮助将不胜感激!

4

1 回答 1

0

这有点棘手。由于您的每个约束都涉及矩阵的乘积,因此进一步对其进行矢量化需要能够乘以更高维的对象(张量?),而 Fusion 没有用于此的接口。

您可以做的一件事是确保您的 A 表示为稀疏矩阵,如果它们确实是稀疏的。

另一种解决方案是使用 C API 重写所有内容。您的数据似乎已经采用了可以相对轻松地进行翻译的格式。

最后但并非最不重要的一点是,如果您可以将您的代码打包成一个可重现的示例并发送给 MOSEK 支持(此处发送电子邮件https://www.mosek.com/support/),那么我们 [我在那里工作] 可以更具体地检查是否有Mosek 中的一些低效率,或者您的代码中是否有任何可以改进的地方。

于 2022-01-28T07:57:08.763 回答