22# downstream packages. Make conversion to those easier.
33function __construct_f (prob; alias_u0:: Bool = false , can_handle_oop:: Val{OOP} = Val (false ),
44 can_handle_scalar:: Val{SCALAR} = Val (false ), make_fixed_point:: Val{FP} = Val (false ),
5- can_handle_arbitrary_dims:: Val{DIMS} = Val (false )) where {SCALAR, OOP, DIMS, FP}
5+ can_handle_arbitrary_dims:: Val{DIMS} = Val (false ),
6+ force_oop:: Val{FOOP} = Val (false )) where {SCALAR, OOP, DIMS, FP, FOOP}
67 if ! OOP && SCALAR
78 error (" Incorrect Specification: OOP not supported but scalar supported." )
89 end
910
11+ resid = evaluate_f (prob, prob. u0)
12+
1013 if SCALAR || ! (prob. u0 isa Number)
1114 u0 = __maybe_unaliased (prob. u0, alias_u0)
1215 else
@@ -20,51 +23,69 @@ function __construct_f(prob; alias_u0::Bool = false, can_handle_oop::Val{OOP} =
2023 @. du += u
2124 end
2225 else
23- @closure (du, u, p) -> prob. f (du, u, p) .+ u
26+ @closure (u, p) -> prob. f (u, p) .+ u
2427 end
2528 else
2629 prob. f
2730 end
2831
29- f_final = if isinplace (prob)
32+ ff = if isinplace (prob)
33+ ninputs = 2
3034 if DIMS || u0 isa AbstractVector
3135 @closure (du, u) -> (f (du, u, prob. p); du)
3236 else
3337 u0_size = size (u0)
34- du_size = size (evaluate_f (prob, u0) )
38+ du_size = size (resid )
3539 @closure (du, u) -> (f (reshape (du, du_size), reshape (u, u0_size), prob. p); du)
3640 end
3741 else
3842 if prob. u0 isa Number
3943 if SCALAR
40- @closure (u) -> prob. f (u, prob. p)
44+ ninputs = 1
45+ @closure (u) -> f (u, prob. p)
4146 elseif OOP
42- @closure (u) -> [prob. f (first (u), prob. p)]
47+ ninputs = 1
48+ @closure (u) -> [f (first (u), prob. p)]
4349 else
44- @closure (du, u) -> (du[1 ] = prob. f (first (u), prob. p); du)
50+ ninputs = 2
51+ resid = [resid]
52+ @closure (du, u) -> (du[1 ] = f (first (u), prob. p); du)
4553 end
4654 else
4755 if OOP
56+ ninputs = 1
4857 if DIMS
49- @closure (u) -> prob . f (u, prob. p)
58+ @closure (u) -> f (u, prob. p)
5059 else
5160 u0_size = size (u0)
52- @closure (u) -> _vec (prob . f (reshape (u, u0_size), prob. p))
61+ @closure (u) -> _vec (f (reshape (u, u0_size), prob. p))
5362 end
5463 else
64+ ninputs = 2
5565 if DIMS
56- @closure (du, u) -> (copyto! (du, prob . f (u, prob. p)); du)
66+ @closure (du, u) -> (copyto! (du, f (u, prob. p)); du)
5767 else
5868 u0_size = size (u0)
5969 @closure (du, u) -> begin
60- copyto! (vec (du), vec (prob . f (reshape (u, u0_size), prob. p)))
70+ copyto! (vec (du), vec (f (reshape (u, u0_size), prob. p)))
6171 return du
6272 end
6373 end
6474 end
6575 end
6676 end
6777
78+ f_final = if FOOP
79+ if ninputs == 1
80+ ff
81+ else
82+ du_ = DIMS ? similar (resid) : _vec (similar (resid))
83+ @closure (u) -> (ff (du_, u); du_)
84+ end
85+ else
86+ ff
87+ end
88+
6889 return f_final, ifelse (DIMS, u0, _vec (u0))
6990end
7091
0 commit comments