Skip to content

Commit acd7a0e

Browse files
authored
[FileFormats.MOF] update to v1.3 (#2158)
1 parent 23a4241 commit acd7a0e

File tree

7 files changed

+180
-27
lines changed

7 files changed

+180
-27
lines changed

docs/src/submodules/FileFormats/overview.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ julia> print(read("file.mof.json", String))
9494
"name": "MathOptFormat Model",
9595
"version": {
9696
"major": 1,
97-
"minor": 2
97+
"minor": 3
9898
},
9999
"variables": [
100100
{
@@ -230,7 +230,7 @@ julia> good_model = JSON.parse("""
230230
{
231231
"version": {
232232
"major": 1,
233-
"minor": 2
233+
"minor": 3
234234
},
235235
"variables": [{"name": "x"}],
236236
"objective": {"sense": "feasibility"},
@@ -249,7 +249,7 @@ julia> bad_model = JSON.parse("""
249249
{
250250
"version": {
251251
"major": 1,
252-
"minor": 2
252+
"minor": 3
253253
},
254254
"variables": [{"NaMe": "x"}],
255255
"objective": {"sense": "feasibility"},

src/FileFormats/MOF/MOF.jl

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ import OrderedCollections
1111
import JSON
1212
import MathOptInterface as MOI
1313

14-
const SCHEMA_PATH = joinpath(@__DIR__, "mof.1.2.schema.json")
15-
const VERSION = v"1.2"
16-
const SUPPORTED_VERSIONS = (v"1.2", v"1.1", v"1.0", v"0.6", v"0.5", v"0.4")
14+
const SCHEMA_PATH = joinpath(@__DIR__, "mof.1.3.schema.json")
15+
const VERSION = v"1.3"
16+
const SUPPORTED_VERSIONS =
17+
(v"1.3", v"1.2", v"1.1", v"1.0", v"0.6", v"0.5", v"0.4")
1718

1819
const OrderedObject = OrderedCollections.OrderedDict{String,Any}
1920
const UnorderedObject = Dict{String,Any}
@@ -39,12 +40,14 @@ MOI.Utilities.@model(
3940
MOI.Interval,
4041
MOI.Semicontinuous,
4142
MOI.Semiinteger,
43+
MOI.Parameter,
4244
),
4345
(
4446
MOI.Reals,
4547
MOI.Zeros,
4648
MOI.Nonnegatives,
4749
MOI.Nonpositives,
50+
MOI.HyperRectangle,
4851
MOI.SecondOrderCone,
4952
MOI.RotatedSecondOrderCone,
5053
MOI.GeometricMeanCone,
@@ -61,6 +64,7 @@ MOI.Utilities.@model(
6164
MOI.LogDetConeSquare,
6265
MOI.PositiveSemidefiniteConeTriangle,
6366
MOI.PositiveSemidefiniteConeSquare,
67+
MOI.HermitianPositiveSemidefiniteConeTriangle,
6468
MOI.AllDifferent,
6569
MOI.Circuit,
6670
MOI.CountAtLeast,
@@ -85,6 +89,7 @@ MOI.Utilities.@model(
8589
)
8690

8791
# Indicator is handled by UniversalFallback.
92+
# Reified is handled by UniversalFallback.
8893

8994
const Model = MOI.Utilities.UniversalFallback{InnerModel{Float64}}
9095

src/FileFormats/MOF/mof.1.2.schema.json renamed to src/FileFormats/MOF/mof.1.3.schema.json

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"$schema": "https://json-schema.org/schema#",
3-
"$id": "https://jump.dev/MathOptFormat/schemas/mof.1.2.schema.json",
3+
"$id": "https://jump.dev/MathOptFormat/schemas/mof.1.3.schema.json",
44
"title": "The schema for MathOptFormat",
55
"type": "object",
66
"required": ["version", "variables", "objective", "constraints"],
@@ -11,7 +11,7 @@
1111
"required": ["minor", "major"],
1212
"properties": {
1313
"minor": {
14-
"enum": [0, 1, 2]
14+
"enum": [0, 1, 2, 3]
1515
},
1616
"major": {
1717
"const": 1
@@ -544,6 +544,18 @@
544544
"const": "Integer"
545545
}
546546
}
547+
}, {
548+
"description": "{value}",
549+
"examples": ["{\"type\": \"Parameter\", \"value\": 2.1}"],
550+
"required": ["value"],
551+
"properties": {
552+
"type": {
553+
"const": "Parameter"
554+
},
555+
"value": {
556+
"type": "number"
557+
}
558+
}
547559
}]
548560
},
549561
"vector_sets": {
@@ -1060,6 +1072,56 @@
10601072
}
10611073
}
10621074
}
1075+
}, {
1076+
"description": "(z, f(x)) ∈ {R^{dimension}: z iff f(x) ∈ S}",
1077+
"examples": ["{\"type\": \"Reified\", \"set\": {\"type\": \"GreaterThan\", \"lower\": 0}}"],
1078+
"required": ["set"],
1079+
"properties": {
1080+
"type": {
1081+
"const": "Reified"
1082+
},
1083+
"set": {
1084+
"oneOf": [{
1085+
"$ref": "#/definitions/scalar_sets"
1086+
}, {
1087+
"$ref": "#/definitions/vector_sets"
1088+
}]
1089+
}
1090+
}
1091+
}, {
1092+
"description": "x ∈ {R^d: x_i ∈ [lower_i, upper_i]}",
1093+
"examples": ["{\"type\": \"HyperRectangle\", \"lower\": [0, 0], \"upper\": [1, 1]}"],
1094+
"required": ["lower", "upper"],
1095+
"properties": {
1096+
"type": {
1097+
"const": "HyperRectangle"
1098+
},
1099+
"lower": {
1100+
"type": "array",
1101+
"items": {
1102+
"type": "number"
1103+
}
1104+
},
1105+
"upper": {
1106+
"type": "array",
1107+
"items": {
1108+
"type": "number"
1109+
}
1110+
}
1111+
}
1112+
}, {
1113+
"description": "The (vectorized) cone of Hermitian positive semidefinite matrices, with non-negative side_dimension rows and columns.",
1114+
"examples": ["{\"type\": \"HermitianPositiveSemidefiniteConeTriangle\", \"side_dimension\": 3}"],
1115+
"required": ["side_dimension"],
1116+
"properties": {
1117+
"type": {
1118+
"const": "HermitianPositiveSemidefiniteConeTriangle"
1119+
},
1120+
"side_dimension": {
1121+
"type": "integer",
1122+
"minimum": 1
1123+
}
1124+
}
10631125
}]
10641126
}
10651127
}

