प्रोग्रामिंग में डीएजी (डायरेक्टेड एसाइक्लिक ग्राफ) का उपयोग कब करें?


37

मुझे हाल ही में एक्टो नाम का एक ढांचा मिला है ।

इस ढांचे में, " प्लास्म " नामक एक बुनियादी घटक , जो कि एक्टो डायरेक्टेड एसाइक्लिक ग्राफ है। एक्टो में, प्लास्म को एक्टो अनुसूचक द्वारा संचालित किया जा सकता है।

मैं सोच रहा हूं कि इस तंत्र का क्या फायदा है, और किन अन्य स्थितियों में हम DAG की अवधारणा का फायदा उठा सकते हैं?


6
अधिकांश स्रोत नियंत्रण प्रबंधन प्रणाली संशोधन को एक DAG के रूप में लागू करते हैं।
ऊद

1
योजना समस्याओं की एक पूरी शाखा है जो डीएजी के साथ बहुत कुछ करती है
TC1

1
कई चीजें जो पेड़ों के रूप में प्रतिनिधित्व करती हैं, उन्हें वास्तव में डीएजी के रूप में प्रतिनिधित्व किया जाना चाहिए, जब अजीब-अभी भी-कुछ-कुछ-सामान्य-किनारे के मामलों को ध्यान में रखते हुए।
जोआचिम सॉर

@JoachimSauer जैसे हार्ड लिंक के साथ फाइल सिस्टम
jk।

जवाबों:


29

अच्छा प्रश्न।

  • कोड का प्रतिनिधित्व डीएजी द्वारा किया जा सकता है जो कोड के भीतर किए गए प्रत्येक अंकगणितीय ऑपरेशन के इनपुट और आउटपुट का वर्णन करता है; यह प्रतिनिधित्व कंपाइलर को सामान्य रूप से सामान्य सबप्रेसेशन उन्मूलन करने की अनुमति देता है।
  • अधिकांश स्रोत नियंत्रण प्रबंधन प्रणाली संशोधन को एक DAG के रूप में लागू करते हैं।
  • कई प्रोग्रामिंग भाषाएँ उन मूल्यों की प्रणालियों का वर्णन करती हैं जो एक निर्देशित एसाइक्लिक ग्राफ द्वारा एक दूसरे से संबंधित हैं। जब एक मूल्य बदल जाता है, तो इसके उत्तराधिकारी पुनर्गणना हो जाते हैं; प्रत्येक मान का मूल्यांकन DAG में उसके पूर्ववर्तियों के एक कार्य के रूप में किया जाता है।
  • DAG गतिरोधों का पता लगाने में आसान होते हैं क्योंकि वे प्रक्रियाओं और संसाधनों के एक समूह के बीच निर्भरता को चित्रित करते हैं।
  • कम्प्यूटेशनल ज्यामिति में कई यादृच्छिक एल्गोरिदम में, एल्गोरिथ्म एक इतिहास डीएजी को बनाए रखता है जो कुछ ज्यामितीय निर्माण की विशेषताओं का प्रतिनिधित्व करता है जिन्हें बाद के महीन पैमाने की विशेषताओं से बदल दिया गया है; इस DAG में पथों का अनुसरण करके, उपरोक्त दो डेटा संरचनाओं के लिए बिंदु स्थान प्रश्नों का उत्तर दिया जा सकता है।
  • एक बार जब हमारे पास डीएजी स्मृति में होता है, तो हम पूरे सेट के अधिकतम निष्पादन समय की गणना करने के लिए एल्गोरिदम लिख सकते हैं।
  • स्प्रेडशीट सिस्टम की प्रोग्रामिंग करते समय, निर्भरता ग्राफ जो एक सेल को दूसरे से जोड़ता है यदि पहला सेल एक सूत्र को संग्रहीत करता है जो दूसरे सेल में मूल्य का उपयोग करता है, तो एक निर्देशित चक्रीय ग्राफ होना चाहिए। निर्भरता के चक्र को रोक दिया जाता है क्योंकि वे चक्र में शामिल कोशिकाओं को एक अच्छी तरह से परिभाषित मूल्य नहीं होने का कारण बनते हैं। इसके अतिरिक्त, चक्रीय होने के लिए निर्भरता की आवश्यकता होने पर स्प्रेडशीट बदलने पर सेल मूल्यों की पुनर्गणनाओं को शेड्यूल करने के लिए एक टोपोलॉजिकल ऑर्डर का उपयोग किया जा सकता है।
  • DAG का उपयोग करके हम सही क्रम में गणनाओं का मूल्यांकन करने के लिए एल्गोरिदम लिख सकते हैं।

