id: 9006b8b6a3084301961ccc06fa7893da
parent_id: 
item_type: 1
item_id: f9c8cc6ea0e743b1a7997fbb0f8ea792
item_updated_time: 1782143590156
title_diff: "[{\"diffs\":[[1,\"NG Preflop Port — 169-Hand Ranking Strategy\"]],\"start1\":0,\"start2\":0,\"length1\":0,\"length2\":43}]"
body_diff: "[{\"diffs\":[[1,\"# NG Preflop Port — 169-Hand Ranking Strategy\\\n\\\n## Summary\\\n\\\nPorted the Java `PreFlopStrategyV1` (ringnl/supersonic) to Rust as `ng_preflop`.\\\nThis replaces the boolean hand-grouping approach (`g1_big_stack_preflop`) with\\\na continuous 169-hand ranking table approach for Gen 2 and Gen 3.\\\n\\\nGen 3 is now the production bot (`cash_nl.toml`).\\\n\\\n## New Files\\\n- `holdem_bots/src/common/hand_rankings.rs` — Three 169-hand ranking tables\\\n  (general, HU, profitability) + blended strength functions\\\n- `holdem_bots/src/cash/ng_preflop.rs` — `NgPreFlop` strategy ported from Java\\\n\\\n## Architecture: Old vs New\\\n\\\n### Old: Boolean Hand Grouping (`g1_big_stack_preflop`)\\\n- Discrete categories with gaps (J9s falls through)\\\n- No continuous strength measure, no HU/full-ring interpolation\\\n\\\n### New: 169-Hand Ranking Tables (`ng_preflop`)\\\n- Three orderings: general (Sklansky), HU (jazbo.com), profit (tightpoker.com)\\\n- Blended strength by active players: `mixed_strength_half` and `mixed_strength`\\\n- Position-aware thresholds: SB steal 17.7%, early 7.2%, mid 8.4%, late 14.2%\\\n- Implied odds for limping: requires `potentialWin >= 15 × to_call`\\\n- Re-raise thresholds: standard 5.9% (JJ+/AK), huge raise 1.2%\\\n\\\n## Configs\\\n\\\n### Production (`cash_nl.toml` — Gen 3)\\\n```toml\\\n[[strategies]]\\\ntype = \\\"g1_short_stack_preflop\\\"\\\n[[strategies]]\\\ntype = \\\"ng_preflop\\\"\\\n[[strategies]]\\\ntype = \\\"g3_postflop_rollout\\\"\\\n```\\\n\\\n### Comparison (`cash_nl_gen2.toml` — Gen 2)\\\n```toml\\\n[[strategies]]\\\ntype = \\\"g1_short_stack_preflop\\\"\\\n[[strategies]]\\\ntype = \\\"g1_big_stack_preflop\\\"\\\n[[strategies]]\\\ntype = \\\"g2_postflop_rollout_v4\\\"\\\n```\\\n\\\n### Comparison (`cash_gen1.toml` — Gen 1)\\\n```toml\\\n[[strategies]]\\\ntype = \\\"g1_short_stack_preflop\\\"\\\n[[strategies]]\\\ntype = \\\"g1_big_stack_preflop\\\"\\\n[[strategies]]\\\ntype = \\\"g1_postflop_rules\\\"\\\n```\\\n\\\n## What Was NOT Ported (from NGPreFlopStrategyV2)\\\n\\\n- **PlayerModelV2** — opponent statistics database\\\n- **ICM all-in profitability** — tournament equity calculations\\\n- **Win probability tables** (13×13 vs top 5%/10% ranges) — could be ported later\\\n- **Squeeze plays, limp-reraise** — future enhancements\\\n- **Blind level modifier** — SNG-specific\\\n\\\n## Key Fixes Applied During Port\\\n\\\n- **f64::MAX sentinel inversion** — `determine_limp_cards_threshold` returned MAX (always-limp) → fixed to 0.0\\\n- **action_commits_me cost** — now passes `to_call + raise_amount` (true out-of-pocket)\\\n- **safe_raise** — caps raise totals at effective stack, saturating arithmetic\\\n- **Redundant percentile scans** — eliminated (4→2 per decision via `_from` variants)\\\n- **sweep_mode** — production config sets `sweep_mode = false` for live entropy\"]],\"start1\":0,\"start2\":0,\"length1\":0,\"length2\":2587}]"
metadata_diff: {"new":{"id":"f9c8cc6ea0e743b1a7997fbb0f8ea792","parent_id":"1246bbc3bb4948fc8329079b84b4ae3d","latitude":"0.00000000","longitude":"0.00000000","altitude":"0.0000","author":"","source_url":"","is_todo":0,"todo_due":0,"todo_completed":0,"source":"joplin-desktop","source_application":"net.cozic.joplin-desktop","application_data":"","order":1782128719938,"markup_language":1,"is_shared":0,"share_id":"","conflict_original_id":"","master_key_id":"","user_data":"","deleted_time":0},"deleted":[]}
encryption_cipher_text: 
encryption_applied: 0
updated_time: 2026-06-22T15:57:19.159Z
created_time: 2026-06-22T15:57:19.159Z
type_: 13