7.3 KiB
Poker Hand Evaluation Project
Overview
This project is a comprehensive Rust-based poker hand evaluation and bot development framework. Built around a high-performance poker hand evaluation library, it provides tools for poker bot development, game simulation, strategy analysis, and performance monitoring.
Architecture
The project is organized into several key components:
poker-project/
├── core/ # Core poker API and hand evaluation
│ ├── src/api/ # Core data types and traits
│ ├── src/hand_evaluator.rs # High-performance hand evaluation
│ ├── src/evaluator_generator/ # Lookup table generation
│ └── src/texas_holdem/ # Texas Hold'em game logic
├── bots/ # Poker bot implementations
├── simulator/ # Game simulation and testing tools
├── tools/ # Analysis and monitoring utilities
└── docs/ # Documentation and guides
Core Components
🃏 Core Library (core/)
High-Performance Poker Hand Evaluation
- Perfect Hash Algorithm: O(1) hand evaluation using precomputed tables
- Multi-Hand Support: Evaluate 5, 6, or 7-card poker hands
- Memory Efficient: ~128MB for complete evaluation tables
- Standards Compliant: Based on proven poker evaluation algorithms
Key Features:
- Card and Hand management
- Deck operations and shuffling
- Player action representation
- Game state information
- Bot interface definitions
- Configuration management
🤖 Poker Bots (bots/)
AI Player Implementations
- Multiple bot strategies (random, tight, aggressive, adaptive)
- Complete Player and GameObserver trait implementations
- Configurable behavior and decision-making
- Performance tracking and analysis
🎲 Simulator (simulator/)
Game Simulation Framework
- Complete Texas Hold'em game simulation
- Monte Carlo analysis for strategy testing
- Range vs range analysis
- Tournament and cash game simulation
- Statistical analysis and reporting
🔧 Tools (tools/)
Development and Analysis Utilities
- Log analysis and pattern detection
- Real-time performance monitoring
- Automated testing frameworks
- Report generation and visualization
Performance Characteristics
| Component | Performance | Memory Usage |
|---|---|---|
| Hand Evaluation | ~10-20ns per hand | ~128MB tables |
| Bot Decision | < 10ms per action | ~10KB per bot |
| Game Simulation | ~1ms per hand | ~1MB per simulation |
| Log Analysis | ~100ms per 1000 hands | ~50MB for analysis |
Quick Start
Basic Hand Evaluation
use poker_api::hand_evaluator::LookupHandEvaluator;
use poker_api::api::hand::Hand;
use poker_api::api::card::Card;
// Create evaluator (generates tables on first use)
let evaluator = LookupHandEvaluator::new().unwrap();
// Create a poker hand
let mut hand = Hand::new();
hand.add_card(Card::from_string("As").unwrap()).unwrap();
hand.add_card(Card::from_string("Ks").unwrap()).unwrap();
hand.add_card(Card::from_string("Qs").unwrap()).unwrap();
hand.add_card(Card::from_string("Js").unwrap()).unwrap();
hand.add_card(Card::from_string("Ts").unwrap()).unwrap();
// Evaluate hand strength
let rank = evaluator.rank_hand(&hand);
println!("Hand rank: {}", rank); // Higher values = stronger hands
Creating a Poker Bot
use poker_api::api::player::Player;
use poker_api::api::preferences::Preferences;
use poker_api::api::action::Action;
struct MyBot {
hole_cards: Option<(Card, Card)>,
aggression: f64,
}
impl Player for MyBot {
fn init(&mut self, prefs: Box<dyn Preferences>) {
self.aggression = prefs.get_double("aggression", 0.5);
}
fn hole_cards(&mut self, c1: Card, c2: Card, _seat: usize) {
self.hole_cards = Some((c1, c2));
}
fn get_action(&mut self) -> Action {
if self.hole_cards.is_some() {
// Make decision based on hole cards and aggression
Action::check_action()
} else {
Action::fold_action(0.0)
}
}
}
Running Simulations
use poker_api::simulator::texas_holdem::TexasHoldemSimulation;
// Create and configure simulation
let mut simulation = TexasHoldemSimulation::new();
simulation.set_player_range(0, "AA,KK,QQ".to_string());
simulation.set_player_range(1, "22+,A2+".to_string());
// Run simulation
let results = simulation.run(10000);
println!("Simulation results: {:?}", results);
Algorithm Details
Perfect Hash Hand Evaluation
The core algorithm uses a perfect hash function to map each possible card combination to a unique index in a precomputed ranking table:
- Card Encoding: Each card is encoded into a compact binary representation
- Perfect Hash: Cards are mapped to unique indices using mathematical functions
- Table Lookup: Precomputed ranking tables provide instant hand strength values
- Best Hand Selection: For 6-7 card hands, finds optimal 5-card combination
Table Generation Process
The first time an evaluator is created, it generates evaluation tables (~1-2 seconds):
- 612,978 combinations processed for 5-card hands
- 32+ million entries in final lookup table
- Mathematical verification ensures accuracy
- Binary serialization for fast loading on subsequent runs
Development
Building the Project
# Clone the repository
git clone <repository-url>
cd poker-project
# Build all components
cargo build --release
# Run tests
cargo test
# Generate documentation
cargo doc --open
Project Structure
Each component is designed to work independently while integrating seamlessly:
- Core Library: Standalone poker hand evaluation
- Bot Framework: Pluggable AI player system
- Simulation Engine: Controlled testing environment
- Analysis Tools: Performance monitoring and strategy analysis
Contributing
The project welcomes contributions in several areas:
- Bot Strategies: New AI playing strategies
- Game Variants: Additional poker game types
- Performance: Optimizations and hardware acceleration
- Analysis Tools: Enhanced monitoring and reporting
- Documentation: Guides and tutorials
Use Cases
Poker Bot Development
- Develop and test poker AI strategies
- Analyze bot performance against known ranges
- Optimize decision-making algorithms
Game Simulation
- Test poker scenarios and edge cases
- Analyze range vs range situations
- Study game theory optimal strategies
Strategy Research
- Research optimal bet sizing
- Analyze position and stack size effects
- Develop exploitative strategies
Performance Analysis
- Monitor poker application performance
- Identify bottlenecks and optimization opportunities
- Load testing for production systems
License
This project is licensed under the MIT License - see the LICENSE file for details.
Acknowledgments
- Meerkat API: Original Java implementation by Ray Wotton
- Poker Standards: 2+2 Poker hand ranking standards
- Rust Community: Performance optimizations and best practices
- Contributors: All contributors to the poker evaluation algorithms
Note: This project focuses on poker hand evaluation and bot development. It does not include real-money gambling functionality and is intended for educational and research purposes.