YALMIP icon indicating copy to clipboard operation
YALMIP copied to clipboard

Mosek support for complex data

Open jdbancal opened this issue 5 years ago • 7 comments

It seems that Mosek supports SDP problems specified with complex coefficients (tested on MOSEK Version 7.1.0.14), however in definesolvers.m, the Mosek SDP solver is defined as not supporting complex problems.

Complex problems are still solved through yalmip's automatic translation into a real equivalent, but dual variables are then inaccessible (NaN values are returned).

Would it be possible to allow calls to Mosek for complex problems, hence returning dual variables seemlessly?

jdbancal avatar Jan 28 '20 09:01 jdbancal

At the moment a bit of a mess to accomplish, as far as I can recall. I'll keep this open though

johanlofberg avatar Jan 28 '20 09:01 johanlofberg

Thanks for your understanding, I can totally imagine it could take quite some work to implement something like that properly, even just for SDPs.

Looking for a possible temporary workaround, I found only three solvers with solver.complex set to 1 in definesolvers.m. These are SeDuMi versions 1.03, 1.05 and 1.1, which are quite outdated and should probably not be used anymore. Do you know why complex support was disabled for SeDuMi 1.3? On my side, this solver seems to at least accept complex data. Wondering if supporting this version of SeDuMi would be easier to implement than Mosek (hence at least allowing full complex support for one maintained solver).

jdbancal avatar Jan 28 '20 12:01 jdbancal

I cannot see anything in the commit history, so I guess it was turned off before 2012, and my guess it was due to simplify the code (little used feature so low pay-off to fix issues). In 1.03-1.1 it is probably just kept by mistake as those are dead

johanlofberg avatar Jan 28 '20 12:01 johanlofberg

Oh, I see, then there's probably no quick workaround. Thanks for your feedback!

jdbancal avatar Jan 28 '20 12:01 jdbancal

and a fundamental problem in YALMIP is that there is no complex variable. x = sdpvar(n,n,'','complex') simply generates a+b*i with structure on a and b, i.e. the complex cone is disaggregated from start.

johanlofberg avatar Jan 28 '20 12:01 johanlofberg

Hmm, that needs not be a problem... If I have a chance I might take a closer look at this issue

jdbancal avatar Jan 28 '20 12:01 jdbancal

OK.

So basically when setting complex to 0, YALMIP takes C-Ay and maps it to the real cone by doubling dimensions, and then sends the data C and A for that lifted formulation. When set to 1, the complex data C and A will be sent to the interface code (callsedumi.m). It's probably not too hard with sedumi, as it was supported previously

johanlofberg avatar Jan 28 '20 12:01 johanlofberg