From 492045e538cf806bb49631dfbbaabbd8b566147e Mon Sep 17 00:00:00 2001 From: natrixaeria Date: Sun, 5 Jan 2020 22:28:25 +0100 Subject: Generate permutaitons and bitmasks --- src/lib.rs | 1 + src/main.rs | 12 ++++++++++-- src/solvers/gpusolver.rs | 28 ++++++++++++++++++++++++++-- src/structs.rs | 1 + 4 files changed, 38 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs index 5c239cc..9c73567 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +mod permutations; pub mod solver; pub mod solvers; pub mod structs; diff --git a/src/main.rs b/src/main.rs index a59f553..178664f 100755 --- a/src/main.rs +++ b/src/main.rs @@ -5,8 +5,16 @@ mod structs; #[macro_use] pub extern crate lazy_static; +use crate::solver::{Solver, IteratorSolver}; + pub static N: u32 = 8; fn main() { - let mut solver = solvers::intuitive::NormalSolver::new(N); - solver.solve(); + //let mut solver = solvers::intuitive::NormalSolver::new(N); + //solver.solve(); + + let mut solver = solvers::gpusolver::GpuSolver::new(N); + println!("solver: {:?}", solver); + for (i, solution) in solver.solve().enumerate() { + println!("{}: {:?}", i, solution); + } } diff --git a/src/solvers/gpusolver.rs b/src/solvers/gpusolver.rs index 4c58251..2b9eb4a 100644 --- a/src/solvers/gpusolver.rs +++ b/src/solvers/gpusolver.rs @@ -1,6 +1,8 @@ use crate::solver::{wall_stats, Solver, IteratorSolver}; use crate::structs::StoneWall; +use crate::permutations::PermutationGenerator; +#[derive(Debug)] pub struct GpuSolver { n: u32, h: u32, w: u32, permutations: Vec>, @@ -13,13 +15,35 @@ impl GpuSolver { } } +fn generate_permutations(n: u32) -> Vec> { + crate::permutations::HeapsPermutations::permutations(n) +} + +fn generate_masks(permutations: &[Vec]) -> Vec { + let mut masks = Vec::with_capacity(permutations.len()); + for p in permutations { + let mut v = 0; + let mut x = 0u64; + for i in p.iter().take(p.len() - 1).map(|i| { + v += i; + v + }) { + x |= 1 << i + } + masks.push(x) + } + masks +} + impl Solver for GpuSolver { fn new(n: u32) -> Self { let (h, w) = wall_stats(n); + let permutations = generate_permutations(n); + let masks = generate_masks(&permutations); Self { n, h, w, - permutations: vec![], - masks: vec![] + permutations, + masks, } } fn n(&self) -> u32 { diff --git a/src/structs.rs b/src/structs.rs index 1d33215..55cff29 100755 --- a/src/structs.rs +++ b/src/structs.rs @@ -1,3 +1,4 @@ +#[derive(Clone, Debug)] pub struct StoneWall { rows: Vec>, } -- cgit v1.2.3-54-g00ecf