This commit is contained in:
+68
-62
@@ -1,92 +1,98 @@
|
||||
#![feature(array_zip)]
|
||||
#![feature(generic_const_exprs)]
|
||||
|
||||
use std::path::PathBuf;
|
||||
use clap::Parser;
|
||||
use rand::prelude::*;
|
||||
use crate::cli::{drive_system};
|
||||
use crate::cli::cli::{StickProbabilityCli, InitialCli, BallsCli, PCM, ModelCli};
|
||||
use crate::cli::output::write;
|
||||
use crate::system::model::DLASystem;
|
||||
use crate::system::spaces::continuous::{ContinuousSticker, ContinuousStorage, ContinuousWalker};
|
||||
use crate::system::spaces::hexagonal::HexPosition;
|
||||
use crate::system::spaces::square_grid::{Grid2D, Grid3D};
|
||||
use crate::system::spaces::VectorStorage;
|
||||
use crate::system::spawner::UniformSpawner;
|
||||
use crate::system::sticker::{ProbabilisticSticking, SimpleSticking};
|
||||
use crate::system::walker::LocalRandomWalker;
|
||||
|
||||
mod system;
|
||||
mod example_systems;
|
||||
|
||||
use clap::Parser;
|
||||
use crate::example_systems::{cont, drive_system, stick_probability, three_dimensional, write_csv, write_json};
|
||||
|
||||
#[derive(clap::ValueEnum, Clone, Debug)]
|
||||
enum PreConfiguredSystem {
|
||||
Grid2,
|
||||
Grid3,
|
||||
Hex,
|
||||
Balls,
|
||||
}
|
||||
|
||||
#[derive(Parser, Debug)]
|
||||
struct Cli {
|
||||
#[arg(value_enum, long, default_value_t = PreConfiguredSystem::Grid2)]
|
||||
mode: PreConfiguredSystem,
|
||||
|
||||
#[arg(long, default_value_t = 1600)]
|
||||
grid_size: u32,
|
||||
|
||||
#[arg(short, long)]
|
||||
max_frames: Option<usize>,
|
||||
|
||||
seed: u64,
|
||||
max_particles: usize,
|
||||
stick_probability: f32,
|
||||
output: PathBuf,
|
||||
}
|
||||
mod surface_probability_measure;
|
||||
mod cli;
|
||||
|
||||
fn main() {
|
||||
let cli = Cli::parse();
|
||||
let cli = ModelCli::parse();
|
||||
|
||||
println!("Running: {:?}", cli);
|
||||
|
||||
match cli.mode {
|
||||
PreConfiguredSystem::Grid2 => {
|
||||
let mut sys = stick_probability(
|
||||
cli.seed,
|
||||
cli.grid_size,
|
||||
match cli.preconfigured_model {
|
||||
PCM::Initial(InitialCli { grid_size }) => {
|
||||
let mut sys = DLASystem::<_, Grid2D, _, _, _, _>::new(
|
||||
SmallRng::seed_from_u64(cli.seed),
|
||||
VectorStorage::new(grid_size, 2),
|
||||
LocalRandomWalker,
|
||||
UniformSpawner,
|
||||
SimpleSticking,
|
||||
cli.max_particles,
|
||||
cli.stick_probability,
|
||||
);
|
||||
|
||||
drive_system(&mut sys, cli.max_frames);
|
||||
write_csv(&mut sys, &cli.output);
|
||||
write(&sys, cli.format, &cli.output);
|
||||
}
|
||||
|
||||
PreConfiguredSystem::Grid3 => {
|
||||
let mut sys = three_dimensional(
|
||||
cli.seed,
|
||||
cli.grid_size,
|
||||
PCM::StickProbability(StickProbabilityCli { grid_size, stick_probability }) => {
|
||||
let mut sys = DLASystem::<_, Grid2D, _, _, _, _>::new(
|
||||
SmallRng::seed_from_u64(cli.seed),
|
||||
VectorStorage::new(grid_size, 2),
|
||||
LocalRandomWalker,
|
||||
UniformSpawner,
|
||||
ProbabilisticSticking { stick_probability },
|
||||
cli.max_particles,
|
||||
cli.stick_probability,
|
||||
);
|
||||
|
||||
drive_system(&mut sys, cli.max_frames);
|
||||
|
||||
write_json(&mut sys, &cli.output);
|
||||
write(&sys, cli.format, &cli.output);
|
||||
}
|
||||
|
||||
PreConfiguredSystem::Hex => {
|
||||
let mut sys = three_dimensional(
|
||||
cli.seed,
|
||||
cli.grid_size,
|
||||
cli.max_particles,
|
||||
cli.stick_probability,
|
||||
);
|
||||
|
||||
drive_system(&mut sys, cli.max_frames);
|
||||
|
||||
write_json(&mut sys, &cli.output);
|
||||
},
|
||||
|
||||
PreConfiguredSystem::Balls => {
|
||||
let mut sys = cont(
|
||||
cli.seed,
|
||||
PCM::Grid3(StickProbabilityCli { grid_size, stick_probability }) => {
|
||||
let mut sys = DLASystem::<_, Grid3D, _, _, _, _>::new(
|
||||
SmallRng::seed_from_u64(cli.seed),
|
||||
VectorStorage::new(grid_size, 3),
|
||||
LocalRandomWalker,
|
||||
UniformSpawner,
|
||||
ProbabilisticSticking { stick_probability },
|
||||
cli.max_particles,
|
||||
);
|
||||
|
||||
drive_system(&mut sys, cli.max_frames);
|
||||
write(&sys, cli.format, &cli.output);
|
||||
}
|
||||
|
||||
write_json(&mut sys, &cli.output);
|
||||
PCM::Hex(StickProbabilityCli { grid_size, stick_probability }) => {
|
||||
let mut sys = DLASystem::<_, HexPosition, _, _, _, _>::new(
|
||||
SmallRng::seed_from_u64(cli.seed),
|
||||
VectorStorage::new(grid_size, 2),
|
||||
LocalRandomWalker,
|
||||
UniformSpawner,
|
||||
ProbabilisticSticking { stick_probability },
|
||||
cli.max_particles,
|
||||
);
|
||||
|
||||
drive_system(&mut sys, cli.max_frames);
|
||||
write(&sys, cli.format, &cli.output);
|
||||
}
|
||||
|
||||
PCM::Balls(BallsCli { ball_radius, stick_distance, walk_step }) => {
|
||||
let mut sys = DLASystem::new(
|
||||
SmallRng::seed_from_u64(cli.seed),
|
||||
ContinuousStorage { inner: kiddo::KdTree::new(), ball_radius_sq: ball_radius * ball_radius },
|
||||
ContinuousWalker { walk_step },
|
||||
UniformSpawner,
|
||||
ContinuousSticker { range_sq: stick_distance * stick_distance },
|
||||
cli.max_particles,
|
||||
);
|
||||
|
||||
drive_system(&mut sys, cli.max_frames);
|
||||
write(&sys, cli.format, &cli.output);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user