本文へスキップ
DispatchAtlas
検索

あなたの成果を公開する

DispatchAtlas はそのレジストリから、ウェブサイトの専用の閲覧可能なセクションへ直接 自動公開します: 登録されたソルバーは ソルバー推薦器に現れ、エクスポートされたベンチマーク サブセットはダウンロード可能なバンドルになり、エクスポートされた キャンペーン結果は結果エクスプローラーでレンダリングされます。各 ステップはインストール済みの公開 API を使います -- リポジトリ専用のツールなし -- ので、 あなた自身のソルバー、ベンチマーク、結果が、出荷されたものと同じサーフェスに届きます。 実行可能な examples/publish_to_portal.py は、全パスを 1 秒未満でエンドツーエンドに歩きます。

ソルバーを公開する

ソルバーはレジストリメタデータ(プロファイル)を携えます。それを SolverRegistry に 登録すると、公開-カタログ化されたプロファイルがポータルのレンダリングする公開カタログに 入ります:

from dispatchatlas.solve import SolverRegistry
 
catalog = SolverRegistry()
catalog.register_instance(your_solver)
published = {metadata.solver_id for metadata in catalog.public_catalog()}

ウェブサイトが提供するレジストリ-派生ソルバーバンドルは、カタログ化された各ソルバーを 携えるので、登録された公開ソルバーは追加ステップなしで ソルバー推薦器に届きます。

ベンチマークサブセットを公開する

任意のカタログを、移植可能で自己記述的なバンドルとフラットな CSV テーブルに投影します -- ポータルのダウンロードセンターが訪問者に提供する正確な成果物:

from dispatchatlas.bench import (
    build_continuum_catalog,
    catalog_metadata_for_sets,
    catalog_subset_to_bundle,
    catalog_subset_to_csv,
)
 
records = catalog_metadata_for_sets(build_continuum_catalog(root_seed=23))
bundle_bytes = catalog_subset_to_bundle(records)  # ダウンロード可能なアーカイブ
csv_text = catalog_subset_to_csv(records)  # 同じ行のフラットなテーブル

両方ともダウンロードセンターが提供するダウンロード可能成果物で あり、完全な連続体カタログは既にベンチマークカタログで 閲覧可能です。

build_continuum_catalog は高速な三-リソースプレビューを物質化します -- ポータルの フィルタリングと素早い一瞥に理想的。研究-スケールの参照ベンチマークには build_continuum_full_catalog に差し替えます。これは各ファミリーをその宣言されたスケールで 構築し -- より大きなリソースプールとタスク数、そこで協調割り当て・競合・配置構造が真に 現れます -- 同じ catalog_metadata_for_setscatalog_subset_to_bundle エクスポート サーフェスを流れます:

from dispatchatlas.bench import build_continuum_full_catalog
 
research_records = catalog_metadata_for_sets(
    build_continuum_full_catalog(root_seed=23, problem_count_per_family=4)
)
research_bundle = catalog_subset_to_bundle(research_records)  # 研究-スケール

インストール可能なパッケージから公開する

上記の各節は、あなた自身のスクリプトの中からソルバーやジェネレーターを登録します。再利用可能な拡張——別のプロジェクトがインストールするだけで、接着コードなしに取り込めるもの——のために、DispatchAtlas はパッケージングのエントリーポイントを読み取ります。そのため、インストールされた配布物は、組み込みのレジストリに触れることなくソルバーとベンチマークジェネレーターを提供できます。あなたのパッケージの pyproject.toml で、対応するエントリーポイントグループの下に引数なしのプロバイダーを宣言します:

[project.entry-points."dispatchatlas.solvers"]
my-solvers = "my_package.providers:scheduling_solvers"
 
[project.entry-points."dispatchatlas.benchmark_generators"]
my-generators = "my_package.providers:scheduling_generators"

各ターゲットは、引数を取らず反復可能オブジェクトを返す呼び出し可能オブジェクトです——ソルバーグループには ProfiledSolver、ジェネレーターグループには BenchmarkGenerator——同梱のプロバイダーが返すのと同じ形です。探索は決して自動では行われないため、同梱のカタログは決定的なままです。呼び出し側が明示的にオプトインします:

from dispatchatlas.bench import GeneratorRegistry, discover_plugin_generators
from dispatchatlas.solve import default_solver_registry, discover_plugin_solvers
 
solvers = default_solver_registry()
discover_plugin_solvers(solvers)  # 登録されたサードパーティ製ソルバーの id
 
generators = GeneratorRegistry()
discover_plugin_generators(generators)  # 登録されたサードパーティ製ジェネレーターの id

探索されたソルバーは上記と同じ register_instance の経路を流れるため、公開カタログ化されたプラグインソルバーは追加の手順なしでソルバー推薦器に届きます。探索は証拠に対して fail-closed です:引用参照を宣言しないプラグインソルバー、または出典を引用せずに引用裏付けありと主張するジェネレーターは、レジストリに入る前に拒否されます——サードパーティの拡張は、同梱カタログと同じ引用裏付けの不変条件を担います。

結果を公開する

キャンペーンを実行し、それを開示ポリシーを通じて、サイトの結果エクスプローラーが レンダリングする portal-results バンドルへエクスポートします:

from dispatchatlas.analytica import (
    AnalysisConfig,
    EvidenceTier,
    default_disclosure_policy,
    load_result_dataset,
    write_portal_dataset,
)
 
dataset = load_result_dataset(workspace, "your-campaign-id")
write_portal_dataset(
    dataset,
    default_disclosure_policy(EvidenceTier.CORE),
    target_dir,
    AnalysisConfig(objective_name="makespan"),
)

write_portal_dataset は、宣言された開示層にフィルタされた、コンテンツハッシュ済みの portal-results.json を書きます -- 結果エクスプローラーが レンダリングする正確なバンドルなので、そのエクスポートはポータルに公開されたあなたの結果 です。開示フィルタはフェイルクローズです: 層が許可しない結果は決して公開されないので、 研究が偶然に過剰共有することはできません。

エンドツーエンドで見る

uv run python examples/publish_to_portal.py

この例はソルバーを登録し、それがポータルソルバーバンドルに乗ることを確認し、ベンチマーク サブセットをバンドルと CSV にエクスポートし、結果がポータルの結果-エクスプローラー形式で エクスポートされるキャンペーンを実行します -- 公開パス全体を、インストール済み公開 API と サイトが出荷するコミット済みポータルバンドルから直接読み取ります。