Mosek矢量化,缓慢添加约束



我正试图用具有形式约束的C++Fusion在Mosek中求解一个半定程序

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

其中每个M_ j是正半定矩阵。目前,我正在创建约束,使用for循环对a_{I,j}M_j求和,使用另一个for循环添加所有约束。然而,约束的数量相当大,并且使用M->很多次的约束(…(是我程序中最慢的部分。我查看了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->约束(…(将不胜感激!

这有点棘手。由于您的每个约束都涉及矩阵的乘积,因此进一步向量化它将需要乘法高维对象(张量?(的能力,而Fusion没有这样的接口。

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

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

最后但同样重要的是,如果您可以将代码打包成一个可复制的示例,并发送给MOSEK支持(请发送电子邮件至此处https://www.mosek.com/support/)然后我们(我在那里工作(可以更具体地检查Mosek中是否存在一些低效率,或者您的代码中是否可以改进。

最新更新