Add blueprints directory and generalize benchmark and tests.
This commit is contained in:
parent
96a86779f4
commit
02e65f6fe3
12 changed files with 75 additions and 38 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -1 +1,3 @@
|
||||||
/target
|
/target
|
||||||
|
flamegraph.svg
|
||||||
|
perf.data*
|
||||||
|
|
|
||||||
|
|
@ -1,30 +1,32 @@
|
||||||
use criterion::{criterion_group, criterion_main, Criterion};
|
use criterion::{criterion_group, criterion_main, Criterion};
|
||||||
|
|
||||||
use factorio_blueprint::belt_finding::brute_force::problems::{simple, snake};
|
use factorio_blueprint::belt_finding::brute_force::problems::{mid, simple, snake};
|
||||||
|
|
||||||
|
macro_rules! bench_bruteforce {
|
||||||
|
($b:ident; $i:ident) => {
|
||||||
|
|
||||||
|
$b.bench_function(stringify!($i), |b| {
|
||||||
|
let p = $i();
|
||||||
|
|
||||||
|
b.iter(|| {
|
||||||
|
let mut b = p.clone();
|
||||||
|
|
||||||
|
while b.next_finish_state() {}
|
||||||
|
|
||||||
|
b.solution_count()
|
||||||
|
});
|
||||||
|
})
|
||||||
|
};
|
||||||
|
($b:ident; $i:ident $($is:ident )+) => {
|
||||||
|
|
||||||
|
bench_bruteforce!($b; $i);
|
||||||
|
bench_bruteforce!($b; $($is)+);
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
fn brute_force(c: &mut Criterion) {
|
fn brute_force(c: &mut Criterion) {
|
||||||
c.bench_function("simple", |b| {
|
bench_bruteforce!(c; simple mid snake);
|
||||||
let p = simple();
|
|
||||||
|
|
||||||
b.iter(|| {
|
|
||||||
let mut g = p.clone();
|
|
||||||
|
|
||||||
while g.next_finish_state() {}
|
|
||||||
|
|
||||||
g.solution_count()
|
|
||||||
});
|
|
||||||
});
|
|
||||||
c.bench_function("weaving", |b| {
|
|
||||||
let p = snake();
|
|
||||||
|
|
||||||
b.iter(|| {
|
|
||||||
let mut g = p.clone();
|
|
||||||
|
|
||||||
while g.next_finish_state() {}
|
|
||||||
|
|
||||||
g.solution_count()
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
criterion_group!(benches, brute_force);
|
criterion_group!(benches, brute_force);
|
||||||
|
|
|
||||||
1
blueprints/book
Normal file
1
blueprints/book
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
0eNqdlN1uhCAQhd9lrnEDVtefV2k2Bu3slhTBCG5qNr57UdO4SXW13DED851wYOYBpeywaYWyRan1F+SPJWMgf38Kxz1RaTWnjbgpLsec7RuEHITFGggoXo+R0ZK3QcMVShgICPWB35Cz4UIAlRVW4IyZgr5QXV1i6w6sAgg02rgarUY9xwnClJ1iAr1bMhqd4mEgf1jhUVaS7rLeDrPiXVZ0mBXusuKjrHO2yzr7eM/WWYmPXxus1OeOG6xsYdVcygAlVrYVVdBoiXt/Y2S6ehS3z1J37fiBGb2sqDD6b5nwpUy2qrI0y/UaGBSmdgqm4kq57ZfvlqXr9jCPntlkefTMJsujZzZZHj0zs9zsmoZc/jQTCdyxNVOV8zdKMucMozRK6TL16FplMI1bAryy4o7F79EXvOEHwC3N0A==
|
||||||
1
blueprints/bp
Normal file
1
blueprints/bp
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
0eNqd1N1ugyAUB/B3OdfYgNP68SpNs6A77UgQDOAyY3j3ob3okml13Il6fv945DBBIwfsjVAO6glEq5WF+jKBFXfF5XzPjT1CDcJhBwQU7+aV1ZKbpOcKJXgCQn3gN9TMXwmgcsIJfDDLYnxXQ9egCS+sAgR6bUONVnNecJK0ZKecwBguGc1Ouffkj5UetYpy13o7bOW7VnbYSnet/Kh1rnatc0zv2bpVxPRrwypjvnHDqp5Wx6VMUGLrjGiTXkvc2xuzGepR3D8bPZh5AzN6XUlh9N8x6cuYajXlOSy3W2JR2C4k2JYrFR6//G9Vud4eFjEzm1bEzGxaETOzaUXMzMMKZ9dyyNW/zkQCX2jsUhX6mxVV6AyjNCup9z8fYqg/
|
||||||
1
blueprints/mining
Normal file
1
blueprints/mining
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
0eJydlNGOgyAQRf9lnqERamv1cX9j02y0TtxJAA3iZpvGf19sG+Ou25TyCMycS7iXuUClBuwsGQfFBejUmh6K9wv01JhSTXvu3CEUQA41MDClnlbVYA1arsmQaXhtSSkYGZCp8RsKMR4ZoHHkCG+4exsqPDlLp9+NDLq297WtmfR8P5ebHYOzB212nlqT9W3XY3nnnj/MoCu0kxZ7FS8e0fcrulzQnS1N37XW8QqV++fWySNusuJuY7jJc24aw5XPubvXX3k2kQe4uI93cY1f25gt8BprGjSfVbpW4Zq+DX/zg/8VSM1n1Q52Snt+fFmNp+Fy+R+5wzHGcx6gJJIockD8hYgiBwRVyGn2XIdVsZhtDL7Q9rfwHUSa5TJLZZ5vc8FAlV7XV7/N1eP4Ay9CrIM=
|
||||||
1
blueprints/nested
Normal file
1
blueprints/nested
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
0eNq9lGFvgyAQhv/LfcYGnLbqX2kag+7akSEYwGZN438f2iwumVbLh32D4+55wwt3d6hkh60RypWV1p9Q3KeIheJ4fyFhOBO1Vo+wFRfF5RBztxahAOGwAQKKN8POaslN1HKFEnoCQr3jFxSsPxFA5YQT+MCMm1upuqZC4xNmAQRabX2NVoOe50RxxnYpgZtfMprs0r4nf1jxVtYhW2W9bWalq6xkMyteZaVbWft8lbUP8Z7Nsw4hfi2wspA7LrDyidVwKSOUWDsj6qjVEtf+xsD09SguH5XuzPCBGT3NqDD6skz8VCafVZma5XyOLArbeAVbc6X88dN3y7N5e1hAzyyyAnpmkRXQM4usgJ55sPzsGodc8WsmEriisWOV9zc55N4ZRmmS0Wnq0bnKaBy3BHjtxBXLn9R/5PXfnorzYQ==
|
||||||
1
blueprints/rail
Normal file
1
blueprints/rail
Normal file
File diff suppressed because one or more lines are too long
1
blueprints/simple
Normal file
1
blueprints/simple
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
0eJxtjs0KwjAQhN9lzhEaioo5+hoikraLBNJNSbZiKXl30x/Eg5eF3Z35ZmY0fqQhOhaYGa4NnGBuM5J7svXLTaaBYOCEeiiw7ZdNouU0hCiHhrwgKzju6A2j812BWJw42kj/HQpDSEUUeMkoxkphKrOQOhep3T7VzpoePPYNxZ2/djE/1RVeFNNqOdeVPtYnfdQXBW9LWFFev8qcP37OUWQ=
|
||||||
1
blueprints/tiles
Normal file
1
blueprints/tiles
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
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
|
||||||
1
blueprints/walls
Normal file
1
blueprints/walls
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -7,11 +7,13 @@ use factorio_blueprint::belt_finding::brute_force::{problems, Bruteforce};
|
||||||
enum Mode {
|
enum Mode {
|
||||||
Solutions,
|
Solutions,
|
||||||
Step,
|
Step,
|
||||||
|
Statistics,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(ValueEnum, Clone)]
|
#[derive(ValueEnum, Clone)]
|
||||||
enum Problem {
|
enum Problem {
|
||||||
Simple,
|
Simple,
|
||||||
|
Mid,
|
||||||
Snake,
|
Snake,
|
||||||
Weaving,
|
Weaving,
|
||||||
}
|
}
|
||||||
|
|
@ -20,6 +22,7 @@ impl Problem {
|
||||||
fn get_problem(&self) -> Bruteforce {
|
fn get_problem(&self) -> Bruteforce {
|
||||||
match self {
|
match self {
|
||||||
Problem::Simple => problems::simple(),
|
Problem::Simple => problems::simple(),
|
||||||
|
Problem::Mid => problems::mid(),
|
||||||
Problem::Snake => problems::snake(),
|
Problem::Snake => problems::snake(),
|
||||||
Problem::Weaving => problems::weaving(),
|
Problem::Weaving => problems::weaving(),
|
||||||
}
|
}
|
||||||
|
|
@ -47,7 +50,7 @@ fn main() {
|
||||||
println!("{}\n{}\n{}", b.count(), b.solution_count(), b);
|
println!("{}\n{}\n{}", b.count(), b.solution_count(), b);
|
||||||
}
|
}
|
||||||
|
|
||||||
println!("{}\n{}", b.count(), b.solution_count());
|
println!("Solutions: {}\nStates: {}", b.solution_count(), b.count());
|
||||||
}
|
}
|
||||||
Mode::Step => {
|
Mode::Step => {
|
||||||
while b.next_state() {
|
while b.next_state() {
|
||||||
|
|
@ -55,7 +58,12 @@ fn main() {
|
||||||
let mut s = String::new();
|
let mut s = String::new();
|
||||||
let _ = io::stdin().read_line(&mut s);
|
let _ = io::stdin().read_line(&mut s);
|
||||||
}
|
}
|
||||||
println!("{}\n{}", b.count(), b.solution_count());
|
println!("Solutions: {}\nStates: {}", b.solution_count(), b.count());
|
||||||
|
}
|
||||||
|
Mode::Statistics => {
|
||||||
|
while b.next_finish_state() {}
|
||||||
|
|
||||||
|
println!("Solutions: {}\nStates: {}", b.solution_count(), b.count());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -629,23 +629,24 @@ impl Display for Bruteforce {
|
||||||
mod test {
|
mod test {
|
||||||
use super::problems;
|
use super::problems;
|
||||||
|
|
||||||
#[test]
|
macro_rules! test_bruteforce {
|
||||||
fn simple() {
|
($i:ident $x:expr) => {
|
||||||
let mut b = problems::simple();
|
#[test]
|
||||||
|
fn $i() {
|
||||||
|
let mut b = problems::$i();
|
||||||
|
|
||||||
while b.next_finish_state() {}
|
while b.next_finish_state() {}
|
||||||
|
|
||||||
assert_eq!(b.solution_count(), 9);
|
assert_eq!(b.solution_count(), $x);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
($i:ident $x:expr; $($is:ident $xs:expr);+) => {
|
||||||
|
test_bruteforce!($i $x);
|
||||||
|
test_bruteforce!($($is $xs);+);
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
test_bruteforce!(simple 9; mid 238240; snake 5);
|
||||||
fn snake() {
|
|
||||||
let mut b = problems::snake();
|
|
||||||
|
|
||||||
while b.next_finish_state() {}
|
|
||||||
|
|
||||||
assert_eq!(b.solution_count(), 5);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub mod problems {
|
pub mod problems {
|
||||||
|
|
@ -669,6 +670,22 @@ pub mod problems {
|
||||||
b.build()
|
b.build()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn mid() -> Bruteforce {
|
||||||
|
let mut b = BruteforceBuilder::new(6, 6);
|
||||||
|
|
||||||
|
b.add_path(
|
||||||
|
(Position::new(0, 0), Direction::Down),
|
||||||
|
(Position::new(5, 5), Direction::Down),
|
||||||
|
);
|
||||||
|
|
||||||
|
b.add_path(
|
||||||
|
(Position::new(0, 5), Direction::Up),
|
||||||
|
(Position::new(5, 0), Direction::Up),
|
||||||
|
);
|
||||||
|
|
||||||
|
b.build()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn snake() -> Bruteforce {
|
pub fn snake() -> Bruteforce {
|
||||||
let mut p = BruteforceBuilder::new(14, 3);
|
let mut p = BruteforceBuilder::new(14, 3);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue