Drop variant B, adopt Black-belt Exam defender, add one-sidedness metrics
- Remove variant B (Brown cap, +1 for higher beating lower) from rules, engine, bots and simulator; a higher belt beating a lower one gains 0. - Final Exam: the defender fights as a Black belt (RULES.md v0.7). Ties to the defender and best-of-3 stay as simulator switches (`--exam`). - Report stripe income per source as gains and losses. - Add ten one-sidedness measures sampled at turn ends (lead gap, winner margin and lead share, halfway leader, last lead change, contention, rank swaps, leader Kumite losses, Exam challengers, winner pace). - Plan: decisions D28-D33 and the detailed Phase 6. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+25
-2
@@ -14,10 +14,11 @@ from dojo.bots import (
|
||||
HeuristicAgent,
|
||||
Profile,
|
||||
RandomAgent,
|
||||
series_probability,
|
||||
win_probability,
|
||||
)
|
||||
from dojo.engine import Agent, FightView, Game, RandomSource
|
||||
from dojo.rules import VARIANT_A, VARIANT_B, Card, RulesConfig
|
||||
from dojo.rules import DEFAULT_RULES, Card, RulesConfig
|
||||
|
||||
ALLENAMENTO = Pos(0, 5)
|
||||
FATICA = Pos(3, 6)
|
||||
@@ -30,6 +31,22 @@ def test_win_probability_counts_senshu_and_bonuses() -> None:
|
||||
assert win_probability(0, 0) == pytest.approx(21 / 36)
|
||||
assert win_probability(2, 0) == pytest.approx(30 / 36)
|
||||
assert win_probability(0, 2) == pytest.approx(10 / 36)
|
||||
assert win_probability(0, 0, senshu=False) == pytest.approx(15 / 36)
|
||||
|
||||
|
||||
def test_series_probability_is_a_best_of_n() -> None:
|
||||
assert series_probability(0.3, 1) == pytest.approx(0.3)
|
||||
assert series_probability(0.5, 3) == pytest.approx(0.5)
|
||||
assert series_probability(0.6, 3) == pytest.approx(0.6**2 * (3 - 2 * 0.6))
|
||||
|
||||
|
||||
def test_kiai_that_only_ties_the_exam_is_kept_when_ties_go_to_the_defender() -> None:
|
||||
game, _, _ = make_game(config=RulesConfig(exam_ties_to_defender=True))
|
||||
game.players[0].tecnica = Card.KIAI
|
||||
exam = FightView(0, 1, True, 3, 5, played=())
|
||||
|
||||
assert not HeuristicAgent().play_tecnica(game.view(0), exam)
|
||||
assert HeuristicAgent().play_tecnica(game.view(0), fight(3, 5))
|
||||
|
||||
|
||||
def test_heuristic_prefers_allenamento_to_fatica() -> None:
|
||||
@@ -100,7 +117,13 @@ def play(board: Board, config: RulesConfig, seed: int) -> Game:
|
||||
return game
|
||||
|
||||
|
||||
@pytest.mark.parametrize("config", [VARIANT_A, VARIANT_B])
|
||||
@pytest.mark.parametrize(
|
||||
"config",
|
||||
[
|
||||
DEFAULT_RULES,
|
||||
RulesConfig(exam_ties_to_defender=True, exam_defender_black=True, exam_rounds=3),
|
||||
],
|
||||
)
|
||||
def test_bots_play_full_games_reproducibly(board: Board, config: RulesConfig) -> None:
|
||||
first, again = play(board, config, seed=7), play(board, config, seed=7)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user