AHC Lib
===========
`titan23 <https://atcoder.jp/users/titan23?contestType=heuristic>`_ が使用している、AHC のツールです。
ありえないバグがあるかもしれません。ご注意ください。
`View on GitHub <https://github.com/titan-23/ahclib/tree/main>`_
使い方
-------
初期設定
~~~~~~~~~~~~~~~~~~
作業ディレクトリで以下のコマンドを実行し、設定ファイル ``ahc_settings`` ファイルを生成します
.. code-block:: shell
python3 -m ahclib setup
並列実行
~~~~~~~~~~~~~~~~~~
``njobs`` 数のスレッドを立ち上げて実行します。結果を記録した csv ファイルと実行ソースファイルが ``./ahclib_results/`` ディレクトリに保存されます
コマンドは以下です
.. code-block:: shell
python3 -m ahclib test [-c] [-v] [-r]
**オプション**
- ``-c`` : コンパイルします
- ``-v`` : ログを表示します(推奨)
- ``-r`` : 標準出力と標準エラー出力をすべて保存します
Optuna を用いたパラメータ探索
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
コマンドは以下です
.. code-block:: shell
python3 -m ahclib opt
設定ファイル
-------------
設定ファイル ``ahc_settings`` 中の ``AHCSettings`` クラスに以下の情報を書いてください
* スレッド数 (``njobs``)
- (パソコンの最大スレッド数-1)との ``min`` がとられる
* ファイル名 (``filename``)
* コンパイルコマンド (``compile_command``)
- コンパイルする必要が無いときは、``None`` とする
* 実行コマンド (``execute_command``)
* 入力ファイル (``input_file_names``)
- ``list[str]`` の形式で書く
* 制限時間 (``timeout``)
- ``ms`` 単位で指定する
- 指定しないときは ``None`` とする
- 各テストでメモリを多く使う場合など、正確さに欠けることがある点に注意
* 集計関数 (``get_score``)
- 例: 平均など
例:
.. code-block:: python
njobs = 127
filename = "./main.cpp"
compile_command = "g++ ./main.cpp -O2 -std=c++20 -o a.out -I./../../../Library_cpp"
execute_command = "./a.out"
input_file_names = [f"./in/{str(i).zfill(4)}.txt" for i in range(100)]
timeout = None
def get_score(scores: list[float]) -> float:
return sum(scores) / len(scores)
Optuna を用いたパラメータ探索用の設定
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* ``study_name``
- ``study_name`` が既にある場合、そのデータベースが利用される
* ``direction``
- ``minimize`` か ``maximize``
* optuna の試行回数 (``n_trials``)
* optuna のスレッド数 (``n_jobs_optuna``)
* 推定するもの
.. code-block:: python
def objective(trial: optuna.trial.Trial) -> tuple:
- 返り値のタプルはコマンドライン引数として渡す順番にする
例: 初期温度を探索する
.. code-block:: python
study_name = "test"
direction = "minimize"
n_trials = 50
n_jobs_optuna = 1
def objective(trial: optuna.trial.Trial) -> tuple:
start_temp = trial.suggest_float("start_temp", 1, 1e9, log=True)
return start_temp, # タプルで返す
.. code-block:: cpp
double start_temp;
int main(int argc, char *argv[]) {
start_temp = std::stod(argv[1]); // argv[1], ... に objective で返した値が格納されている
solve();
return 0;
}
Raw data
{
"_id": null,
"home_page": "https://github.com/titan-23/ahclib",
"name": "ahclib",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "AtCoder, AHC, heuristic",
"author": "titan23",
"author_email": "titan23.kyopuro@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/3c/dc/ad050b14d5d191cbb22fd47f91d5fa128a4c6999b77b3209825dc32c86c0/ahclib-0.1.0.tar.gz",
"platform": null,
"description": "AHC Lib\n===========\n\n`titan23 <https://atcoder.jp/users/titan23?contestType=heuristic>`_ \u304c\u4f7f\u7528\u3057\u3066\u3044\u308b\u3001AHC \u306e\u30c4\u30fc\u30eb\u3067\u3059\u3002\n\u3042\u308a\u3048\u306a\u3044\u30d0\u30b0\u304c\u3042\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002\u3054\u6ce8\u610f\u304f\u3060\u3055\u3044\u3002\n\n`View on GitHub <https://github.com/titan-23/ahclib/tree/main>`_\n\n\n\u4f7f\u3044\u65b9\n-------\n\n\u521d\u671f\u8a2d\u5b9a\n~~~~~~~~~~~~~~~~~~\n\n\u4f5c\u696d\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3067\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3001\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb ``ahc_settings`` \u30d5\u30a1\u30a4\u30eb\u3092\u751f\u6210\u3057\u307e\u3059\n\n.. code-block:: shell\n\n python3 -m ahclib setup\n\n\n\n\u4e26\u5217\u5b9f\u884c\n~~~~~~~~~~~~~~~~~~\n\n``njobs`` \u6570\u306e\u30b9\u30ec\u30c3\u30c9\u3092\u7acb\u3061\u4e0a\u3052\u3066\u5b9f\u884c\u3057\u307e\u3059\u3002\u7d50\u679c\u3092\u8a18\u9332\u3057\u305f csv \u30d5\u30a1\u30a4\u30eb\u3068\u5b9f\u884c\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u304c ``./ahclib_results/`` \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u4fdd\u5b58\u3055\u308c\u307e\u3059\n\n\u30b3\u30de\u30f3\u30c9\u306f\u4ee5\u4e0b\u3067\u3059\n\n.. code-block:: shell\n\n python3 -m ahclib test [-c] [-v] [-r]\n\n**\u30aa\u30d7\u30b7\u30e7\u30f3**\n\n- ``-c`` : \u30b3\u30f3\u30d1\u30a4\u30eb\u3057\u307e\u3059\n- ``-v`` : \u30ed\u30b0\u3092\u8868\u793a\u3057\u307e\u3059(\u63a8\u5968)\n- ``-r`` : \u6a19\u6e96\u51fa\u529b\u3068\u6a19\u6e96\u30a8\u30e9\u30fc\u51fa\u529b\u3092\u3059\u3079\u3066\u4fdd\u5b58\u3057\u307e\u3059\n\n\nOptuna \u3092\u7528\u3044\u305f\u30d1\u30e9\u30e1\u30fc\u30bf\u63a2\u7d22\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n\u30b3\u30de\u30f3\u30c9\u306f\u4ee5\u4e0b\u3067\u3059\n\n.. code-block:: shell\n\n python3 -m ahclib opt\n\n\n\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\n-------------\n\n\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb ``ahc_settings`` \u4e2d\u306e ``AHCSettings`` \u30af\u30e9\u30b9\u306b\u4ee5\u4e0b\u306e\u60c5\u5831\u3092\u66f8\u3044\u3066\u304f\u3060\u3055\u3044\n\n* \u30b9\u30ec\u30c3\u30c9\u6570 (``njobs``)\n\n - (\u30d1\u30bd\u30b3\u30f3\u306e\u6700\u5927\u30b9\u30ec\u30c3\u30c9\u6570-1)\u3068\u306e ``min`` \u304c\u3068\u3089\u308c\u308b\n\n* \u30d5\u30a1\u30a4\u30eb\u540d (``filename``)\n\n* \u30b3\u30f3\u30d1\u30a4\u30eb\u30b3\u30de\u30f3\u30c9 (``compile_command``)\n\n - \u30b3\u30f3\u30d1\u30a4\u30eb\u3059\u308b\u5fc5\u8981\u304c\u7121\u3044\u3068\u304d\u306f\u3001``None`` \u3068\u3059\u308b\n\n* \u5b9f\u884c\u30b3\u30de\u30f3\u30c9 (``execute_command``)\n\n* \u5165\u529b\u30d5\u30a1\u30a4\u30eb (``input_file_names``)\n\n - ``list[str]`` \u306e\u5f62\u5f0f\u3067\u66f8\u304f\n\n* \u5236\u9650\u6642\u9593 (``timeout``)\n\n - ``ms`` \u5358\u4f4d\u3067\u6307\u5b9a\u3059\u308b\n - \u6307\u5b9a\u3057\u306a\u3044\u3068\u304d\u306f ``None`` \u3068\u3059\u308b\n - \u5404\u30c6\u30b9\u30c8\u3067\u30e1\u30e2\u30ea\u3092\u591a\u304f\u4f7f\u3046\u5834\u5408\u306a\u3069\u3001\u6b63\u78ba\u3055\u306b\u6b20\u3051\u308b\u3053\u3068\u304c\u3042\u308b\u70b9\u306b\u6ce8\u610f\n\n* \u96c6\u8a08\u95a2\u6570 (``get_score``)\n\n - \u4f8b: \u5e73\u5747\u306a\u3069\n\n\n\u4f8b:\n\n.. code-block:: python\n\n njobs = 127\n filename = \"./main.cpp\"\n compile_command = \"g++ ./main.cpp -O2 -std=c++20 -o a.out -I./../../../Library_cpp\"\n execute_command = \"./a.out\"\n input_file_names = [f\"./in/{str(i).zfill(4)}.txt\" for i in range(100)]\n timeout = None\n\n def get_score(scores: list[float]) -> float:\n return sum(scores) / len(scores)\n\n\nOptuna \u3092\u7528\u3044\u305f\u30d1\u30e9\u30e1\u30fc\u30bf\u63a2\u7d22\u7528\u306e\u8a2d\u5b9a\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n* ``study_name``\n\n - ``study_name`` \u304c\u65e2\u306b\u3042\u308b\u5834\u5408\u3001\u305d\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u5229\u7528\u3055\u308c\u308b\n\n* ``direction``\n\n - ``minimize`` \u304b ``maximize``\n\n* optuna \u306e\u8a66\u884c\u56de\u6570 (``n_trials``)\n\n* optuna \u306e\u30b9\u30ec\u30c3\u30c9\u6570 (``n_jobs_optuna``)\n\n* \u63a8\u5b9a\u3059\u308b\u3082\u306e\n\n .. code-block:: python\n\n def objective(trial: optuna.trial.Trial) -> tuple:\n\n - \u8fd4\u308a\u5024\u306e\u30bf\u30d7\u30eb\u306f\u30b3\u30de\u30f3\u30c9\u30e9\u30a4\u30f3\u5f15\u6570\u3068\u3057\u3066\u6e21\u3059\u9806\u756a\u306b\u3059\u308b\n\n\n\u4f8b: \u521d\u671f\u6e29\u5ea6\u3092\u63a2\u7d22\u3059\u308b\n\n.. code-block:: python\n\n study_name = \"test\"\n direction = \"minimize\"\n n_trials = 50\n n_jobs_optuna = 1\n\n def objective(trial: optuna.trial.Trial) -> tuple:\n start_temp = trial.suggest_float(\"start_temp\", 1, 1e9, log=True)\n return start_temp, # \u30bf\u30d7\u30eb\u3067\u8fd4\u3059\n\n.. code-block:: cpp\n\n double start_temp;\n\n int main(int argc, char *argv[]) {\n start_temp = std::stod(argv[1]); // argv[1], ... \u306b objective \u3067\u8fd4\u3057\u305f\u5024\u304c\u683c\u7d0d\u3055\u308c\u3066\u3044\u308b\n solve();\n return 0;\n }\n",
"bugtrack_url": null,
"license": "MIT License",
"summary": "Parallel Execution and Optuna Optimization Tools for AHC",
"version": "0.1.0",
"project_urls": {
"Homepage": "https://github.com/titan-23/ahclib"
},
"split_keywords": [
"atcoder",
" ahc",
" heuristic"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "cc67db375bb1c579e4d06c61530051ad5016910b2a91a6aeb1098c55bebbd7ea",
"md5": "a59427aabc172ca847494531f6bb81f7",
"sha256": "40f54ae07d9cb6028801a5527ed61de7481523f8a4da5082ef2642c6737c9e04"
},
"downloads": -1,
"filename": "ahclib-0.1.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "a59427aabc172ca847494531f6bb81f7",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 12311,
"upload_time": "2024-12-19T00:41:51",
"upload_time_iso_8601": "2024-12-19T00:41:51.875383Z",
"url": "https://files.pythonhosted.org/packages/cc/67/db375bb1c579e4d06c61530051ad5016910b2a91a6aeb1098c55bebbd7ea/ahclib-0.1.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "3cdcad050b14d5d191cbb22fd47f91d5fa128a4c6999b77b3209825dc32c86c0",
"md5": "1ae45b3894febe37ffb96af9625afc99",
"sha256": "b537288b1ed12555059feb270ab12e6bd7a3d1ac8c725b873a704f520e5445aa"
},
"downloads": -1,
"filename": "ahclib-0.1.0.tar.gz",
"has_sig": false,
"md5_digest": "1ae45b3894febe37ffb96af9625afc99",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 11636,
"upload_time": "2024-12-19T00:41:54",
"upload_time_iso_8601": "2024-12-19T00:41:54.870632Z",
"url": "https://files.pythonhosted.org/packages/3c/dc/ad050b14d5d191cbb22fd47f91d5fa128a4c6999b77b3209825dc32c86c0/ahclib-0.1.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-12-19 00:41:54",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "titan-23",
"github_project": "ahclib",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [
{
"name": "optuna",
"specs": [
[
">=",
"4.1.0"
]
]
},
{
"name": "optunahub",
"specs": [
[
">=",
"0.1.0"
]
]
},
{
"name": "setuptools",
"specs": [
[
">=",
"75.6.0"
]
]
}
],
"lcname": "ahclib"
}