Skip to content

Commit 9ae58e4

Browse files
committed
implement TrackedResource
1 parent c62a6e5 commit 9ae58e4

File tree

5 files changed

+108
-1
lines changed

5 files changed

+108
-1
lines changed

Project.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@ license = "MIT"
55
desc = "A discrete event process oriented simulation framework."
66
authors = ["Ben Lauwens and SimJulia and ConcurrentSim contributors"]
77
repo = "https://github.com/JuliaDynamics/ConcurrentSim.jl.git"
8-
version = "1.1.0"
8+
version = "1.2.0"
99

1010
[deps]
1111
DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
1212
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
1313
ResumableFunctions = "c5292f4c-5179-55e1-98c5-05642aab7184"
14+
Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
1415

1516
[compat]
1617
DataStructures = "0.18"
1718
ResumableFunctions = "0.6"
19+
Tables = "1.10.1"
1820
julia = "1.6"

docs/Project.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
[deps]
22
ConcurrentSim = "6ed1e86c-fcaf-46a9-97e0-2b26a2cdb499"
3+
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
34
Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
45
Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4"
56
ResumableFunctions = "c5292f4c-5179-55e1-98c5-05642aab7184"

src/ConcurrentSim.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ module ConcurrentSim
1818
export AbstractProcess, Simulation, run, now, active_process, StopSimulation
1919
export Process, @process, interrupt
2020
export Container, Resource, Store, put!, get, cancel, request, tryrequest
21+
export TrackedResource
2122
export nowDatetime
2223

2324
include("base.jl")
@@ -28,6 +29,7 @@ module ConcurrentSim
2829
include("resources/base.jl")
2930
include("resources/containers.jl")
3031
include("resources/stores.jl")
32+
include("resources/tracked.jl")
3133
include("utils/time.jl")
3234
include("deprecated.jl")
3335
end

src/resources/tracked.jl

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
import Tables
2+
3+
"""
4+
A wrapper around a resource that tracks the time at which the resource is interacted with.
5+
6+
```jldoctest
7+
julia> using ConcurrentSim, DataFrames
8+
9+
julia> env = Simulation(); r = TrackedResource(Resource(env));
10+
11+
julia> run(env, 1); now(env)
12+
1.0
13+
14+
julia> request(r); run(env, 2); now(env)
15+
2.0
16+
17+
julia> request(r); run(env, 3); unlock(r); run(env, 4); now(env)
18+
4.0
19+
20+
julia> DataFrame(r)
21+
3×2 DataFrame
22+
Row │ events times
23+
│ Symbol Float64
24+
─────┼───────────────────
25+
1 │ increase 1.0
26+
2 │ increase 2.0
27+
3 │ decrease 3.0
28+
```
29+
"""
30+
struct TrackedResource{T}
31+
resource::T
32+
events::Vector{Symbol}
33+
times::Vector{Float64}
34+
end
35+
36+
TrackedResource(resource) = TrackedResource(resource, Symbol[], Float64[])
37+
38+
function Base.take!(tr::TrackedResource, args...; kwargs...)
39+
r = take!(tr.resource, args...; kwargs...)
40+
push!(tr.events, :decrease)
41+
push!(tr.times, now(tr.resource.env))
42+
return r
43+
end
44+
45+
function Base.put!(tr::TrackedResource, args...; kwargs...)
46+
r = put!(tr.resource, args...; kwargs...)
47+
push!(tr.events, :increase)
48+
push!(tr.times, now(tr.resource.env))
49+
return r
50+
end
51+
52+
function Base.unlock(tr::TrackedResource, args...; kwargs...)
53+
r = unlock(tr.resource, args...; kwargs...)
54+
push!(tr.events, :decrease)
55+
push!(tr.times, now(tr.resource.env))
56+
return r
57+
end
58+
59+
function request(tr::TrackedResource, args...; kwargs...)
60+
r = request(tr.resource, args...; kwargs...)
61+
push!(tr.events, :increase)
62+
push!(tr.times, now(tr.resource.env))
63+
return r
64+
end
65+
66+
##
67+
# Tables interface
68+
##
69+
70+
Tables.istable(::Type{<:TrackedResource}) = true
71+
Tables.schema(tr::TrackedResource) = Tables.Schema(Tables.columnnames(tr), [Symbol, Float64])
72+
73+
Tables.columnaccess(::Type{<:TrackedResource}) = true
74+
75+
Tables.columns(tr::TrackedResource) = tr
76+
77+
function Tables.getcolumn(tr::TrackedResource, i::Int)
78+
if i == 1
79+
return tr.events
80+
elseif i == 2
81+
return tr.times
82+
else
83+
error("`TrackedResource` has only two columns, but you are attempting to access column $(i).")
84+
end
85+
end
86+
87+
function Tables.getcolumn(tr::TrackedResource, s::Symbol)
88+
if s == :events
89+
return tr.events
90+
elseif s == :times
91+
return tr.times
92+
else
93+
error("`TrackedResource` has only two columns (events and times), but you are attempting to access column $(s).")
94+
end
95+
end
96+
97+
function Tables.columnnames(tr::TrackedResource)
98+
return (:events, :times)
99+
end
100+
101+
# TODO Makie recipes

test/Project.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
[deps]
22
Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595"
3+
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
34
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
45
Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
56
Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4"

0 commit comments

Comments
 (0)