Crates.io | dvcompute_cons |
lib.rs | dvcompute_cons |
version | 2.0.0 |
source | src |
created_at | 2022-01-05 11:09:47.657749 |
updated_at | 2024-06-29 10:43:05.157423 |
description | Discrete event simulation library (conservative distributed simulation) |
homepage | https://gitflic.ru/project/dsorokin/dvcompute |
repository | https://gitflic.ru/project/dsorokin/dvcompute |
max_upload_size | |
id | 508320 |
size | 548,294 |
This crate is a part of discrete event simulation framework DVCompute Simulator (registration
number 2021660590 of Rospatent). The dvcompute_cons
crate is destined for conservative
distributed simulation, but the same code base is shared by the dvcompute
crate destined for sequential simulation.
There are the following main crates: dvcompute
(sequential simulation),
dvcompute_dist
(optimistic distributed simulation),
dvcompute_cons
(conservative distributed simulation) and
dvcompute_branch
(nested simulation). All four crates are
very close. They are based on the same method.
In case of conservative distributed simulation, it is expected that the dvcompute_mpi
and dvcompute_core_cons
dynamic (shared) libraries can be found by the operating system, when
launching the executable file of the simulation model.
You can build the dvcompute_mpi
library yourself from the
sources
that require CMake, C++ compiler and some MPI implementation that you are going to use.
But the dvcompute_core_cons
dynamic library must satisfy the predefined binary
interface (it must implement the event queue). You can request the author for
the pebuilt version that implements this interface. This prebuilt version is
a part of "Redistributable Code" portions of DVCompute Simulator.
The main idea is to use continuations for modeling discontinuous processes. Such continuations are themselves wrapped in the monad, for which there are easy-to-use combinators. This idea is inspired by two sources: (1) combinators for futures that were in Rust before introducing the async/await syntax and (2) the Aivika simulation library that I developed in Haskell before.
Here is an example that defines a model of the machine that breaks down and then it is repaired:
const UP_TIME_MEAN: f64 = 1.0;
const REPAIR_TIME_MEAN: f64 = 0.5;
fn machine_process(total_up_time: Grc<RefComp<f64>>) -> ProcessBox<()> {
let total_up_time2 = total_up_time.clone();
random_exponential_process(UP_TIME_MEAN)
.and_then(move |up_time| {
RefComp::modify(total_up_time, move |total_up_time| {
total_up_time + up_time
})
.into_process()
.and_then(move |()| {
random_exponential_process_(REPAIR_TIME_MEAN)
})
.and_then(move |()| {
machine_process(total_up_time2)
})
})
.into_boxed()
}
These computations are combined with help of the monadic bind. Such computations should be run later to take effect.
You can find examples in the author's repository.
Also you can read the PDF document DVCompute Simulator Tutorial.
Copyright 2020-2024 David Sorokin davsor@mail.ru, based in Yoshkar-Ola, Russia
This software is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.