src/FileFormats/MOF/read.jl

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,10 +362,12 @@ end
362362
Interval,
363363
Semiinteger,
364364
Semicontinuous,
365+
Parameter,
365366
Zeros,
366367
Reals,
367368
Nonnegatives,
368369
Nonpositives,
370+
HyperRectangle,
369371
SecondOrderCone,
370372
RotatedSecondOrderCone,
371373
GeometricMeanCone,
@@ -380,6 +382,7 @@ end
380382
LogDetConeSquare,
381383
PositiveSemidefiniteConeTriangle,
382384
PositiveSemidefiniteConeSquare,
385+
HermitianPositiveSemidefiniteConeTriangle,
383386
ExponentialCone,
384387
DualExponentialCone,
385388
PowerCone,
@@ -388,6 +391,7 @@ end
388391
SOS2,
389392
IndicatorSet, # Required for v0.6
390393
Indicator, # Required for v1.0
394+
Reified,
391395
Complements,
392396
AllDifferent,
393397
Circuit,
@@ -451,6 +455,10 @@ function set_to_moi(::Val{:Semicontinuous}, object::Object)
451455
return MOI.Semicontinuous{Float64}(object["lower"], object["upper"])
452456
end
453457

458+
function set_to_moi(::Val{:Parameter}, object::Object)
459+
return MOI.Parameter{Float64}(object["value"])
460+
end
461+
454462
# ========== Non-typed vector sets ==========
455463

