pub use crate::game::Game;
use crate::moves::DifficultEvaluator;
use crate::enddb::EndDb;
use super::Cram;
#[derive(Copy, Clone, Eq, PartialEq)]
pub struct CramDifficultEvaluator {
outside_mask: u64
}
impl DifficultEvaluator for CramDifficultEvaluator {
type Game = Cram;
type PositionDifficult = u16;
fn difficult_of(&self, _game: &Cram, to_evaluate: &<Cram as Game>::Position) -> Self::PositionDifficult {
let v = ((to_evaluate.count_ones() << 3) + (to_evaluate & self.outside_mask).count_ones()) as u16;
v * v
}
}
impl<SliceType> From<&EndDb<&Cram, SliceType>> for CramDifficultEvaluator {
fn from(enddb: &EndDb<&Cram, SliceType>) -> Self {
let size = (enddb.slices.len() * (1<<32)) as u64;
Self { outside_mask:
if size == 0 { !0 }
else if size.is_power_of_two() { !(size.wrapping_sub(1)) }
else { !((size.next_power_of_two()>>1).wrapping_sub(1)) }
}
}
}
pub struct SmallerComponentsFirst;
impl DifficultEvaluator for SmallerComponentsFirst {
type Game = Cram;
type PositionDifficult = u16;
fn difficult_of(&self, _game: &Cram, to_evaluate: &<Cram as Game>::Position) -> Self::PositionDifficult {
let v = to_evaluate.count_ones() as u16;
v * v
}
}
pub struct LessMovesFirst;
impl DifficultEvaluator for LessMovesFirst {
type Game = Cram;
type PositionDifficult = u16;
fn difficult_of(&self, game: &Cram, to_evaluate: &<Cram as Game>::Position) -> Self::PositionDifficult {
let v = game.moves_count(to_evaluate) as u16;
v * v
}
}