improve naive solver #13

Open
cscherrNT wants to merge 13 commits from feat/naive into devel
2 changed files with 39 additions and 13 deletions
Showing only changes of commit 5c43363cf8 - Show all commits

View File

@ -4,14 +4,15 @@ use libpt::log::{debug, error, info, trace};
use crate::error::{SolverError, WResult}; use crate::error::{SolverError, WResult};
use crate::game::evaluation::{Evaluation, EvaluationUnit}; use crate::game::evaluation::{Evaluation, EvaluationUnit};
use crate::game::response::Status;
use crate::wlist::word::{Word, WordData}; use crate::wlist::word::{Word, WordData};
use crate::wlist::WordList; use crate::wlist::WordList;
use super::{AnyBuiltinSolver, Solver, Status};
mod states; mod states;
use states::*; use states::*;
use super::{AnyBuiltinSolver, Solver};
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct NaiveSolver<'wl, WL> { pub struct NaiveSolver<'wl, WL> {
wl: &'wl WL, wl: &'wl WL,
@ -37,9 +38,10 @@ impl<'wl, WL: WordList> Solver<'wl, WL> for NaiveSolver<'wl, WL> {
let mut state: SolverState = SolverState::new(); let mut state: SolverState = SolverState::new();
let responses = game.responses().iter().enumerate(); let responses = game.responses().iter().enumerate();
for (_idx, response) in responses { for (_idx, response) in responses {
let mut already_found_amounts: HashMap<char, usize> = HashMap::new(); let mut abs_freq: HashMap<char, usize> = HashMap::new();
let evaluation: &Evaluation = response.evaluation(); let evaluation: &Evaluation = response.evaluation();
for (idx, p) in evaluation.clone().into_iter().enumerate() { for (idx, p) in evaluation.clone().into_iter().enumerate() {
state.start_step();
match p.1 { match p.1 {
Status::Matched => { Status::Matched => {
pattern.replace_range(idx..idx + 1, &p.0.to_string()); pattern.replace_range(idx..idx + 1, &p.0.to_string());
@ -49,7 +51,7 @@ impl<'wl, WL: WordList> Solver<'wl, WL> for NaiveSolver<'wl, WL> {
.entry(p.0) .entry(p.0)
.or_insert(CharInfo::new(game.length())) .or_insert(CharInfo::new(game.length()))
.found_at(idx); .found_at(idx);
*already_found_amounts.entry(p.0).or_default() += 1; *abs_freq.entry(p.0).or_default() += 1;
} }
Status::Exists => { Status::Exists => {
let cinfo = state let cinfo = state
@ -57,16 +59,18 @@ impl<'wl, WL: WordList> Solver<'wl, WL> for NaiveSolver<'wl, WL> {
.entry(p.0) .entry(p.0)
.or_insert(CharInfo::new(game.length())); .or_insert(CharInfo::new(game.length()));
cinfo.tried_but_failed(idx); cinfo.tried_but_failed(idx);
*already_found_amounts.entry(p.0).or_default() += 1; *abs_freq.entry(p.0).or_default() += 1;
cinfo.min_occurences(already_found_amounts[&p.0]); }
Status::None => {
let cinfo = state
.char_map_mut()
.entry(p.0)
.or_insert(CharInfo::new(game.length()));
cinfo.tried_but_failed(idx);
} }
Status::None => state
.char_map_mut()
.entry(p.0)
.or_insert(CharInfo::new(game.length()))
.max_occurences(*already_found_amounts.entry(p.0).or_default()),
} }
trace!("absolute frequencies: {already_found_amounts:?}"); trace!("absolute frequencies: {abs_freq:?}");
state.finish_step(&abs_freq);
} }
} }

View File

@ -37,7 +37,7 @@ impl SolverState {
pub(crate) fn get_all_known_contained(&self) -> Vec<(&char, &CharInfo)> { pub(crate) fn get_all_known_contained(&self) -> Vec<(&char, &CharInfo)> {
self.char_map self.char_map
.iter() .iter()
.filter(|(key, value)| value.part_of_solution()) .filter(|(_key, value)| value.part_of_solution())
.collect() .collect()
} }
@ -49,6 +49,28 @@ impl SolverState {
} }
true true
} }
pub(crate) fn start_step(&mut self) {}
pub(crate) fn finish_step(&mut self, abs_freq: &HashMap<char, usize>) {
for (k, v) in abs_freq {
if *v == 0 {
self.char_map
.get_mut(k)
.expect(
"char in abs_freq was not added to the char_map before finalizing the step",
)
.max_occurences(0);
} else {
self.char_map
.get_mut(k)
.expect(
"char in abs_freq was not added to the char_map before finalizing the step",
)
.min_occurences(*v);
}
}
}
} }
impl CharInfo { impl CharInfo {