Skip to content

Commit 23ead7d

Browse files
compile identity macro for direct usage and fixes to build_function
1 parent 8579585 commit 23ead7d

File tree

4 files changed

+55
-2
lines changed

4 files changed

+55
-2
lines changed

src/ModelingToolkit.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ export Operation, Expression
44
export calculate_jacobian, generate_jacobian, generate_function
55
export independent_variables, dependent_variables, parameters
66
export simplified_expr
7-
export @register
7+
export @register, @I
88
export modelingtoolkitize
99

1010

src/direct.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,19 @@ function simplified_expr(O::Operation)
2525
return Expr(:call, Symbol(O.op), simplified_expr.(O.args)...)
2626
end
2727

28+
function simplified_expr(c::Constant)
29+
c.value
30+
end
31+
2832
function simplified_expr(eq::Equation)
2933
Expr(:(=), simplified_expr(eq.lhs), simplified_expr(eq.rhs))
3034
end
35+
36+
macro I(ex)
37+
name = :ICompile
38+
ret = return quote
39+
macro $(esc(name))()
40+
esc($ex)
41+
end
42+
end
43+
end

src/utils.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ function flatten_expr!(x)
3131
x
3232
end
3333

34-
function build_function(rhss, vs, ps, args = (), conv = rhs -> convert(Expr, rhs); constructor=nothing)
34+
function build_function(rhss, vs, ps, args = (), conv = simplified_expr; constructor=nothing)
3535
_vs = map(x-> x isa Operation ? x.op : x, vs)
3636
_ps = map(x-> x isa Operation ? x.op : x, ps)
3737
var_pairs = [(u.name, :(u[$i])) for (i, u) enumerate(_vs)]

test/direct.jl

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,43 @@ for i in 1:3
2828
end
2929
@test all(isequal.(ModelingToolkit.gradient(eqs[1],[x,y,z]),[σ * -1,σ,0]))
3030
@test all(isequal.(ModelingToolkit.hessian(eqs[1],[x,y,z]),0))
31+
32+
@parameters σ() ρ() β()
33+
@variables x y z
34+
35+
eqs =*(y-x),
36+
x*-z)-y,
37+
x*y - β*z]
38+
39+
ModelingToolkit.build_function(eqs,[x,y,z],[σ,ρ,β])
40+
41+
mac = @I begin
42+
@parameters σ() ρ() β()
43+
@variables x() y() z()
44+
45+
eqs =*(y-x),
46+
x*-z)-y,
47+
x*y - β*z]
48+
49+
ModelingToolkit.build_function(eqs,[x,y,z],[σ,ρ,β])
50+
end
51+
f = @ICompile
52+
out = [1.0,2,3]
53+
f([1.0,2,3],[1.0,2,3])
54+
f(out,[1.0,2,3],[1.0,2,3])
55+
56+
mac = @I begin
57+
@parameters σ() ρ() β()
58+
@variables x() y() z()
59+
60+
eqs =*(y-x),
61+
x*-z)-y,
62+
x*y - β*z]
63+
= ModelingToolkit.jacobian(eqs,[x,y,z])
64+
ModelingToolkit.build_function(∂,[x,y,z],[σ,ρ,β])
65+
end
66+
f = @ICompile
67+
out = zeros(3,3)
68+
f([1.0,2,3],[1.0,2,3])
69+
f(out,[1.0,2,3],[1.0,2,3])
70+
out

0 commit comments

Comments
 (0)