संपादित करें:

  • जब स्प्रेडशीट में सूत्र मानों को पुनर्संयोजित करते हुए फार्मूला सेल मूल्यांकन का आदेश डीएजी का उपयोग करके किया जा सकता है
  • Git सामग्री भंडारण, प्रमुखों के लिए संदर्भ बिंदु, ऑब्जेक्ट मॉडल प्रतिनिधित्व और दूरस्थ प्रोटोकॉल के लिए DAG का उपयोग करता है।
  • डीएजी का उपयोग ट्रेस शेड्यूलिंग में किया जाता है: वैश्विक समयबद्धन के लिए पहला व्यावहारिक दृष्टिकोण, ट्रेस शेड्यूलिंग नियंत्रण प्रवाह पथ को अनुकूलित करने का प्रयास करता है जिसे सबसे अधिक बार निष्पादित किया जाता है।
  • एक्टो एक प्रोसेसिंग फ्रेमवर्क है और यह डीएजी का उपयोग मॉडल प्रोसेसिंग ग्राफ के लिए करता है ताकि ग्राफ समकालिक निष्पादन का आदेश दे। एक्टो में प्लास्म डीएजी है और उस पर शेड्यूलर काम करता है।
  • DAGs का उपयोग सॉफ्टवेयर पाइपलाइनिंग में किया जाता है, जो कि लूप्स को ऑप्टिमाइज़ करने के लिए उपयोग की जाने वाली तकनीक है, जो हार्डवेयर पाइपलाइनिंग को समानताएं बनाती है।

अच्छे संसाधन:


1
नहीं छोरों? मुझे लगता है कि जब तक एक लूप समाप्त हो जाता है, तब तक इसे योग्य होना चाहिए। ए -> बी -> सी होने के बजाय, यह ए -> बी -> ए 1 -> बी 1 -> ए 2 -> बी 2 -> सी। चक्रीय एक अर्थ में हो सकता है, लेकिन दूसरे में नहीं। एक चक्र से अधिक सर्पिल की तरह।
ग्लेनपेटर्सन

@GlenPeterson, हाँ आप सही हैं। मैंने अपना उत्तर संपादित कर दिया है। टिप्पणी के लिए धन्यवाद। :)
एमडी महबूबुर रहमान

अभी भी नहीं लगता कि "सीधी रेखा" आवश्यक है। DAG में 'G' ग्राफ़ के लिए है। नीचे मेरे जवाब की जाँच करें। क्षमा करें, मैंने उत्तर देने से पहले आपका ध्यानपूर्वक नहीं पढ़ा, लेकिन मैंने आपकी पूर्णता और ज्ञान-प्राप्ति के सभी स्तरों के लिए आपका उत्तर +1 किया।
ग्लेनपेटर्सन

@GlenPeterson, गलती के लिए क्षमा करें। मैंने अपना उत्तर अपडेट कर दिया है। मुझे आपका जवाब भी पसंद है। तो आपके उत्तर को +1 कर दिया।
एमडी महबूबुर रहमान

3
आपके +1 के लिए धन्यवाद। मुझे अब भी लगता है कि सभी कोड डीएजी हैं, जो अंकगणित के भाव तक सीमित नहीं हैं। I / O, अपवाद, बहु-प्रक्रिया इंटरैक्शन और हार्डवेयर व्यवधान सभी एक निर्देशन में केवल अन्य प्रारंभ या अंत नोड हैं (क्योंकि वे प्रारंभ या अंत हैं), Acyclic (कोई अनंत छोर नहीं) ग्राफ़ (नोड्स के आदेशित जोड़े का परिमित सेट) । रिकी के सवाल का एक दिलचस्प अनुवर्ती हो सकता है, "क्या कोई सही और काम करने वाला कोड है जो डीएजी नहीं है।" मुझे लगता है कि उत्तर "नहीं" है, लेकिन मुझे किसी को गलत साबित करने में खुशी होगी।
ग्लेनपेटर्सन

