Skip to content

Commit 0b3b4f5

Browse files
handle the static array cases in build_function for non-vector outputs
1 parent 2faa051 commit 0b3b4f5

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed

src/utils.jl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,21 @@ function build_function(rhss, vs, ps = (), args = (), conv = simplified_expr, ex
5858

5959
if rhss isa Matrix
6060
arr_sys_expr = build_expr(:vcat, [build_expr(:row,[conv(rhs) for rhs rhss[i,:]]) for i in 1:size(rhss,1)])
61+
# : x because ??? what to do in the general case?
62+
_constructor = constructor === nothing ? :(u isa ModelingToolkit.StaticArrays.StaticArray ? ModelingToolkit.StaticArrays.SMatrix{$(size(rhss)...)} : x->x) : constructor
6163
elseif typeof(rhss) <: Array && !(typeof(rhss) <: Vector)
6264
vector_form = build_expr(:vect, [conv(rhs) for rhs rhss])
6365
arr_sys_expr = :(reshape($vector_form,$(size(rhss)...)))
66+
_constructor = constructor === nothing ? :(u isa ModelingToolkit.StaticArrays.StaticArray ? ModelingToolkit.StaticArrays.SArray{$(size(rhss)...)} : x->x) : constructor
6467
elseif rhss isa SparseMatrixCSC
6568
vector_form = build_expr(:vect, [conv(rhs) for rhs nonzeros(rhss)])
6669
arr_sys_expr = :(SparseMatrixCSC{eltype(u),Int}($(size(rhss)...), $(rhss.colptr), $(rhss.rowval), $vector_form))
70+
# Static and sparse? Probably not a combo that will actually be hit, but give a default anyways
71+
_constructor = constructor === nothing ? :(u isa ModelingToolkit.StaticArrays.StaticArray ? ModelingToolkit.StaticArrays.SMatrix{$(size(rhss)...)} : x->x) : constructor
6772
else # Vector
6873
arr_sys_expr = build_expr(:vect, [conv(rhs) for rhs rhss])
74+
# Handle vector constructor separately using `typeof(u)` to support things like LabelledArrays
75+
_constructor = constructor === nothing ? :(u isa ModelingToolkit.StaticArrays.StaticArray ? ModelingToolkit.StaticArrays.similar_type(typeof(u), eltype(X)) : x->convert(typeof(u),x)) : constructor
6976
end
7077

7178
let_expr = Expr(:let, var_eqs, tuple_sys_expr)
@@ -85,7 +92,7 @@ function build_function(rhss, vs, ps = (), args = (), conv = simplified_expr, ex
8592
end
8693
T = promote_type(map(typeof,X)...)
8794
map(T,X)
88-
construct = $(constructor === nothing ? :(u isa ModelingToolkit.StaticArrays.StaticArray ? ModelingToolkit.StaticArrays.similar_type(typeof(u), eltype(X)) : x->convert(typeof(u),x)) : constructor)
95+
construct = $_constructor
8996
construct(X)
9097
end
9198
)

0 commit comments

Comments
 (0)