A process-oriented and trajectory-based Discrete-Event Simulation (DES) package for R. Designed to be a generic framework, it leverages the power of 'Rcpp' to boost the performance, turning DES in R feasible. As a noteworthy characteristic, 'simmer' exploits the concept of trajectory: a common path in the simulation model for entities of the same type.
[[, for trajectories (1847898). Think about trajectories as lists of activities and these operators will do (almost) everything you expect. As a side effect, the generics
tail()automatically work with trajectories also as expected.
length()method to obtain the number of first-level activities in a trajectory (f86375a). Useful in combination with the subsetting operators.
create_trajectory()has been deprecated in favor of
plot_attributes()have been deprecated and will be removed in the next release in order to minimise dependencies (5b43f2b). We plan to release a new package on CRAN covering these features and new ones.
get_prev_activity()(f86375a). These methods were only useful for development purposes and nobody should be using them. And it was never a good idea to directly expose external pointers.
renege_if()activity triggers reneging upon reception of a signal broadcasted with
queue_size_strict=TRUE: arrivals were not being dropped (#83).
set_capacity()with a preemptive resource when the old value was
Inf: arrivals were not being preempted (63beb2c).
set_queue_size()become activities (#77). Just like
release(), they have the associated
set_queue_size_selected()for a joint use together with
deactivate()activities allow an arrival to start or stop a generator, respectively, from inside a trajectory (#80).
set_distribution()activities allow an arrival to install a new trajectory or distribution, respectively, in a generator from inside a trajectory (#80).
wait()can be used to send signals, wait for signals, trap them and launch asynchronous handlers.
log_()activity simply prints messages for debugging purposes (eaa4554).
get_mon_arrivals(ongoing = TRUE)(#73).
run(until)runs the simulation exactly until
until, instead of until the first event scheduled at a time >=
restart) has been moved from
add_generator()(#69). This leads to a more natural interpretation of prioritization values as attributes of arrivals from the same generator, rather than attributes of a
seize(). Still, prioritization values can be redefined dynamically from inside a trajectory with the new activity
seize_selected()(#49). This feature allows us to fine-tune what happens to an arrival if it cannot seize a resource: instead of getting dropped, it may execute a given subtrajectory.
clone()implements the workflow pattern in which an entity is processed in multiple parallel threads. The user can define a different sub-trajectory for each clone. With
synchronize(), multiple parallel clones converge and are synchronized: only one continues (the first or the last to arrive), and the others are removed.
separate()activities (#45). They can be used to implement a rollercoaster process:
batch()collects a number of arrivals before they can continue processing as a block, and
separate()splits a previously established batch.
renege_abort()activities (#58). They can be used to set or unset a timer after which the arrival will abandon.
0, the arrival skips the
branch()and continues to the next activity instead of throwing an
index out of rangeerror (#70).
branch()'s deprecated argument
join()activity to concatenate trajectories (#50).
add_resource()to guarantee the queue size limit with preemption (#59).
end_time - start_time. All versions 3.2.x are affected by this bug.
preemptiblein the documentation of
preemptibleto be equal or greater than
mergeparameter name to
continue. The old name is deprecated (#57).
match.arg()in multiple-choice arguments (#55).
branch()backwards linking and count (#56).
release()in two steps to deal properly with capacity changes at the same point in time (#64).
every()is deprecated due to #65.
queue_sizecan change over time following a user-defined scheduling, which can be generated with the new function
until=Infis allowed now (f47baa9).
t=3, queue=2meant that, until
t=3, the queue had 2 customers, and at
t=3the system changed (because of a new arrival or a new departure). The idea was to keep the values and time vectors aligned (see #28). But from this moment on, the resources are monitored _after changing the status of the system. This is more consistent with what a user would expect, and more consistent with the behaviour of other related R functions (e.g., see
stepfun(), from the
statspackage). Wrapping up and from now on,
t=3, queue=2means that some event happened at
t=3whose immediate and subsequent result was a queue with 2 customers.
preemptive=TRUE. Arrivals in the server can be preempted on a
seize()has three basic properties:
priority: already present in previous versions.
priorityvalue greater than this may preempt the present
restart: whether the current task (a
timeout()activity, for instance) should be restarted if the arrival is preempted.
from_to()convenience functions (8e524cd).
branch()activity now provides attributes to its
optionfunction, as the other activities (#42).
get_mon_arrivals()returned the start/activity/end times per arrival for the whole trajectory. This behaviour remains, but additionally,
get_mon_arrivals(per_resource = TRUE)returns these times per resource, so that it is possible to retrieve queueing/system times per resource.
get_mon_*()functions accept a single simulation environment as well as a list of environments representing several replications (5ee2725). A new column (
replication) in the resulting data frame indicates the corresponding replication number.
rollback()activity (#17 and #22).
selfvisibly, instead of invisibly (#35).
from()convenience functions (29cccd2 and 7cfdd90).
add_skip_event()function to implement a more flexible and user-friendly branching method.
narrivals beforehand, this release leverages the concept of generator of arrivals, which is faster and more flexible. At the same time, the concept of trajectory as a chain of activities is implemented entirely in C++ internally. Our tests show that simmer is even faster than SimPy when it comes to simulate queueing networks.