summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornatrixaeria <upezu@student.kit.edu>2020-01-05 22:28:25 +0100
committernatrixaeria <upezu@student.kit.edu>2020-01-05 22:28:25 +0100
commit492045e538cf806bb49631dfbbaabbd8b566147e (patch)
treeaac3d023960a470bf46ab5ccb7a1d20f9a80f355
parent85627bc39db56d1ca3dca747535afcf6fd9cdcdd (diff)
Generate permutaitons and bitmasks
-rw-r--r--src/lib.rs1
-rwxr-xr-xsrc/main.rs12
-rw-r--r--src/solvers/gpusolver.rs28
-rwxr-xr-xsrc/structs.rs1
4 files changed, 38 insertions, 4 deletions
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<Vec<u32>>,
@@ -13,13 +15,35 @@ impl GpuSolver {
}
}
+fn generate_permutations(n: u32) -> Vec<Vec<u32>> {
+ crate::permutations::HeapsPermutations::permutations(n)
+}
+
+fn generate_masks(permutations: &[Vec<u32>]) -> Vec<u64> {
+ 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<Vec<u32>>,
}