@@ -405,8 +405,8 @@ automatically symbolically generating the Jacobian and more from the
405
405
numerically-defined functions.
406
406
"""
407
407
struct ODEFunction{iip, specialize, F, TMM, Ta, Tt, TJ, JVP, VJP, JP, SP, TW, TWt, WP, TPJ,
408
- O, TCV, SYS,
409
- IProb, UIProb, IProbMap, IProbPmap , NLP} <: AbstractODEFunction{iip}
408
+ O, TCV,
409
+ SYS, ID , NLP} <: AbstractODEFunction{iip}
410
410
f:: F
411
411
mass_matrix:: TMM
412
412
analytic:: Ta
@@ -423,10 +423,7 @@ struct ODEFunction{iip, specialize, F, TMM, Ta, Tt, TJ, JVP, VJP, JP, SP, TW, TW
423
423
observed:: O
424
424
colorvec:: TCV
425
425
sys:: SYS
426
- initializeprob:: IProb
427
- update_initializeprob!:: UIProb
428
- initializeprobmap:: IProbMap
429
- initializeprobpmap:: IProbPmap
426
+ initialization_data:: ID
430
427
nlprob:: NLP
431
428
end
432
429
@@ -530,8 +527,8 @@ information on generating the SplitFunction from this symbolic engine.
530
527
"""
531
528
struct SplitFunction{
532
529
iip, specialize, F1, F2, TMM, C, Ta, Tt, TJ, JVP, VJP, JP, WP, SP, TW, TWt,
533
- TPJ, O, TCV, SYS,
534
- IProb, UIProb, IProbMap, IProbPmap , NLP} <: AbstractODEFunction{iip}
530
+ TPJ, O,
531
+ TCV, SYS, ID , NLP} <: AbstractODEFunction{iip}
535
532
f1:: F1
536
533
f2:: F2
537
534
mass_matrix:: TMM
@@ -550,10 +547,7 @@ struct SplitFunction{
550
547
observed:: O
551
548
colorvec:: TCV
552
549
sys:: SYS
553
- initializeprob:: IProb
554
- update_initializeprob!:: UIProb
555
- initializeprobmap:: IProbMap
556
- initializeprobpmap:: IProbPmap
550
+ initialization_data:: ID
557
551
nlprob:: NLP
558
552
end
559
553
@@ -1529,7 +1523,7 @@ automatically symbolically generating the Jacobian and more from the
1529
1523
numerically-defined functions.
1530
1524
"""
1531
1525
struct DAEFunction{iip, specialize, F, Ta, Tt, TJ, JVP, VJP, JP, SP, TW, TWt, TPJ, O, TCV,
1532
- SYS, IProb, UIProb, IProbMap, IProbPmap } < :
1526
+ SYS, ID } < :
1533
1527
AbstractDAEFunction{iip}
1534
1528
f:: F
1535
1529
analytic:: Ta
@@ -1545,10 +1539,7 @@ struct DAEFunction{iip, specialize, F, Ta, Tt, TJ, JVP, VJP, JP, SP, TW, TWt, TP
1545
1539
observed:: O
1546
1540
colorvec:: TCV
1547
1541
sys:: SYS
1548
- initializeprob:: IProb
1549
- update_initializeprob!:: UIProb
1550
- initializeprobmap:: IProbMap
1551
- initializeprobpmap:: IProbPmap
1542
+ initialization_data:: ID
1552
1543
end
1553
1544
1554
1545
"""
@@ -2440,6 +2431,8 @@ function ODEFunction{iip, specialize}(f;
2440
2431
initializeprobmap = __has_initializeprobmap (f) ? f. initializeprobmap : nothing ,
2441
2432
initializeprobpmap = __has_initializeprobpmap (f) ? f. initializeprobpmap : nothing ,
2442
2433
nlprob = __has_nlprob (f) ? f. nlprob : nothing ,
2434
+ initialization_data = __has_initialization_data (f) ? f. initialization_data :
2435
+ nothing
2443
2436
) where {iip,
2444
2437
specialize
2445
2438
}
@@ -2486,8 +2479,11 @@ function ODEFunction{iip, specialize}(f;
2486
2479
_f = prepare_function (f)
2487
2480
2488
2481
sys = sys_or_symbolcache (sys, syms, paramsyms, indepsym)
2482
+ initdata = reconstruct_initialization_data (
2483
+ initialization_data, initializeprob, update_initializeprob!,
2484
+ initializeprobmap, initializeprobpmap)
2489
2485
2490
- @assert typeof (initializeprob) < :
2486
+ @assert typeof (initdata . initializeprob) < :
2491
2487
Union{Nothing, NonlinearProblem, NonlinearLeastSquaresProblem}
2492
2488
2493
2489
if specialize === NoSpecialize
@@ -2497,11 +2493,10 @@ function ODEFunction{iip, specialize}(f;
2497
2493
typeof (sparsity), Any, Any, typeof (W_prototype), Any,
2498
2494
Any,
2499
2495
typeof (_colorvec),
2500
- typeof (sys), Any, Any, Any, Any, Any }(_f, mass_matrix, analytic, tgrad, jac,
2496
+ typeof (sys), Any, Any}(_f, mass_matrix, analytic, tgrad, jac,
2501
2497
jvp, vjp, jac_prototype, sparsity, Wfact,
2502
2498
Wfact_t, W_prototype, paramjac,
2503
- observed, _colorvec, sys, initializeprob, update_initializeprob!, initializeprobmap,
2504
- initializeprobpmap, nlprob)
2499
+ observed, _colorvec, sys, initdata, nlprob)
2505
2500
elseif specialize === false
2506
2501
ODEFunction{iip, FunctionWrapperSpecialize,
2507
2502
typeof (_f), typeof (mass_matrix), typeof (analytic), typeof (tgrad),
@@ -2510,16 +2505,11 @@ function ODEFunction{iip, specialize}(f;
2510
2505
typeof (paramjac),
2511
2506
typeof (observed),
2512
2507
typeof (_colorvec),
2513
- typeof (sys), typeof (initializeprob),
2514
- typeof (update_initializeprob!),
2515
- typeof (initializeprobmap),
2516
- typeof (initializeprobpmap),
2517
- typeof (nlprob)}(_f, mass_matrix,
2508
+ typeof (sys), typeof (initdata), typeof (nlprob)}(_f, mass_matrix,
2518
2509
analytic, tgrad, jac,
2519
2510
jvp, vjp, jac_prototype, sparsity, Wfact,
2520
2511
Wfact_t, W_prototype, paramjac,
2521
- observed, _colorvec, sys, initializeprob, update_initializeprob!,
2522
- initializeprobmap, initializeprobpmap, nlprob)
2512
+ observed, _colorvec, sys, initdata, nlprob)
2523
2513
else
2524
2514
ODEFunction{iip, specialize,
2525
2515
typeof (_f), typeof (mass_matrix), typeof (analytic), typeof (tgrad),
@@ -2528,14 +2518,10 @@ function ODEFunction{iip, specialize}(f;
2528
2518
typeof (paramjac),
2529
2519
typeof (observed),
2530
2520
typeof (_colorvec),
2531
- typeof (sys), typeof (initializeprob), typeof (update_initializeprob!),
2532
- typeof (initializeprobmap),
2533
- typeof (initializeprobpmap),
2534
- typeof (nlprob)}(_f, mass_matrix, analytic, tgrad, jac,
2535
- jvp, vjp, jac_prototype, sparsity, Wfact,
2521
+ typeof (sys), typeof (initdata), typeof (nlprob)}(_f, mass_matrix, analytic, tgrad,
2522
+ jac, jvp, vjp, jac_prototype, sparsity, Wfact,
2536
2523
Wfact_t, W_prototype, paramjac,
2537
- observed, _colorvec, sys, initializeprob, update_initializeprob!, initializeprobmap,
2538
- initializeprobpmap, nlprob)
2524
+ observed, _colorvec, sys, initdata, nlprob)
2539
2525
end
2540
2526
end
2541
2527
@@ -2552,28 +2538,23 @@ function unwrapped_f(f::ODEFunction, newf = unwrapped_f(f.f))
2552
2538
Any, Any, Any, Any, typeof (f. jac_prototype),
2553
2539
typeof (f. sparsity), Any, Any, Any,
2554
2540
Any, typeof (f. colorvec),
2555
- typeof (f. sys), Any, Any, Any, Any, Any }(
2541
+ typeof (f. sys), Any, Any}(
2556
2542
newf, f. mass_matrix, f. analytic, f. tgrad, f. jac,
2557
2543
f. jvp, f. vjp, f. jac_prototype, f. sparsity, f. Wfact,
2558
2544
f. Wfact_t, f. W_prototype, f. paramjac,
2559
- f. observed, f. colorvec, f. sys, f. initializeprob,
2560
- f. update_initializeprob!, f. initializeprobmap,
2561
- f. initializeprobpmap, f. nlprob)
2545
+ f. observed, f. colorvec, f. sys, f. initialization_data, f. nlprob)
2562
2546
else
2563
2547
ODEFunction{isinplace (f), specialization (f), typeof (newf), typeof (f. mass_matrix),
2564
2548
typeof (f. analytic), typeof (f. tgrad),
2565
2549
typeof (f. jac), typeof (f. jvp), typeof (f. vjp), typeof (f. jac_prototype),
2566
2550
typeof (f. sparsity), typeof (f. Wfact), typeof (f. Wfact_t), typeof (f. W_prototype),
2567
2551
typeof (f. paramjac),
2568
2552
typeof (f. observed), typeof (f. colorvec),
2569
- typeof (f. sys), typeof (f. initializeprob), typeof (f. update_initializeprob!),
2570
- typeof (f. initializeprobmap),
2571
- typeof (f. initializeprobpmap),
2572
- typeof (f. nlprob)}(newf, f. mass_matrix, f. analytic, f. tgrad, f. jac,
2553
+ typeof (f. sys), typeof (f. initialization_data), typeof (f. nlprob)}(
2554
+ newf, f. mass_matrix, f. analytic, f. tgrad, f. jac,
2573
2555
f. jvp, f. vjp, f. jac_prototype, f. sparsity, f. Wfact,
2574
2556
f. Wfact_t, f. W_prototype, f. paramjac,
2575
- f. observed, f. colorvec, f. sys, f. initializeprob, f. update_initializeprob!,
2576
- f. initializeprobmap, f. initializeprobpmap, f. nlprob)
2557
+ f. observed, f. colorvec, f. sys, f. initialization_data, f. nlprob)
2577
2558
end
2578
2559
end
2579
2560
@@ -2704,8 +2685,8 @@ end
2704
2685
2705
2686
@add_kwonly function SplitFunction (f1, f2, mass_matrix, cache, analytic, tgrad, jac, jvp,
2706
2687
vjp, jac_prototype, W_prototype, sparsity, Wfact, Wfact_t, paramjac,
2707
- observed, colorvec, sys, initializeprob, update_initializeprob!,
2708
- initializeprobmap, initializeprobpmap, nlprob)
2688
+ observed, colorvec, sys, initializeprob = nothing , update_initializeprob! = nothing ,
2689
+ initializeprobmap = nothing , initializeprobpmap = nothing , initialization_data = nothing , nlprob)
2709
2690
f1 = ODEFunction (f1)
2710
2691
f2 = ODEFunction (f2)
2711
2692
@@ -2714,17 +2695,20 @@ end
2714
2695
throw (NonconformingFunctionsError ([" f2" ]))
2715
2696
end
2716
2697
2698
+ initdata = reconstruct_initialization_data (
2699
+ initialization_data, initializeprob, update_initializeprob!,
2700
+ initializeprobmap, initializeprobpmap)
2701
+
2717
2702
SplitFunction{isinplace (f2), FullSpecialize, typeof (f1), typeof (f2),
2718
2703
typeof (mass_matrix),
2719
2704
typeof (cache), typeof (analytic), typeof (tgrad), typeof (jac), typeof (jvp),
2720
2705
typeof (vjp), typeof (jac_prototype), typeof (W_prototype), typeof (sparsity),
2721
2706
typeof (Wfact), typeof (Wfact_t), typeof (paramjac), typeof (observed), typeof (colorvec),
2722
- typeof (sys), typeof (initializeprob), typeof (update_initializeprob!), typeof (initializeprobmap),
2723
- typeof (initializeprobpmap), typeof (nlprob)}(
2707
+ typeof (sys), typeof (initdata), typeof (nlprob)}(
2724
2708
f1, f2, mass_matrix,
2725
2709
cache, analytic, tgrad, jac, jvp, vjp,
2726
2710
jac_prototype, W_prototype, sparsity, Wfact, Wfact_t, paramjac, observed, colorvec, sys,
2727
- initializeprob, update_initializeprob!, initializeprobmap, initializeprobpmap , nlprob)
2711
+ initdata , nlprob)
2728
2712
end
2729
2713
function SplitFunction {iip, specialize} (f1, f2;
2730
2714
mass_matrix = __has_mass_matrix (f1) ?
@@ -2761,37 +2745,39 @@ function SplitFunction{iip, specialize}(f1, f2;
2761
2745
f1. update_initializeprob! : nothing ,
2762
2746
initializeprobmap = __has_initializeprobmap (f1) ? f1. initializeprobmap : nothing ,
2763
2747
initializeprobpmap = __has_initializeprobpmap (f1) ? f1. initializeprobpmap : nothing ,
2764
- nlprob = __has_nlprob (f1) ? f1. nlprob : nothing
2748
+ nlprob = __has_nlprob (f1) ? f1. nlprob : nothing ,
2749
+ initialization_data = __has_initialization_data (f1) ? f1. initialization_data :
2750
+ nothing
2765
2751
) where {iip,
2766
2752
specialize
2767
2753
}
2768
2754
sys = sys_or_symbolcache (sys, syms, paramsyms, indepsym)
2769
- @assert typeof (initializeprob) < :
2755
+ initdata = reconstruct_initialization_data (
2756
+ initialization_data, initializeprob, update_initializeprob!,
2757
+ initializeprobmap, initializeprobpmap)
2758
+ @assert typeof (initdata. initializeprob) < :
2770
2759
Union{Nothing, NonlinearProblem, NonlinearLeastSquaresProblem}
2771
2760
2772
2761
if specialize === NoSpecialize
2773
2762
SplitFunction{iip, specialize, Any, Any, Any, Any, Any, Any, Any, Any, Any,
2774
2763
Any, Any, Any, Any, Any, Any, Any,
2775
- Any, Any, Any, Any, Any, Any, Any }(f1, f2, mass_matrix, _func_cache,
2764
+ Any, Any, Any, Any}(f1, f2, mass_matrix, _func_cache,
2776
2765
analytic,
2777
2766
tgrad, jac, jvp, vjp, jac_prototype, W_prototype,
2778
2767
sparsity, Wfact, Wfact_t, paramjac,
2779
- observed, colorvec, sys, initializeprob. update_initializeprob!, initializeprobmap,
2780
- initializeprobpmap, initializeprobpmap, nlprob)
2768
+ observed, colorvec, sys, initdata, nlprob)
2781
2769
else
2782
2770
SplitFunction{iip, specialize, typeof (f1), typeof (f2), typeof (mass_matrix),
2783
2771
typeof (_func_cache), typeof (analytic),
2784
2772
typeof (tgrad), typeof (jac), typeof (jvp), typeof (vjp),
2785
2773
typeof (jac_prototype), typeof (W_prototype), typeof (sparsity),
2786
2774
typeof (Wfact), typeof (Wfact_t), typeof (paramjac), typeof (observed),
2787
2775
typeof (colorvec),
2788
- typeof (sys), typeof (initializeprob), typeof (update_initializeprob!),
2789
- typeof (initializeprobmap),
2790
- typeof (initializeprobpmap), typeof (nlprob)}(f1, f2,
2776
+ typeof (sys), typeof (initdata), typeof (nlprob)}(f1, f2,
2791
2777
mass_matrix, _func_cache, analytic, tgrad, jac,
2792
2778
jvp, vjp, jac_prototype, W_prototype,
2793
2779
sparsity, Wfact, Wfact_t, paramjac, observed, colorvec, sys,
2794
- initializeprob, update_initializeprob!, initializeprobmap, initializeprobpmap , nlprob)
2780
+ initdata , nlprob)
2795
2781
end
2796
2782
end
2797
2783
@@ -3420,7 +3406,9 @@ function DAEFunction{iip, specialize}(f;
3420
3406
update_initializeprob! = __has_update_initializeprob! (f) ?
3421
3407
f. update_initializeprob! : nothing ,
3422
3408
initializeprobmap = __has_initializeprobmap (f) ? f. initializeprobmap : nothing ,
3423
- initializeprobpmap = __has_initializeprobpmap (f) ? f. initializeprobpmap : nothing ) where {
3409
+ initializeprobpmap = __has_initializeprobpmap (f) ? f. initializeprobpmap : nothing ,
3410
+ initialization_data = __has_initialization_data (f) ? f. initialization_data :
3411
+ nothing ) where {
3424
3412
iip,
3425
3413
specialize
3426
3414
}
@@ -3452,33 +3440,32 @@ function DAEFunction{iip, specialize}(f;
3452
3440
3453
3441
_f = prepare_function (f)
3454
3442
sys = sys_or_symbolcache (sys, syms, paramsyms, indepsym)
3443
+ initdata = reconstruct_initialization_data (
3444
+ initialization_data, initializeprob, update_initializeprob!,
3445
+ initializeprobmap, initializeprobpmap)
3455
3446
3456
- @assert typeof (initializeprob) < :
3447
+ @assert typeof (initdata . initializeprob) < :
3457
3448
Union{Nothing, NonlinearProblem, NonlinearLeastSquaresProblem}
3458
3449
3459
3450
if specialize === NoSpecialize
3460
3451
DAEFunction{iip, specialize, Any, Any, Any,
3461
3452
Any, Any, Any, Any, Any,
3462
3453
Any, Any, Any,
3463
- Any, typeof (_colorvec), Any, Any, Any, Any, Any }(_f, analytic, tgrad, jac, jvp,
3454
+ Any, typeof (_colorvec), Any, Any}(_f, analytic, tgrad, jac, jvp,
3464
3455
vjp, jac_prototype, sparsity,
3465
3456
Wfact, Wfact_t, paramjac, observed,
3466
- _colorvec, sys, initializeprob, update_initializeprob!,
3467
- initializeprobmap, initializeprobpmap)
3457
+ _colorvec, sys, initdata)
3468
3458
else
3469
3459
DAEFunction{iip, specialize, typeof (_f), typeof (analytic), typeof (tgrad),
3470
3460
typeof (jac), typeof (jvp), typeof (vjp), typeof (jac_prototype),
3471
3461
typeof (sparsity), typeof (Wfact), typeof (Wfact_t),
3472
3462
typeof (paramjac),
3473
3463
typeof (observed), typeof (_colorvec),
3474
- typeof (sys), typeof (initializeprob), typeof (update_initializeprob!),
3475
- typeof (initializeprobmap),
3476
- typeof (initializeprobpmap)}(
3464
+ typeof (sys), typeof (initdata)}(
3477
3465
_f, analytic, tgrad, jac, jvp, vjp,
3478
3466
jac_prototype, sparsity, Wfact, Wfact_t,
3479
3467
paramjac, observed,
3480
- _colorvec, sys, initializeprob, update_initializeprob!,
3481
- initializeprobmap, initializeprobpmap)
3468
+ _colorvec, sys, initdata)
3482
3469
end
3483
3470
end
3484
3471
@@ -4397,6 +4384,14 @@ function sys_or_symbolcache(sys, syms, paramsyms, indepsym = nothing)
4397
4384
return sys
4398
4385
end
4399
4386
4387
+ function reconstruct_initialization_data (
4388
+ initdata, initprob, update_initprob!, initprobmap, initprobpmap)
4389
+ if initdata === nothing && initprob != = nothing
4390
+ initdata = OverrideInitData (initprob, update_initprob!, initprobmap, initprobpmap)
4391
+ end
4392
+ return initdata
4393
+ end
4394
+
4400
4395
# ######### Existence Functions
4401
4396
4402
4397
# Check that field/property exists (may be nothing)
@@ -4420,11 +4415,20 @@ __has_colorvec(f) = isdefined(f, :colorvec)
4420
4415
__has_sys (f) = isdefined (f, :sys )
4421
4416
__has_analytic_full (f) = isdefined (f, :analytic_full )
4422
4417
__has_resid_prototype (f) = isdefined (f, :resid_prototype )
4423
- __has_initializeprob (f) = isdefined (f, :initializeprob )
4424
- __has_update_initializeprob! (f) = isdefined (f, :update_initializeprob! )
4425
- __has_initializeprobmap (f) = isdefined (f, :initializeprobmap )
4426
- __has_initializeprobpmap (f) = isdefined (f, :initializeprobpmap )
4427
4418
__has_nlprob (f) = isdefined (f, :nlprob )
4419
+ function __has_initializeprob (f)
4420
+ has_initialization_data (f) && isdefined (f. initialization_data, :initializeprob )
4421
+ end
4422
+ function __has_update_initializeprob! (f)
4423
+ has_initialization_data (f) && isdefined (f. initialization_data, :update_initializeprob! )
4424
+ end
4425
+ function __has_initializeprobmap (f)
4426
+ has_initialization_data (f) && isdefined (f. initialization_data, :initializeprobmap )
4427
+ end
4428
+ function __has_initializeprobpmap (f)
4429
+ has_initialization_data (f) && isdefined (f. initialization_data, :initializeprobpmap )
4430
+ end
4431
+ __has_initialization_data (f) = isdefined (f, :initialization_data )
4428
4432
4429
4433
# compatibility
4430
4434
has_invW (f:: AbstractSciMLFunction ) = false
@@ -4438,16 +4442,20 @@ has_Wfact_t(f::AbstractSciMLFunction) = __has_Wfact_t(f) && f.Wfact_t !== nothin
4438
4442
has_paramjac (f:: AbstractSciMLFunction ) = __has_paramjac (f) && f. paramjac != = nothing
4439
4443
has_sys (f:: AbstractSciMLFunction ) = __has_sys (f) && f. sys != = nothing
4440
4444
function has_initializeprob (f:: AbstractSciMLFunction )
4441
- __has_initializeprob (f) && f. initializeprob != = nothing
4445
+ __has_initializeprob (f) && f. initialization_data . initializeprob != = nothing
4442
4446
end
4443
4447
function has_update_initializeprob! (f:: AbstractSciMLFunction )
4444
- __has_update_initializeprob! (f) && f. update_initializeprob! != = nothing
4448
+ __has_update_initializeprob! (f) &&
4449
+ f. initialization_data. update_initializeprob! != = nothing
4445
4450
end
4446
4451
function has_initializeprobmap (f:: AbstractSciMLFunction )
4447
- __has_initializeprobmap (f) && f. initializeprobmap != = nothing
4452
+ __has_initializeprobmap (f) && f. initialization_data . initializeprobmap != = nothing
4448
4453
end
4449
4454
function has_initializeprobpmap (f:: AbstractSciMLFunction )
4450
- __has_initializeprobpmap (f) && f. initializeprobpmap != = nothing
4455
+ __has_initializeprobpmap (f) && f. initialization_data. initializeprobpmap != = nothing
4456
+ end
4457
+ function has_initialization_data (f:: AbstractSciMLFunction )
4458
+ __has_initialization_data (f) && f. initialization_data != = nothing
4451
4459
end
4452
4460
4453
4461
function has_syms (f:: AbstractSciMLFunction )
0 commit comments