|
32 | 32 |
|
33 | 33 | head(io::IO, c::GenericConstraint) = head(io, c.set)
|
34 | 34 |
|
| 35 | +function head(io::IO, set::MOI.AbstractSet) |
| 36 | + return print(io, replace("$(typeof(set))", "MathOptInterface" => "MOI")) |
| 37 | +end |
| 38 | + |
35 | 39 | AbstractTrees.children(c::GenericConstraint) = (c.child,)
|
36 | 40 |
|
37 | 41 | # A fallback. Define a new method if `MOI.Utilities.distance_to_set`
|
|
46 | 50 |
|
47 | 51 | vexity(c::GenericConstraint) = vexity(vexity(c.child), c.set)
|
48 | 52 |
|
| 53 | +function vexity( |
| 54 | + vex, |
| 55 | + # An enumeration of sets that are most likely to be used by Convex.jl |
| 56 | + ::Union{ |
| 57 | + MOI.SecondOrderCone, |
| 58 | + MOI.RotatedSecondOrderCone, |
| 59 | + MOI.ExponentialCone, |
| 60 | + MOI.DualExponentialCone, |
| 61 | + MOI.PowerCone, |
| 62 | + MOI.DualPowerCone, |
| 63 | + MOI.PositiveSemidefiniteConeSquare, |
| 64 | + MOI.GeometricMeanCone, |
| 65 | + MOI.NormCone, |
| 66 | + MOI.NormInfinityCone, |
| 67 | + MOI.NormOneCone, |
| 68 | + MOI.NormSpectralCone, |
| 69 | + MOI.NormNuclearCone, |
| 70 | + MOI.RelativeEntropyCone, |
| 71 | + MOI.LogDetConeSquare, |
| 72 | + MOI.RootDetConeSquare, |
| 73 | + }, |
| 74 | +) |
| 75 | + if !(vex == ConstVexity() || vex == AffineVexity()) |
| 76 | + return NotDcp() |
| 77 | + end |
| 78 | + return ConvexVexity() |
| 79 | +end |
| 80 | + |
| 81 | +function vexity(::Any, set::MOI.AbstractSet) |
| 82 | + return error( |
| 83 | + "`Convex.vexity(vex, ::$(typeof(set)))`: is not yet implemented. Please open an issue at https://github.com/jump-dev/Convex.jl", |
| 84 | + ) |
| 85 | +end |
| 86 | + |
49 | 87 | function _add_constraint!(context::Context, c::GenericConstraint)
|
50 | 88 | if vexity(c.child) == ConstVexity()
|
51 | 89 | if !is_feasible(evaluate(c.child), c.set, CONSTANT_CONSTRAINT_TOL[])
|
@@ -201,14 +239,7 @@ function set_with_size(
|
201 | 239 | return MOI.PositiveSemidefiniteConeSquare(sz[1])
|
202 | 240 | end
|
203 | 241 |
|
204 |
| -head(io::IO, ::MOI.PositiveSemidefiniteConeSquare) = print(io, "sdp") |
205 |
| - |
206 |
| -function vexity(vex, ::MOI.PositiveSemidefiniteConeSquare) |
207 |
| - if !(vex in (AffineVexity(), ConstVexity())) |
208 |
| - return NotDcp() |
209 |
| - end |
210 |
| - return AffineVexity() |
211 |
| -end |
| 242 | +head(io::IO, ::MOI.PositiveSemidefiniteConeSquare) = print(io, "PSD") |
212 | 243 |
|
213 | 244 | function is_feasible(x, ::MOI.PositiveSemidefiniteConeSquare, tol)
|
214 | 245 | return x ≈ transpose(x) && LinearAlgebra.eigmin(x) >= -tol
|
|
244 | 275 | ⪯(x::Value, y::AbstractExpr) = ⪰(y, x)
|
245 | 276 |
|
246 | 277 | ⪯(x::AbstractExpr, y::Value) = ⪰(y, x)
|
247 |
| - |
248 |
| -# ============================================================================== |
249 |
| -# ExponentialCone |
250 |
| -# ============================================================================== |
251 |
| - |
252 |
| -head(io::IO, ::MOI.ExponentialCone) = print(io, "exp") |
253 |
| - |
254 |
| -function vexity(vex, ::MOI.ExponentialCone) |
255 |
| - if !(vex == ConstVexity() || vex == AffineVexity()) |
256 |
| - return NotDcp() |
257 |
| - end |
258 |
| - return ConvexVexity() |
259 |
| -end |
260 |
| - |
261 |
| -# ============================================================================== |
262 |
| -# SecondOrderCone |
263 |
| -# ============================================================================== |
264 |
| - |
265 |
| -head(io::IO, ::MOI.SecondOrderCone) = print(io, "soc") |
266 |
| - |
267 |
| -function vexity(vex, ::MOI.SecondOrderCone) |
268 |
| - if !(vex == ConstVexity() || vex == AffineVexity()) |
269 |
| - return NotDcp() |
270 |
| - end |
271 |
| - return ConvexVexity() |
272 |
| -end |
273 |
| - |
274 |
| -# ============================================================================== |
275 |
| -# RotatedSecondOrderCone |
276 |
| -# ============================================================================== |
277 |
| - |
278 |
| -head(io::IO, ::MOI.RotatedSecondOrderCone) = print(io, "rsoc") |
279 |
| - |
280 |
| -function vexity(vex, ::MOI.RotatedSecondOrderCone) |
281 |
| - if !(vex == ConstVexity() || vex == AffineVexity()) |
282 |
| - return NotDcp() |
283 |
| - end |
284 |
| - return ConvexVexity() |
285 |
| -end |
286 |
| - |
287 |
| -# ============================================================================== |
288 |
| -# RelativeEntropyCone |
289 |
| -# ============================================================================== |
290 |
| - |
291 |
| -head(io::IO, ::MOI.RelativeEntropyCone) = print(io, "RelativeEntropyCone") |
292 |
| - |
293 |
| -function vexity(vex, ::MOI.RelativeEntropyCone) |
294 |
| - if !(vex == ConstVexity() || vex == AffineVexity()) |
295 |
| - return NotDcp() |
296 |
| - end |
297 |
| - return ConvexVexity() |
298 |
| -end |
0 commit comments