From b94d001ab28be3a1f1b67280776491f63c69ab5e Mon Sep 17 00:00:00 2001 From: Joshua Coles Date: Wed, 8 Mar 2023 16:32:53 +0000 Subject: [PATCH] Fix issues with big sizes, really I should be using a different storage mechanism for large sizes I think --- libdla.h | 15 +-- src/cli/output.rs | 7 +- src/clib.rs | 150 +++++++++++++++------------- src/system/spaces/square_grid.rs | 15 +-- src/system/spaces/vector_storage.rs | 2 +- 5 files changed, 90 insertions(+), 99 deletions(-) diff --git a/libdla.h b/libdla.h index fc72b24..62322e1 100644 --- a/libdla.h +++ b/libdla.h @@ -4,21 +4,8 @@ #include #include -struct CStorage; - -struct CPosition { - int32_t _0; - int32_t _1; -}; - extern "C" { -CStorage *storage_new(uint32_t grid_size); - -bool storage_at(const CStorage *storage, int32_t i, int32_t j); - -void storage_deposit(CStorage *storage, int32_t i, int32_t j, uint8_t val); - -CPosition walk(uint32_t d, int32_t i, int32_t j); +bool dla_rust_disabled(); } // extern "C" diff --git a/src/cli/output.rs b/src/cli/output.rs index f5e32b9..eb9abbb 100644 --- a/src/cli/output.rs +++ b/src/cli/output.rs @@ -39,11 +39,6 @@ fn write_csv_positions, W: Walker

, Sp: Spa fn write_json_full_data, W: Walker

, Sp: Spawner

