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+ 
140function  SciMLBase. LinearProblem (sys:: System , op; kwargs... )
241    SciMLBase. LinearProblem {true} (sys, op; kwargs... )
342end 
@@ -14,8 +53,8 @@ function SciMLBase.LinearProblem{iip}(
1453    check_complete (sys, LinearProblem)
1554    check_compatibility &&  check_compatible_system (LinearProblem, sys)
1655
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,
1958        build_initializeprob =  false , symbolic_u0 =  true , u0_constructor, u0_eltype,
2059        kwargs... )
2160
@@ -32,25 +71,21 @@ function SciMLBase.LinearProblem{iip}(
3271    u0_eltype =  something (u0_eltype, floatT)
3372
3473    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)
3577
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)
4480
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
4588    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 
5489        get_A =  build_explicit_observed_function (
5590            sys, A; param_only =  true , eval_expression, eval_module)
5691        if  sparse
@@ -61,16 +96,11 @@ function SciMLBase.LinearProblem{iip}(
6196        A =  u0_constructor (get_A (p))
6297        b =  u0_constructor (get_b (p))
6398    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))
68101    end 
69102
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
74104end 
75105
76106#  For remake
0 commit comments