From d0c70ad88b11f412c9d8c6735b74cce1b1ff015b Mon Sep 17 00:00:00 2001 From: Malte Voos Date: Sat, 20 Aug 2022 14:12:11 +0200 Subject: cleanup --- bonusaufgabe/src/benchmark.rs | 24 ++++++++++ bonusaufgabe/src/main.rs | 103 ++++++++++++++++++++---------------------- 2 files changed, 72 insertions(+), 55 deletions(-) create mode 100644 bonusaufgabe/src/benchmark.rs (limited to 'bonusaufgabe/src') diff --git a/bonusaufgabe/src/benchmark.rs b/bonusaufgabe/src/benchmark.rs new file mode 100644 index 0000000..9063977 --- /dev/null +++ b/bonusaufgabe/src/benchmark.rs @@ -0,0 +1,24 @@ +use super::*; +use test::Bencher; + +fn benchmark(task_file_name: &str, bencher: &mut Bencher) { + let task_str = fs::read_to_string(task_file_name).expect("Datei kann nicht gelesen werden"); + let task = Task::try_from(task_str.as_str()).expect("Datei enthält keine gültige Aufgabe"); + + bencher.iter(|| solve_task(&task)); +} + +#[bench] +fn benchmark3(bencher: &mut Bencher) { + benchmark("input/stapel3.txt", bencher); +} + +#[bench] +fn benchmark4(bencher: &mut Bencher) { + benchmark("input/stapel4.txt", bencher); +} + +#[bench] +fn benchmark5(bencher: &mut Bencher) { + benchmark("input/stapel5.txt", bencher); +} diff --git a/bonusaufgabe/src/main.rs b/bonusaufgabe/src/main.rs index f5983bc..f3245d2 100644 --- a/bonusaufgabe/src/main.rs +++ b/bonusaufgabe/src/main.rs @@ -1,14 +1,21 @@ +#![feature(test)] + +extern crate test; + +#[cfg(test)] +mod benchmark; + use bitvec::prelude::*; use rand::seq::SliceRandom; use std::env; use std::fmt; use std::fs; use std::process; +use std::time; type Card = BitVec; // Typ, der eine zu lösende Aufgabe beschreibt. -#[derive(Clone)] // TODO remove struct Task { cards: Vec, num_pass_cards: usize, @@ -17,11 +24,18 @@ struct Task { // Die Lösung enthält die von Zara stammenden echten Karten. struct Solution { real_cards: Vec, + // Der Anschaulichkeit halber werden ein paar weitere Randinformationen + // mit ausgegeben. + num_cards: usize, + num_real_cards: usize, + bits_per_card: usize, + num_free_vars: usize, + p: usize, } // `solve_task` löst eine gegebene Aufgabe und beinhaltet den // eigentlichen Algorithmus. -fn solve_task(task: Task) -> Solution { +fn solve_task(task: &Task) -> Solution { // `num_real_cards` Karten im Stapel stammen von Zara Zackig, nämlich // die `num_pass_cards` Öffnungskarten plus eine Sicherungkarte. let num_real_cards = task.num_pass_cards + 1; @@ -76,28 +90,20 @@ fn lee_brickell_iteration(cards: &[Card], num_real_cards: usize) -> Option row, None => { // Wurde kein Pivotelement gefunden, gehört diese Spalte zu @@ -118,10 +124,9 @@ fn lee_brickell_iteration(cards: &[Card], num_real_cards: usize) -> Option Option Option Option( - rand::distributions::Standard, - ) - .take(bits_per_card) - .collect::() - }) - .collect::>(); - let mut new_cards = solution.real_cards; - new_cards.append(&mut new_rand_cards); - new_cards.shuffle(&mut rand::thread_rng()); - task.cards = new_cards - } + println!("{}", solution); + println!("Laufzeit ohne I/O: {:?}", elapsed); } // Liest eine Aufgabe im Format der Beispielaufgaben ein. @@ -386,7 +372,7 @@ impl TryFrom<&str> for Task { '1' => Some(true), _ => None, }) - .collect::() + .collect::() }) .collect::>(); @@ -404,6 +390,13 @@ impl TryFrom<&str> for Task { // Formatiert die Lösung zur Ausgabe. impl fmt::Display for Solution { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + writeln!( + f, + "Randinformationen (siehe Dokumentation):\nn = {}; w = {}; b = {}; k = {}; p = {}", + self.num_cards, self.num_real_cards, self.bits_per_card, self.num_free_vars, self.p + )?; + writeln!(f)?; + writeln!(f, "Echte Karten:")?; for card in self.real_cards.iter() { for bit in card.iter() { match *bit { -- cgit 1.4.1