1
+ struct LinearFunction{iip, I} <: SciMLBase.AbstractSciMLFunction{iip}
2
+ interface:: I
3
+ A:: AbstractMatrix
4
+ b:: AbstractVector
5
+ end
6
+
7
+ function LinearFunction {iip} (
8
+ sys:: System ; expression = Val{false }, check_compatibility = true ,
9
+ sparse = false , eval_expression = false , eval_module = @__MODULE__ ,
10
+ checkbounds = false , cse = true , kwargs... ) where {iip}
11
+ check_complete (sys, LinearProblem)
12
+ check_compatibility && check_compatible_system (LinearProblem, sys)
13
+
14
+ A, b = calculate_A_b (sys; sparse)
15
+ update_A = generate_update_A (sys, A; expression, wrap_gfw = Val{true }, eval_expression,
16
+ eval_module, checkbounds, cse, kwargs... )
17
+ update_b = generate_update_b (sys, b; expression, wrap_gfw = Val{true }, eval_expression,
18
+ eval_module, checkbounds, cse, kwargs... )
19
+ observedfun = ObservedFunctionCache (
20
+ sys; steady_state = false , expression, eval_expression, eval_module, checkbounds,
21
+ cse)
22
+
23
+ if expression == Val{true }
24
+ symbolic_interface = quote
25
+ update_A = $ update_A
26
+ update_b = $ update_b
27
+ sys = $ sys
28
+ observedfun = $ observedfun
29
+ $ (SciMLBase. SymbolicLinearInterface)(
30
+ update_A, update_b, sys, observedfun, nothing )
31
+ end
32
+ else
33
+ symbolic_interface = SciMLBase. SymbolicLinearInterface (
34
+ update_A, update_b, sys, observedfun, nothing )
35
+ end
36
+
37
+ return LinearFunction {iip, typeof(symbolic_interface)} (symbolic_interface, A, b)
38
+ end
39
+
1
40
function SciMLBase. LinearProblem (sys:: System , op; kwargs... )
2
41
SciMLBase. LinearProblem {true} (sys, op; kwargs... )
3
42
end
@@ -14,8 +53,8 @@ function SciMLBase.LinearProblem{iip}(
14
53
check_complete (sys, LinearProblem)
15
54
check_compatibility && check_compatible_system (LinearProblem, sys)
16
55
17
- _ , u0, p = process_SciMLProblem (
18
- EmptySciMLFunction {iip}, sys, op; check_length, expression,
56
+ f , u0, p = process_SciMLProblem (
57
+ LinearFunction {iip}, sys, op; check_length, expression,
19
58
build_initializeprob = false , symbolic_u0 = true , u0_constructor, u0_eltype,
20
59
kwargs... )
21
60
@@ -32,25 +71,21 @@ function SciMLBase.LinearProblem{iip}(
32
71
u0_eltype = something (u0_eltype, floatT)
33
72
34
73
u0_constructor = get_p_constructor (u0_constructor, u0Type, u0_eltype)
74
+ symbolic_interface = f. interface
75
+ A, b = get_A_b_from_LinearFunction (
76
+ sys, f, p; eval_expression, eval_module, expression, u0_constructor)
35
77
36
- A, b = calculate_A_b (sys; sparse)
37
- update_A = generate_update_A (sys, A; expression, wrap_gfw = Val{true }, eval_expression,
38
- eval_module, checkbounds, cse, kwargs... )
39
- update_b = generate_update_b (sys, b; expression, wrap_gfw = Val{true }, eval_expression,
40
- eval_module, checkbounds, cse, kwargs... )
41
- observedfun = ObservedFunctionCache (
42
- sys; steady_state = false , expression, eval_expression, eval_module, checkbounds,
43
- cse)
78
+ kwargs = (; u0, process_kwargs (sys; kwargs... )... , f = symbolic_interface)
79
+ args = (; A, b, p)
44
80
81
+ return maybe_codegen_scimlproblem (expression, LinearProblem{iip}, args; kwargs... )
82
+ end
83
+
84
+ function get_A_b_from_LinearFunction (
85
+ sys:: System , f:: LinearFunction , p; eval_expression = false ,
86
+ eval_module = @__MODULE__ , expression = Val{false }, u0_constructor = identity)
87
+ @unpack A, b, interface = f
45
88
if expression == Val{true }
46
- symbolic_interface = quote
47
- update_A = $ update_A
48
- update_b = $ update_b
49
- sys = $ sys
50
- observedfun = $ observedfun
51
- $ (SciMLBase. SymbolicLinearInterface)(
52
- update_A, update_b, sys, observedfun, nothing )
53
- end
54
89
get_A = build_explicit_observed_function (
55
90
sys, A; param_only = true , eval_expression, eval_module)
56
91
if sparse
@@ -61,16 +96,11 @@ function SciMLBase.LinearProblem{iip}(
61
96
A = u0_constructor (get_A (p))
62
97
b = u0_constructor (get_b (p))
63
98
else
64
- symbolic_interface = SciMLBase. SymbolicLinearInterface (
65
- update_A, update_b, sys, observedfun, nothing )
66
- A = u0_constructor (update_A (p))
67
- b = u0_constructor (update_b (p))
99
+ A = u0_constructor (interface. update_A! (p))
100
+ b = u0_constructor (interface. update_b! (p))
68
101
end
69
102
70
- kwargs = (; u0, process_kwargs (sys; kwargs... )... , f = symbolic_interface)
71
- args = (; A, b, p)
72
-
73
- return maybe_codegen_scimlproblem (expression, LinearProblem{iip}, args; kwargs... )
103
+ return A, b
74
104
end
75
105
76
106
# For remake
0 commit comments