From 46351760bfb3b133a05098c7be2f84bd5e744a91 Mon Sep 17 00:00:00 2001 From: Maciej Jur Date: Fri, 16 Dec 2022 20:42:57 +0100 Subject: [PATCH] 2022 day 16 part 2 wip --- 2022/rust/Cargo.lock | 124 +++++++++++++++++++++++++++++++ 2022/rust/Cargo.toml | 1 + 2022/rust/src/solutions/day16.rs | 57 +++++++------- 3 files changed, 151 insertions(+), 31 deletions(-) diff --git a/2022/rust/Cargo.lock b/2022/rust/Cargo.lock index 85b8dd2..ff69878 100644 --- a/2022/rust/Cargo.lock +++ b/2022/rust/Cargo.lock @@ -11,12 +11,129 @@ dependencies = [ "memchr", ] +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "crossbeam-channel" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "either" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "libc" +version = "0.2.138" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" + [[package]] name = "memchr" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "rayon" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db3a213adf02b3bcfd2d3846bb41cb22857d131789e01df434fb7e7bc0759b7" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cac410af5d00ab6884528b4ab69d1e8e146e8d471201800fa1b4524126de6ad3" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "num_cpus", +] + [[package]] name = "regex" version = "1.7.0" @@ -38,5 +155,12 @@ checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" name = "rust" version = "0.1.0" dependencies = [ + "rayon", "regex", ] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" diff --git a/2022/rust/Cargo.toml b/2022/rust/Cargo.toml index ee6d9d0..b7034a3 100644 --- a/2022/rust/Cargo.toml +++ b/2022/rust/Cargo.toml @@ -7,3 +7,4 @@ edition = "2021" [dependencies] regex = "1.7.0" +rayon = "1.6.1" diff --git a/2022/rust/src/solutions/day16.rs b/2022/rust/src/solutions/day16.rs index c90594d..6faa3ec 100644 --- a/2022/rust/src/solutions/day16.rs +++ b/2022/rust/src/solutions/day16.rs @@ -2,6 +2,8 @@ use std::cmp::Ordering; use std::collections::{BinaryHeap, HashMap, HashSet}; use crate::utils; +use rayon::prelude::*; + pub fn run() -> () { let lines = utils::read_lines(utils::Source::Day(16)); @@ -107,7 +109,7 @@ fn move_to_open<'data, 'a>( let opened = { let mut opened = opened.clone(); opened.insert(curr); opened }; let time_left = state.time_left - distance - 1; - closed.iter() + closed.par_iter() .map(|&next| move_to_open(map, distances, &closed, &opened, MoveState { curr, next, time_left, released })) .max() .unwrap_or_else(|| released + release_pressure(map, &opened) * time_left) @@ -142,56 +144,49 @@ fn parallel_to_open<'data, 'a>( opened: &'a HashSet<&'data str>, state: ParallelMoveState, ) -> u32 { - let p_distance = *distances.get(&(state.p_curr, state.p_next)).unwrap() - state.p_progress; - let e_distance = *distances.get(&(state.e_curr, state.e_next)).unwrap() - state.e_progress; - let distance = state.time_left.min(p_distance).min(e_distance); + let p_distance_left = *distances.get(&(state.p_curr, state.p_next)).unwrap() - state.p_progress; + let e_distance_left = *distances.get(&(state.e_curr, state.e_next)).unwrap() - state.e_progress; + let distance = state.time_left.min(p_distance_left).min(e_distance_left); let released = state.released + distance * release_pressure(map, opened); if distance == state.time_left { return released }; + // opening let released = released + release_pressure(map, opened); - let (closed, opened) = match (distance == p_distance, distance == e_distance) { - (true, true) => ( - { let mut closed = closed.clone(); closed.remove(state.p_next); closed.remove(state.e_next); closed }, - { let mut opened = opened.clone(); opened.insert(state.p_next); opened.insert(state.e_next); opened }, - ), - (true, false) => ( - { let mut closed = closed.clone(); closed.remove(state.p_next); closed }, - { let mut opened = opened.clone(); opened.insert(state.p_next); opened }, - ), - (false, true) => ( - { let mut closed = closed.clone(); closed.remove(state.e_next); closed }, - { let mut opened = opened.clone(); opened.insert(state.e_next); opened }, - ), - _ => unreachable!(), + let (closed, opened) = { + let mut closed = closed.clone(); + let mut opened = opened.clone(); + if distance == p_distance_left { closed.remove(state.p_next); opened.insert(state.p_next); }; + if distance == e_distance_left { closed.remove(state.e_next); opened.insert(state.e_next); }; + (closed, opened) }; let time_left = state.time_left - distance - 1; - match (distance == p_distance, distance == e_distance) { - (true, true) => closed.iter() - .flat_map(|&p_next| closed.iter() + match (distance == p_distance_left, distance == e_distance_left) { + (true, true) => closed.par_iter() + .flat_map(|&p_next| closed.par_iter() .filter(move |&&e_next| e_next != p_next) - .map(|&e_next| { parallel_to_open(map, distances, &closed, &opened, ParallelMoveState { + .map(|&e_next| parallel_to_open(map, distances, &closed, &opened, ParallelMoveState { p_curr: state.p_next, p_next, p_progress: 0, e_curr: state.e_next, e_next, e_progress: 0, time_left, released, - })}) + })) ) .max() .unwrap_or_else(|| released + release_pressure(map, &opened) * time_left), - (true, false) => closed.iter() - .map(|&next| { parallel_to_open(map, distances, &closed, &opened, ParallelMoveState { + (true, false) => closed.par_iter() + .map(|&next| parallel_to_open(map, distances, &closed, &opened, ParallelMoveState { p_curr: state.p_next, p_next: next, p_progress: 0, - e_curr: state.e_curr, e_next: state.e_next, e_progress: state.e_progress + 1, + e_curr: state.e_curr, e_next: state.e_next, e_progress: state.e_progress + distance + 1, time_left, released, - })}) + })) .max() .unwrap_or_else(|| released + release_pressure(map, &opened) * time_left), - (false, true) => closed.iter() - .map(|&next| { parallel_to_open(map, distances, &closed, &opened, ParallelMoveState { - p_curr: state.p_curr, p_next: state.p_next, p_progress: state.p_progress + 1, + (false, true) => closed.par_iter() + .map(|&next| parallel_to_open(map, distances, &closed, &opened, ParallelMoveState { + p_curr: state.p_curr, p_next: state.p_next, p_progress: state.p_progress + distance + 1, e_curr: state.e_next, e_next: next, e_progress: 0, time_left, released, - })}) + })) .max() .unwrap_or_else(|| released + release_pressure(map, &opened) * time_left), _ => unreachable!()