Drop checkpoint.directory from config — config defines what an experiment is, not where its outputs go. The CLI now computes the run directory from run.experiment_name plus a timestamp, defaulting to runs/tmp/ for throwaway runs and runs/ when --keep is passed. - Remove CheckpointConfig.directory and DeepCFRConfig.checkpoint_path - DeepCFRTrainer takes run_dir: Path explicitly - CLI: add --keep boolean; --resume requires an explicit path (no shortcut) - Auto path: runs/[tmp/]<YYYY-MM-DD_HHMMSS>_<experiment_name-kebab>/ - Rename 13 configs to kebab-case; strip directory: lines; kebab their experiment_name values - Rewrite AGENTS.md training/run sections; document archive/tmp/<flat> layout, --keep, kebab-case scope - Update tests for new run_dir flow and dropped --resume shortcut Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
105 lines
2.1 KiB
YAML
105 lines
2.1 KiB
YAML
run:
|
|
experiment_name: lost-cities-deep-cfr-selfplay-anchor-safe-512x3-2x-updates-10000iter
|
|
seed: 79
|
|
max_iterations: 10000
|
|
max_minutes: null
|
|
device: cuda
|
|
use_amp: false
|
|
|
|
rules:
|
|
n_colors: 5
|
|
n_ranks: 9
|
|
min_rank: 2
|
|
n_handshakes: 3
|
|
hand_size: 8
|
|
expedition_penalty: -20
|
|
bonus_threshold: 8
|
|
bonus_amount: 20
|
|
|
|
encoding:
|
|
derived_playability: true
|
|
slot_aware_playability: true
|
|
|
|
network:
|
|
hidden_size: 512
|
|
num_layers: 3
|
|
activation: relu
|
|
|
|
traversal:
|
|
traversals_per_player: 2
|
|
traversals_per_player: 70
|
|
max_depth: null
|
|
max_nodes_per_traversal: 10000
|
|
max_nodes_per_traversal: 1000
|
|
regret_matching_epsilon: 0.0001
|
|
outcome_sampling_epsilon: 0.2
|
|
outcome_sampling_value_clip: 500.0
|
|
outcome_unsampled_regret: zero
|
|
cutoff_value_mode: score_diff
|
|
cutoff_rollouts: 0
|
|
cutoff_rollout_policy: random
|
|
cutoff_rollout_max_steps: 300
|
|
opponent_policy: self_play_league
|
|
strategy_sample_interval: 1
|
|
store_strategy_on_traverser_nodes: true
|
|
store_strategy_on_opponent_nodes: false
|
|
num_workers: 8
|
|
worker_chunk_size: 4
|
|
worker_chunk_size: 8
|
|
progress_every_traversals: 10
|
|
endpoint_depth_bucket_width: 100
|
|
endpoint_depth_bucket_max: 1000
|
|
|
|
regret_matching:
|
|
all_negative_fallback: argmax_tiebreak
|
|
|
|
training_weighting:
|
|
mode: none
|
|
|
|
self_play:
|
|
snapshot_every: 1
|
|
max_snapshots: 20
|
|
anchor_probability: 0.0
|
|
current_weight: 0.45
|
|
recent_weight: 0.30
|
|
older_weight: 0.15
|
|
anchor_weight: 0.10
|
|
recent_window: 5
|
|
|
|
optimization:
|
|
advantage_updates_per_iteration: 1
|
|
strategy_updates_per_iteration: 1
|
|
advantage_batch_size: 1024
|
|
strategy_batch_size: 1024
|
|
advantage_updates_per_iteration: 512
|
|
strategy_updates_per_iteration: 512
|
|
learning_rate: 0.00003
|
|
weight_decay: 0.0001
|
|
grad_clip: 1.0
|
|
|
|
memory:
|
|
advantage_capacity: 2000000
|
|
strategy_capacity: 2000000
|
|
|
|
checkpoint:
|
|
save_latest: true
|
|
save_every: 100
|
|
progress_interval_seconds: 20.0
|
|
exact_resume: false
|
|
|
|
evaluation:
|
|
eval_every: 5
|
|
games: 100
|
|
opponents:
|
|
- random
|
|
- passive_discard
|
|
- safe_heuristic
|
|
- safe_heuristic_loose
|
|
- safe_heuristic_strict
|
|
- noisy_safe
|
|
max_steps: 10000
|
|
on_max_steps: score_diff
|
|
batch_size: 64
|
|
device: trainer
|
|
num_workers: 4
|