@@ -361,3 +361,96 @@ function SciMLBase.DiscreteFunction{iip, specialize}(sys::DiscreteSystem,
361
361
observed = observedfun,
362
362
analytic = analytic)
363
363
end
364
+
365
+ """
366
+ ```julia
367
+ DiscreteFunctionExpr{iip}(sys::DiscreteSystem, dvs = states(sys),
368
+ ps = parameters(sys);
369
+ version = nothing,
370
+ kwargs...) where {iip}
371
+ ```
372
+
373
+ Create a Julia expression for an `DiscreteFunction` from the [`DiscreteSystem`](@ref).
374
+ The arguments `dvs` and `ps` are used to set the order of the dependent
375
+ variable and parameter vectors, respectively.
376
+ """
377
+ struct DiscreteFunctionExpr{iip} end
378
+ struct DiscreteFunctionClosure{O, I} <: Function
379
+ f_oop:: O
380
+ f_iip:: I
381
+ end
382
+ (f:: DiscreteFunctionClosure )(u, p, t) = f. f_oop (u, p, t)
383
+ (f:: DiscreteFunctionClosure )(du, u, p, t) = f. f_iip (du, u, p, t)
384
+
385
+ function DiscreteFunctionExpr {iip} (sys:: DiscreteSystem , dvs = states (sys),
386
+ ps = parameters (sys), u0 = nothing ;
387
+ version = nothing , p = nothing ,
388
+ linenumbers = false ,
389
+ simplify = false ,
390
+ kwargs... ) where {iip}
391
+ f_oop, f_iip = generate_function (sys, dvs, ps; expression = Val{true }, kwargs... )
392
+
393
+ fsym = gensym (:f )
394
+ _f = :($ fsym = $ DiscreteFunctionClosure ($ f_oop, $ f_iip))
395
+
396
+ ex = quote
397
+ $ _f
398
+ DiscreteFunction {$iip} ($ fsym,
399
+ syms = $ (Symbol .(states (sys))),
400
+ indepsym = $ (QuoteNode (Symbol (get_iv (sys)))),
401
+ paramsyms = $ (Symbol .(parameters (sys))))
402
+ end
403
+ ! linenumbers ? striplines (ex) : ex
404
+ end
405
+
406
+ function DiscreteFunctionExpr (sys:: DiscreteSystem , args... ; kwargs... )
407
+ DiscreteFunctionExpr {true} (sys, args... ; kwargs... )
408
+ end
409
+
410
+ function process_DiscreteProblem (constructor, sys:: DiscreteSystem , u0map, parammap;
411
+ version = nothing ,
412
+ linenumbers = true , parallel = SerialForm (),
413
+ eval_expression = true ,
414
+ use_union = false ,
415
+ kwargs... )
416
+ eqs = equations (sys)
417
+ dvs = states (sys)
418
+ ps = parameters (sys)
419
+
420
+ defs = defaults (sys)
421
+ defs = mergedefaults (defs, parammap, ps)
422
+ defs = mergedefaults (defs, u0map, dvs)
423
+
424
+ u0 = varmap_to_vars (u0map, dvs; defaults = defs, tofloat = true )
425
+ p = varmap_to_vars (parammap, ps; defaults = defs, tofloat = ! use_union, use_union)
426
+
427
+ check_eqs_u0 (eqs, dvs, u0; kwargs... )
428
+
429
+ f = constructor (sys, dvs, ps, u0;
430
+ linenumbers = linenumbers, parallel = parallel,
431
+ syms = Symbol .(dvs), paramsyms = Symbol .(ps),
432
+ eval_expression = eval_expression, kwargs... )
433
+ return f, u0, p
434
+ end
435
+
436
+ function DiscreteProblemExpr (sys:: DiscreteSystem , args... ; kwargs... )
437
+ DiscreteProblemExpr {true} (sys, args... ; kwargs... )
438
+ end
439
+
440
+ function DiscreteProblemExpr {iip} (sys:: DiscreteSystem , u0map, tspan,
441
+ parammap = DiffEqBase. NullParameters ();
442
+ check_length = true ,
443
+ kwargs... ) where {iip}
444
+ f, u0, p = process_DiscreteProblem (DiscreteFunctionExpr{iip}, sys, u0map, parammap;
445
+ check_length, kwargs... )
446
+ linenumbers = get (kwargs, :linenumbers , true )
447
+
448
+ ex = quote
449
+ f = $ f
450
+ u0 = $ u0
451
+ p = $ p
452
+ tspan = $ tspan
453
+ DiscreteProblem (f, u0, tspan, p; $ (filter_kwargs (kwargs)... ))
454
+ end
455
+ ! linenumbers ? striplines (ex) : ex
456
+ end
0 commit comments