Публикация вашей работы
DispatchAtlas авто-публикует из своих реестров прямо в выделенные, видимые секции
веб-сайта: зарегистрированный решатель появляется в
Рекомендателе решателей, экспортированное подмножество
бенчмарков становится скачиваемым пакетом, а экспортированный
результат кампании рендерится Обозревателем результатов. Каждый
шаг использует установленный публичный API -- без инструментария только-для-репозитория --
так что ваши собственные решатели, бенчмарки, и результаты достигают тех же поверхностей,
что и отгруженные. Исполняемый
examples/publish_to_portal.py
проходит весь путь от-края-до-края менее чем за секунду.
Опубликовать решатель
Решатель несёт метаданные реестра (профиль). Зарегистрируйте его в 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_sets и
catalog_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) # идентификаторы зарегистрированных сторонних решателей
generators = GeneratorRegistry()
discover_plugin_generators(generators) # идентификаторы зарегистрированных сторонних генераторовОбнаруженный решатель проходит по тому же пути 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, отфильтрованный к
заявленному уровню раскрытия -- точный пакет, который рендерит
Обозреватель результатов, так что экспорт — это ваши результаты,
опубликованные в портал. Фильтр раскрытия fail-closed: результат, который уровень не
разрешает, никогда не публикуется, так что исследование не может случайно переподелиться.
Посмотрите от-края-до-края
uv run python examples/publish_to_portal.pyПример регистрирует решатель, подтверждает, что он едет в пакете решателей портала, экспортирует подмножество бенчмарков в пакет и CSV, и прогоняет кампанию, чьи результаты экспортируются в формате обозревателя-результатов портала -- весь путь публикации, прочитанный прямо из установленного публичного API и закоммиченных пакетов портала, которые отгружает сайт.