نشر عملك
يَنشُر 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 العام المُثبَّت ومن حِزَم البوابة المُلتَزَمة التي يَشحنها الموقع.