تخطٍّ إلى المحتوى
DispatchAtlas
بحث

نشر عملك

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