, St: Sticker>(sys: &DLASystem, output_path: &Path) { let file = File::create(output_path).expect("Failed to open file"); - let vec: Vec

= sys.history - .iter() - .map(|l| l.position.clone()) - .collect(); - - serde_json::to_writer(file, &vec) + serde_json::to_writer(file, &sys.history) .expect("Failed to write json"); } diff --git a/src/clib.rs b/src/clib.rs index e03aa75..1790dbf 100644 --- a/src/clib.rs +++ b/src/clib.rs @@ -1,75 +1,81 @@ -#![feature(array_zip)] - -use system::Storage; -use crate::system::grid::{Pos2D, VectorStorage}; - -mod system; - -#[derive(Eq, PartialEq, Debug)] -#[repr(C)] -pub struct CPosition(i32, i32); - -pub struct CStorage(VectorStorage); - #[no_mangle] -pub extern "C" fn storage_new(grid_size: u32) -> &'static mut CStorage { - let mut pntr = Box::new(CStorage(VectorStorage::new(grid_size))); - Box::leak(pntr) +pub extern "C" fn dla_rust_disabled() -> bool { + true } -#[no_mangle] -pub extern "C" fn storage_at(storage: &CStorage, i: i32, j: i32) -> bool { - storage.0.at(&Pos2D { x: i, y: j }) -} - -#[no_mangle] -pub extern "C" fn storage_deposit(storage: &mut CStorage, i: i32, j: i32, val: u8) { - storage.0.write(&Pos2D { x: i, y: j }, val == 1); -} - -#[no_mangle] -pub extern "C" fn walk(d: u32, i: i32, j: i32) -> CPosition { - return test::b(d, i, j); -} - -mod test { - use num_integer::Integer; - use crate::CPosition; - use crate::system::grid::Pos2D; - - pub(crate) fn a(d: u32, i: i32, j: i32) -> CPosition { - match d { - 0 => CPosition(i + 1, j), - 1 => CPosition(i - 1, j), - 2 => CPosition(i, j + 1), - 3 => CPosition(i, j - 1), - _ => panic!("Ahh"), - } - } - - pub(crate) fn b(d: u32, i: i32, j: i32) -> CPosition { - let (dim, sign) = d.div_rem(&2); - let sign = if sign == 0 { 1 } else { -1 }; - // HACK: Our conventin and the MVA are different, since we are trying to strangle fig this, quick hack. - let offset = Pos2D::in_direction(dim, sign); - let next = Pos2D { x: i, y: j } + offset; - - CPosition(next.x, next.y) - } - - #[test] - fn test() { - let d = [0, 1, 2, 3]; - d.iter() - .map(|d| d.div_rem(&2)) - .for_each(|p| println!("{p:?}")); - } - - #[test] - fn alignment() { - let d = [0, 1, 2, 3]; - d.iter() - .map(|d| (a(*d, 0, 0), b(*d, 0, 0))) - .for_each(|p| assert_eq!(p.0, p.1)); - } -} +// #![feature(array_zip)] +// +// use system::Storage; +// use crate::system::spaces::square_grid::Grid2D; +// use crate::system::spaces::VectorStorage; +// +// mod system; +// +// #[derive(Eq, PartialEq, Debug)] +// #[repr(C)] +// pub struct CPosition(i32, i32); +// +// pub struct CStorage(VectorStorage); +// +// #[no_mangle] +// pub extern "C" fn storage_new(grid_size: u32) -> &'static mut CStorage { +// let mut pntr = Box::new(CStorage(VectorStorage::new(grid_size))); +// Box::leak(pntr) +// } +// +// #[no_mangle] +// pub extern "C" fn storage_at(storage: &CStorage, i: i32, j: i32) -> bool { +// storage.0.at(&Grid2D { x: i, y: j }) +// } +// +// #[no_mangle] +// pub extern "C" fn storage_deposit(storage: &mut CStorage, i: i32, j: i32, val: u8) { +// storage.0.inner.(&Grid2D { x: i, y: j }, val == 1); +// } +// +// #[no_mangle] +// pub extern "C" fn walk(d: u32, i: i32, j: i32) -> CPosition { +// return test::b(d, i, j); +// } +// +// // mod test { +// // use num_integer::Integer; +// // use crate::CPosition; +// // use crate::system::grid::Grid2D; +// // +// // pub(crate) fn a(d: u32, i: i32, j: i32) -> CPosition { +// // match d { +// // 0 => CPosition(i + 1, j), +// // 1 => CPosition(i - 1, j), +// // 2 => CPosition(i, j + 1), +// // 3 => CPosition(i, j - 1), +// // _ => panic!("Ahh"), +// // } +// // } +// // +// // pub(crate) fn b(d: u32, i: i32, j: i32) -> CPosition { +// // let (dim, sign) = d.div_rem(&2); +// // let sign = if sign == 0 { 1 } else { -1 }; +// // // HACK: Our conventin and the MVA are different, since we are trying to strangle fig this, quick hack. +// // let offset = Grid2D::in_direction(dim, sign); +// // let next = Grid2D { x: i, y: j } + offset; +// // +// // CPosition(next.x, next.y) +// // } +// // +// // #[test] +// // fn test() { +// // let d = [0, 1, 2, 3]; +// // d.iter() +// // .map(|d| d.div_rem(&2)) +// // .for_each(|p| println!("{p:?}")); +// // } +// // +// // #[test] +// // fn alignment() { +// // let d = [0, 1, 2, 3]; +// // d.iter() +// // .map(|d| (a(*d, 0, 0), b(*d, 0, 0))) +// // .for_each(|p| assert_eq!(p.0, p.1)); +// // } +// // } diff --git a/src/system/spaces/square_grid.rs b/src/system/spaces/square_grid.rs index 1f61b69..0d3ca85 100644 --- a/src/system/spaces/square_grid.rs +++ b/src/system/spaces/square_grid.rs @@ -140,16 +140,19 @@ impl GriddedPosition for Grid3D { assert!(self.y < grid_size && -(grid_size) < self.y); assert!(self.z < grid_size && -(grid_size) < self.z); - let x = (self.x + (grid_size) / 2) as usize; - let y = (self.y + (grid_size) / 2) as usize; - let z = (self.z + (grid_size) / 2) as usize; + let half_grid = (grid_size) / 2; + let x = (self.x + half_grid) as usize; + let y = (self.y + half_grid) as usize; + let z = (self.z + half_grid) as usize; + + let grid_size_usize = grid_size as usize; let linear_index = - (grid_size as usize * grid_size as usize) * z - + (grid_size as usize) * y + (grid_size_usize * grid_size_usize) * z + + (grid_size_usize) * y + x; - if linear_index >= (grid_size * grid_size * grid_size) as usize { + if linear_index >= (grid_size_usize * grid_size_usize * grid_size_usize) as usize { eprintln!("AHHH SOMETHING WENT WRONG {:?} gives {}", self, linear_index); } diff --git a/src/system/spaces/vector_storage.rs b/src/system/spaces/vector_storage.rs index 2de57ab..1a08290 100644 --- a/src/system/spaces/vector_storage.rs +++ b/src/system/spaces/vector_storage.rs @@ -8,7 +8,7 @@ pub struct VectorStorage { impl VectorStorage { pub fn new(grid_size: u32, dimension: u32) -> VectorStorage { - VectorStorage { grid_size, dimension, backing: vec![false; grid_size.pow(dimension) as usize] } + VectorStorage { grid_size, dimension, backing: vec![false; (grid_size as usize).pow(dimension) as usize] } } }