Skip to content

Commit 553c44b

Browse files
committed
feat(): added options spec to constraints/meta
1 parent e85a808 commit 553c44b

File tree

3 files changed

+89
-18
lines changed

3 files changed

+89
-18
lines changed

src/backends/reactivemp.jl

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -341,8 +341,29 @@ end
341341

342342
## Factorisations constraints specification language
343343

344-
function write_constraints_specification(::ReactiveMPBackend, factorisation, marginalsform, messagesform)
345-
return :(ReactiveMP.ConstraintsSpecification($factorisation, $marginalsform, $messagesform))
344+
function write_constraints_specification(::ReactiveMPBackend, factorisation, marginalsform, messagesform, options)
345+
return :(ReactiveMP.ConstraintsSpecification($factorisation, $marginalsform, $messagesform, $options))
346+
end
347+
348+
function write_constraints_specification_options(::ReactiveMPBackend, options)
349+
@capture(options, [ entries__ ]) || error("Invalid constraints specification options syntax. Should be `@constraints [ option1 = value1, ... ] ...`, but `$(options)` found.")
350+
351+
is_warn_option_present = false
352+
353+
warn_option = :(true)
354+
355+
foreach(entries) do option
356+
if @capture(option, warn = value_)
357+
!is_warn_option_present || error("`warn` option $(option) for constraints specification has been redefined.")
358+
is_warn_option_present = true
359+
@assert value isa Bool "`warn` option for constraints specification expects true/false value"
360+
warn_option = value
361+
else
362+
error("Unknown option '$option' for constraints specification.")
363+
end
364+
end
365+
366+
return :(ReactiveMP.ConstraintsSpecificationOptions($warn_option))
346367
end
347368

348369
function write_factorisation_constraint(::ReactiveMPBackend, names, entries)
@@ -387,8 +408,29 @@ end
387408

388409
## Meta specification language
389410

390-
function write_meta_specification(::ReactiveMPBackend, entries)
391-
return :(ReactiveMP.MetaSpecification($entries))
411+
function write_meta_specification(::ReactiveMPBackend, entries, options)
412+
return :(ReactiveMP.MetaSpecification($entries, $options))
413+
end
414+
415+
function write_meta_specification_options(::ReactiveMPBackend, options)
416+
@capture(options, [ entries__ ]) || error("Invalid meta specification options syntax. Should be `@meta [ option1 = value1, ... ] ...`, but `$(options)` found.")
417+
418+
is_warn_option_present = false
419+
420+
warn_option = :(true)
421+
422+
foreach(entries) do option
423+
if @capture(option, warn = value_)
424+
!is_warn_option_present || error("`warn` option $(option) for meta specification has been redefined.")
425+
is_warn_option_present = true
426+
@assert value isa Bool "`warn` option for meta specification expects true/false value"
427+
warn_option = value
428+
else
429+
error("Unknown option '$option' for meta specification.")
430+
end
431+
end
432+
433+
return :(ReactiveMP.MetaSpecificationOptions($warn_option))
392434
end
393435

394436
function write_meta_specification_entry(::ReactiveMPBackend, F, N, meta)

src/constraints.jl

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
export @constraints
22

33
"""
4-
write_constraints_specification(backend, factorisation, marginalsform, messagesform)
4+
write_constraints_specification(backend, factorisation, marginalsform, messagesform, options)
55
"""
66
function write_constraints_specification end
77

8+
"""
9+
write_constraints_specification_options(backend, options)
10+
"""
11+
function write_constraints_specification_options end
12+
813
"""
914
write_factorisation_constraint(backend, names, entries)
1015
"""
@@ -56,7 +61,12 @@ function write_form_constraint_specification_entry end
5661
function write_form_constraint_specification end
5762

5863
macro constraints(constraints_specification)
59-
return generate_constraints_expression(__get_current_backend(), constraints_specification)
64+
# Empty options is :([])
65+
return generate_constraints_expression(__get_current_backend(), :([]), constraints_specification)
66+
end
67+
68+
macro constraints(constraints_options, constraints_specification)
69+
return generate_constraints_expression(__get_current_backend(), constraints_options, constraints_specification)
6070
end
6171

6272
## Factorisation constraints
@@ -125,19 +135,20 @@ end
125135

126136
##
127137

128-
function generate_constraints_expression(backend, constraints_specification)
138+
function generate_constraints_expression(backend, constraints_options, constraints_specification)
129139

