Skip to content

Commit 0d9fde4

Browse files
Merge pull request #3382 from SebastianM-C/smc/fix
fix(nonlinearsystem): Fix codegen issue for vector parameters
2 parents 27cfc3b + a001992 commit 0d9fde4

File tree

4 files changed

+29
-4
lines changed

4 files changed

+29
-4
lines changed

src/discretedomain.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ $(TYPEDEF)
8585
Represents a sample operator. A discrete-time signal is created by sampling a continuous-time signal.
8686
8787
# Constructors
88-
`Sample(clock::Union{TimeDomain, InferredTimeDomain} = InferredDiscrete)`
88+
`Sample(clock::Union{TimeDomain, InferredTimeDomain} = InferredDiscrete())`
8989
`Sample(dt::Real)`
9090
9191
`Sample(x::Num)`, with a single argument, is shorthand for `Sample()(x)`.
@@ -106,7 +106,7 @@ julia> Δ = Sample(0.01)
106106
"""
107107
struct Sample <: Operator
108108
clock::Any
109-
Sample(clock::Union{TimeDomain, InferredTimeDomain} = InferredDiscrete) = new(clock)
109+
Sample(clock::Union{TimeDomain, InferredTimeDomain} = InferredDiscrete()) = new(clock)
110110
end
111111

112112
function Sample(arg::Real)
@@ -190,7 +190,7 @@ struct ShiftIndex
190190
clock::Union{InferredTimeDomain, TimeDomain, IntegerSequence}
191191
steps::Int
192192
function ShiftIndex(
193-
clock::Union{TimeDomain, InferredTimeDomain, IntegerSequence} = Inferred, steps::Int = 0)
193+
clock::Union{TimeDomain, InferredTimeDomain, IntegerSequence} = Inferred(), steps::Int = 0)
194194
new(clock, steps)
195195
end
196196
ShiftIndex(dt::Real, steps::Int = 0) = new(Clock(dt), steps)
@@ -254,7 +254,7 @@ function input_timedomain(h::Hold, arg = nothing)
254254
if has_time_domain(arg)
255255
return get_time_domain(arg)
256256
end
257-
InferredDiscrete # the Hold accepts any discrete
257+
InferredDiscrete() # the Hold accepts any discrete
258258
end
259259
output_timedomain(::Hold, _ = nothing) = ContinuousClock()
260260

src/systems/nonlinear/nonlinearsystem.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,12 @@ function NonlinearSystem(eqs; kwargs...)
219219
push!(new_ps, p)
220220
end
221221
else
222+
if symbolic_type(p) == ArraySymbolic() &&
223+
Symbolics.shape(unwrap(p)) != Symbolics.Unknown()
224+
for i in eachindex(p)
225+
delete!(new_ps, p[i])
226+
end
227+
end
222228
push!(new_ps, p)
223229
end
224230
end

test/nonlinearsystem.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ using DiffEqBase, SparseArrays
44
using Test
55
using NonlinearSolve
66
using ForwardDiff
7+
using SymbolicIndexingInterface
78
using ModelingToolkit: value
89
using ModelingToolkit: get_default_or_guess, MTKParameters
910

@@ -380,3 +381,12 @@ end
380381
@test_throws ["single equation", "unknown"] IntervalNonlinearFunctionExpr(
381382
sys, (0.0, 1.0))
382383
end
384+
385+
@testset "Vector parameter used unscalarized and partially scalarized" begin
386+
@variables x y
387+
@parameters p[1:2] (f::Function)(..)
388+
389+
@mtkbuild sys = NonlinearSystem([x^2 - p[1]^2 ~ 0, y^2 ~ f(p)])
390+
@test !any(isequal(p[1]), parameters(sys))
391+
@test is_parameter(sys, p)
392+
end

test/scc_nonlinear_problem.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,3 +282,12 @@ end
282282
sccprob = SCCNonlinearProblem(fullsys, u0, p)
283283
@test isequal(parameters(fullsys), parameters(sccprob.f.sys))
284284
end
285+
286+
@testset "Vector parameters in function arguments" begin
287+
@variables x y
288+
@parameters p[1:2] (f::Function)(..)
289+
290+
@mtkbuild sys = NonlinearSystem([x^2 - p[1]^2 ~ 0, y^2 ~ f(p)])
291+
prob = SCCNonlinearProblem(sys, [x => 1.0, y => 1.0], [p => ones(2), f => sum])
292+
@test_nowarn solve(prob, NewtonRaphson())
293+
end

0 commit comments

Comments
 (0)