#events #distributed #discrete #numbers #conservative #nested

dvcompute_cons

离散事件模拟库(保守分布式模拟)

4 个稳定版本

2.0.0 2024年6月29日
1.3.5 2022年1月12日
1.3.4 2022年1月6日
1.3.3 2022年1月5日

#87模拟

26 每月下载量
3 crates 中使用

MPL-2.0 许可证

625KB
15K SLoC

dvcompute_cons

此 crate 是离散事件模拟框架 DVCompute Simulator 的一部分(Rospatent 注册号 2021660590)。该 dvcompute_cons crate 用于保守分布式模拟,但与用于顺序模拟的 dvcompute crate 共享相同的代码库。

以下是一些主要 crate:dvcompute(顺序模拟)、dvcompute_dist(乐观分布式模拟)、dvcompute_cons(保守分布式模拟)和 dvcompute_branch(嵌套模拟)。所有四个 crate 都非常相似。它们基于相同的方法。

需求

在保守分布式模拟的情况下,当启动模拟模型的可执行文件时,操作系统应能够找到 dvcompute_mpidvcompute_core_cons 动态(共享)库。

您可以从 源代码 中构建自己的 dvcompute_mpi 库,这些源代码需要 CMake、C++ 编译器和您打算使用的某些 MPI 实现。

但是,dvcompute_core_cons 动态库必须满足预定义的二进制接口(它必须实现事件队列)。您可以请求作者提供实现此接口的预构建版本。此预构建版本是 DVCompute Simulator 的“可分发代码”部分。

模拟方法

主要思想是使用延续来模拟不连续过程。这样的延续本身被包裹在 monad 中,对于这个 monad,有易于使用的组合子。这个想法受到两个来源的启发:(1)在引入 async/await 语法之前 Rust 中的未来组合子;(2)我之前用 Haskell 开发的 Aivika 模拟库。

以下是一个定义机器故障后进行维修的模型的示例

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()
}

这些计算通过 monadic bind 结合在一起。这些计算应该稍后运行以生效。

示例

您可以在作者的 仓库 中找到示例。

文档

教程

您还可以阅读PDF文档 DVCompute 模拟器教程

参考文献

  • Sorokin David. DVCompute 模拟器用于离散事件模拟。应用信息学=应用信息学杂志,2021年,第16卷,第3期,第93-108页(俄语)。DOI: 10.37791/2687-0649-2021-16-3-93-108

许可协议

版权所有 2020-2024 David Sorokin [email protected],俄罗斯尤什卡尔-奥拉

本软件受Mozilla公共许可证第2.0版的约束。如果本文件未附带MPL副本,您可以在http://mozilla.org/MPL/2.0/获取一份。

依赖项

~1.7–2.6MB
~50K SLoC