130140
if isblock(constraints_specification)
131141
generatedfname = gensym(:constraints)
132142
generatedfbody = :(function $(generatedfname)() $constraints_specification end)
133-
return :($(generate_constraints_expression(backend, generatedfbody))())
143+
return :($(generate_constraints_expression(backend, constraints_options, generatedfbody))())
134144
end
135145

136146
@capture(constraints_specification, (function cs_name_(cs_args__; cs_kwargs__) cs_body_ end) | (function cs_name_(cs_args__) cs_body_ end)) ||
137147
error("Constraints specification language requires full function definition")
138148

139-
cs_args = cs_args === nothing ? [] : cs_args
140-
cs_kwargs = cs_kwargs === nothing ? [] : cs_kwargs
149+
cs_args = cs_args === nothing ? [] : cs_args
150+
cs_kwargs = cs_kwargs === nothing ? [] : cs_kwargs
151+
cs_options = write_constraints_specification_options(backend, constraints_options)
141152

142153
lhs_dict = Dict{UInt, FactorisationConstraintLHSInfo}()
143154

@@ -308,7 +319,13 @@ function generate_constraints_expression(backend, constraints_specification)
308319
return expression
309320
end
310321

311-
return_specification = write_constraints_specification(backend, factorisation_constraints_symbol, marginals_form_constraints_symbol, messages_form_constraints_symbol)
322+
return_specification = write_constraints_specification(
323+
backend,
324+
factorisation_constraints_symbol,
325+
marginals_form_constraints_symbol,
326+
messages_form_constraints_symbol,
327+
cs_options
328+
)
312329

313330
res = quote
314331
function $cs_name($(cs_args...); $(cs_kwargs...))

src/meta.jl

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,49 @@
11
export @meta
22

33
"""
4-
write_meta_specification(backend, entries)
4+
write_meta_specification(backend, entries, options)
55
"""
66
function write_meta_specification end
77

8+
"""
9+
write_meta_specification_options(backend, options)
10+
"""
11+
function write_meta_specification_options end
12+
813
"""
914
write_meta_specification_entry(backend, F, N, meta)
1015
"""
1116
function write_meta_specification_entry end
1217

18+
1319
macro meta(meta_specification)
14-
return generate_meta_expression(__get_current_backend(), meta_specification)
20+
# Empty options `:([])`
21+
return generate_meta_expression(__get_current_backend(), :([]), meta_specification)
22+
end
23+
24+
macro meta(meta_options, meta_specification)
25+
return generate_meta_expression(__get_current_backend(), meta_options, meta_specification)
1526
end
1627

1728
struct MetaSpecificationLHSInfo
1829
hash :: UInt
1930
checkname :: Symbol
2031
end
2132

22-
function generate_meta_expression(backend, meta_specification)
33+
function generate_meta_expression(backend, meta_options, meta_specification)
2334

2435
if isblock(meta_specification)
2536
generatedfname = gensym(:constraints)
2637
generatedfbody = :(function $(generatedfname)() $meta_specification end)
27-
return :($(generate_meta_expression(backend, generatedfbody))())
38+
return :($(generate_meta_expression(backend, meta_options, generatedfbody))())
2839
end
2940

3041
@capture(meta_specification, (function cs_name_(cs_args__; cs_kwargs__) cs_body_ end) | (function cs_name_(cs_args__) cs_body_ end)) ||
3142
error("Meta specification language requires full function definition")
3243

33-
cs_args = cs_args === nothing ? [] : cs_args
34-
cs_kwargs = cs_kwargs === nothing ? [] : cs_kwargs
44+
cs_args = cs_args === nothing ? [] : cs_args
45+
cs_kwargs = cs_kwargs === nothing ? [] : cs_kwargs
46+
cs_options = write_meta_specification_options(backend, meta_options)
3547

3648
lhs_dict = Dict{UInt, MetaSpecificationLHSInfo}()
3749

@@ -76,7 +88,7 @@ function generate_meta_expression(backend, meta_specification)
7688
end
7789
end
7890

79-
ret_meta_specification = write_meta_specification(backend, meta_spec_symbol)
91+
ret_meta_specification = write_meta_specification(backend, meta_spec_symbol, cs_options)
8092

8193
res = quote
8294
function $cs_name($(cs_args...); $(cs_kwargs...))

0 commit comments

Comments
 (0)