Skip to content

Commit 563dedc

Browse files
committed
fix: handle more typed array cases
This also fixes more tests
1 parent ed5e0fb commit 563dedc

File tree

2 files changed

+18
-17
lines changed

2 files changed

+18
-17
lines changed

src/systems/model_parsing.jl

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -232,55 +232,56 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
232232
varclass, where_types, meta)
233233
return var, def, Dict()
234234
end
235-
Expr(:tuple, Expr(:ref, a, b...), y) || Expr(:tuple, Expr(:(::), Expr(:ref, a, b...), n), y) => begin
236-
isdefined(mod, :n) || (n = Real)
235+
Expr(:tuple, Expr(:(::), Expr(:ref, a, b...), type), y) || Expr(:tuple, Expr(:ref, a, b...), y) => begin
236+
(@isdefined type) || (type = Real)
237237
varname = Meta.isexpr(a, :call) ? a.args[1] : a
238238
push!(kwargs, Expr(:kw, varname, nothing))
239239
varval = unit_handled_variable_value(mod, y, varname)
240240
if varclass == :parameters
241-
var = :($varname = $first(@parameters $a[$(b...)]::$n = ($varval, $y)))
241+
var = :($varname = $first(@parameters $a[$(b...)]::$type = ($varval, $y)))
242242
else
243-
var = :($varname = $first(@variables $a[$(b...)]::$n = ($varval, $y)))
243+
var = :($varname = $first(@variables $a[$(b...)]::$type = ($varval, $y)))
244244
end
245245
#TODO: update `dict` aka `Model.structure` with the metadata
246246
(:($varname...), var), nothing, Dict()
247247
end
248-
Expr(:(=), Expr(:ref, a, b...), y) || Expr(:(=), Expr(:(::), Expr(:ref, a, b...), n), y) => begin
249-
isdefined(mod, :n) || (n = Real)
248+
Expr(:(=), Expr(:(::), Expr(:ref, a, b...), type), y) || Expr(:(=), Expr(:ref, a, b...), y) => begin
249+
(@isdefined type) || (type = Real)
250250
varname = Meta.isexpr(a, :call) ? a.args[1] : a
251251
if Meta.isexpr(y, :tuple)
252252
varval = unit_handled_variable_value(mod, y, varname)
253253
val, y = (y.args[1], y.args[2:end])
254254
push!(kwargs, Expr(:kw, varname, nothing))
255255
if varclass == :parameters
256256
var = :($varname = $varname === nothing ? $val : $varname;
257-
$varname = $first(@parameters $a[$(b...)]::$n = (
257+
$varname = $first(@parameters $a[$(b...)]::$type = (
258258
$varval, $(y...))))
259259
else
260260
var = :($varname = $varname === nothing ? $val : $varname;
261-
$varname = $first(@variables $a[$(b...)]::$n = (
261+
$varname = $first(@variables $a[$(b...)]::$type = (
262262
$varval, $(y...))))
263263
end
264264
else
265265
push!(kwargs, Expr(:kw, varname, nothing))
266266
if varclass == :parameters
267267
var = :($varname = $varname === nothing ? $y : $varname;
268-
$varname = $first(@parameters $a[$(b...)]::$n = $varname))
268+
$varname = $first(@parameters $a[$(b...)]::$type = $varname))
269269
else
270270
var = :($varname = $varname === nothing ? $y : $varname;
271-
$varname = $first(@variables $a[$(b...)]::$n = $varname))
271+
$varname = $first(@variables $a[$(b...)]::$type = $varname))
272272
end
273273
end
274274
#TODO: update `dict`` aka `Model.structure` with the metadata
275275
(:($varname...), var), nothing, Dict()
276276
end
277-
Expr(:ref, a, b...) => begin
277+
Expr(:(::), Expr(:ref, a, b...), type) || Expr(:ref, a, b...) => begin
278+
(@isdefined type) || (type = Real)
278279
varname = a isa Expr && a.head == :call ? a.args[1] : a
279280
push!(kwargs, Expr(:kw, varname, nothing))
280281
if varclass == :parameters
281-
var = :($varname = $first(@parameters $a[$(b...)] = $varname))
282+
var = :($varname = $first(@parameters $a[$(b...)]::$type = $varname))
282283
elseif varclass == :variables
283-
var = :($varname = $first(@variables $a[$(b...)] = $varname))
284+
var = :($varname = $first(@variables $a[$(b...)]::$type = $varname))
284285
else
285286
throw("Symbolic array with arbitrary length is not handled for $varclass.
286287
Please open an issue with an example.")

test/model_parsing.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -303,9 +303,9 @@ end
303303
@test symtype(type_model.par2) == Int
304304
@test symtype(type_model.par3) == BigFloat
305305
@test symtype(type_model.par4) == Float64
306-
@test_broken symtype(type_model.par5[1]) == BigFloat
307-
@test_broken symtype(type_model.par6[1]) == BigFloat
308-
@test_broken symtype(type_model.par7[1, 1]) == BigFloat
306+
@test symtype(type_model.par5[1]) == BigFloat
307+
@test symtype(type_model.par6[1]) == BigFloat
308+
@test symtype(type_model.par7[1, 1]) == BigFloat
309309

310310
@test_throws TypeError TypeModel(; name = :throws, flag = 1)
311311
@test_throws TypeError TypeModel(; name = :throws, par0 = 1)
@@ -317,7 +317,7 @@ end
317317

318318
# Test that array types are correctly added.
319319
@named type_model2 = TypeModel(; par5 = rand(BigFloat, 3))
320-
@test_broken symtype(type_model2.par5[1]) == BigFloat
320+
@test symtype(type_model2.par5[1]) == BigFloat
321321

322322
@named type_model3 = TypeModel(; par7 = rand(BigFloat, 3, 3))
323323
@test symtype(type_model3.par7[1, 1]) == BigFloat

0 commit comments

Comments
 (0)