Crates.io | pahcer |
lib.rs | pahcer |
version | 0.1.1 |
source | src |
created_at | 2024-11-27 13:47:35.805797 |
updated_at | 2024-11-28 17:38:33.714062 |
description | A tool to run tests for AtCoder Heuristic Contest (AHC) |
homepage | |
repository | https://github.com/terry-u16/pahcer |
max_upload_size | |
id | 1463080 |
size | 177,753 |
AtCoder Heuristic Contest (AHC) のローカルテストを並列実行するツールです。
Rustの実行環境が必要です。公式サイトを参考に事前にインストールしてください。
Rustインストール後、以下のコマンドでpahcerをインストールしてください。
$ cargo install pahcer
以下のコマンドが実行できればインストール成功です。
$ pahcer --version
インストールが失敗する場合、以下を順にお試しください。
$ rustup update
--locked
オプションを付けてインストールする$ cargo install pahcer --locked
cargo-update
を使用する方法と素のCargoを使う方法があります。前者がオススメです。
cargo-update
を使う方法$ cargo install cargo-update # 初回のみ必要
$ cargo install-update pahcer
更新がなかった場合でも都度コンパイル処理が走るので少し重いです。
$ cargo install -f pahcer
アンインストールしたい場合は以下のコマンドを実行してください。
$ cargo uninstall pahcer
以下のようにコードとAtCoderの公式テストツールを配置してください。
この配置に従わなくても構いませんが、設定ファイルの編集が必要になります。
ahc000 (プロジェクトルート)
├ main.cpp (解答プログラムのコード)
└ tools (AtCoder提供の公式ローカルテストツール)
├ src
└ in
ahc000 (プロジェクトルート)
├ main.py (解答プログラムのコード)
└ tools (AtCoder提供の公式ローカルテストツール)
├ src
└ in
ahc000 (プロジェクトルート)
├ src
│ └ main.rs (解答プログラムのコード)
├ targets (ビルド成果物フォルダ)
├ Cargo.toml
└ tools (AtCoder提供の公式ローカルテストツール)
├ src
└ in
ahc000 (プロジェクトルート)
├ main.go (解答プログラムのコード)
└ tools (AtCoder提供の公式ローカルテストツール)
├ src
└ in
以下を実行して、初期設定を行います。
$ pahcer init -p <PROBLEM_NAME> -o <OBJECTIVE> -l <LANGUAGE> [-i]
<PROBLEM_NAME>
にはコンテスト名を入れてください。<OBJECTIVE>
にはスコアが大きい方が良いか小さい方が良いかを指定してください。
max
: スコアが大きい方が良いmin
: スコアが小さい方が良い<LANGUAGE>
にはお使いの言語を入力してください。現在以下のオプションが指定可能です。
cpp
: C++python
: Pythonrust
: Rust
cargo.toml
の package.name
と patcher init
の <PROBLEM_NAME>
を一致させないと設定ファイルの編集が必要になります。targets
ディレクトリがプロジェクトルート直下にない場合も同様です。cargo-competeを使用している場合などは注意してください。go
: Go-i
オプションはインタラクティブ問題の時に設定してください。実行すると、設定ファイルが ./pahcer_config.toml
に生成されます。また、テストケースの実行結果が格納される ./pahcer
ディレクトリが生成されます。
AHC039 (非インタラクティブ問題、スコア最大化)でC++を使用
$ pahcer init -p ahc039 -o max -l cpp
AHC030 (インタラクティブ問題、スコア最小化)でPythonを使用
$ pahcer init -p ahc030 -o min -l python -i
以下のコマンドを実行するとテストケースが並列で実行されます。
$ pahcer run
実行中、各ケースの実行結果がコンソールに表形式で逐次出力されます。各列の内容は以下の通りです。
Progress
: テストケース実行の進行状況です。Seed
: 実行したテストケースのseed値です。Case Score
: 当該テストケースのスコアです。
Score
: 実スコア(正の整数値のみ許容)です。0点の場合はWA扱いとなります。Relative
: ローカルでのベストスコアを100としたときの相対スコアです。
OBJECTIVE = max
のときは 100 * YOURS / BEST
、 OBJECTIVE = min
のときは 100 * BEST / YOURS
で計算されます。Average Score
: その時点までの平均スコアです。
Score
: 実スコアの平均値です。Relative
: 相対スコアの平均値です。Exec. Time
: 実行時間(ミリ秒表示)です。並列実行数などにより変化しうるので参考程度にご覧ください。このとき、並列実行を行っている都合上seedの順番が実行ごとに変化することに注意してください。途中で実行を中断する場合は Ctrl+C
を押してください。
実行後、以下の情報が表示されます。
Average Score
: 実スコアの平均値です。Average Score (log10)
: 実スコアの対数を取った値の平均値です。相対スコア問題の評価などに活用いただけます。Average Relative Score
: 相対スコアの平均値です。Accepted
: Acceptされたケース数です。正の点数を取ったテストケースがAcceptedと見なされます。実行時間が長くてもTLE扱いにはなりませんのでご注意ください。Max Execution Time
: 実行時間の最大値です。また、実行後以下の3ファイルが生成または追記されます。
./pahcer/summary.md
: 実行結果のサマリが表形式で記録されたファイルです。./pahcer/best_scores.json
: ローカルでのベストスコアが保存されたJSONファイルです。./pahcer/json/result_*.json
: 実行結果の詳細が記録されたJSONファイルです。デフォルトでは、 seed=0 から seed=99 までの100ケースが実行されます。カスタマイズしたい場合やうまく動かない場合は ./pahcer_config.toml
を編集してください。(非WSLのWindows環境だと設定を変える必要があるかもしれません。)
Optunaとの連携によるパラメータ最適化も可能です。詳細は ./optuna-sample/README.md
をご参照ください。
pahcerの実行コマンド一覧です。
pahcer init
pahcerの初期設定を行います。
$ pahcer init [OPTIONS] -p <PROBLEM_NAME> -o <OBJECTIVE> -l <LANGAGE>
-p
, --problem
-o
, --objective
max
: スコアが大きい方が良いmin
: スコアが小さい方が良い-l
, --language
cpp
: C++python
: Pythonrust
: Rustgo
: Go-i
, --interactive
以下でヘルプが出せます。
$ pahcer init -h
$ pahcer init -p ahc030 -o min -l python -i
pahcer run
テストケースを並列実行します。
$ pahcer run [OPTIONS]
-c
, --comment
-j
, --json
--shuffle
--setting-file
./pahcer_config.toml
)のパスをデフォルトから変更します。--freeze-best-scores
--no-result-file
--no-compile
以下でヘルプが出せます。
$ pahcer init -h
$ pahcer run -c 焼きなまし高速化バージョン -j --shuffle --setting-file settings.toml --freeze-best-scores --no-result-file
設定ファイル ./pahcer_config.toml
の内容を説明します。
general
全般に関する設定です。
version
設定ファイルのバージョンです。
problem
問題固有の項目に関する設定です。
problem_name
問題の名前(コンテスト名)です。
objective
スコアが大きい方が良いか小さい方が良いかを指定します。以下のいずれかが指定可能です。
Max
: スコアが大きい方が良いMin
: スコアが小さい方が良いscore_regex
スコアの抽出を行う正規表現です。
pahcerは各実行ステップにおける標準出力・標準エラー出力の内容を全て読み込み、 score_regex
に一致した行からスコアを抽出します。そのような行が複数存在する場合は最も最後の行が優先されます(同実行ステップで標準出力・標準エラー出力両方に存在する場合は標準エラー出力が優先)。なお、一致する行が1つも存在しなかった場合は WA
となります。
test
テストケースの実行に関する設定です。
start_seed
テストケースの開始seed値を指定します。
end_seed
テストケースの終了seed値を指定します。 start_seed
より大きい値でなければなりません。
[start_seed, end_seed) の半開区間が実行されるため、 end_seed
は区間に含まれない ことに注意してください。
threads
並列実行数を指定します。 0
を指定すると実行しているマシンの物理CPU数と同じ値となります。
out_dir
全ケース終了後の結果ファイルの出力先ディレクトリを指定します。
compile_steps
pahcer run
を実行したときに一度だけ行われるコンパイル実行のステップです。複数設定することが可能で、その場合は上から順に逐次実行されます。
program
コンパイルステップで実行されるプログラム名です。
args
コンパイルステップでプログラムに渡されるコマンドライン引数です。配列の形で渡します。
current_dir
コンパイルステップの実行ディレクトリです。省略が可能で、省略した場合はカレントディレクトリとなります。
test_steps
テストケース実行時に行われるステップです。複数設定することが可能で、その場合は上から順に逐次実行されます。
なお、 args
, stdin
, stdout
, stderr
にはプレースホルダーが設定可能で、以下のように展開されます。
{SEED}
: シード値(例: {SEED}.txt
-> 1.txt
){SEED04}
: 0で4桁にパディングされたシード値(例: {SEED04}.txt
-> 0001.txt
)program
テストステップで実行されるプログラム名です。
args
テストステップでプログラムに渡されるコマンドライン引数です。配列の形で渡します。
stdin
テストステップでプログラムに渡される標準入力の内容が記録されたファイルを指定します。省略が可能で、省略した場合は標準入力に何も渡しません。
stdout
テストステップでプログラムから出力される標準出力の記録先ファイルを指定します。省略が可能で、省略した場合はファイル出力を行いません(スコア抽出にのみ使用されます)。
stderr
テストステップでプログラムから出力される標準エラー出力の記録先ファイルを指定します。省略が可能で、省略した場合はファイル出力を行いません(スコア抽出にのみ使用されます)。
measure_time
実行時間の計測対象か否かをbool値で指定します。 true
が指定されたテストステップの実行時間の合計値が最終的に出力されます。
MITまたはApache-2.0のデュアルライセンスです。
pahcer
をよく pacher
とtypoします。必要に応じてエイリアスを設定するとよいです。