parallel simulation of economies

This commit is contained in:
Christof Petig 2022-03-19 15:51:07 +01:00
parent 96c5d17460
commit aeac483bac
3 changed files with 19 additions and 5 deletions

View File

@ -1,3 +1,4 @@
use rayon::prelude::*;
use std::{
cmp::{Eq, Ord, Ordering, PartialEq, PartialOrd},
fmt, hash,
@ -85,6 +86,15 @@ impl<T> Store<T> {
}
}
impl<T: Send + Sync> Store<T> {
pub fn par_iter_mut(&mut self) -> impl ParallelIterator<Item = (Id<T>, &mut T)> {
self.items
.par_iter_mut()
.enumerate()
.map(|(idx, obj)| (Id(idx as u64, PhantomData), obj))
}
}
impl<T> Index<Id<T>> for Store<T> {
type Output = T;

View File

@ -9,6 +9,7 @@ use crate::{
},
Index,
};
use rayon::prelude::*;
use tracing::{debug, info};
const TICK_PERIOD: f32 = 3.0 * DAYS_PER_MONTH; // 3 months
@ -236,19 +237,20 @@ fn check_money(index: &mut Index) {
);
}
pub fn tick(index: &mut Index, _world: &mut WorldSim, dt: f32, mut vc: vergleich::Context) {
pub fn tick(index: &mut Index, _world: &mut WorldSim, dt: f32, _vc: vergleich::Context) {
if INTER_SITE_TRADE {
// move deliverables to recipient cities
for (id, deliv) in index.trade.deliveries.drain() {
index.sites.get_mut(id).economy.deliveries.extend(deliv);
}
}
for (site_id, site) in index.sites.iter_mut() {
index.sites.par_iter_mut().for_each(|(site_id, site)| {
if site.do_economic_simulation() {
site.economy
.tick(site_id, dt, vc.context(&site_id.id().to_string()));
site.economy.tick(site_id, dt, vergleich::Context::dummy());
// helpful for debugging but not compatible with parallel execution
// vc.context(&site_id.id().to_string()));
}
}
});
if INTER_SITE_TRADE {
// distribute orders (travelling merchants)
for (_id, site) in index.sites.iter_mut() {

View File

@ -43,6 +43,8 @@ pub mod vergleich {
pub fn context(&mut self, _: &str) -> Context { Context {} }
pub fn value(&mut self, _: &str, val: f32) -> f32 { val }
pub fn dummy() -> Self { Context {} }
}
}