@@ -281,9 +281,13 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
281
281
varval = (@isdefined default_val) ? default_val :
282
282
unit_handled_variable_value (meta, varname)
283
283
if varclass == :parameters
284
+ Meta. isexpr (a, :call ) && assert_unique_independent_var (dict, a. args[end ])
284
285
var = :($ varname = $ first (@parameters ($ a[$ (indices... )]:: $type = $ varval),
285
286
$ meta_val))
286
287
else
288
+ Meta. isexpr (a, :call ) ||
289
+ throw (" $a is not a variable of the independent variable" )
290
+ assert_unique_independent_var (dict, a. args[end ])
287
291
var = :($ varname = $ first (@variables ($ a[$ (indices)]:: $type = $ varval),
288
292
$ meta_val))
289
293
end
@@ -301,10 +305,15 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
301
305
val, def_n_meta = (def_n_meta. args[1 ], def_n_meta. args[2 : end ])
302
306
push! (kwargs, Expr (:kw , varname, nothing ))
303
307
if varclass == :parameters
308
+ Meta. isexpr (a, :call ) &&
309
+ assert_unique_independent_var (dict, a. args[end ])
304
310
var = :($ varname = $ varname === nothing ? $ val : $ varname;
305
311
$ varname = $ first (@parameters ($ a[$ (indices... )]:: $type = $ varval),
306
312
$ (def_n_meta... )))
307
313
else
314
+ Meta. isexpr (a, :call ) ||
315
+ throw (" $a is not a variable of the independent variable" )
316
+ assert_unique_independent_var (dict, a. args[end ])
308
317
var = :($ varname = $ varname === nothing ? $ val : $ varname;
309
318
$ varname = $ first (@variables $ a[$ (indices... )]:: $type = (
310
319
$ varval),
@@ -313,9 +322,14 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
313
322
else
314
323
push! (kwargs, Expr (:kw , varname, nothing ))
315
324
if varclass == :parameters
325
+ Meta. isexpr (a, :call ) &&
326
+ assert_unique_independent_var (dict, a. args[end ])
316
327
var = :($ varname = $ varname === nothing ? $ def_n_meta : $ varname;
317
328
$ varname = $ first (@parameters $ a[$ (indices... )]:: $type = $ varname))
318
329
else
330
+ Meta. isexpr (a, :call ) ||
331
+ throw (" $a is not a variable of the independent variable" )
332
+ assert_unique_independent_var (dict, a. args[end ])
319
333
var = :($ varname = $ varname === nothing ? $ def_n_meta : $ varname;
320
334
$ varname = $ first (@variables $ a[$ (indices... )]:: $type = $ varname))
321
335
end
@@ -331,8 +345,12 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
331
345
varname = a isa Expr && a. head == :call ? a. args[1 ] : a
332
346
push! (kwargs, Expr (:kw , varname, nothing ))
333
347
if varclass == :parameters
348
+ Meta. isexpr (a, :call ) && assert_unique_independent_var (dict, a. args[end ])
334
349
var = :($ varname = $ first (@parameters $ a[$ (indices... )]:: $type = $ varname))
335
350
elseif varclass == :variables
351
+ Meta. isexpr (a, :call ) ||
352
+ throw (" $a is not a variable of the independent variable" )
353
+ assert_unique_independent_var (dict, a. args[end ])
336
354
var = :($ varname = $ first (@variables $ a[$ (indices... )]:: $type = $ varname))
337
355
else
338
356
throw (" Symbolic array with arbitrary length is not handled for $varclass .
@@ -411,14 +429,22 @@ function generate_var!(dict, a, varclass;
411
429
generate_var (a, varclass; indices, type)
412
430
end
413
431
432
+ function assert_unique_independent_var (dict, iv:: Num )
433
+ assert_unique_independent_var (dict, nameof (iv))
434
+ end
435
+ function assert_unique_independent_var (dict, iv)
436
+ prev_iv = get! (dict, :independent_variable ) do
437
+ iv
438
+ end
439
+ prev_iv isa Num && (prev_iv = nameof (prev_iv))
440
+ @assert isequal (iv, prev_iv) " Multiple independent variables are used in the model $(typeof (iv)) $(typeof (prev_iv)) "
441
+ end
442
+
414
443
function generate_var! (dict, a, b, varclass, mod;
415
444
indices:: Union{Vector{UnitRange{Int}}, Nothing} = nothing ,
416
445
type = Real)
417
446
iv = b == :t ? get_t (mod, b) : generate_var (b, :independent_variables )
418
- prev_iv = get! (dict, :independent_variable ) do
419
- iv
420
- end
421
- @assert isequal (iv, prev_iv) " Multiple independent variables are used in the model"
447
+ assert_unique_independent_var (dict, iv)
422
448
check_name_uniqueness (dict, a, varclass)
423
449
vd = get! (dict, varclass) do
424
450
Dict {Symbol, Dict{Symbol, Any}} ()
0 commit comments