+/** @param n The number of instances to add to this Task (>=0).
+ * @note Instances goes always from instance_0 to instance_x,
+ * where x is the current number of instance.
+ */
+void Task::add_instances(int n)
+{
+ xbt_assert(n >= 0, "Cannot add a negative number of instances (provided: %d)", n);
+ int instance_count = (int)amount_.size() - 2;
+ for (int i = instance_count; i < n + instance_count; i++) {
+ amount_["instance_" + std::to_string(i)] = amount_.at("instance_0");
+ queued_firings_["instance_" + std::to_string(i)] = 0;
+ running_instances_["instance_" + std::to_string(i)] = 0;
+ count_["instance_" + std::to_string(i)] = 0;
+ parallelism_degree_["instance_" + std::to_string(i)] = parallelism_degree_.at("instance_0");
+ current_activities_["instance_" + std::to_string(i)] = {};
+ internal_bytes_to_send_["instance_" + std::to_string(i)] = internal_bytes_to_send_.at("instance_0");
+ ;
+ }
+}
+
+/** @param n The number of instances to remove from this Task (>=0).
+ * @note Instances goes always from instance_0 to instance_x,
+ * where x is the current number of instance.
+ * Running instances cannot be removed.
+ */
+void Task::remove_instances(int n)
+{
+ int instance_count = (int)amount_.size() - 2;
+ xbt_assert(n >= 0, "Cannot remove a negative number of instances (provided: %d)", n);
+ xbt_assert(instance_count - n > 0, "The number of instances must be above 0 (instances: %d, provided: %d)",
+ instance_count, n);
+ for (int i = instance_count - 1; i >= instance_count - n; i--) {
+ xbt_assert(running_instances_.at("instance_" + std::to_string(i)) == 0,
+ "Cannot remove a running instance (instances: %d)", i);
+ amount_.erase("instance_" + std::to_string(i));
+ queued_firings_.erase("instance_" + std::to_string(i));
+ running_instances_.erase("instance_" + std::to_string(i));
+ count_.erase("instance_" + std::to_string(i));
+ parallelism_degree_.erase("instance_" + std::to_string(i));
+ current_activities_.erase("instance_" + std::to_string(i));
+ }
+}
+