add FutureMoves::check_arena

This commit is contained in:
Simon Gardling 2025-02-25 12:09:56 -05:00
parent bd00c29ad4
commit 5f7a5fdb00
Signed by: titaniumtown
GPG Key ID: 9AB28AC10ECE533D
2 changed files with 40 additions and 2 deletions

View File

@ -12,8 +12,8 @@ pub struct ComplexAgent {
#[allow(dead_code)] #[allow(dead_code)]
impl ComplexAgent { impl ComplexAgent {
pub const fn new(color: Piece) -> Self { pub const fn new(color: Piece) -> Self {
const MAX_DEPTH: usize = 18; const MAX_DEPTH: usize = 8;
const NON_LAZY_DEPTH: usize = 5; const NON_LAZY_DEPTH: usize = 8;
Self { Self {
color, color,
future_moves: FutureMoves::new(color, MAX_DEPTH, NON_LAZY_DEPTH), future_moves: FutureMoves::new(color, MAX_DEPTH, NON_LAZY_DEPTH),

View File

@ -299,6 +299,44 @@ impl FutureMoves {
self.refocus_tree(); self.refocus_tree();
self.extend_layers(); self.extend_layers();
self.compute_values(0..self.arena.len()); self.compute_values(0..self.arena.len());
// check arena's consistancy
assert_eq!(self.check_arena().join("\n"), "");
}
/// Checks the consistancy of the Arena (parents and children)
/// returns a vector of errors ([`String`])
pub fn check_arena(&self) -> Vec<String> {
let mut errors = vec![];
for idx in 0..self.arena.len() {
let m = &self.arena[idx];
if let Some(parent) = m.parent {
if !(0..self.arena.len()).contains(&parent) {
errors.push(format!("{}: parent is out of range ({})", idx, parent));
}
if !self.arena[parent].children.contains(&idx) {
errors.push(format!(
"{}: parent ({}) doesn't list {} as child",
idx, parent, idx
));
}
}
for &child_idx in &m.children {
if !(0..self.arena.len()).contains(&child_idx) {
errors.push(format!("{}: parent is out of range ({})", idx, child_idx));
}
if self.arena[child_idx].parent != Some(idx) {
errors.push(format!(
"{}: child ({}) does not list self as parent",
idx, child_idx
));
}
}
}
errors
} }
fn prune_bad_children(&mut self) { fn prune_bad_children(&mut self) {