diff --git a/src/elo.rs b/src/elo.rs index 202da53..809a023 100644 --- a/src/elo.rs +++ b/src/elo.rs @@ -1,3 +1,5 @@ +use std::num::NonZero; + use crate::{ agent::Agent, complexagent::ComplexAgent, @@ -5,7 +7,9 @@ use crate::{ logic::{ChildrenEvalMethod, FutureMoveConfig}, repr::{Board, Piece, Winner}, }; -use indicatif::{ParallelProgressIterator, ProgressStyle, TermLike}; +use indicatif::{ + ParallelProgressIterator, ProgressBar, ProgressDrawTarget, ProgressStyle, TermLike, +}; use rand::seq::SliceRandom; use rayon::iter::{IntoParallelIterator, ParallelIterator}; use skillratings::{ @@ -25,7 +29,7 @@ pub fn run() { children_eval_method: ChildrenEvalMethod::Average, }; - let configs = (6..=6) + let configs = (6..=7) .map(move |d| FutureMoveConfig { max_depth: d, ..FMV_BASE @@ -139,12 +143,37 @@ impl PlayerArena { let (sender, receiver) = crossbeam_channel::unbounded(); + let term = console::Term::stdout(); + // Spawn parallel processing in a dedicated thread let processing_thread = { let sender = sender.clone(); + let term = term.clone(); + std::thread::spawn(move || { + rayon::ThreadPoolBuilder::new() + .num_threads( + (std::thread::available_parallelism() + .map(NonZero::get) + .expect("unable to get number of threads") + / 3) + * 2, + ) + .build_global() + .unwrap(); + created_pairs .into_par_iter() + .progress_with({ + let a = ProgressBar::new(num as u64).with_style( + ProgressStyle::with_template( + "[{elapsed_precise}] {pos:>7}/{len:7} ETA: {eta}", + ) + .expect("invalid ProgressStyle"), + ); + a.set_draw_target(ProgressDrawTarget::term(term, 5)); + a + }) .progress_with_style( ProgressStyle::with_template( "[{elapsed_precise}] {pos:>7}/{len:7} ETA: {eta}", @@ -161,7 +190,6 @@ impl PlayerArena { // Immediately drop our copy of the sender so the channel closes properly drop(sender); - let term = console::Term::stdout(); // Process results on main thread as they arrive let mut received_num = 0; while let Ok((i, j, o)) = receiver.recv() {