2024-03-26 00:16:26 +01:00
|
|
|
#![warn(clippy::all)]
|
|
|
|
// #![warn(missing_docs)]
|
|
|
|
#![warn(missing_debug_implementations)]
|
|
|
|
|
|
|
|
use clap::Parser;
|
|
|
|
use libpt::log::*;
|
2024-04-17 15:01:32 +02:00
|
|
|
use tokio;
|
2024-03-26 00:16:26 +01:00
|
|
|
|
2024-04-04 22:46:25 +02:00
|
|
|
use wordle_analyzer::bench::builtin::BuiltinBenchmark;
|
2024-04-05 20:00:33 +02:00
|
|
|
use wordle_analyzer::bench::report::Report;
|
2024-04-04 22:46:25 +02:00
|
|
|
use wordle_analyzer::bench::{Benchmark, DEFAULT_N};
|
2024-04-05 20:00:33 +02:00
|
|
|
use wordle_analyzer::error::WResult;
|
2024-04-17 12:39:14 +02:00
|
|
|
use wordle_analyzer::game::GameBuilder;
|
|
|
|
use wordle_analyzer::solve::{AnyBuiltinSolver, BuiltinSolverNames, Solver};
|
2024-03-26 00:16:26 +01:00
|
|
|
use wordle_analyzer::wlist::builtin::BuiltinWList;
|
2024-04-04 20:14:20 +02:00
|
|
|
|
2024-03-26 00:16:26 +01:00
|
|
|
use wordle_analyzer::{self, game};
|
|
|
|
|
|
|
|
#[derive(Parser, Clone, Debug)]
|
|
|
|
#[command(version, about, long_about, author)]
|
|
|
|
struct Cli {
|
|
|
|
/// precompute all possibilities for better performance at runtime
|
|
|
|
#[arg(short, long)]
|
|
|
|
precompute: bool,
|
|
|
|
/// how long should the word be?
|
|
|
|
#[arg(short, long, default_value_t = wordle_analyzer::DEFAULT_WORD_LENGTH)]
|
|
|
|
length: usize,
|
|
|
|
/// how many times can we guess?
|
|
|
|
#[arg(short, long, default_value_t = wordle_analyzer::DEFAULT_MAX_STEPS)]
|
|
|
|
max_steps: usize,
|
|
|
|
/// more verbose logs
|
|
|
|
#[arg(short, long)]
|
|
|
|
verbose: bool,
|
|
|
|
/// which solver to use
|
|
|
|
#[arg(short, long, default_value_t = BuiltinSolverNames::default())]
|
|
|
|
solver: BuiltinSolverNames,
|
2024-04-04 22:46:25 +02:00
|
|
|
/// how many games to play for the benchmark
|
|
|
|
#[arg(short, long, default_value_t = DEFAULT_N)]
|
|
|
|
n: usize,
|
2024-04-05 20:00:33 +02:00
|
|
|
/// how many threads to use for benchmarking
|
|
|
|
///
|
|
|
|
/// Note that the application as the whole will use at least one more thread.
|
|
|
|
#[arg(short, long, default_value_t = num_cpus::get())]
|
|
|
|
threads: usize,
|
2024-03-26 00:16:26 +01:00
|
|
|
}
|
|
|
|
|
2024-04-17 14:13:48 +02:00
|
|
|
#[tokio::main]
|
|
|
|
async fn main() -> anyhow::Result<()> {
|
2024-03-26 00:16:26 +01:00
|
|
|
let cli = Cli::parse();
|
|
|
|
if cli.verbose {
|
2024-04-04 22:46:25 +02:00
|
|
|
Logger::build_mini(Some(Level::DEBUG))?;
|
2024-03-26 00:16:26 +01:00
|
|
|
} else {
|
|
|
|
Logger::build_mini(Some(Level::INFO))?;
|
|
|
|
}
|
2024-04-04 22:46:25 +02:00
|
|
|
trace!("dumping CLI: {:#?}", cli);
|
2024-03-26 00:16:26 +01:00
|
|
|
|
|
|
|
let wl = BuiltinWList::default();
|
2024-04-17 12:39:14 +02:00
|
|
|
let builder: GameBuilder<'_, BuiltinWList> = game::Game::builder(&wl)
|
2024-03-26 00:16:26 +01:00
|
|
|
.length(cli.length)
|
|
|
|
.max_steps(cli.max_steps)
|
|
|
|
.precompute(cli.precompute);
|
2024-04-17 12:39:14 +02:00
|
|
|
let solver: AnyBuiltinSolver<'_, BuiltinWList> = cli.solver.to_solver(&wl);
|
2024-04-17 14:13:48 +02:00
|
|
|
let bench = BuiltinBenchmark::build(&wl, solver, builder, cli.threads)?;
|
2024-04-04 22:46:25 +02:00
|
|
|
trace!("{bench:#?}");
|
2024-04-05 20:00:33 +02:00
|
|
|
|
2024-04-17 15:01:32 +02:00
|
|
|
let n = cli.n;
|
2024-04-18 14:10:32 +02:00
|
|
|
let bench2 = bench.clone();
|
|
|
|
let in_progress_bench = tokio::spawn(async move {
|
|
|
|
bench2.bench(n).await
|
2024-04-17 15:01:32 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
while !bench.is_finished() {
|
|
|
|
tokio::time::sleep(tokio::time::Duration::from_millis(5000)).await;
|
|
|
|
println!("{}", bench.report());
|
2024-04-05 20:00:33 +02:00
|
|
|
}
|
2024-04-17 15:01:32 +02:00
|
|
|
in_progress_bench.await;
|
|
|
|
dbg!(bench.report());
|
2024-03-26 00:16:26 +01:00
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|