Skip to content

Commit 8f1493f

Browse files
fixup! refactor: get System to precompile in a trivial case
1 parent 28c3542 commit 8f1493f

File tree

1 file changed

+98
-3
lines changed

1 file changed

+98
-3
lines changed

src/ModelingToolkit.jl

Lines changed: 98 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -354,10 +354,93 @@ for prop in [SYS_PROPS; [:continuous_events, :discrete_events]]
354354
end
355355

356356
PrecompileTools.@compile_workload begin
357-
using ModelingToolkit
357+
fold1 = Val{false}()
358+
using SymbolicUtils
359+
using SymbolicUtils: shape
360+
using Symbolics
361+
@syms x y f(t) q[1:5]
362+
SymbolicUtils.Sym{SymReal}(:a; type = Real, shape = SymbolicUtils.ShapeVecT())
363+
x + y
364+
x * y
365+
x / y
366+
x ^ y
367+
x ^ 5
368+
6 ^ x
369+
x - y
370+
-y
371+
2y
372+
z = 2
373+
dict = SymbolicUtils.ACDict{VartypeT}()
374+
dict[x] = 1
375+
dict[y] = 1
376+
type::typeof(DataType) = rand() < 0.5 ? Real : Float64
377+
nt = (; type, shape, unsafe = true)
378+
Base.pairs(nt)
379+
BSImpl.AddMul{VartypeT}(1, dict, SymbolicUtils.AddMulVariant.MUL; type, shape = SymbolicUtils.ShapeVecT(), unsafe = true)
380+
*(y, z)
381+
*(z, y)
382+
SymbolicUtils.symtype(y)
383+
f(x)
384+
(5x / 5)
385+
expand((x + y) ^ 2)
386+
simplify(x ^ (1//2) + (sin(x) ^ 2 + cos(x) ^ 2) + 2(x + y) - x - y)
387+
ex = x + 2y + sin(x)
388+
rules1 = Dict(x => y)
389+
rules2 = Dict(x => 1)
390+
Dx = Differential(x)
391+
Differential(y)(ex)
392+
uex = unwrap(ex)
393+
Symbolics.executediff(Dx, uex)
394+
# Running `fold = Val(true)` invalidates the precompiled statements
395+
# for `fold = Val(false)` and itself doesn't precompile anyway.
396+
# substitute(ex, rules1)
397+
substitute(ex, rules1; fold = fold1)
398+
substitute(ex, rules2; fold = fold1)
399+
@variables foo
400+
f(foo)
401+
@variables x y f(::Real) q[1:5]
402+
x + y
403+
x * y
404+
x / y
405+
x ^ y
406+
x ^ 5
407+
# 6 ^ x
408+
x - y
409+
-y
410+
2y
411+
symtype(y)
412+
z = 2
413+
*(y, z)
414+
*(z, y)
415+
f(x)
416+
(5x / 5)
417+
[x, y]
418+
[x, f, f]
419+
promote_type(Int, Num)
420+
promote_type(Real, Num)
421+
promote_type(Float64, Num)
422+
# expand((x + y) ^ 2)
423+
# simplify(x ^ (1//2) + (sin(x) ^ 2 + cos(x) ^ 2) + 2(x + y) - x - y)
424+
ex = x + 2y + sin(x)
425+
rules1 = Dict(x => y)
426+
# rules2 = Dict(x => 1)
427+
# Running `fold = Val(true)` invalidates the precompiled statements
428+
# for `fold = Val(false)` and itself doesn't precompile anyway.
429+
# substitute(ex, rules1)
430+
substitute(ex, rules1; fold = fold1)
431+
Symbolics.linear_expansion(ex, y)
432+
# substitute(ex, rules2; fold = fold1)
433+
# substitute(ex, rules2)
434+
# substitute(ex, rules1; fold = fold2)
435+
# substitute(ex, rules2; fold = fold2)
436+
q[1]
437+
q'q
438+
using ModelingToolkit
358439
@variables x(ModelingToolkit.t_nounits)
359-
@named sys = System([ModelingToolkit.D_nounits(x) ~ -x], ModelingToolkit.t_nounits)
360-
prob = ODEProblem(mtkcompile(sys), [x => 30.0], (0, 100), jac = true)
440+
isequal(ModelingToolkit.D_nounits.x, ModelingToolkit.t_nounits)
441+
sys = System([ModelingToolkit.D_nounits(x) ~ x], ModelingToolkit.t_nounits, [x], Num[]; name = :sys)
442+
sys = System([ModelingToolkit.D_nounits(x) ~ x], ModelingToolkit.t_nounits, [x], Num[]; name = :sys)
443+
# mtkcompile(sys)
361444
@mtkmodel __testmod__ begin
362445
@constants begin
363446
c = 1.0
@@ -388,4 +471,16 @@ PrecompileTools.@compile_workload begin
388471
end
389472
end
390473

474+
precompile(Tuple{typeof(Base.merge), NamedTuple{(:f, :args, :metadata, :hash, :hash2, :shape, :type, :id), Tuple{SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{SymbolicUtils.SymReal}, SymbolicUtils.SmallVec{SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{SymbolicUtils.SymReal}, Array{SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{SymbolicUtils.SymReal}, 1}}, Nothing, UInt64, UInt64, SymbolicUtils.SmallVec{Base.UnitRange{Int64}, Array{Base.UnitRange{Int64}, 1}}, DataType, SymbolicUtils.IDType}}, NamedTuple{(:metadata,), Tuple{Base.ImmutableDict{DataType, Any}}}})
475+
precompile(Tuple{typeof(Base.merge), NamedTuple{(:f, :args, :metadata, :hash, :hash2, :shape, :type, :id), Tuple{SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{SymbolicUtils.SymReal}, SymbolicUtils.SmallVec{SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{SymbolicUtils.SymReal}, Array{SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{SymbolicUtils.SymReal}, 1}}, Base.ImmutableDict{DataType, Any}, UInt64, UInt64, SymbolicUtils.SmallVec{Base.UnitRange{Int64}, Array{Base.UnitRange{Int64}, 1}}, DataType, SymbolicUtils.IDType}}, NamedTuple{(:id, :hash, :hash2), Tuple{Nothing, Int64, Int64}}})
476+
precompile(Tuple{typeof(Core.kwcall), NamedTuple{(:f, :args, :metadata, :hash, :hash2, :shape, :type, :id), Tuple{SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{SymbolicUtils.SymReal}, SymbolicUtils.SmallVec{SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{SymbolicUtils.SymReal}, Array{SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{SymbolicUtils.SymReal}, 1}}, Base.ImmutableDict{DataType, Any}, Int64, Int64, SymbolicUtils.SmallVec{Base.UnitRange{Int64}, Array{Base.UnitRange{Int64}, 1}}, DataType, Nothing}}, Type{SymbolicUtils.BasicSymbolicImpl.Term{SymbolicUtils.SymReal}}})
477+
precompile(Tuple{typeof(Symbolics.parse_vars), Symbol, Type, Tuple{Symbol, Symbol}, Function})
478+
precompile(Tuple{typeof(Base.merge), NamedTuple{(:name, :metadata, :hash, :hash2, :shape, :type, :id), Tuple{Symbol, Base.ImmutableDict{DataType, Any}, UInt64, UInt64, SymbolicUtils.SmallVec{Base.UnitRange{Int64}, Array{Base.UnitRange{Int64}, 1}}, DataType, SymbolicUtils.IDType}}, NamedTuple{(:metadata,), Tuple{Base.ImmutableDict{DataType, Any}}}})
479+
precompile(Tuple{typeof(Base.vect), Symbolics.Equation, Vararg{Symbolics.Equation}})
480+
precompile(Tuple{typeof(Core.kwcall), NamedTuple{(:name, :defaults), Tuple{Symbol, Base.Dict{Symbolics.Num, Float64}}}, Type{ModelingToolkit.System}, Array{Symbolics.Equation, 1}, Symbolics.Num, Array{Symbolics.Num, 1}, Array{Symbolics.Num, 1}})
481+
precompile(Tuple{Type{NamedTuple{(:name, :defaults), T} where T<:Tuple}, Tuple{Symbol, Base.Dict{Symbolics.Num, Float64}}})
482+
precompile(Tuple{typeof(SymbolicUtils.isequal_somescalar), Float64, Float64})
483+
precompile(Tuple{Type{NamedTuple{(:name, :defaults, :guesses), T} where T<:Tuple}, Tuple{Symbol, Base.Dict{Symbolics.Num, Float64}, Base.Dict{Symbolics.Num, Float64}}})
484+
precompile(Tuple{typeof(Core.kwcall), NamedTuple{(:name, :defaults, :guesses), Tuple{Symbol, Base.Dict{Symbolics.Num, Float64}, Base.Dict{Symbolics.Num, Float64}}}, Type{ModelingToolkit.System}, Array{Symbolics.Equation, 1}, Symbolics.Num, Array{Symbolics.Num, 1}, Array{Symbolics.Num, 1}})
485+
391486
end # module

0 commit comments

Comments
 (0)