चैपल में एक अच्छी विशेषता यह है कि यह एक सरणी के डोमेन और उसके वितरण के बीच अंतर करता है। यह जांचने का सबसे अच्छा तरीका क्या है कि दो सरणियों का डोमेन और वितरण समान है (जो अक्सर चाहता है)?

सबसे अच्छा मैं देख सकता हूं कि D1==D2 और D1.dist==D2.dist की जांच करें, अगर D1 और D2 दोनों डोमेन हैं।

विशेष रूप से, निम्नलिखित कोड पर विचार करें:

const Dom = {1..5, 1..5};
const BDom = newBlockDom(Dom);
var x : [Dom] int;
var y : [BDom] int;

test(x,y);

proc test(a : [?Dom1] int, b : [Dom1] int) {
}

यह संकलित करता है और ठीक चलता है, जो समझ में आता है कि फ़ंक्शन घोषणा में क्वेरी सिंटैक्स केवल डोमेन समानता के लिए परीक्षण करता है, लेकिन वितरण समानता के लिए नहीं (भले ही Dom1 यह भी जानता हो कि a कैसे वितरित किया जाता है)। क्या इस मामले में वितरण समानता की जांच करने का एकमात्र तरीका a.domain.dist==b.domain.dist करना है?

5
Nikhil Padmanabhan 16 जून 2020, 00:15

1 उत्तर

सबसे बढ़िया उत्तर

यह जांचने के लिए कि क्या दो डोमेन चैपल में सेट किए गए समान वितरित इंडेक्स का वर्णन करते हैं, आप सही हैं कि आप D1 == D2 और D1.dist == D2.dist का उपयोग करेंगे। चैपल में डोमेन समानता यह जांचती है कि क्या दो डोमेन एक ही इंडेक्स सेट का वर्णन करते हैं, इसलिए डोमेन मैप्स/वितरण से स्वतंत्र है। इसी तरह, दो डोमेन मानचित्रों/वितरणों के बीच एक समानता जांच यह जांचती है कि क्या वे समान रूप से सूचकांक वितरित करते हैं।

ध्यान दें कि चैपल में, डोमेन और वितरण दोनों में पहचान की धारणा होती है, इसलिए यदि आपने दो वितरित डोमेन इस प्रकार बनाए हैं:

var BDom1 = newBlockDom(Dom),
    BDom2 = newBlockDom(Dom);

वे उपरोक्त समानता जांच पास करेंगे, फिर भी अलग डोमेन मान होंगे। कुछ मामलों में, यह आश्चर्य करना उचित हो सकता है कि क्या दो डोमेन एक्सप्रेशन समान डोमेन इंस्टेंस को संदर्भित करते हैं, लेकिन मेरा मानना ​​​​है कि आज चैपल में ऐसा करने का कोई आधिकारिक उपयोगकर्ता-सामना नहीं है। यदि यह रुचिकर है, तो यह हमारे GitHub मुद्दों पृष्ठ।

आपके कोड उदाहरण के संबंध में:

const Dom = {1..5, 1..5};
const BDom = newBlockDom(Dom);
var x : [Dom] int;
var y : [BDom] int;

test(x,y);

proc test(a : [?Dom1] int, b : [Dom1] int) {
}

यहाँ एक सूक्ष्मता चल रही है जिसके लिए कुछ स्पष्टीकरण की आवश्यकता है। सबसे पहले, ध्यान दें कि यदि आप तर्कों को अपने test() रूटीन में उलट देते हैं, तो यह संकलित नहीं होगा, संभवतः आपकी अपेक्षा के समान कार्य करेगा (TIO):

test(y,x);

इसका कारण यह है कि जिन डोमेन में स्पष्ट डोमेन मैप नहीं होता है, उन्हें विशेष रूप से औपचारिक सरणी तर्कों में माना जाता है। विशेष रूप से, चैपल को परिभाषित करने में, हम एक औपचारिक तर्क नहीं चाहते थे जिसे यहां X जैसा घोषित किया गया था:

proc foo(X: [1..n] real) { ... }

आवश्यकता है कि वास्तविक सरणी तर्क गैर-वितरित हो / डिफ़ॉल्ट डोमेन मानचित्र हो। दूसरे शब्दों में, हम चाहते थे कि उपयोगकर्ता 1..n से अनुक्रमित ब्लॉक- या चक्रीय-वितरित सरणी में पास करने में सक्षम हो, ताकि औपचारिक सरणी के सूचकांक सेट को बाधित कर सके लेकिन इसके वितरण को नहीं। इसके विपरीत, यदि औपचारिक तर्क के डोमेन को स्पष्ट डोमेन मानचित्र के रूप में परिभाषित किया जाता है, जैसे:

proc bar(X: [BDom] int) { ... }

(उपरोक्त BDom की आपकी ब्लॉक-वितरित परिभाषा का उपयोग करके), उस डोमेन से मेल खाने के लिए वास्तविक सरणी तर्क की आवश्यकता होती है।

इसका एक प्रभाव यह है कि आपके उदाहरण में, चूंकि Dom1 एक डिफ़ॉल्ट डोमेन मानचित्र वाले डोमेन से मेल खाता था, b समान रूप से किसी भी वितरण के साथ समान अनुक्रमणिका सेट करने के लिए समान रूप से विवश है। जबकि जब पहला वास्तविक तर्क ब्लॉक-वितरित होता है (जैसा कि मेरी कॉल में है), Dom1 उस वितरण को एन्कोड करता है और बाधा को b पर लागू करता है।

यदि इस पर आपकी प्रतिक्रिया यह है कि यह भ्रमित/असममित लगता है, तो मैं सहमत होने के इच्छुक हूं। मेरा मानना ​​​​है कि हमने इस संबंध में घोषित/नामित डोमेन को अज्ञात लोगों से अलग व्यवहार करने पर चर्चा की है (चूंकि यह X: [1..n] में डोमेन की गुमनामी थी, इसलिए हम इस नियम को अपनाने पर ध्यान केंद्रित कर रहे थे, और इसके आवेदन के लिए डोमेन जैसे Dom1 इस तरह के मामलों में वर्तमान कार्यान्वयन का एक साइड इफेक्ट है)। फिर, एक GitHub मुद्दा इस व्यवहार पर सवाल उठाने/चुनौती देने के लिए पूरी तरह से उचित खेल होगा।

3
user3666197 16 जून 2020, 01:05