#计算 #进程 #事件 #嵌套 #离散 #建模

dvcompute_branch

离散事件模拟库(嵌套模拟)

5 个稳定版本

2.0.0 2024年6月29日
1.3.7 2022年1月16日
1.3.5 2022年1月13日
1.3.4 2022年1月6日
1.3.3 2022年1月5日

#130模拟

每月 24 次下载
3 crate 中使用

MPL-2.0 许可证

665KB
16K SLoC

dvcompute_branch

此crate是离散事件模拟框架DVCompute Simulator(Rospatent注册号2021660590)的一部分。dvcompute_branch crate用于嵌套模拟,但与用于乐观分布式模拟的dvcompute_dist crate共享相同的代码库。

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

模拟方法

主要思想是使用连续性来模拟不连续过程。这种连续性本身被包装在单子中,对于这种单子有易于使用的组合子。这个想法受到了两个来源的启发:(1) 在引入async/await语法之前存在于Rust中的future组合子;(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()
}

这些计算是通过单子绑定结合的。这些计算应该在稍后运行以产生效果。

示例

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

文档

教程

您还可以阅读PDF文档DVCompute Simulator教程

参考文献

  • Sorokin David. DVCompute Simulator for discrete event simulation. Prikladnaya informatika=Journal of Applied Informatics, 2021, vol.16, no.3, pp.93-108 (in Russian). 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/获取一个副本。

依赖项

~0–600KB
~10K SLoC