pub struct GameAnalyzer<G = ()> {
game: G,
}Expand description
Owns a fixed game definition and reusable analysis caches.
Move generators may collect statistics, but must keep the rules unchanged.
Closure-based games must be finite and acyclic; detected cycles panic.
Outcome queries stop exploring a position once a winning move is found.
Use impartial_graph for Win/Draw/Lose analysis of cyclic graphs.
use competitive::algorithm::{GameAnalyzer, GameOutcome};
let mut nim = GameAnalyzer::new().impartial(|&n: &usize| 0..n);
assert_eq!(nim.grundy().eval(&3), 3);
assert_eq!(nim.sum().grundy().eval(&[3, 3]), 0);
assert_eq!(nim.misere().outcome().eval(&1), GameOutcome::Lose);
assert_eq!(nim.outcome().eval(&1), GameOutcome::Win);
assert_eq!(nim.grundy().verify(0..10, |&n| n as u64), None);Fields§
§game: GImplementations§
Source§impl GameAnalyzer
impl GameAnalyzer
Sourcepub fn impartial_graph<G>(
self,
graph: &G,
) -> GameAnalyzer<ImpartialGraph<'_, G>>
pub fn impartial_graph<G>( self, graph: &G, ) -> GameAnalyzer<ImpartialGraph<'_, G>>
Uses the graph’s shared moves for both players. Query vertices must be
valid inputs to the graph’s VertexMap operations.
Source§impl<'g, G> GameAnalyzer<ImpartialGraph<'g, G>>
impl<'g, G> GameAnalyzer<ImpartialGraph<'g, G>>
pub fn grundy( &mut self, ) -> GameAnalysis<'_, ImpartialGraph<'g, G>, G::Vertex, u64>
pub fn value( &mut self, ) -> GameAnalysis<'_, ImpartialGraph<'g, G>, G::Vertex, GameValue>
pub fn outcome( &mut self, ) -> GameAnalysis<'_, ImpartialGraph<'g, G>, G::Vertex, GameOutcome>
pub fn misere(&mut self) -> Misere<'_, ImpartialGraph<'g, G>>
pub fn sum(&mut self) -> GameSum<'_, ImpartialGraph<'g, G>>
pub fn clear_cache(&mut self)
Source§impl GameAnalyzer
impl GameAnalyzer
pub fn impartial<S, F, I>( self, moves: F, ) -> GameAnalyzer<Impartial<S, impl FnMut(&S) -> Map<I::IntoIter, fn(S) -> Neighbor<S, ()>>>>
Sourcepub fn impartial_moves<S, L, F, I>(
self,
moves: F,
) -> GameAnalyzer<Impartial<S, F>>
pub fn impartial_moves<S, L, F, I>( self, moves: F, ) -> GameAnalyzer<Impartial<S, F>>
Examples found in repository?
crates/competitive/src/algorithm/game_analyzer/impartial.rs (line 27)
16 pub fn impartial<S, F, I>(
17 self,
18 mut moves: F,
19 ) -> GameAnalyzer<
20 Impartial<S, impl FnMut(&S) -> std::iter::Map<I::IntoIter, fn(S) -> Neighbor<S, ()>>>,
21 >
22 where
23 F: FnMut(&S) -> I,
24 I: IntoIterator<Item = S>,
25 {
26 let label: fn(S) -> Neighbor<S, ()> = |to| Neighbor::new(to, ());
27 self.impartial_moves(move |s: &S| moves(s).into_iter().map(label))
28 }Source§impl<S, F> GameAnalyzer<Impartial<S, F>>
impl<S, F> GameAnalyzer<Impartial<S, F>>
Source§impl<S, L, F, I> GameAnalyzer<Impartial<S, F>>
impl<S, L, F, I> GameAnalyzer<Impartial<S, F>>
pub fn grundy(&mut self) -> GameAnalysis<'_, Impartial<S, F>, S, u64>
pub fn value(&mut self) -> GameAnalysis<'_, Impartial<S, F>, S, GameValue>
pub fn outcome(&mut self) -> GameAnalysis<'_, Impartial<S, F>, S, GameOutcome>
Source§impl GameAnalyzer
impl GameAnalyzer
pub fn partisan<S, FL, FR, IL, IR>(
self,
left: FL,
right: FR,
) -> GameAnalyzer<Partisan<S, impl FnMut(&S) -> Map<IL::IntoIter, fn(S) -> Neighbor<S, ()>>, impl FnMut(&S) -> Map<IR::IntoIter, fn(S) -> Neighbor<S, ()>>>>where
FL: FnMut(&S) -> IL,
FR: FnMut(&S) -> IR,
IL: IntoIterator<Item = S>,
IR: IntoIterator<Item = S>,
Sourcepub fn partisan_moves<S, L, FL, FR, IL, IR>(
self,
left: FL,
right: FR,
) -> GameAnalyzer<Partisan<S, FL, FR>>where
FL: FnMut(&S) -> IL,
FR: FnMut(&S) -> IR,
IL: IntoIterator<Item = Neighbor<S, L>>,
IR: IntoIterator<Item = Neighbor<S, L>>,
pub fn partisan_moves<S, L, FL, FR, IL, IR>(
self,
left: FL,
right: FR,
) -> GameAnalyzer<Partisan<S, FL, FR>>where
FL: FnMut(&S) -> IL,
FR: FnMut(&S) -> IR,
IL: IntoIterator<Item = Neighbor<S, L>>,
IR: IntoIterator<Item = Neighbor<S, L>>,
Examples found in repository?
crates/competitive/src/algorithm/game_analyzer/partisan.rs (lines 37-40)
19 pub fn partisan<S, FL, FR, IL, IR>(
20 self,
21 mut left: FL,
22 mut right: FR,
23 ) -> GameAnalyzer<
24 Partisan<
25 S,
26 impl FnMut(&S) -> std::iter::Map<IL::IntoIter, fn(S) -> Neighbor<S, ()>>,
27 impl FnMut(&S) -> std::iter::Map<IR::IntoIter, fn(S) -> Neighbor<S, ()>>,
28 >,
29 >
30 where
31 FL: FnMut(&S) -> IL,
32 FR: FnMut(&S) -> IR,
33 IL: IntoIterator<Item = S>,
34 IR: IntoIterator<Item = S>,
35 {
36 let label: fn(S) -> Neighbor<S, ()> = |to| Neighbor::new(to, ());
37 self.partisan_moves(
38 move |s: &S| left(s).into_iter().map(label),
39 move |s: &S| right(s).into_iter().map(label),
40 )
41 }Source§impl<S, FL, FR> GameAnalyzer<Partisan<S, FL, FR>>
impl<S, FL, FR> GameAnalyzer<Partisan<S, FL, FR>>
Source§impl<S, L, FL, FR, IL, IR> GameAnalyzer<Partisan<S, FL, FR>>
impl<S, L, FL, FR, IL, IR> GameAnalyzer<Partisan<S, FL, FR>>
pub fn value(&mut self) -> GameAnalysis<'_, Partisan<S, FL, FR>, S, GameValue>
pub fn outcome( &mut self, ) -> GameAnalysis<'_, Partisan<S, FL, FR>, S, PartisanOutcome>
Source§impl GameAnalyzer
impl GameAnalyzer
Sourcepub fn scoring<S, L, F, T, I>(
self,
moves: F,
terminal: T,
) -> GameAnalyzer<Scoring<S, F, T>>
pub fn scoring<S, L, F, T, I>( self, moves: F, terminal: T, ) -> GameAnalyzer<Scoring<S, F, T>>
Scores and rewards are measured for the player whose turn it is.
terminal returns Some(score) at terminal states and None elsewhere.
Source§impl<S, F, T> GameAnalyzer<Scoring<S, F, T>>
impl<S, F, T> GameAnalyzer<Scoring<S, F, T>>
pub fn clear_cache(&mut self)
Source§impl<S, L, F, T, I> GameAnalyzer<Scoring<S, F, T>>
impl<S, L, F, T, I> GameAnalyzer<Scoring<S, F, T>>
pub fn score(&mut self) -> GameAnalysis<'_, Scoring<S, F, T>, S, i64>
Source§impl GameAnalyzer
impl GameAnalyzer
Trait Implementations§
Auto Trait Implementations§
impl<G> Forget for GameAnalyzer<G>
impl<G> Freeze for GameAnalyzer<G>where
G: Freeze,
impl<G> Move for GameAnalyzer<G>
impl<G> RefUnwindSafe for GameAnalyzer<G>where
G: RefUnwindSafe,
impl<G> Send for GameAnalyzer<G>where
G: Send,
impl<G> Sync for GameAnalyzer<G>where
G: Sync,
impl<G> Unpin for GameAnalyzer<G>where
G: Unpin,
impl<G> UnsafeUnpin for GameAnalyzer<G>where
G: UnsafeUnpin,
impl<G> UnwindSafe for GameAnalyzer<G>where
G: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more