@@ -320,9 +320,7 @@ function DiffEqBase.ODEFunction{iip, specialize}(sys::AbstractODESystem,
320320 expression_module = eval_module, checkbounds = checkbounds,
321321 kwargs... )
322322 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)
326324
327325 if specialize === SciMLBase. FunctionWrapperSpecialize && iip
328326 if u0 === nothing || p === nothing || t === nothing
@@ -338,10 +336,7 @@ function DiffEqBase.ODEFunction{iip, specialize}(sys::AbstractODESystem,
338336 expression_module = eval_module,
339337 checkbounds = checkbounds, kwargs... )
340338 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)
345340 else
346341 _tgrad = nothing
347342 end
@@ -354,8 +349,7 @@ function DiffEqBase.ODEFunction{iip, specialize}(sys::AbstractODESystem,
354349 checkbounds = checkbounds, kwargs... )
355350 jac_oop, jac_iip = eval_or_rgf .(jac_gen; eval_expression, eval_module)
356351
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)
359353 else
360354 _jac = nothing
361355 end
@@ -435,8 +429,7 @@ function DiffEqBase.DAEFunction{iip}(sys::AbstractODESystem, dvs = unknowns(sys)
435429 expression_module = eval_module, checkbounds = checkbounds,
436430 kwargs... )
437431 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)
440433
441434 if jac
442435 jac_gen = generate_dae_jacobian (sys, dvs, ps;
@@ -446,8 +439,7 @@ function DiffEqBase.DAEFunction{iip}(sys::AbstractODESystem, dvs = unknowns(sys)
446439 checkbounds = checkbounds, kwargs... )
447440 jac_oop, jac_iip = eval_or_rgf .(jac_gen; eval_expression, eval_module)
448441
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)
451443 else
452444 _jac = nothing
453445 end
@@ -496,8 +488,7 @@ function DiffEqBase.DDEFunction{iip}(sys::AbstractODESystem, dvs = unknowns(sys)
496488 expression_module = eval_module, checkbounds = checkbounds,
497489 kwargs... )
498490 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)
501492
502493 DDEFunction {iip} (f; sys = sys, initialization_data)
503494end
@@ -521,14 +512,12 @@ function DiffEqBase.SDDEFunction{iip}(sys::AbstractODESystem, dvs = unknowns(sys
521512 expression_module = eval_module, checkbounds = checkbounds,
522513 kwargs... )
523514 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)
526516
527517 g_gen = generate_diffusion_function (sys, dvs, ps; expression = Val{true },
528518 isdde = true , kwargs... )
529519 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)
532521
533522 SDDEFunction {iip} (f, g; sys = sys, initialization_data)
534523end
@@ -549,13 +538,6 @@ variable and parameter vectors, respectively.
549538"""
550539struct ODEFunctionExpr{iip, specialize} end
551540
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-
559541function ODEFunctionExpr {iip, specialize} (sys:: AbstractODESystem , dvs = unknowns (sys),
560542 ps = parameters (sys), u0 = nothing ;
561543 version = nothing , tgrad = false ,
@@ -572,13 +554,14 @@ function ODEFunctionExpr{iip, specialize}(sys::AbstractODESystem, dvs = unknowns
572554 f_oop, f_iip = generate_function (sys, dvs, ps; expression = Val{true }, kwargs... )
573555
574556 fsym = gensym (:f )
575- _f = :($ fsym = $ ODEFunctionClosure ($ f_oop, $ f_iip))
557+ _f = :($ fsym = $ (GeneratedFunctionWrapper{( 2 , 3 , is_split (sys))}) ($ f_oop, $ f_iip))
576558 tgradsym = gensym (:tgrad )
577559 if tgrad
578560 tgrad_oop, tgrad_iip = generate_tgrad (sys, dvs, ps;
579561 simplify = simplify,
580562 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))
582565 else
583566 _tgrad = :($ tgradsym = nothing )
584567 end
@@ -588,7 +571,8 @@ function ODEFunctionExpr{iip, specialize}(sys::AbstractODESystem, dvs = unknowns
588571 jac_oop, jac_iip = generate_jacobian (sys, dvs, ps;
589572 sparse = sparse, simplify = simplify,
590573 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))
592576 else
593577 _jac = :($ jacsym = nothing )
594578 end
@@ -647,13 +631,6 @@ variable and parameter vectors, respectively.
647631"""
648632struct DAEFunctionExpr{iip} end
649633
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-
657634function DAEFunctionExpr {iip} (sys:: AbstractODESystem , dvs = unknowns (sys),
658635 ps = parameters (sys), u0 = nothing ;
659636 version = nothing , tgrad = false ,
@@ -667,7 +644,7 @@ function DAEFunctionExpr{iip}(sys::AbstractODESystem, dvs = unknowns(sys),
667644 f_oop, f_iip = generate_function (sys, dvs, ps; expression = Val{true },
668645 implicit_dae = true , kwargs... )
669646 fsym = gensym (:f )
670- _f = :($ fsym = $ DAEFunctionClosure ($ f_oop, $ f_iip))
647+ _f = :($ fsym = $ (GeneratedFunctionWrapper{( 3 , 4 , is_split (sys))}) ($ f_oop, $ f_iip))
671648 ex = quote
672649 $ _f
673650 ODEFunction {$iip} ($ fsym)
@@ -708,6 +685,7 @@ function SymbolicTstops(
708685 expression = Val{true },
709686 p_start = 1 , p_end = length (rps), add_observed = false , force_SA = true )
710687 tstops = eval_or_rgf (tstops; eval_expression, eval_module)
688+ tstops = GeneratedFunctionWrapper {(1, 3, is_split(sys))} (tstops, nothing )
711689 return SymbolicTstops (tstops)
712690end
713691
0 commit comments