12

इसका उत्तर यह है कि प्रोग्रामिंग से इसका कोई लेना-देना नहीं है। इसका समाधान समस्या से करना है।

जैसे लिंक्ड-लिस्ट कुछ विशेष वर्गों की समस्याओं के लिए उपयोग की जाने वाली डेटा संरचनाएं हैं, ग्राफ़ कुछ रिश्तों का प्रतिनिधित्व करने के लिए उपयोगी हैं। लिंक की गई सूची, पेड़, रेखांकन, और अन्य सार संरचनाएं केवल प्रोग्रामिंग के लिए एक कनेक्शन है कि आप उन्हें कोड में लागू कर सकते हैं। वे अमूर्तता के उच्च स्तर पर मौजूद हैं। यह प्रोग्रामिंग के बारे में नहीं है, यह समस्याओं के समाधान में डेटा संरचनाओं को लागू करने के बारे में है।

यदि फिर भी आप प्रोग्रामिंग के साथ कुछ संबंध चाहते हैं तो कृपया निम्नलिखित बातों पर विचार करें:

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

1
यह दिखाने के लिए कि अकेले प्रोग्रामिंग के दायरे से बाहर कैसे है, इस बारे में सोचें कि आप एक रिलेशनल डेटाबेस में टेबल को व्हाइटबोर्ड कैसे करते हैं, मानसिक रूप से पथ की लंबाई 1 टेबल से दूसरे टेबल पर पार्स करने के लिए, यह मानसिक रूप से समकक्ष के लिए एक डीएजी का प्रदर्शन निर्धारित करने के लिए है आपका डेटा मॉडल
जिमी हॉफ

6

अन्य लोगों ने डेटा के लिए डीएजी लागू किया है, लेकिन मुझे लगता है कि यह कम से कम लागू करने के लिए है (यदि ऐसा नहीं है) तो कोड के लिए। महबूब आर आरमन इसका उल्लेख करते हैं, इसलिए यह वास्तव में उनके जवाब का एक अधिक है जो अपने आप में एक पूर्ण उत्तर की तुलना में है।

यह मेरे लिए किसी भी अपरिमेय कंप्यूटर प्रोग्राम की तुलना में होता है जो अनंत छोरों से मुक्त होता है (धन्यवाद @AndresF।) एक डायरेक्टेड एसाइक्लिक ग्राफ (DAG) है। इसका मतलब है कि कोड के निष्पादन के संभावित मार्ग निर्देशित हैं (पहले यह, फिर वह), और एसाइक्लिक (अनंत लूप नहीं बनाना)। वे एक ग्राफ हैं क्योंकि किसी भी महत्वपूर्ण कोड के माध्यम से रास्ता शायद ही कभी सूची या पेड़ के रूप में सरल होता है।

मैंने शायद 4 साल तक XSLT में काम किया। मेरे पास यह बताने का एक भयानक समय था कि यह एक अच्छा सामान्य प्रयोजन प्रोग्रामिंग भाषा क्यों नहीं है, लेकिन डीएजी इसका कारण है। विशेष रूप से, XSLT एक डेटा संचालित भाषा है। आप फ़ंक्शंस को परिभाषित करते हैं (हाँ, कार्यात्मक-प्रोग्रामिंग अर्थ में), लेकिन आप अपने कोड से इन कार्यों को जरूरी नहीं कहते हैं। इसके बजाय, XSLT एक इनपुट XML दस्तावेज़ के नोड्स के माध्यम से, और पुनरावृति के चयन का एक संयोजन स्थापित करता है। यह इनपुट डेटा की संरचना को निर्धारित करता है कि कौन से फ़ंक्शन कहलाते हैं और किस क्रम में हैं।

