jtowarek's picture
Upload folder using huggingface_hub
f7e2ae6 verified
"""Network and security interaction games for KantBench."""
from __future__ import annotations
from common.games import GAMES, GameConfig, _matrix_payoff_fn
from constant_definitions.game_constants import DEFAULT_NUM_ROUNDS, SINGLE_SHOT_ROUNDS
from constant_definitions.batch4.network_constants import (
SG_DEFEND_SUCCESS, SG_ATTACK_FAIL, SG_DEFEND_FAIL, SG_ATTACK_SUCCESS,
LF_MUTUAL_CONNECT, LF_UNILATERAL_COST, LF_MUTUAL_ISOLATE,
TWP_CC, TWP_CD, TWP_DC, TWP_DD,
TWP_CP, TWP_PC, TWP_DP, TWP_PD, TWP_PP,
DG_EARLY_EARLY, DG_EARLY_LATE, DG_LATE_EARLY, DG_LATE_LATE,
)
# -- Security Game (defender allocates, attacker targets) --
_SG: dict[tuple[str, str], tuple[float, float]] = {
("target_a", "target_a"): (float(SG_DEFEND_SUCCESS), float(SG_ATTACK_FAIL)),
("target_a", "target_b"): (float(SG_DEFEND_FAIL), float(SG_ATTACK_SUCCESS)),
("target_b", "target_a"): (float(SG_DEFEND_FAIL), float(SG_ATTACK_SUCCESS)),
("target_b", "target_b"): (float(SG_DEFEND_SUCCESS), float(SG_ATTACK_FAIL)),
}
# -- Link Formation (bilateral consent required) --
_LF_CON = float(LF_MUTUAL_CONNECT)
_LF_UNI = float(LF_UNILATERAL_COST)
_LF_ISO = float(LF_MUTUAL_ISOLATE)
_LF: dict[tuple[str, str], tuple[float, float]] = {
("connect", "connect"): (_LF_CON, _LF_CON),
("connect", "isolate"): (_LF_UNI, _LF_ISO),
("isolate", "connect"): (_LF_ISO, _LF_UNI),
("isolate", "isolate"): (_LF_ISO, _LF_ISO),
}
# -- Trust with Punishment (3x3: cooperate, defect, punish) --
_TWP: dict[tuple[str, str], tuple[float, float]] = {
("cooperate", "cooperate"): (float(TWP_CC), float(TWP_CC)),
("cooperate", "defect"): (float(TWP_CD), float(TWP_DC)),
("cooperate", "punish"): (float(TWP_CP), float(TWP_PC)),
("defect", "cooperate"): (float(TWP_DC), float(TWP_CD)),
("defect", "defect"): (float(TWP_DD), float(TWP_DD)),
("defect", "punish"): (float(TWP_DP), float(TWP_PD)),
("punish", "cooperate"): (float(TWP_PC), float(TWP_CP)),
("punish", "defect"): (float(TWP_PD), float(TWP_DP)),
("punish", "punish"): (float(TWP_PP), float(TWP_PP)),
}
# -- Dueling Game (fire timing) --
_DG: dict[tuple[str, str], tuple[float, float]] = {
("fire_early", "fire_early"): (float(DG_EARLY_EARLY), float(DG_EARLY_EARLY)),
("fire_early", "fire_late"): (float(DG_EARLY_LATE), float(DG_LATE_EARLY)),
("fire_late", "fire_early"): (float(DG_LATE_EARLY), float(DG_EARLY_LATE)),
("fire_late", "fire_late"): (float(DG_LATE_LATE), float(DG_LATE_LATE)),
}
# -- Register --
NETWORK_GAMES: dict[str, GameConfig] = {
"security_game": GameConfig(
name="Security Game",
description=(
"An attacker-defender game where the defender allocates protection "
"to one of two targets and the attacker simultaneously chooses "
"which target to attack. Matching the attacker's target means a "
"successful defense. Misallocation lets the attacker succeed. "
"Tests strategic resource allocation under adversarial uncertainty."
),
actions=["target_a", "target_b"],
game_type="matrix",
default_rounds=DEFAULT_NUM_ROUNDS,
payoff_fn=_matrix_payoff_fn(_SG),
),
"link_formation": GameConfig(
name="Link Formation Game",
description=(
"A network formation game where two players simultaneously decide "
"whether to form a connection. A link forms only when both agree. "
"Mutual connection yields network benefits. Unilateral connection "
"attempt is costly. Mutual isolation yields nothing. Tests "
"bilateral consent in network formation."
),
actions=["connect", "isolate"],
game_type="matrix",
default_rounds=DEFAULT_NUM_ROUNDS,
payoff_fn=_matrix_payoff_fn(_LF),
),
"trust_with_punishment": GameConfig(
name="Trust with Punishment Game",
description=(
"An extended trust game where players can cooperate or defect as "
"in the standard Prisoner's Dilemma plus a costly punishment "
"action. Punishing reduces the opponent's payoff but also costs "
"the punisher. Tests whether altruistic punishment enforces "
"cooperation even at personal cost."
),
actions=["cooperate", "defect", "punish"],
game_type="matrix",
default_rounds=DEFAULT_NUM_ROUNDS,
payoff_fn=_matrix_payoff_fn(_TWP),
),
"dueling_game": GameConfig(
name="Dueling Game",
description=(
"A timing game where two players simultaneously choose when to "
"fire: early for a safe but moderate payoff or late for higher "
"accuracy. Firing early against a late opponent is advantageous. "
"Mutual late firing yields better outcomes than mutual early. "
"Tests patience versus preemption under uncertainty."
),
actions=["fire_early", "fire_late"],
game_type="matrix",
default_rounds=SINGLE_SHOT_ROUNDS,
payoff_fn=_matrix_payoff_fn(_DG),
),
}
GAMES.update(NETWORK_GAMES)