homotopy_class_compare — DRIVE braidpath op

• Data kinds: any × any → table

• Call: import fullseye as fs; fs.ledger.homotopy_class_compare(traj_a, traj_b, obstacles=None, angle=0.1, jitter='auto', tol=1e-09) (implementation को सीधे call करना हो तो import braidpath; braidpath.homotopy_class_compare(traj_a, traj_b, obstacles=None, angle=0.1, jitter='auto', tol=1e-09), registry से लेना हो तो opsdrive.get("homotopy_class_compare"))

• GPU: नहीं (केवल CPU reference implementation)

उपयोग

समान start और end points वाले दो path families (multi-agent plans) एक ही homotopy class में हैं या नहीं।

टकराव के बिना (न एजेंट आपस में, न बाधा बिंदुओं से ओवरलैप हों) आरंभ और अंत बिंदुओं को स्थिर रखते हुए निरंतर रूप से विकृत किया जा सके ⇔ ब्रेड बराबर हैं।

ब्रेड braid_from_trajectories से आता है, तुलना Dynnikov निर्देशांकों से होती है। प्रक्षेपण के कोण पर निर्भर नहीं (गेट कई कोण आज़माता है)।

Returns: dict same, word_a / word_b, key_a / key_b, quotient (a b⁻¹ का सरलीकृत शब्द —— खाली हो तो वही वर्ग, खाली न हो तो “घूमने का तरीका कैसे अलग है” बताने वाला शब्द), endpoint_error (आरंभ और अंत बिंदुओं का अधिकतम अंतर), tol_limit (tol की ऊपरी सीमा)। आरंभ और अंत बिंदु tol (डिफ़ॉल्ट ENDPOINT_TOL = 1e-9, निर्देशांक की इकाई में, प्रत्येक निर्देशांक के अंतर का अधिकतम) के भीतर मेल खाने चाहिए। tol उत्तर नहीं बदलता, केवल पास / अस्वीकार करने वाला गेट है, और कारण सहित “बेअसर नॉब” के बही-खाते में दर्ज है। tol के भीतर खिसके हुए B के अंत बिंदुओं को, B के पहले और बाद में A के अंत बिंदुओं तक सीधी रेखा में ले जाने वाले खंड जोड़कर, फिर तुलना की जाती है (word_b उसी संरेखित योजना का शब्द है)। tol की ऊपरी सीमा tol_limit = d / (2√2) है (d = A के आरंभ और अंत विन्यास में तंतुओं के बीच की न्यूनतम दूरी, बाधा बिंदुओं सहित):

हर एजेंट प्रत्येक निर्देशांक में tol के भीतर = दूरी में √2·tol के भीतर ही चलता है, इसलिए दो एजेंटों के बीच की दूरी 2√2·tol से कम बदलती है, और संरेखित करने वाले खंड नहीं टकराते। साथ ही A के अंत बिंदुओं से प्रत्येक निर्देशांक में tol के भीतर वाले विन्यासों का समुच्चय उत्तल है और उसमें टकराव नहीं है, इसलिए किसी भी तरह संरेखित करें, वर्ग वही रहता है —— उत्तर न प्रक्षेपण के कोण पर निर्भर है न tol पर। सीमा से बड़ा tol अस्वीकार किया जाता है, क्योंकि वह भिन्न अंत बिंदुओं वाली योजनाओं को एक ही वर्ग कह सकता है। यदि अलग-अलग प्लानरों के अंत बिंदु पूर्णांकन से भिन्न हों, तो tol को सीमा के भीतर बढ़ाएँ या तुलना से पहले अंत बिंदुओं को संरेखित करें (वर्ग स्थिर अंत बिंदुओं वाले विरूपणों का वर्ग है, इसलिए भिन्न अंत बिंदुओं वाली दो योजनाओं की तुलना नहीं की जा सकती)।

Raises: ValueError (एजेंटों की संख्या अलग, आरंभ या अंत बिंदु tol से अधिक दूर, tol ऋणात्मक, अपरिमित या tol_limit से कम नहीं, प्रक्षेपण पर आरंभ या अंत बिंदुओं का क्रम मेल नहीं खाता, टकराव)।

संदर्भ (sample data, साहित्य)

• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।

• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।

• Algorithm का मानक स्रोत (लेखक, वर्ष) और उपयोग ऊपर की family usage guide में दिए गए हैं।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• poc_braid_homotopy_classes — py -3.11 examples/poc_braid_homotopy_classes.py

वे अगले ops जिनसे type जुड़ता है (table को input के रूप में लेते हैं)

course_layout · course_occupancy · course_contains · world_build · world_camera · world_move · lidar_scan · rss_longitudinal_same

इसी category के (braidpath)

braid_from_trajectories · braid_reduce · braid_artin_images · dynnikov_coordinates · dynnikov_act · braid_equivalent · pairwise_winding · homotopy_shortest_paths


*Provenance: braidpath.py — DRIVE operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.