Skip to content

Commit f3e5a97

Browse files
committed
Introduce Handler
1 parent a7e73f1 commit f3e5a97

5 files changed

Lines changed: 49 additions & 18 deletions

File tree

src/SimJulia.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ module SimJulia
2828
export Coroutine, @coroutine
2929
export Container, Resource, Store
3030
export Put, Get, Request, Release, cancel, capacity, request, @request
31-
export Model, Continuous, Variable, ZeroCrossing
32-
export @model, @continuous, @trigger, @zerocrossing
31+
export Model, Continuous, Variable
32+
export @model, @continuous
3333
export evaluate
3434
export QSS
3535
export non_stiff, stiff

src/continuous.jl

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,13 @@ function evaluate(var::Variable, t::Float64=now(environment(var)))
1818
evaluate(var.x, t - var.t)
1919
end
2020

21-
struct ZeroCrossing <: AbstractEvent
22-
21+
struct Handler <: AbstractEvent
22+
bev :: BaseEvent
23+
function(env::Environment)
24+
new(BaseEvent(env))
25+
end
2326
end
2427

25-
macro trigger(expr::Expr)
26-
expr.head != :call && error("Expression is not a function call!")
27-
nothing
28-
end
2928

3029
struct Continuous <: AbstractProcess
3130
bev :: BaseEvent

src/odes/base.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ abstract type Integrator end
22

33
struct Model
44
f :: Vector{Function}
5+
zc :: Vector{Function}
56
deps :: Matrix{Bool}
6-
function Model(f::Vector{Function}, deps::Matrix{Bool})
7-
new(f, deps)
7+
param_deps :: Matrix{Bool}
8+
function Model(f::Vector{Function}, zc::Vector{Function}, deps::Matrix{Bool}, param_deps::Matrix{Bool})
9+
new(f, zc, deps, param_deps)
810
end
911
end

src/odes/macros.jl

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,19 @@ function check_dependencies(ex, deps::Array{Bool}, i::Int, x::Symbol)
1010
end
1111
end
1212

13+
function number_parameters(ex, n::Int, p::Symbol)
14+
if ex isa Expr
15+
if ex.head == :ref && ex.args[1] == p
16+
n = max(n, ex.args[2])
17+
else
18+
for arg in ex.args
19+
n = max(n, number_parameters(arg, n, p))
20+
end
21+
end
22+
end
23+
n
24+
end
25+
1326
macro model(expr::Expr)
1427
expr.head != :function && error("Expression is not a function definition!")
1528
args = getArguments(expr)
@@ -25,36 +38,53 @@ macro model(expr::Expr)
2538
for ex in expr.args[2].args
2639
if ex isa Expr
2740
if ex.head == Symbol("=")
28-
if ex.args[1] isa Expr && ex.args[1].head == :ref && ex.args[1].args[1] == dx
41+
if ex.args[1] isa Expr && ex.args[1].head == :ref && ex.args[1].args[1] == expr.args[1].args[5]
2942
push!(f_vec, ex)
43+
p = max(p, number_parameters(ex.args[2], p, expr.args[1].args[4]))
3044
elseif ex.args[1] isa Symbol
3145
ex.args[2] isa Expr ? push!(a_vec, ex) : push!(c_vec, ex)
3246
end
3347
elseif ex isa Expr && ex.head == :if && ex.args[1].head == :call && ex.args[1].args[1] == :<
3448
push!(zc_vec, ex.args[1].args[2])
3549
push!(neg_vec, ex.args[2])
36-
length(ex.args) == 3 ? push!(pos_vec, ex.args[3]) : Expr()
50+
push!(pos_vec, ex.args[3])
3751
end
3852
end
3953
end
4054
println(zc_vec)
4155
println(neg_vec)
4256
println(pos_vec)
4357
n = length(f_vec)
58+
m = length(zc_vec)
4459
deps = zeros(Bool, n, n)
4560
param_deps = zeros(Bool, n, p)
46-
zc_deps = zeros(Bool, p, n)
47-
for ex in expr.args[2].args
48-
ex isa Expr && ex.head == Symbol("=") && ex.args[1] isa Expr && ex.args[1].head == :ref && ex.args[1].args[1] == dx && check_dependencies(ex.args[2], deps, ex.args[1].args[2], expr.args[1].args[3])
61+
zc_deps = zeros(Bool, m, n)
62+
rev_zc_deps = zeros(Bool, n, m)
63+
for ex in f_vec
64+
check_dependencies(ex.args[2], deps, ex.args[1].args[2], expr.args[1].args[3])
65+
check_dependencies(ex.args[2], param_deps, ex.args[1].args[2], expr.args[1].args[4])
66+
end
67+
for (i, ex) in enumerate(zc_vec)
68+
check_dependencies(ex, zc_deps, i, expr.args[1].args[3])
4969
end
70+
println(deps)
71+
println(param_deps)
72+
println(zc_deps)
5073
esc(:(function $func_name()
5174
f = Array{Function}($n)
5275
$((:(f[$(f_vec[i].args[1].args[2])] = ($(expr.args[1].args[2])::TaylorSeries.Taylor1, $(expr.args[1].args[3])::Vector{TaylorSeries.Taylor1}, $(expr.args[1].args[4])::Vector{Float64})->begin
5376
$((:($(c)) for c in :($c_vec))...)
5477
$((:($(a)) for a in :($a_vec))...)
5578
$(f_vec[i].args[2])
5679
end) for i in 1:length(:($f_vec)))...)
57-
Model(f, $deps)
80+
zc = Vector{Function}()
81+
$((:(push!(zc, ($(expr.args[1].args[2])::TaylorSeries.Taylor1, $(expr.args[1].args[3])::Vector{TaylorSeries.Taylor1}, $(expr.args[1].args[4])::Vector{Float64})->begin
82+
$((:($(c)) for c in :($c_vec))...)
83+
$((:($(a)) for a in :($a_vec))...)
84+
$(f_vec[i].args[2])
85+
end)) for i in 1:length(:($zc_vec)))...)
86+
min_handler = Vector{Function}()
87+
Model(f, zc, $deps, $param_deps)
5888
end))
5989
end
6090

test/continuous.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using SimJulia
22

33
@model function diffeq(t, x, p, dx)
4-
dx[1] = 0.01*x[2]
4+
dx[1] = p[2]+0.01*x[2]
55
dx[2] = p[1]-100.0*x[1]-100.0*x[2]
66
end
77

@@ -13,7 +13,7 @@ function report(sim::Simulation, cont::Continuous)
1313
end
1414

1515
sim = Simulation()
16-
cont = @continuous diffeq(sim, [0.0, 20.0], [2020.0]; stiff=false, order=4)
16+
cont = @continuous diffeq(sim, [0.0, 20.0], [2020.0, 0.0]; stiff=false, order=4)
1717
@process report(sim, cont)
1818
run(sim, 71)
1919

0 commit comments

Comments
 (0)