456464
function set_to_moi(::Val{:Zeros}, object::Object)
@@ -525,6 +533,14 @@ function set_to_moi(::Val{:PositiveSemidefiniteConeSquare}, object::Object)
525533
return MOI.PositiveSemidefiniteConeSquare(object["side_dimension"])
526534
end
527535

536+
function set_to_moi(
537+
::Val{:HermitianPositiveSemidefiniteConeTriangle},
538+
object::Object,
539+
)
540+
side_dimension = object["side_dimension"]
541+
return MOI.HermitianPositiveSemidefiniteConeTriangle(side_dimension)
542+
end
543+
528544
function set_to_moi(::Val{:ExponentialCone}, ::Object)
529545
return MOI.ExponentialCone()
530546
end
@@ -591,6 +607,13 @@ function set_to_moi(::Val{:SOS2}, object::Object)
591607
return MOI.SOS2(convert(Vector{Float64}, object["weights"]))
592608
end
593609

610+
function set_to_moi(::Val{:HyperRectangle}, object::Object)
611+
return MOI.HyperRectangle(
612+
convert(Vector{Float64}, object["lower"]),
613+
convert(Vector{Float64}, object["upper"]),
614+
)
615+
end
616+
594617
# :IndicatorSet is required for v0.6
595618
# :Indicator is required for v1.0
596619
function set_to_moi(::Union{Val{:Indicator},Val{:IndicatorSet}}, object::Object)
@@ -603,6 +626,10 @@ function set_to_moi(::Union{Val{:Indicator},Val{:IndicatorSet}}, object::Object)
603626
end
604627
end
605628

629+
function set_to_moi(::Val{:Reified}, object::Object)
630+
return MOI.Reified(set_to_moi(object["set"]::typeof(object)))
631+
end
632+
606633
function set_to_moi(::Val{:BinPacking}, object::Object)
607634
return MOI.BinPacking(
608635
convert(Float64, object["capacity"]),

src/FileFormats/MOF/write.jl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ head_name(::Type{<:MOI.EqualTo}) = "EqualTo"
275275
head_name(::Type{<:MOI.Interval}) = "Interval"
276276
head_name(::Type{<:MOI.Semiinteger}) = "Semiinteger"
277277
head_name(::Type{<:MOI.Semicontinuous}) = "Semicontinuous"
278+
head_name(::Type{<:MOI.Parameter}) = "Parameter"
278279

279280
# ========== Non-typed vector sets ==========
280281
head_name(::Type{MOI.Zeros}) = "Zeros"
@@ -302,6 +303,9 @@ function head_name(::Type{MOI.PositiveSemidefiniteConeSquare})
302303
return "PositiveSemidefiniteConeSquare"
303304
end
304305
head_name(::Type{MOI.Complements}) = "Complements"
306+
function head_name(::Type{MOI.HermitianPositiveSemidefiniteConeTriangle})
307+
return "HermitianPositiveSemidefiniteConeTriangle"
308+
end
305309

306310
head_name(::Type{MOI.AllDifferent}) = "AllDifferent"
307311
head_name(::Type{MOI.Circuit}) = "Circuit"
@@ -318,6 +322,7 @@ head_name(::Type{<:MOI.DualPowerCone}) = "DualPowerCone"
318322
head_name(::Type{<:MOI.SOS1}) = "SOS1"
319323
head_name(::Type{<:MOI.SOS2}) = "SOS2"
320324
head_name(::Type{<:MOI.BinPacking}) = "BinPacking"
325+
head_name(::Type{<:MOI.HyperRectangle}) = "HyperRectangle"
321326

322327
function moi_to_object(
323328
set::MOI.Indicator{I,S},
@@ -331,6 +336,16 @@ function moi_to_object(
331336
)
332337
end
333338

339+
function moi_to_object(
340+
set::MOI.Reified,
341+
name_map::Dict{MOI.VariableIndex,String},
342+
)
343+
return OrderedObject(
344+
"type" => "Reified",
345+
"set" => moi_to_object(set.set, name_map),
346+
)
347+
end
348+
334349
function moi_to_object(
335350
set::MOI.Table{T},
336351
::Dict{MOI.VariableIndex,String},

0 commit comments

Comments
 (0)