@@ -151,34 +151,18 @@ pop_structure_dict!(dict, key) = length(dict[key]) == 0 && pop!(dict, key)
151
151
struct NoValue end
152
152
const NO_VALUE = NoValue ()
153
153
154
- function update_kwargs_and_metadata! (dict, kwargs, a, def, indices, type, var ,
154
+ function update_kwargs_and_metadata! (dict, kwargs, a, def, type,
155
155
varclass, where_types, meta)
156
- if indices isa Nothing
157
- if ! isnothing (meta) && haskey (meta, VariableUnit)
158
- uvar = gensym ()
159
- push! (where_types, uvar)
160
- push! (kwargs,
161
- Expr (:kw , :($ a:: Union{Nothing, Missing, $NoValue, $uvar} ), NO_VALUE))
162
- else
163
- push! (kwargs,
164
- Expr (:kw , :($ a:: Union{Nothing, Missing, $NoValue, $type} ), NO_VALUE))
165
- end
166
- dict[:kwargs ][a] = Dict (:value => def, :type => type)
156
+ if ! isnothing (meta) && haskey (meta, VariableUnit)
157
+ uvar = gensym ()
158
+ push! (where_types, uvar)
159
+ push! (kwargs,
160
+ Expr (:kw , :($ a:: Union{Nothing, Missing, $NoValue, $uvar} ), NO_VALUE))
167
161
else
168
- vartype = gensym (:T )
169
162
push! (kwargs,
170
- Expr (:kw ,
171
- Expr (:(:: ), a,
172
- Expr (:curly , :Union , :Nothing , :Missing , NoValue,
173
- Expr (:curly , :AbstractArray , vartype))),
174
- NO_VALUE))
175
- if ! isnothing (meta) && haskey (meta, VariableUnit)
176
- push! (where_types, vartype)
177
- else
178
- push! (where_types, :($ vartype <: $type ))
179
- end
180
- dict[:kwargs ][a] = Dict (:value => def, :type => AbstractArray{type})
163
+ Expr (:kw , :($ a:: Union{Nothing, Missing, $NoValue, $type} ), NO_VALUE))
181
164
end
165
+ dict[:kwargs ][a] = Dict (:value => def, :type => type)
182
166
if dict[varclass] isa Vector
183
167
dict[varclass][1 ][a][:type ] = AbstractArray{type}
184
168
else
@@ -213,8 +197,8 @@ function update_readable_metadata!(varclass_dict, meta::Dict, varname)
213
197
end
214
198
end
215
199
216
- function push_array_kwargs_and_metadata ! (
217
- dict, indices, meta, type, varclass, varname, varval)
200
+ function update_array_kwargs_and_metadata ! (
201
+ dict, indices, kwargs, meta, type, varclass, varname, varval, where_types )
218
202
dict[varclass] = get! (dict, varclass) do
219
203
Dict {Symbol, Dict{Symbol, Any}} ()
220
204
end
@@ -227,6 +211,18 @@ function push_array_kwargs_and_metadata!(
227
211
:type => type
228
212
)))
229
213
214
+ vartype = gensym (:T )
215
+ push! (kwargs,
216
+ Expr (:kw ,
217
+ Expr (:(:: ), varname,
218
+ Expr (:curly , :Union , :Nothing , Expr (:curly , :AbstractArray , vartype))),
219
+ nothing ))
220
+ if ! isnothing (meta) && haskey (meta, VariableUnit)
221
+ push! (where_types, vartype)
222
+ else
223
+ push! (where_types, :($ vartype <: $type ))
224
+ end
225
+
230
226
# Useful keys for kwargs entry are: value, type and size.
231
227
dict[:kwargs ][varname] = varclass_dict[][varname]
232
228
@@ -243,13 +239,12 @@ function unit_handled_variable_value(meta, varname)
243
239
end
244
240
245
241
function parse_variable_def! (dict, mod, arg, varclass, kwargs, where_types;
246
- def = nothing , indices:: Union{Vector{UnitRange{Int}}, Nothing} = nothing ,
247
- type:: Type = Real, meta = Dict {DataType, Expr} ())
242
+ def = nothing , type:: Type = Real, meta = Dict {DataType, Expr} ())
248
243
arg isa LineNumberNode && return
249
244
MLStyle. @match arg begin
250
245
a:: Symbol => begin
251
- var = generate_var! (dict, a, varclass; indices, type)
252
- update_kwargs_and_metadata! (dict, kwargs, a, def, indices, type, var ,
246
+ var = generate_var! (dict, a, varclass; type)
247
+ update_kwargs_and_metadata! (dict, kwargs, a, def, type,
253
248
varclass, where_types, meta)
254
249
return var, def, Dict ()
255
250
end
@@ -265,8 +260,8 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
265
260
dict, mod, a, varclass, kwargs, where_types; def, type, meta)
266
261
end
267
262
Expr (:call , a, b) => begin
268
- var = generate_var! (dict, a, b, varclass, mod; indices, type)
269
- update_kwargs_and_metadata! (dict, kwargs, a, def, indices, type, var ,
263
+ var = generate_var! (dict, a, b, varclass, mod; type)
264
+ update_kwargs_and_metadata! (dict, kwargs, a, def, type,
270
265
varclass, where_types, meta)
271
266
return var, def, Dict ()
272
267
end
@@ -276,7 +271,6 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
276
271
Expr (:tuple , Expr (:ref , a, indices... ), meta_val) => begin
277
272
(@isdefined type) || (type = Real)
278
273
varname = Meta. isexpr (a, :call ) ? a. args[1 ] : a
279
- push! (kwargs, Expr (:kw , varname, nothing ))
280
274
meta = parse_metadata (mod, meta_val)
281
275
varval = (@isdefined default_val) ? default_val :
282
276
unit_handled_variable_value (meta, varname)
@@ -291,8 +285,8 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
291
285
var = :($ varname = $ first (@variables ($ a[$ (indices)]:: $type = $ varval),
292
286
$ meta_val))
293
287
end
294
- push_array_kwargs_and_metadata ! (
295
- dict, indices, meta, type, varclass, varname, varval)
288
+ update_array_kwargs_and_metadata ! (
289
+ dict, indices, kwargs, meta, type, varclass, varname, varval, where_types )
296
290
(:($ varname... ), var), nothing , Dict ()
297
291
end
298
292
Expr (:(= ), Expr (:(:: ), Expr (:ref , a, indices... ), type), def_n_meta) ||
@@ -303,7 +297,6 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
303
297
meta = parse_metadata (mod, def_n_meta)
304
298
varval = unit_handled_variable_value (meta, varname)
305
299
val, def_n_meta = (def_n_meta. args[1 ], def_n_meta. args[2 : end ])
306
- push! (kwargs, Expr (:kw , varname, nothing ))
307
300
if varclass == :parameters
308
301
Meta. isexpr (a, :call ) &&
309
302
assert_unique_independent_var (dict, a. args[end ])
@@ -320,7 +313,6 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
320
313
$ (def_n_meta... )))
321
314
end
322
315
else
323
- push! (kwargs, Expr (:kw , varname, nothing ))
324
316
if varclass == :parameters
325
317
Meta. isexpr (a, :call ) &&
326
318
assert_unique_independent_var (dict, a. args[end ])
@@ -335,15 +327,14 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
335
327
end
336
328
varval, meta = def_n_meta, nothing
337
329
end
338
- push_array_kwargs_and_metadata ! (
339
- dict, indices, meta, type, varclass, varname, varval)
330
+ update_array_kwargs_and_metadata ! (
331
+ dict, indices, kwargs, meta, type, varclass, varname, varval, where_types )
340
332
(:($ varname... ), var), nothing , Dict ()
341
333
end
342
334
Expr (:(:: ), Expr (:ref , a, indices... ), type) ||
343
335
Expr (:ref , a, indices... ) => begin
344
336
(@isdefined type) || (type = Real)
345
337
varname = a isa Expr && a. head == :call ? a. args[1 ] : a
346
- push! (kwargs, Expr (:kw , varname, nothing ))
347
338
if varclass == :parameters
348
339
Meta. isexpr (a, :call ) && assert_unique_independent_var (dict, a. args[end ])
349
340
var = :($ varname = $ first (@parameters $ a[$ (indices... )]:: $type = $ varname))
@@ -356,8 +347,8 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
356
347
throw (" Symbolic array with arbitrary length is not handled for $varclass .
357
348
Please open an issue with an example." )
358
349
end
359
- push_array_kwargs_and_metadata ! (
360
- dict, indices, nothing , type, varclass, varname, nothing )
350
+ update_array_kwargs_and_metadata ! (
351
+ dict, indices, kwargs, nothing , type, varclass, varname, nothing , where_types )
361
352
(:($ varname... ), var), nothing , Dict ()
362
353
end
363
354
Expr (:(= ), a, b) => begin
@@ -392,11 +383,8 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
392
383
end
393
384
end
394
385
395
- function generate_var (a, varclass;
396
- indices:: Union{Vector{UnitRange{Int}}, Nothing} = nothing ,
397
- type = Real)
398
- var = indices === nothing ? Symbolics. variable (a; T = type) :
399
- first (@variables $ a[indices... ]:: type )
386
+ function generate_var (a, varclass; type = Real)
387
+ var = Symbolics. variable (a; T = type)
400
388
if varclass == :parameters
401
389
var = toparam (var)
402
390
elseif varclass == :independent_variables
@@ -426,7 +414,7 @@ function generate_var!(dict, a, varclass;
426
414
vd isa Vector && (vd = first (vd))
427
415
vd[a] = Dict {Symbol, Any} ()
428
416
indices != = nothing && (vd[a][:size ] = Tuple (lastindex .(indices)))
429
- generate_var (a, varclass; indices, type)
417
+ generate_var (a, varclass; type)
430
418
end
431
419
432
420
function assert_unique_independent_var (dict, iv:: Num )
0 commit comments