Type: | Package |
Title: | Helper Methods for 'simmer' Trajectories |
Version: | 0.2.2 |
Description: | Provides wrappers for common activity patterns in 'simmer' trajectories. |
License: | MIT + file LICENSE |
Encoding: | UTF-8 |
URL: | https://r-simmer.org, https://github.com/r-simmer/simmer.bricks |
BugReports: | https://github.com/r-simmer/simmer.bricks/issues |
Depends: | R (≥ 3.1.2), simmer (≥ 3.7.0) |
Suggests: | testthat, knitr, rmarkdown |
ByteCompile: | yes |
RoxygenNote: | 7.2.3 |
VignetteBuilder: | knitr |
NeedsCompilation: | no |
Packaged: | 2023-07-15 10:16:06 UTC; iucar |
Author: | Iñaki Ucar |
Maintainer: | Iñaki Ucar <iucar@fedoraproject.org> |
Repository: | CRAN |
Date/Publication: | 2023-07-15 10:30:02 UTC |
simmer.bricks: Helper Methods for simmer Trajectories
Description
Provides wrappers for common activity patterns in simmer trajectories.
Author(s)
Iñaki Ucar
See Also
simmer's homepage https://r-simmer.org and GitHub repository https://github.com/r-simmer/simmer.bricks.
Delayed Release of a Resource
Description
This brick encapsulates a delayed release: the arrival releases the resource and continues its way immediately, but the resource is busy for an additional period of time.
Usage
delayed_release(
.trj,
resource,
task,
amount = 1,
preemptive = FALSE,
mon_all = FALSE
)
delayed_release_selected(
.trj,
task,
amount = 1,
preemptive = FALSE,
mon_all = FALSE
)
Arguments
.trj |
the trajectory object. |
resource |
the name of the resource. |
task |
the timeout duration supplied by either passing a numeric or a callable object (a function) which must return a numeric (negative values are automatically coerced to positive). |
amount |
the amount to seize/release, accepts either a numeric or a callable object (a function) which must return a numeric. |
preemptive |
whether arrivals in the server can be preempted or not based on seize priorities. |
mon_all |
if |
Value
Returns the following chain of activities: clone
> synchronize
(see examples below).
Examples
## These are equivalent for a non-preemptive resource:
trajectory() %>%
delayed_release("res1", 5, 1)
trajectory() %>%
clone(
2,
trajectory() %>%
set_capacity("res1", -1, mod="+") %>%
release("res1", 1),
trajectory() %>%
timeout(5) %>%
set_capacity("res1", 1, mod="+")
) %>%
synchronize(wait=FALSE)
## These are equivalent for a preemptive resource:
trajectory() %>%
delayed_release("res2", 5, 1, preemptive=TRUE)
trajectory() %>%
clone(
2,
trajectory() %>%
release("res2", 1),
trajectory() %>%
set_prioritization(c(rep(.Machine$integer.max, 2), 0)) %>%
seize("res2", 1) %>%
timeout(5) %>%
release("res2", 1)
) %>%
synchronize(wait=FALSE)
Perform Parallel Tasks
Description
This brick encapsulates the activity of n
workers running parallel
sub-trajectories.
Usage
do_parallel(.trj, ..., .env, wait = TRUE, mon_all = FALSE)
Arguments
.trj |
the trajectory object. |
... |
sub-trajectories or list of sub-trajectories to parallelise. |
.env |
the simulation environment. |
wait |
if |
mon_all |
if |
Value
Returns the following chain of activities: clone
> synchronize
(> wait
> untrap
if wait=FALSE
) (see examples below).
Examples
env <- simmer()
signal <- function() get_name(env)
task.1 <- trajectory("task 1") %>%
timeout(function() rexp(1))
task.2 <- trajectory("task 2") %>%
timeout(function() rexp(1))
## These are equivalent:
trajectory() %>%
do_parallel(
task.1,
task.2,
.env = env, wait = TRUE
)
trajectory() %>%
clone(
n = 3,
trajectory("original") %>%
trap(signal) %>%
wait() %>%
wait() %>%
untrap(signal),
task.1[] %>%
send(signal),
task.2[] %>%
send(signal)) %>%
synchronize(wait = TRUE)
## These are equivalent:
trajectory() %>%
do_parallel(
task.1,
task.2,
.env = env, wait = FALSE
)
trajectory() %>%
clone(
n = 3,
trajectory("original") %>%
trap(signal),
task.1[] %>%
send(signal),
task.2[] %>%
send(signal)) %>%
synchronize(wait = FALSE) %>%
wait() %>%
untrap(signal)
Interleaved Resources
Description
This brick encapsulates a chain of interleaved resources, i.e., the current resource is not released until the next one in the chain is available. An interesting property of such a pattern is that, if one resource is blocked for some reason, the whole chain stops.
Usage
interleave(.trj, resources, task, amount = 1)
Arguments
.trj |
the trajectory object. |
resources |
character vector of resource names. |
task |
the timeout duration supplied by either passing a numeric or a callable object (a function) which must return a numeric (negative values are automatically coerced to positive). |
amount |
the amount to seize/release, accepts either a numeric or a callable object (a function) which must return a numeric. |
Details
Both task
and amount
accept a list of values/functions,
instead of a single one, that should be of the same length as resources
,
so that each value/function is applied to the resource of the same index.
The transition to the second and subsequent resources is guarded by a token,
an auxiliary resource whose capacity must be equal to the capacity + queue
size of the guarded resource, and its queue size must be infinite. For example,
if two resources are provided, c("A", "B")
, the auxiliary resource will
be named "B_token"
. If capacity=2
and queue_size=1
for B,
then capacity=3
and queue_size=Inf
must be the values for
B_token. But note that the user is responsible for adding such an auxiliary
resource to the simulation environment with the appropriate parameters.
Value
Returns the following chain of activities: seize
(1) > timeout
> [seize
(token to 2)
> release
(1) > seize
(2) >
timeout
> release
(2) >
release
(token to 2) > ... (repeat) ]
(see examples below). Thus, the total number of activities appended is
length(resources) * 3 + (length(resources)-1) * 2
.
Examples
## These are equivalent:
trajectory() %>%
interleave(c("A", "B"), c(2, 10), 1)
trajectory() %>%
seize("A", 1) %>%
timeout(2) %>%
seize("B_token", 1) %>%
release("A", 1) %>%
seize("B", 1) %>%
timeout(10) %>%
release("B", 1) %>%
release("B_token", 1)
Visit a Resource
Description
These bricks encapsulate a resource visit: seize, spend some time and release.
Usage
visit(.trj, resource, task, amount = 1)
visit_selected(.trj, task, amount = 1, id = 0)
Arguments
.trj |
the trajectory object. |
resource |
the name of the resource. |
task |
the timeout duration supplied by either passing a numeric or a callable object (a function) which must return a numeric (negative values are automatically coerced to positive). |
amount |
the amount to seize/release, accepts either a numeric or a callable object (a function) which must return a numeric. |
id |
selection identifier for nested usage. |
Value
Returns the following chain of activities: seize
> timeout
> release
(see examples below).
Examples
## These are equivalent:
trajectory() %>%
visit("res", 5, 1)
trajectory() %>%
seize("res", 1) %>%
timeout(5) %>%
release("res", 1)
## These are equivalent:
trajectory() %>%
visit_selected(5, 1)
trajectory() %>%
seize_selected(1) %>%
timeout(5) %>%
release_selected(1)
Wait a Number of Signals
Description
These bricks encapsulate n
stops: wait for a sequence of n
signals. wait_until
also traps and untraps the required signals.
Usage
wait_n(.trj, n = 1)
wait_until(.trj, signals, n = 1)
Arguments
.trj |
the trajectory object. |
n |
number of |
signals |
signal or list of signals, accepts either a string, a list of strings or a callable object (a function) which must return a string or a list of strings. |
Value
wait_n
returns n
times wait
.
wait_until
also adds trap
and
untrap
at the beginning and end, respectively,
of the chain of wait
s (see examples below).
Examples
## These are equivalent:
trajectory() %>%
wait_n(3)
trajectory() %>%
wait() %>%
wait() %>%
wait()
## These are equivalent:
trajectory() %>%
wait_until("green")
trajectory() %>%
trap("green") %>%
wait() %>%
untrap("green")
## These are equivalent:
trajectory() %>%
wait_until(c("one", "another"), 2)
trajectory() %>%
trap(c("one", "another")) %>%
wait() %>%
wait() %>%
untrap(c("one", "another"))