diff --git a/crates/bitcell-ca/benches/ca_benchmarks.rs b/crates/bitcell-ca/benches/ca_benchmarks.rs
index c679c0e..d0381e9 100644
--- a/crates/bitcell-ca/benches/ca_benchmarks.rs
+++ b/crates/bitcell-ca/benches/ca_benchmarks.rs
@@ -1,47 +1,45 @@
use criterion::{black_box, criterion_group, criterion_main, Criterion, BenchmarkId};
-use bitcell_ca::{Grid, Glider, GliderPattern, Battle, Position};
+use bitcell_ca::{Grid, Glider, GliderPattern, Battle, Position, Cell};
+use bitcell_ca::rules::evolve_grid;
fn grid_creation_benchmark(c: &mut Criterion) {
c.bench_function("grid_1024x1024_creation", |b| {
- b.iter(|| Grid::new(black_box(1024), black_box(1024)))
+ b.iter(|| Grid::new())
});
}
fn grid_evolution_benchmark(c: &mut Criterion) {
- let mut group = c.benchmark_group("grid_evolution");
-
- for size in [256, 512, 1024].iter() {
- group.bench_with_input(BenchmarkId::from_parameter(size), size, |b, &size| {
- let mut grid = Grid::new(size, size);
- // Add some initial patterns
- grid.set_cell(100, 100, 128);
- grid.set_cell(100, 101, 128);
- grid.set_cell(101, 100, 128);
-
- b.iter(|| {
- let mut g = grid.clone();
- g.step();
- });
+ let mut grid = Grid::new();
+ // Add some initial patterns
+ grid.set(Position::new(100, 100), Cell::alive(128));
+ grid.set(Position::new(100, 101), Cell::alive(128));
+ grid.set(Position::new(101, 100), Cell::alive(128));
+
+ c.bench_function("grid_evolution_step", |b| {
+ b.iter(|| {
+ let g = grid.clone();
+ black_box(evolve_grid(&g))
});
- }
- group.finish();
+ });
}
-fn glider_simulation_benchmark(c: &mut Criterion) {
- let mut group = c.benchmark_group("glider_simulation");
-
+fn glider_creation_benchmark(c: &mut Criterion) {
+ let mut group = c.benchmark_group("glider_creation");
+
let patterns = vec![
("Standard", GliderPattern::Standard),
("Lightweight", GliderPattern::Lightweight),
("Middleweight", GliderPattern::Middleweight),
("Heavyweight", GliderPattern::Heavyweight),
];
-
+
for (name, pattern) in patterns {
group.bench_with_input(BenchmarkId::from_parameter(name), &pattern, |b, pattern| {
b.iter(|| {
let glider = Glider::new(*pattern, Position::new(100, 100));
- let _ = glider.spawn_on_grid(black_box(&mut Grid::new(512, 512)));
+ let mut grid = Grid::new();
+ grid.set_pattern(glider.position, &glider.cells());
+ black_box(grid)
});
});
}
@@ -49,51 +47,40 @@ fn glider_simulation_benchmark(c: &mut Criterion) {
}
fn battle_simulation_benchmark(c: &mut Criterion) {
- c.bench_function("battle_1000_steps", |b| {
+ c.bench_function("battle_simulation", |b| {
let glider_a = Glider::new(GliderPattern::Heavyweight, Position::new(200, 200));
let glider_b = Glider::new(GliderPattern::Standard, Position::new(800, 800));
let battle = Battle::new(glider_a, glider_b);
-
+
b.iter(|| {
- let mut b = battle.clone();
- black_box(b.simulate().unwrap())
+ let b = battle.clone();
+ black_box(b.simulate())
});
});
}
fn parallel_grid_evolution_benchmark(c: &mut Criterion) {
- let mut group = c.benchmark_group("parallel_evolution");
-
- let mut grid = Grid::new(1024, 1024);
+ let mut grid = Grid::new();
// Add scattered patterns for realistic parallel workload
for i in 0..10 {
for j in 0..10 {
- grid.set_cell(i * 100, j * 100, 200);
+ grid.set(Position::new(i * 100, j * 100), Cell::alive(200));
}
}
-
- group.bench_function("sequential_step", |b| {
- b.iter(|| {
- let mut g = grid.clone();
- g.step();
- });
- });
-
- group.bench_function("parallel_step", |b| {
+
+ c.bench_function("parallel_evolution_step", |b| {
b.iter(|| {
- let mut g = grid.clone();
- g.step(); // step() uses rayon internally
+ let g = grid.clone();
+ black_box(evolve_grid(&g))
});
});
-
- group.finish();
}
criterion_group!(
benches,
grid_creation_benchmark,
grid_evolution_benchmark,
- glider_simulation_benchmark,
+ glider_creation_benchmark,
battle_simulation_benchmark,
parallel_grid_evolution_benchmark
);
diff --git a/crates/bitcell-state/src/storage.rs b/crates/bitcell-state/src/storage.rs
index 79c9395..884f3e0 100644
--- a/crates/bitcell-state/src/storage.rs
+++ b/crates/bitcell-state/src/storage.rs
@@ -47,10 +47,10 @@ impl StorageManager {
}
/// Store a block header
- pub fn store_header(&self, height: u64, hash: &[u8], header: &[u8]) -> Result<(), rocksdb::Error> {
+ pub fn store_header(&self, height: u64, hash: &[u8], header: &[u8]) -> Result<(), String> {
let cf = self.db.cf_handle(CF_HEADERS)
- .ok_or_else(|| rocksdb::Error::new("Column family not found".to_string()))?;
-
+ .ok_or_else(|| "Headers column family not found".to_string())?;
+
let mut batch = WriteBatch::default();
// Store by height
batch.put_cf(cf, height.to_be_bytes(), header);
@@ -58,49 +58,49 @@ impl StorageManager {
batch.put_cf(cf, hash, header);
// Update chain index
let index_cf = self.db.cf_handle(CF_CHAIN_INDEX)
- .ok_or_else(|| rocksdb::Error::new("Column family not found".to_string()))?;
+ .ok_or_else(|| "Chain index column family not found".to_string())?;
batch.put_cf(index_cf, b"latest_height", height.to_be_bytes());
batch.put_cf(index_cf, b"latest_hash", hash);
-
- self.db.write(batch)
+
+ self.db.write(batch).map_err(|e| e.to_string())
}
/// Store a full block
- pub fn store_block(&self, hash: &[u8], block: &[u8]) -> Result<(), rocksdb::Error> {
+ pub fn store_block(&self, hash: &[u8], block: &[u8]) -> Result<(), String> {
let cf = self.db.cf_handle(CF_BLOCKS)
- .ok_or_else(|| rocksdb::Error::new("Column family not found".to_string()))?;
- self.db.put_cf(cf, hash, block)
+ .ok_or_else(|| "Blocks column family not found".to_string())?;
+ self.db.put_cf(cf, hash, block).map_err(|e| e.to_string())
}
/// Get block by hash
- pub fn get_block(&self, hash: &[u8]) -> Result