@@ -320,9 +320,7 @@ function DiffEqBase.ODEFunction{iip, specialize}(sys::AbstractODESystem,
320
320
expression_module = eval_module, checkbounds = checkbounds,
321
321
kwargs... )
322
322
f_oop, f_iip = eval_or_rgf .(f_gen; eval_expression, eval_module)
323
-
324
- f (u, p, t) = f_oop (u, p, t)
325
- f (du, u, p, t) = f_iip (du, u, p, t)
323
+ f = GeneratedFunctionWrapper {(2, 3, is_split(sys))} (f_oop, f_iip)
326
324
327
325
if specialize === SciMLBase. FunctionWrapperSpecialize && iip
328
326
if u0 === nothing || p === nothing || t === nothing
@@ -338,10 +336,7 @@ function DiffEqBase.ODEFunction{iip, specialize}(sys::AbstractODESystem,
338
336
expression_module = eval_module,
339
337
checkbounds = checkbounds, kwargs... )
340
338
tgrad_oop, tgrad_iip = eval_or_rgf .(tgrad_gen; eval_expression, eval_module)
341
-
342
- ___tgrad (u, p, t) = tgrad_oop (u, p, t)
343
- ___tgrad (J, u, p, t) = tgrad_iip (J, u, p, t)
344
- _tgrad = ___tgrad
339
+ _tgrad = GeneratedFunctionWrapper {(2, 3, is_split(sys))} (tgrad_oop, tgrad_iip)
345
340
else
346
341
_tgrad = nothing
347
342
end
@@ -354,8 +349,7 @@ function DiffEqBase.ODEFunction{iip, specialize}(sys::AbstractODESystem,
354
349
checkbounds = checkbounds, kwargs... )
355
350
jac_oop, jac_iip = eval_or_rgf .(jac_gen; eval_expression, eval_module)
356
351
357
- _jac (u, p, t) = jac_oop (u, p, t)
358
- _jac (J, u, p, t) = jac_iip (J, u, p, t)
352
+ _jac = GeneratedFunctionWrapper {(2, 3, is_split(sys))} (jac_oop, jac_iip)
359
353
else
360
354
_jac = nothing
361
355
end
@@ -435,8 +429,7 @@ function DiffEqBase.DAEFunction{iip}(sys::AbstractODESystem, dvs = unknowns(sys)
435
429
expression_module = eval_module, checkbounds = checkbounds,
436
430
kwargs... )
437
431
f_oop, f_iip = eval_or_rgf .(f_gen; eval_expression, eval_module)
438
- f (du, u, p, t) = f_oop (du, u, p, t)
439
- f (out, du, u, p, t) = f_iip (out, du, u, p, t)
432
+ f = GeneratedFunctionWrapper {(3, 4, is_split(sys))} (f_oop, f_iip)
440
433
441
434
if jac
442
435
jac_gen = generate_dae_jacobian (sys, dvs, ps;
@@ -446,8 +439,7 @@ function DiffEqBase.DAEFunction{iip}(sys::AbstractODESystem, dvs = unknowns(sys)
446
439
checkbounds = checkbounds, kwargs... )
447
440
jac_oop, jac_iip = eval_or_rgf .(jac_gen; eval_expression, eval_module)
448
441
449
- _jac (du, u, p, ˍ₋gamma, t) = jac_oop (du, u, p, ˍ₋gamma, t)
450
- _jac (J, du, u, p, ˍ₋gamma, t) = jac_iip (J, du, u, p, ˍ₋gamma, t)
442
+ _jac = GeneratedFunctionWrapper {(3, 5, is_split(sys))} (jac_oop, jac_iip)
451
443
else
452
444
_jac = nothing
453
445
end
@@ -496,8 +488,7 @@ function DiffEqBase.DDEFunction{iip}(sys::AbstractODESystem, dvs = unknowns(sys)
496
488
expression_module = eval_module, checkbounds = checkbounds,
497
489
kwargs... )
498
490
f_oop, f_iip = eval_or_rgf .(f_gen; eval_expression, eval_module)
499
- f (u, h, p, t) = f_oop (u, h, p, t)
500
- f (du, u, h, p, t) = f_iip (du, u, h, p, t)
491
+ f = GeneratedFunctionWrapper {(3, 4, is_split(sys))} (f_oop, f_iip)
501
492
502
493
DDEFunction {iip} (f; sys = sys, initialization_data)
503
494
end
@@ -521,14 +512,12 @@ function DiffEqBase.SDDEFunction{iip}(sys::AbstractODESystem, dvs = unknowns(sys
521
512
expression_module = eval_module, checkbounds = checkbounds,
522
513
kwargs... )
523
514
f_oop, f_iip = eval_or_rgf .(f_gen; eval_expression, eval_module)
524
- f (u, h, p, t) = f_oop (u, h, p, t)
525
- f (du, u, h, p, t) = f_iip (du, u, h, p, t)
515
+ f = GeneratedFunctionWrapper {(3, 4, is_split(sys))} (f_oop, f_iip)
526
516
527
517
g_gen = generate_diffusion_function (sys, dvs, ps; expression = Val{true },
528
518
isdde = true , kwargs... )
529
519
g_oop, g_iip = eval_or_rgf .(g_gen; eval_expression, eval_module)
530
- g (u, h, p, t) = g_oop (u, h, p, t)
531
- g (du, u, h, p, t) = g_iip (du, u, h, p, t)
520
+ g = GeneratedFunctionWrapper {(3, 4, is_split(sys))} (g_oop, g_iip)
532
521
533
522
SDDEFunction {iip} (f, g; sys = sys, initialization_data)
534
523
end
@@ -549,13 +538,6 @@ variable and parameter vectors, respectively.
549
538
"""
550
539
struct ODEFunctionExpr{iip, specialize} end
551
540
552
- struct ODEFunctionClosure{O, I} <: Function
553
- f_oop:: O
554
- f_iip:: I
555
- end
556
- (f:: ODEFunctionClosure )(u, p, t) = f. f_oop (u, p, t)
557
- (f:: ODEFunctionClosure )(du, u, p, t) = f. f_iip (du, u, p, t)
558
-
559
541
function ODEFunctionExpr {iip, specialize} (sys:: AbstractODESystem , dvs = unknowns (sys),
560
542
ps = parameters (sys), u0 = nothing ;
561
543
version = nothing , tgrad = false ,
@@ -572,13 +554,14 @@ function ODEFunctionExpr{iip, specialize}(sys::AbstractODESystem, dvs = unknowns
572
554
f_oop, f_iip = generate_function (sys, dvs, ps; expression = Val{true }, kwargs... )
573
555
574
556
fsym = gensym (:f )
575
- _f = :($ fsym = $ ODEFunctionClosure ($ f_oop, $ f_iip))
557
+ _f = :($ fsym = $ (GeneratedFunctionWrapper{( 2 , 3 , is_split (sys))}) ($ f_oop, $ f_iip))
576
558
tgradsym = gensym (:tgrad )
577
559
if tgrad
578
560
tgrad_oop, tgrad_iip = generate_tgrad (sys, dvs, ps;
579
561
simplify = simplify,
580
562
expression = Val{true }, kwargs... )
581
- _tgrad = :($ tgradsym = $ ODEFunctionClosure ($ tgrad_oop, $ tgrad_iip))
563
+ _tgrad = :($ tgradsym = $ (GeneratedFunctionWrapper{(2 , 3 , is_split (sys))})(
564
+ $ tgrad_oop, $ tgrad_iip))
582
565
else
583
566
_tgrad = :($ tgradsym = nothing )
584
567
end
@@ -588,7 +571,8 @@ function ODEFunctionExpr{iip, specialize}(sys::AbstractODESystem, dvs = unknowns
588
571
jac_oop, jac_iip = generate_jacobian (sys, dvs, ps;
589
572
sparse = sparse, simplify = simplify,
590
573
expression = Val{true }, kwargs... )
591
- _jac = :($ jacsym = $ ODEFunctionClosure ($ jac_oop, $ jac_iip))
574
+ _jac = :($ jacsym = $ (GeneratedFunctionWrapper{(2 , 3 , is_split (sys))})(
575
+ $ jac_oop, $ jac_iip))
592
576
else
593
577
_jac = :($ jacsym = nothing )
594
578
end
@@ -647,13 +631,6 @@ variable and parameter vectors, respectively.
647
631
"""
648
632
struct DAEFunctionExpr{iip} end
649
633
650
- struct DAEFunctionClosure{O, I} <: Function
651
- f_oop:: O
652
- f_iip:: I
653
- end
654
- (f:: DAEFunctionClosure )(du, u, p, t) = f. f_oop (du, u, p, t)
655
- (f:: DAEFunctionClosure )(out, du, u, p, t) = f. f_iip (out, du, u, p, t)
656
-
657
634
function DAEFunctionExpr {iip} (sys:: AbstractODESystem , dvs = unknowns (sys),
658
635
ps = parameters (sys), u0 = nothing ;
659
636
version = nothing , tgrad = false ,
@@ -667,7 +644,7 @@ function DAEFunctionExpr{iip}(sys::AbstractODESystem, dvs = unknowns(sys),
667
644
f_oop, f_iip = generate_function (sys, dvs, ps; expression = Val{true },
668
645
implicit_dae = true , kwargs... )
669
646
fsym = gensym (:f )
670
- _f = :($ fsym = $ DAEFunctionClosure ($ f_oop, $ f_iip))
647
+ _f = :($ fsym = $ (GeneratedFunctionWrapper{( 3 , 4 , is_split (sys))}) ($ f_oop, $ f_iip))
671
648
ex = quote
672
649
$ _f
673
650
ODEFunction {$iip} ($ fsym)
@@ -708,6 +685,7 @@ function SymbolicTstops(
708
685
expression = Val{true },
709
686
p_start = 1 , p_end = length (rps), add_observed = false , force_SA = true )
710
687
tstops = eval_or_rgf (tstops; eval_expression, eval_module)
688
+ tstops = GeneratedFunctionWrapper {(1, 3, is_split(sys))} (tstops, nothing )
711
689
return SymbolicTstops (tstops)
712
690
end
713
691
0 commit comments