Skip to content

Commit 2497d9b

Browse files
Merge pull request #3079 from SebastianM-C/smc/pdeps
Relax type constraints to allow callable parameters in pdeps
2 parents 0916a02 + 6f96622 commit 2497d9b

File tree

3 files changed

+28
-3
lines changed

3 files changed

+28
-3
lines changed

src/systems/abstractsystem.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3090,7 +3090,7 @@ function process_parameter_dependencies(pdeps, ps)
30903090
end
30913091
for p in pdeps]
30923092
end
3093-
lhss = BasicSymbolic[]
3093+
lhss = []
30943094
for p in pdeps
30953095
if !isparameter(p.lhs)
30963096
error("LHS of parameter dependency must be a single parameter. Found $(p.lhs).")
@@ -3101,6 +3101,7 @@ function process_parameter_dependencies(pdeps, ps)
31013101
end
31023102
push!(lhss, p.lhs)
31033103
end
3104+
lhss = map(identity, lhss)
31043105
pdeps = topsort_equations(pdeps, union(ps, lhss))
31053106
ps = filter(ps) do p
31063107
!any(isequal(p), lhss)

src/systems/index_cache.jl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ struct IndexCache
4949
constant_idx::ParamIndexMap
5050
nonnumeric_idx::NonnumericMap
5151
observed_syms::Set{BasicSymbolic}
52-
dependent_pars::Set{BasicSymbolic}
52+
dependent_pars::Set{Union{BasicSymbolic, CallWithMetadata}}
5353
discrete_buffer_sizes::Vector{Vector{BufferTemplate}}
5454
tunable_buffer_size::BufferTemplate
5555
constant_buffer_sizes::Vector{BufferTemplate}
@@ -275,7 +275,8 @@ function IndexCache(sys::AbstractSystem)
275275
end
276276
end
277277

278-
dependent_pars = Set{BasicSymbolic}()
278+
dependent_pars = Set{Union{BasicSymbolic, CallWithMetadata}}()
279+
279280
for eq in parameter_dependencies(sys)
280281
sym = eq.lhs
281282
ttsym = default_toterm(sym)

test/parameter_dependencies.jl

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,29 @@ end
177177
@test SciMLBase.successful_retcode(sol)
178178
end
179179

180+
struct CallableFoo
181+
p::Any
182+
end
183+
184+
@register_symbolic CallableFoo(x)
185+
186+
(f::CallableFoo)(x) = f.p + x
187+
188+
@testset "callable parameters" begin
189+
@variables y(t) = 1
190+
@parameters p=2 (i::CallableFoo)(..)
191+
192+
eqs = [D(y) ~ i(t) + p]
193+
@named model = ODESystem(eqs, t, [y], [p, i];
194+
parameter_dependencies = [i ~ CallableFoo(p)])
195+
sys = structural_simplify(model)
196+
197+
prob = ODEProblem(sys, [], (0.0, 1.0))
198+
sol = solve(prob, Tsit5())
199+
200+
@test SciMLBase.successful_retcode(sol)
201+
end
202+
180203
@testset "Clock system" begin
181204
dt = 0.1
182205
@variables x(t) y(t) u(t) yd(t) ud(t) r(t) z(t)

0 commit comments

Comments
 (0)