Compare commits
4 Commits
b62745adec
...
68e5d9fc3a
| Author | SHA1 | Date | |
|---|---|---|---|
|
68e5d9fc3a
|
|||
|
70354a4111
|
|||
|
56f3eae156
|
|||
|
5d574c9674
|
@@ -21,8 +21,7 @@ impl ThinGridData {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(dead_code)]
|
pub fn new_from_grid_vec(in_grids: &[Grid]) -> Vec<Self> {
|
||||||
pub fn new_from_grid_vec(in_grids: Vec<Grid>) -> Vec<Self> {
|
|
||||||
in_grids
|
in_grids
|
||||||
.iter()
|
.iter()
|
||||||
.map(|grid| Self::new_from_grid(grid))
|
.map(|grid| Self::new_from_grid(grid))
|
||||||
@@ -30,13 +29,6 @@ impl ThinGridData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// from grid.rs (needed in image gen)
|
// from grid.rs (needed in image gen)
|
||||||
#[allow(dead_code)]
|
|
||||||
pub fn data(&self) -> &[f32] {
|
|
||||||
&self.data
|
|
||||||
}
|
|
||||||
|
|
||||||
// from grid.rs (needed in image gen)
|
|
||||||
#[allow(dead_code)]
|
|
||||||
pub fn quantile(&self, fraction: f32) -> f32 {
|
pub fn quantile(&self, fraction: f32) -> f32 {
|
||||||
let index = if (fraction - 1.0_f32).abs() < f32::EPSILON {
|
let index = if (fraction - 1.0_f32).abs() < f32::EPSILON {
|
||||||
self.data.len() - 1
|
self.data.len() - 1
|
||||||
@@ -59,7 +51,7 @@ pub struct ImgData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl ImgData {
|
impl ImgData {
|
||||||
pub fn new(in_grids: Vec<ThinGridData>, in_palette: Palette) -> Self {
|
pub const fn new(in_grids: Vec<ThinGridData>, in_palette: Palette) -> Self {
|
||||||
ImgData {
|
ImgData {
|
||||||
grids: in_grids,
|
grids: in_grids,
|
||||||
palette: in_palette,
|
palette: in_palette,
|
||||||
@@ -83,7 +75,7 @@ impl ImgData {
|
|||||||
for (grid, max_value, color) in
|
for (grid, max_value, color) in
|
||||||
multizip((&self.grids, &max_values, &self.palette.colors))
|
multizip((&self.grids, &max_values, &self.palette.colors))
|
||||||
{
|
{
|
||||||
let mut t = (grid.data()[i] / max_value).clamp(0.0, 1.0);
|
let mut t = (grid.data[i] / max_value).clamp(0.0, 1.0);
|
||||||
t = t.powf(1.0 / 2.2); // gamma correction
|
t = t.powf(1.0 / 2.2); // gamma correction
|
||||||
r += color.0[0] as f32 * t;
|
r += color.0[0] as f32 * t;
|
||||||
g += color.0[1] as f32 * t;
|
g += color.0[1] as f32 * t;
|
||||||
|
|||||||
@@ -34,6 +34,5 @@ fn main() {
|
|||||||
// export saved image data
|
// export saved image data
|
||||||
println!("Rendering all saved image data....");
|
println!("Rendering all saved image data....");
|
||||||
model.render_all_imgdata();
|
model.render_all_imgdata();
|
||||||
model.flush_image_data();
|
|
||||||
println!("Done!");
|
println!("Done!");
|
||||||
}
|
}
|
||||||
|
|||||||
25
src/model.rs
25
src/model.rs
@@ -13,8 +13,8 @@ use std::{path::Path, time::Instant};
|
|||||||
|
|
||||||
// Top-level simulation class.
|
// Top-level simulation class.
|
||||||
pub struct Model {
|
pub struct Model {
|
||||||
// The grid they move on.
|
// per-population grid (one for each population)
|
||||||
grids: Vec<Grid>,
|
population_grids: Vec<Grid>,
|
||||||
|
|
||||||
// Attraction table governs interaction across populations
|
// Attraction table governs interaction across populations
|
||||||
attraction_table: Vec<Vec<f32>>,
|
attraction_table: Vec<Vec<f32>>,
|
||||||
@@ -39,7 +39,7 @@ impl Model {
|
|||||||
const REPULSION_FACTOR_STD: f32 = 0.1;
|
const REPULSION_FACTOR_STD: f32 = 0.1;
|
||||||
|
|
||||||
pub fn print_configurations(&self) {
|
pub fn print_configurations(&self) {
|
||||||
for (i, grid) in self.grids.iter().enumerate() {
|
for (i, grid) in self.population_grids.iter().enumerate() {
|
||||||
println!("Grid {}: {}", i, grid.config);
|
println!("Grid {}: {}", i, grid.config);
|
||||||
}
|
}
|
||||||
println!("Attraction table: {:#?}", self.attraction_table);
|
println!("Attraction table: {:#?}", self.attraction_table);
|
||||||
@@ -84,7 +84,7 @@ impl Model {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Model {
|
Model {
|
||||||
grids,
|
population_grids: grids,
|
||||||
attraction_table,
|
attraction_table,
|
||||||
diffusivity,
|
diffusivity,
|
||||||
iteration: 0,
|
iteration: 0,
|
||||||
@@ -108,14 +108,18 @@ impl Model {
|
|||||||
let mut time_per_agent_list: Vec<f64> = Vec::new();
|
let mut time_per_agent_list: Vec<f64> = Vec::new();
|
||||||
let mut time_per_step_list: Vec<f64> = Vec::new();
|
let mut time_per_step_list: Vec<f64> = Vec::new();
|
||||||
|
|
||||||
let agents_num: usize = self.grids.iter().map(|grid| grid.agents.len()).sum();
|
let agents_num: usize = self
|
||||||
|
.population_grids
|
||||||
|
.iter()
|
||||||
|
.map(|grid| grid.agents.len())
|
||||||
|
.sum();
|
||||||
(0..steps).for_each(|_| {
|
(0..steps).for_each(|_| {
|
||||||
// Combine grids
|
// Combine grids
|
||||||
combine(&mut self.grids, &self.attraction_table);
|
combine(&mut self.population_grids, &self.attraction_table);
|
||||||
let agents_tick_time = Instant::now();
|
let agents_tick_time = Instant::now();
|
||||||
|
|
||||||
// Tick agents
|
// Tick agents
|
||||||
self.grids.par_iter_mut().for_each(|grid| {
|
self.population_grids.par_iter_mut().for_each(|grid| {
|
||||||
grid.tick();
|
grid.tick();
|
||||||
grid.diffuse(self.diffusivity); // Diffuse + Decay
|
grid.diffuse(self.diffusivity); // Diffuse + Decay
|
||||||
});
|
});
|
||||||
@@ -144,7 +148,7 @@ impl Model {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn save_image_data(&mut self) {
|
fn save_image_data(&mut self) {
|
||||||
let grids = ThinGridData::new_from_grid_vec(self.grids.clone());
|
let grids = ThinGridData::new_from_grid_vec(&self.population_grids);
|
||||||
let img_data = ImgData::new(grids, self.palette);
|
let img_data = ImgData::new(grids, self.palette);
|
||||||
self.img_data_vec.push((self.iteration + 1, img_data));
|
self.img_data_vec.push((self.iteration + 1, img_data));
|
||||||
let size: usize = std::mem::size_of_val(&self.img_data_vec);
|
let size: usize = std::mem::size_of_val(&self.img_data_vec);
|
||||||
@@ -159,14 +163,9 @@ impl Model {
|
|||||||
self.img_data_vec.len()
|
self.img_data_vec.len()
|
||||||
);
|
);
|
||||||
self.render_all_imgdata();
|
self.render_all_imgdata();
|
||||||
self.flush_image_data();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn flush_image_data(&mut self) {
|
|
||||||
self.img_data_vec.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn render_all_imgdata(&mut self) {
|
pub fn render_all_imgdata(&mut self) {
|
||||||
if !Path::new("./tmp").exists() {
|
if !Path::new("./tmp").exists() {
|
||||||
std::fs::create_dir("./tmp").expect("could create directory");
|
std::fs::create_dir("./tmp").expect("could create directory");
|
||||||
|
|||||||
Reference in New Issue
Block a user