Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 9 additions & 8 deletions commissioners/common/utils.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
from __future__ import annotations

from collections import defaultdict
from datetime import UTC, datetime, timedelta
from datetime import UTC, datetime
from math import ceil
from typing import Any
from uuid import UUID

from commissioners.common.models import (
DIVISION_LEADERBOARD_SCORE_EWMA_HALFLIFE,
DIVISION_TYPE_STAGING,
DEFAULT_STAGES,
DivisionSnapshot,
Expand Down Expand Up @@ -51,7 +50,11 @@ def select_division(
if division is not None:
return division
if fallback_to_lowest:
return min(candidates, key=lambda division: division.level, default=None)
return min(
candidates,
key=lambda division: (division.level, division.name, str(division.id)),
default=None,
)
return None


Expand All @@ -60,15 +63,13 @@ def select_qualifier_division(
divisions: list[DivisionSnapshot],
) -> DivisionSnapshot | None:
from commissioners.common.models import DIVISION_TYPE_STAGING

config = commissioner_config or {}
qualifiers_division_name = config.get("qualifiers_division_name")
if not qualifiers_division_name:
return None
return select_division(
divisions,
division_name=qualifiers_division_name,
division_name=config.get("qualifiers_division_name"),
division_type=DIVISION_TYPE_STAGING,
fallback_to_lowest=False,
fallback_to_lowest=True,
)


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ defaults:
divisions:
qualifiers:
match:
name: Qualifiers
type: staging
entrants: qualifying
min_entries_to_start: 1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ defaults:
divisions:
qualifiers:
match:
name: Qualifiers
type: staging
entrants: qualifying
min_entries_to_start: 1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ defaults:
divisions:
qualifiers:
match:
name: Qualifiers
type: staging
entrants: qualifying
min_entries_to_start: 1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ defaults:
divisions:
qualifiers:
match:
name: Qualifiers
type: staging
entrants: qualifying
min_entries_to_start: 1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ defaults:
divisions:
qualifiers:
match:
name: Qualifiers
type: staging
entrants: qualifying
min_entries_to_start: 1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ defaults:
divisions:
qualifiers:
match:
name: Qualifiers
type: staging
entrants: qualifying
min_entries_to_start: 1
Expand Down
75 changes: 75 additions & 0 deletions tests/test_commissioner_strategies.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,81 @@ def _ruleset_commissioner(name: str) -> RulesetStrategyCommissioner:
return RulesetStrategyCommissioner(_ruleset_config(name))


@pytest.mark.parametrize("config_name", ["among_them", "cogs_vs_clips", "cue_n_woo", "default", "four_score", "proxywar"])
def test_ruleset_strategy_configs_do_not_pin_qualifier_division_name(config_name: str) -> None:
config = _ruleset_config(config_name)

assert config["divisions"]["qualifiers"]["match"] == {"type": "staging"}


def test_baseline_commissioner_graduates_renamed_qualifier_by_topology() -> None:
qualifier_id = uuid4()
competition_id = uuid4()
policy_version_id = uuid4()
round_start = _round_start(
policy_version_ids=[policy_version_id],
num_agents=1,
commissioner_config={"qualifiers_division_name": "Qualifiers"},
division_name="Entry Gate",
division_id=qualifier_id,
division_type="staging",
extra_divisions=[DivisionInfo(id=competition_id, name="Daily", level=1, type="competition")],
)

complete = complete_round_for_round_start(
BaselineCommissioner(),
round_start,
[
ProtocolEpisodeResult(
request_id="0",
scores=[EpisodeScore(policy_version_id=policy_version_id, score=1.0)],
)
],
)

assert complete.membership_changes[0].from_division_id == qualifier_id
assert complete.membership_changes[0].to_division_id == competition_id


def test_ruleset_strategy_graduates_renamed_qualifier_by_topology() -> None:
qualifier_id = uuid4()
competition_id = uuid4()
policy_version_id = uuid4()
round_start = _round_start(
policy_version_ids=[policy_version_id],
num_agents=1,
commissioner_config={},
division_name="Entry Gate",
division_id=qualifier_id,
division_type="staging",
extra_divisions=[DivisionInfo(id=competition_id, name="Daily", level=1, type="competition")],
)

complete = complete_round_for_round_start(
_ruleset_commissioner("default"),
round_start,
[
ProtocolEpisodeResult(
request_id="0",
scores=[EpisodeScore(policy_version_id=policy_version_id, score=1.0)],
)
],
[
ProtocolEpisodeRequest(
request_id="0",
variant_id="default",
policy_version_ids=[policy_version_id],
)
],
)

event = complete.policy_membership_events[0]
assert event.from_division_id == qualifier_id
assert event.to_division_id == competition_id
assert event.status == "competing"
assert event.substatus == "champion"


def _round_start(
*,
policy_version_ids: list[UUID],
Expand Down
Loading