यह बहुत दिलचस्प और बहुत अच्छा था जब तक कि आपके कार्यक्रम को एक डेटा शर्त का सामना नहीं करना पड़ा जिसे आपने 2:30 बजे परीक्षण नहीं किया था और आपको इसे ठीक करना था। जब आप डेटा को डीएजी को परिभाषित करने देते हैं, तो डीएजी की परिभाषा सभी संभावित इनपुट स्थितियां बन जाती हैं - जो किसी भी गैर-तुच्छ व्यवसाय एप्लिकेशन के लिए अयोग्य से परे हैं; वे अकल्पनीय हैं।

पहले तो मैंने सोचा कि कार्यात्मक प्रोग्रामिंग DAG नहीं हो सकती क्योंकि निष्पादन आदेश कभी-कभी स्पष्ट नहीं होता है, या प्रोग्रामर द्वारा भी इसके बारे में नहीं सोचा जाता है। लेकिन एक कार्यात्मक कार्यक्रम निर्भरता को परिभाषित करता है। वास्तव में, कार्यात्मक प्रोग्रामिंग की घोषणात्मक प्रकृति को केवल निष्पादन निर्भरता को निर्दिष्ट किए बिना केवल निर्भरता (ए ^ 2 = बी ^ 2 + सी ^ 2) को परिभाषित करने के रूप में सोचा जा सकता है (इससे कोई फर्क नहीं पड़ता कि 'बी' या 'सी' पहले चुकता है) , इसलिए जब तक कि वे दोनों एक साथ जोड़े जाने से पहले चुकता नहीं हो जाते)।

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

अच्छा सवाल - पोस्ट करने के लिए धन्यवाद!


1
क्या आपकी राय में यह अनिवार्य कार्यक्रम DAG है while (true) { print("hi"); }:? शायद आप गैर-समाप्ति कार्यक्रमों को बाहर करना चाहते हैं?
एंड्रेस एफ।

5

वर्तमान में डीएजी को प्रोग्रामिंग में रेखांकित किया गया है। ऐतिहासिक रूप से विकास से संबंधित कई चीजें पेड़ों और पदानुक्रमों के साथ बनाई गई थीं क्योंकि एक बॉक्स में कुछ हिलना हमारे दिमाग के लिए सुविधाजनक है ताकि जटिल चीजों को प्रबंधित करना आसान हो सके। लेकिन यदि आप घटनाओं को देखते हैं और वे अन्य घटनाओं और राज्यों पर निर्भर करते हैं तो आपको डीएजी मिलेगा क्योंकि हमारे जीवन में और कार्यक्रम में कुछ भी अतीत में कुछ भी निर्भर कर सकता है लेकिन भविष्य में नहीं, इसलिए आपको पूरी तरह से "चक्रीय" मिलेगा संबंध डीएजी अवधारणा पर लागू होंगे। हालांकि यह शायद ही कभी विकास में स्पष्ट रूप से उपयोग किया जाता है, यह ध्यान में रखते हुए चीजों को बेहतर ढंग से समझने में मदद मिलेगी


2

मैं सोच रहा हूं कि एक्टो में प्लास्म का क्या फायदा है ...

डीएजी का उपयोग बाधाओं के साथ अनुक्रम में कार्यों के संग्रह को मॉडल करने के लिए किया जा सकता है कि कुछ कार्यों को दूसरों से पहले किया जाना चाहिए। एक्टो एक प्रोसेसिंग फ्रेमवर्क है और यह डीएजी का उपयोग मॉडल प्रोसेसिंग ग्राफ के लिए करता है ताकि ग्राफ समकालिक निष्पादन का आदेश दे। एक्टो में प्लास्म डीएजी है और उस पर शेड्यूलर काम करता है।

