Activities for seizing/releasing a resource, by name or a previously selected one. Resources must be defined in the simulation environment (see add_resource).

seize(.trj, resource, amount = 1, continue = NULL, post.seize = NULL,
  reject = NULL)

seize_selected(.trj, amount = 1, id = 0, continue = NULL,
  post.seize = NULL, reject = NULL)

release(.trj, resource, amount = 1)

release_selected(.trj, amount = 1, id = 0)

release_all(.trj, resource)

release_selected_all(.trj, id = 0)

Arguments

.trj

the trajectory object.

resource

the name of the resource.

amount

the amount to seize/release, accepts either a numeric or a callable object (a function) which must return a numeric.

continue

a boolean (if post.seize OR reject is defined) or a pair of booleans (if post.seize AND reject are defined; if only one value is provided, it will be recycled) to indicate whether these subtrajectories should continue to the next activity in the main trajectory.

post.seize

an optional trajectory object which will be followed after a successful seize.

reject

an optional trajectory object which will be followed if the arrival is rejected (dropped).

id

selection identifier for nested usage.

Value

Returns the trajectory object.

Details

Rejection happens when a resource is at full capacity and there is no room in the queue (either because there is a finite queue_size and it is full, or because queue_size=0 and thus it is disabled). In those cases, the reject parameter defines a fallback trajectory. Note, however, that, if the arrival is accepted (either in the queue or in the server) and then it is dropped afterwards due to preemption or resource shrinkage, then this trajectory will not be executed. Instead, see handle_unfinished for another, more general, method for handling all kinds of unfinished arrivals.

See also

Examples

## simple seize, delay, then release traj <- trajectory() %>% seize("doctor", 1) %>% timeout(3) %>% release("doctor", 1) simmer() %>% add_resource("doctor", capacity=1) %>% add_generator("patient", traj, at(0, 1)) %>% run() %>% get_mon_resources()
#> resource time server queue capacity queue_size system limit replication #> 1 doctor 0 1 0 1 Inf 1 Inf 1 #> 2 doctor 1 1 1 1 Inf 2 Inf 1 #> 3 doctor 3 1 0 1 Inf 1 Inf 1 #> 4 doctor 6 0 0 1 Inf 0 Inf 1
## arrival rejection (no space left in the queue) traj <- trajectory() %>% log_("arriving...") %>% seize("doctor", 1) %>% # the second patient won't reach this point log_("doctor seized") %>% timeout(5) %>% release("doctor", 1) simmer() %>% add_resource("doctor", capacity=1, queue_size=0) %>% add_generator("patient", traj, at(0, 1)) %>% run() %>% invisible
#> 0: patient0: arriving... #> 0: patient0: doctor seized #> 1: patient1: arriving...
## capturing rejection to retry traj <- trajectory() %>% log_("arriving...") %>% seize( "doctor", 1, continue = FALSE, reject = trajectory() %>% log_("rejected!") %>% # go for a walk and try again timeout(2) %>% log_("retrying...") %>% rollback(amount = 4, times = Inf)) %>% # the second patient will reach this point after a couple of walks log_("doctor seized") %>% timeout(5) %>% release("doctor", 1) %>% log_("leaving") simmer() %>% add_resource("doctor", capacity=1, queue_size=0) %>% add_generator("patient", traj, at(0, 1)) %>% run() %>% invisible
#> 0: patient0: arriving... #> 0: patient0: doctor seized #> 1: patient1: arriving... #> 1: patient1: rejected! #> 3: patient1: retrying... #> 3: patient1: rejected! #> 5: patient1: retrying... #> 5: patient0: leaving #> 5: patient1: doctor seized #> 10: patient1: leaving
## combining post.seize and reject traj <- trajectory() %>% log_("arriving...") %>% seize( "doctor", 1, continue = c(TRUE, TRUE), post.seize = trajectory("admitted patient") %>% log_("admitted") %>% timeout(5) %>% release("doctor", 1), reject = trajectory("rejected patient") %>% log_("rejected!") %>% seize("nurse", 1) %>% timeout(2) %>% release("nurse", 1)) %>% # both patients will reach this point, as continue = c(TRUE, TRUE) timeout(10) %>% log_("leaving...") simmer() %>% add_resource("doctor", capacity=1, queue_size=0) %>% add_resource("nurse", capacity=10, queue_size=0) %>% add_generator("patient", traj, at(0, 1)) %>% run() %>% invisible
#> 0: patient0: arriving... #> 0: patient0: admitted #> 1: patient1: arriving... #> 1: patient1: rejected! #> 13: patient1: leaving... #> 15: patient0: leaving...