Skip to content

Commit

Permalink
fix resources to properly reset initial parameters, closes #325
Browse files Browse the repository at this point in the history
  • Loading branch information
Enchufa2 committed Sep 27, 2024
1 parent bf93de6 commit 43893be
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 16 deletions.
2 changes: 1 addition & 1 deletion DESCRIPTION
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Package: simmer
Type: Package
Title: Discrete-Event Simulation for R
Version: 4.4.6.6
Version: 4.4.6.7
Authors@R: c(
person("Iñaki", "Ucar", email="[email protected]",
role=c("aut", "cph", "cre"), comment=c(ORCID="0000-0001-6403-5550")),
Expand Down
3 changes: 2 additions & 1 deletion NEWS.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# simmer devel

- Fix `set_source()` to avoid leaking arrivals from the old source (#322).
- Fix sources to properly restore distributions and trajectories (#324).
- Fix sources to properly reset distributions and trajectories (#324).
- Fix resources to properly reset initial parameters (#325).

# simmer 4.4.6.4

Expand Down
12 changes: 7 additions & 5 deletions R/simmer-methods.R
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Copyright (C) 2014-2015 Bart Smeets
# Copyright (C) 2015-2016 Bart Smeets and Iñaki Ucar
# Copyright (C) 2016-2022 Iñaki Ucar
# Copyright (C) 2016-2024 Iñaki Ucar
#
# This file is part of simmer.
#
Expand Down Expand Up @@ -317,12 +317,12 @@ add_resource.simmer <- function(.env, name, capacity=1, queue_size=Inf, mon=TRUE

if (inherits(capacity, "schedule")) {
capacity_schedule <- capacity
capacity <- capacity_schedule$schedule$init
capacity <- NA
} else capacity_schedule <- NA

if (inherits(queue_size, "schedule")) {
queue_size_schedule <- queue_size
queue_size <- queue_size_schedule$schedule$init
queue_size <- NA
} else queue_size_schedule <- NA

for (i in name) {
Expand All @@ -332,12 +332,14 @@ add_resource.simmer <- function(.env, name, capacity=1, queue_size=Inf, mon=TRUE
if (ret) .env$resources[[i]] <- c(mon=mon, preemptive=preemptive)

if (inherits(capacity_schedule, "schedule"))
add_resource_manager_(.env$sim_obj, i, "capacity", positive(capacity),
add_resource_manager_(.env$sim_obj, i, "capacity",
positive(capacity_schedule$schedule$init),
capacity_schedule$schedule$intervals,
capacity_schedule$schedule$values,
capacity_schedule$schedule$period)
if (inherits(queue_size_schedule, "schedule"))
add_resource_manager_(.env$sim_obj, i, "queue_size", positive(queue_size),
add_resource_manager_(.env$sim_obj, i, "queue_size",
positive(queue_size_schedule$schedule$init),
queue_size_schedule$schedule$intervals,
queue_size_schedule$schedule$values,
queue_size_schedule$schedule$period)
Expand Down
14 changes: 8 additions & 6 deletions inst/include/simmer/resource.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Copyright (C) 2014-2015 Bart Smeets
// Copyright (C) 2015-2016 Bart Smeets and Iñaki Ucar
// Copyright (C) 2016-2019 Iñaki Ucar
// Copyright (C) 2016-2024 Iñaki Ucar
//
// This file is part of simmer.
//
Expand Down Expand Up @@ -41,17 +41,19 @@ namespace simmer {
Resource(Simulator* sim, const std::string& name, int mon, int capacity,
int queue_size, bool queue_size_strict, int queue_priority_min,
int queue_priority_max)
: Entity(sim, name, mon), capacity(capacity), queue_size(queue_size),
server_count(0), queue_count(0), queue_size_strict(queue_size_strict),
: Entity(sim, name, mon), capacity_(capacity), queue_size_(queue_size),
queue_size_strict(queue_size_strict),
queue_priority_min(queue_priority_min),
queue_priority_max(queue_priority_max) {}
queue_priority_max(queue_priority_max) { reset(); }

/**
* Reset the resource: server, queue
*/
void reset() {
server_count = 0;
queue_count = 0;
capacity = capacity_;
queue_size = queue_size_;
}

/**
Expand Down Expand Up @@ -169,8 +171,8 @@ namespace simmer {
virtual bool is_waiting(Arrival* arrival) const = 0;

protected:
int capacity;
int queue_size;
int capacity_, capacity;
int queue_size_, queue_size;
int server_count; /**< number of arrivals being served */
int queue_count; /**< number of arrivals waiting */
bool queue_size_strict;
Expand Down
2 changes: 1 addition & 1 deletion tests/testthat/test-simmer-generator.R
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ test_that("arrivals are correctly monitored", {
})

test_that("several generators can be attached at once", {
env <- simmer(verbose=TRUE) %>%
env <- simmer(verbose = env_verbose) %>%
add_generator(letters[1:3], trajectory(), function() 1)

expect_equal(get_sources(env), letters[1:3])
Expand Down
27 changes: 25 additions & 2 deletions tests/testthat/test-simmer-resource.R
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Copyright (C) 2015 Iñaki Ucar and Bart Smeets
# Copyright (C) 2015-2023 Iñaki Ucar
# Copyright (C) 2015-2024 Iñaki Ucar
#
# This file is part of simmer.
#
Expand Down Expand Up @@ -145,8 +145,31 @@ test_that("a big departure triggers more than one small seize from the queue", {
})

test_that("several resources can be attached at once", {
env <- simmer(verbose=TRUE) %>%
env <- simmer(verbose = env_verbose) %>%
add_resource(letters[1:3])

expect_equal(get_resources(env), letters[1:3])
})

test_that("resources are reset", {
t <- trajectory() %>%
set_capacity("res", 2) %>%
set_queue_size("res", 2)

env <- simmer(verbose = env_verbose) %>%
add_resource("res", 1, 1) %>%
add_generator("dummy", t, at(0))

expect_equal(get_capacity(env, "res"), 1)
expect_equal(get_queue_size(env, "res"), 1)

run(env)

expect_equal(get_capacity(env, "res"), 2)
expect_equal(get_queue_size(env, "res"), 2)

reset(env)

expect_equal(get_capacity(env, "res"), 1)
expect_equal(get_queue_size(env, "res"), 1)
})

0 comments on commit 43893be

Please sign in to comment.