@@ -33,6 +33,8 @@ function flatten_expr!(x)
33
33
x
34
34
end
35
35
36
+ default_tensor_constructor (x) = x-> (out = similar (typeof (u),$ (size (rhss)... )); out .= x)
37
+
36
38
function build_function (rhss, vs, ps = (), args = (), conv = simplified_expr, expression = Val{true };
37
39
checkbounds = false , constructor= nothing , linenumbers = true )
38
40
_vs = map (x-> x isa Operation ? x. op : x, vs)
@@ -59,11 +61,11 @@ function build_function(rhss, vs, ps = (), args = (), conv = simplified_expr, ex
59
61
if rhss isa Matrix
60
62
arr_sys_expr = build_expr (:vcat , [build_expr (:row ,[conv (rhs) for rhs ∈ rhss[i,:]]) for i in 1 : size (rhss,1 )])
61
63
# : 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
64
+ _constructor = constructor === nothing ? :(u isa ModelingToolkit. StaticArrays. StaticArray ? ModelingToolkit. StaticArrays. SMatrix{$ (size (rhss)... )} : default_tensor_constructor ) : constructor
63
65
elseif typeof (rhss) <: Array && ! (typeof (rhss) <: Vector )
64
66
vector_form = build_expr (:vect , [conv (rhs) for rhs ∈ rhss])
65
67
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
68
+ _constructor = constructor === nothing ? :(u isa ModelingToolkit. StaticArrays. StaticArray ? ModelingToolkit. StaticArrays. SArray{$ (size (rhss)... )} : default_tensor_constructor ) : constructor
67
69
elseif rhss isa SparseMatrixCSC
68
70
vector_form = build_expr (:vect , [conv (rhs) for rhs ∈ nonzeros (rhss)])
69
71
arr_sys_expr = :(SparseMatrixCSC {eltype(u),Int} ($ (size (rhss)... ), $ (rhss. colptr), $ (rhss. rowval), $ vector_form))
@@ -85,15 +87,16 @@ function build_function(rhss, vs, ps = (), args = (), conv = simplified_expr, ex
85
87
86
88
oop_ex = :(
87
89
($ (fargs. args... ),) -> begin
88
- if $ (fargs. args[1 ]) isa Array
90
+ # If u is a weird non-StaticArray type and we want a sparse matrix, just do the optimized sparse anyways
91
+ if $ (fargs. args[1 ]) isa Array || (! ($ (fargs. args[1 ]) <: StaticArray ) && $ (rhss isa SparseMatrixCSC))
89
92
return $ arr_bounds_block
90
93
else
91
94
X = $ bounds_block
95
+ T = promote_type (map (typeof,X)... )
96
+ map (T,X)
97
+ construct = $ _constructor
98
+ return construct (X)
92
99
end
93
- T = promote_type (map (typeof,X)... )
94
- map (T,X)
95
- construct = $ _constructor
96
- construct (X)
97
100
end
98
101
)
99
102
0 commit comments