DAG की अवधारणा का हम किन अन्य स्थितियों में फायदा उठा सकते हैं?

  • DAWG एक डेटा संरचना है जो स्ट्रिंग्स के एक सेट का प्रतिनिधित्व करता है और एक क्वेरी ऑपरेशन के लिए अनुमति देता है जो यह परीक्षण करता है कि क्या किसी दिए गए स्ट्रिंग का सेट उसकी लंबाई के अनुपात में है।
  • Git सामग्री भंडारण, प्रमुखों के लिए संदर्भ बिंदु, ऑब्जेक्ट मॉडल प्रतिनिधित्व और दूरस्थ प्रोटोकॉल के लिए DAG का उपयोग करता है।

हालांकि यह एक लंबा समय रहा है ... लेकिन मुझे लगता है कि यह जवाब वास्तव में मुझे एक्टो की भावना को समझने में मदद करता है। इसे इंगित करना है। धन्यवाद!
पो-जेन लाई

0

एक वास्तविक दुनिया उदाहरण के रूप में, हमारा सॉफ्टवेयर एक IDE के समान है जहां अंतिम उपयोगकर्ता एक छवि (मशीन दृष्टि निरीक्षण) पर किए जाने वाले संचालन की एक श्रृंखला को परिभाषित कर सकता है। इन निरीक्षणों में अन्य निरीक्षणों पर निर्भरताएँ हो सकती हैं या उन पर निर्भरताएँ हो सकती हैं। चूंकि यह अंतिम उपयोगकर्ता द्वारा सभी विन्यास योग्य है, इसलिए हम डिजाइन समय पर समानांतर प्रसंस्करण के लिए अनुकूलन नहीं कर सकते हैं। डीएजी के रूप में इन निरीक्षणों और निर्भरताओं का प्रतिनिधित्व करके, हम रन समय में अधिकतम प्रदर्शन के लिए समग्र निरीक्षण की समानता का अनुकूलन कर सकते हैं।


-1

बस एक और उदाहरण के लिए, कोको ऐप में मेमोरी मैनेजमेंट नियम बनाए गए हैं ताकि सभी मजबूत संदर्भ एक निर्देशित एसाइक्लिक ग्राफ बनाए, जो लीक की अनुपस्थिति की गारंटी देने के लिए किया जाता है।


-2

एक अन्य उत्तर को जोड़ना जैसा कि सिस्टम बनाने के लिए एक संदर्भ नहीं देखा गया है, makeजो भवन निर्माण के लिए निर्भरता का पता लगाने के लिए डीएजी का उपयोग करता है।

अधिक जानकारी यहाँ


क्या मैंने कुछ भी गलत कहा, क्यों इसे
नीचा दिखाया

आपने एक खराब उत्तर के साथ एक पुराने प्रश्न को उछाल दिया। यदि आपको कोई ऐसा उत्तर लिखने के लिए लुभाया जाता है जो "इसे जोड़ रहा है क्योंकि किसी और ने इसका उल्लेख नहीं किया है ..." और केवल एक ही वाक्य है, तो यह उत्तर का अच्छा नहीं है। कृपया सवाल का पूरी तरह से जवाब देने की कोशिश करें और समझाएं कि एप्लिकेशन कैसे DAG का उपयोग करता है, और यह डिज़ाइन कैसे काम करता है, और इसे अन्य विकल्पों पर क्यों चुना गया। आदर्श रूप से, कई अनुच्छेद सामग्री के लायक हैं।

ठीक है, मुझे बाद में विस्तार से
बताएं

ठीक है, दोहराने के बजाय, बस एक लिंक के साथ अद्यतन किया गया है जो यह बताता है कि यह कैसे टूल में उपयोग किया जा रहा हैmake
dlmeetei

लिंक को बासी या असफल होने की एक आदत है। यदि ऐसा होता है, तो आप ठीक उसी जगह पर हैं जहाँ आपने शुरू किया था - एक छोटी-सी एक पंक्ति जिसका जवाब ज्यादा मदद नहीं करता है। क्या आप लिंक की सामग्री को संक्षेप में बता सकते हैं ताकि यह उत्तर अपने आप खड़ा हो सके? (लिंक रखें, बस सुनिश्चित करें कि लिंक के बिना भी उत्तर एक अच्छा है)।
डैन पिचेलमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.