पॉलीटॉप मॉडल: Difference between revisions

From Vigyanwiki
(Created page with "{{for|physical models of polyhedra|Polyhedron model}} पॉलीहेड्रल मॉडल (जिसे पॉलीटॉप विधि भी कहा जात...")
 
No edit summary
 
(14 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{for|physical models of polyhedra|Polyhedron model}}
पॉलीटॉप मॉडल जिसे बहुफलकीय प्रारूप भी कहा जाता है, एक गणितीय ढांचा है, जिन्हे गणना करने के लिए स्पष्ट रूप से अत्यधिक सघन प्रतिनिधित्व की आवश्यकता होती है। नेस्टेड लूप प्रोग्राम विशिष्ट प्रयोगों के लिए उपयोगी हैं, परंतु इसके लिए ये एकमात्र उदाहरण नहीं है, और इस प्रारूप का सबसे सरल उपयोग प्रोग्राम अनुकूलन में लूप नेस्ट अनुकूलन के लिए है। बहुफलकीय विधि नेस्टेड लूप के भीतर प्रत्येक लूप पुनरावृत्ति को बहुकोणीय आकृति नामक गणितीय वस्तुओं के अंदर नेस्टेड बिंदुओं के रूप में प्रदर्शित करती है, और सजातीय रूपान्तरण या अधिक सामान्य, गैर- सजातीय रूपान्तरण करती है। जैसे कि बहुतलों पर टाइलिंग, और तत्पश्चात रूपांतरित बहुतलों को समतुल्य बहुफलनों में परिवर्तित करती है, परंतु अनुकूलित, बहुफलकीय प्रारूप स्कैनिंग के माध्यम से लूप नेस्ट करता है।   
पॉलीहेड्रल मॉडल (जिसे पॉलीटॉप विधि भी कहा जाता है) उन प्रोग्रामों के लिए एक गणितीय ढांचा है जो बड़ी संख्या में संचालन करते हैं - स्पष्ट रूप से गणना करने के लिए बहुत बड़े - जिससे 'कॉम्पैक्ट' प्रतिनिधित्व की आवश्यकता होती है। नेस्टेड लूप प्रोग्राम विशिष्ट हैं, लेकिन केवल उदाहरण नहीं हैं, और मॉडल का सबसे आम उपयोग [[कार्यक्रम अनुकूलन]] में [[पाश घोंसला अनुकूलन]] के लिए है। पॉलीहेड्रल विधि नेस्टेड लूप के भीतर प्रत्येक लूप पुनरावृत्ति को पॉलीटॉप नामक गणितीय वस्तुओं के अंदर जाली बिंदुओं के रूप में मानती है, [[affine परिवर्तन]] या अधिक सामान्य गैर-एफ़िन ट्रांसफ़ॉर्मेशन करती है जैसे कि [[polytope]]्स पर [[लूप टाइलिंग]], और फिर रूपांतरित पॉलीटोप्स को समतुल्य में परिवर्तित करती है, लेकिन अनुकूलित (निर्भर करता है) लक्षित अनुकूलन लक्ष्य पर), पॉलीहेड्रा स्कैनिंग के माध्यम से लूप नेस्ट।


== सरल उदाहरण ==
== सरल उदाहरण ==


[[सी (प्रोग्रामिंग भाषा)]] में लिखे गए निम्नलिखित उदाहरण पर विचार करें:
[[सी (प्रोग्रामिंग भाषा)|सी प्रोग्रामिंग भाषा]] में लिखे गए निम्नलिखित उदाहरण पर विचार करें:


<वाक्यविन्यास प्रकाश लैंग = सी>
  const int n = 100;
कॉन्स्टेंट इंट एन = 100;
इंट आई, जे, ए [एन] [एन];


के लिए (i = 1; i <n; i++) {
int i, j, a[n][n];
   के लिए (जे = 1; जे <(आई + 2) && जे <एन; जे ++) {
    ए [आई] [जे] = ए [आई - 1] [जे] + ए [आई] [जे - 1];
for (i = 1; i < n; i++) {
  }
   for (j = 1; j < (i + 2) && j < n; j++) {
}
</वाक्यविन्यास हाइलाइट>


इस कोड के साथ आवश्यक समस्या यह है कि आंतरिक पाश के प्रत्येक पुनरावृत्ति पर <code>a[i][j]</code> आवश्यकता है कि पिछले पुनरावृत्ति के परिणाम, <code>a[i][j - 1]</code>, पहले से ही उपलब्ध हो। इसलिए, इस कोड को समानांतर या [[पाइपलाइन (कंप्यूटिंग)]] नहीं किया जा सकता जैसा कि वर्तमान में लिखा गया है।
  a[i][j] = a[i - 1][j] + a[i][j - 1];
 
इस कूट के साथ आवश्यक समस्या यह है कि [i] [j] पर आंतरिक लूप के प्रत्येक पुनरावृत्ति के लिए आवश्यक है, कि पिछले पुनरावृत्ति का परिणाम, [i] [j - 1], पहले से ही उपलब्ध हो। इसलिए, इस कूट को समानांतर या पाइपलाइन नहीं किया जा सकता जैसा कि वर्तमान में लिखा गया है।


एफ़िन परिवर्तन के साथ पॉलीटॉप मॉडल का एक अनुप्रयोग <math>(i',\, j') = (i+j,\, j)</math> और सीमाओं में उपयुक्त परिवर्तन, नेस्टेड छोरों को ऊपर में बदल देगा:
सजातीय परिवर्तन के साथ बहुतलीय प्रारूप का एक अनुप्रयोग <math>(i',\, j') = (i+j,\, j)</math> और सीमाओं में उपयुक्त परिवर्तन, ऊपर नेस्टेड लूप को रूपांतरित कर देगा-


<वाक्यविन्यास प्रकाश लैंग = सी>
a[i - j][j] = a[i - j - 1][j] + a[i - j][j - 1];
[आई - जे] [जे] = [आई - जे - 1] [जे] + [आई - जे] [जे - 1];
</वाक्यविन्यास हाइलाइट>


इस स्थिति में, आंतरिक लूप का कोई पुनरावृत्ति पिछले पुनरावृत्ति के परिणामों पर निर्भर नहीं करता है; पूरे आंतरिक लूप को समानांतर में निष्पादित किया जा सकता है। (हालांकि, बाहरी लूप का प्रत्येक पुनरावृत्ति पिछले पुनरावृत्तियों पर निर्भर करता है।)
इस स्थिति में, आंतरिक लूप का कोई पुनरावृत्ति पिछले पुनरावृत्ति के परिणामों पर निर्भर नहीं करता है; पूरे आंतरिक लूप को समानांतर में निष्पादित किया जा सकता है, यद्यपि बाहरी लूप का प्रत्येक पुनरावृत्ति पिछले पुनरावृत्तियों पर निर्भर करता है


== विस्तृत उदाहरण ==
== विस्तृत उदाहरण ==


[[File:Polytope model unskewed.svg|thumb|right|की निर्भरताएँ <code>src</code>, लूप ऑप्टिमाइज़ेशन से पहले # कॉमन लूप ट्रांसफ़ॉर्मेशन। लाल बिंदु से मेल खाता है <code>src[1][0]</code>; गुलाबी बिंदु से मेल खाता है <code>src[2][2]</code>.]]निम्नलिखित सी (प्रोग्रामिंग भाषा) कोड फ़्लॉइड-स्टाइनबर्ग [[तड़पना]]िंग के समान त्रुटि-वितरण डिथरिंग के एक रूप को लागू करता है, लेकिन शैक्षणिक कारणों से संशोधित किया गया है। द्वि-आयामी सरणी <code>src</code> रोकना <code>h</code> की पंक्तियों <code>w</code> पिक्सेल, प्रत्येक पिक्सेल का ग्रे[[स्केल]] मान 0 और 255 सहित के बीच होता है। दिनचर्या समाप्त होने के बाद, आउटपुट array <code>dst</code> मान 0 या मान 255 के साथ केवल पिक्सेल शामिल होंगे। गणना के दौरान, प्रत्येक पिक्सेल की डाइथरिंग त्रुटि को वापस जोड़कर एकत्र किया जाता है <code>src</code> सरणी। (नोटिस जो <code>src</code> और <code>dst</code> गणना के दौरान दोनों पढ़े और लिखे जाते हैं; <code>src</code> केवल-पढ़ने के लिए नहीं है, और <code>dst</code> केवल लिखने के लिए नहीं है।)
[[File:Polytope model unskewed.svg|thumb|right|लूप तिरछा करने से पहले, एसआरसी की निर्भरता। लाल बिंदु एसआरसी[1][0]; गुलाबी बिंदु एसआरसी[2] से मेल खाता है.]]निम्नलिखित सी कूट फ़्लॉइड-स्टाइनबर्ग डाइथरिंग के समान त्रुटि-वितरण डिथरिंग के एक रूप को अनुबंधित करता है, परंतु शैक्षणिक कारणों से इन्हे संशोधित किया गया है। द्वि-आयामी सरणी एसआरसी में डब्ल्यू पिक्सेल की एच पंक्तियाँ होती हैं, प्रत्येक पिक्सेल में 0 और 255 के मध्य ग्रेस्केल मान होता है। रूटीन समाप्त होने के उपरांत, निर्गत त्रुटि डीएसटीमें मात्र 0 मान या 255 मान वाले पिक्सेल उपस्थित होंगे। गणना के समय, प्रत्येक पिक्सेल की डाइटिंग त्रुटि को वापस एसआरसी सरणी में जोड़कर एकत्र किया जाता है। ध्यान दें कि गणना के समय, एसआरसी और डीएसटीदोनों पढ़े और लिखे जाते हैं; एसआरसी मात्र पढ़ने के लिए नहीं है, और डीएसटीमात्र लिखने के लिए नहीं है।


आंतरिक पाश का प्रत्येक पुनरावृत्ति मूल्यों को संशोधित करता है <code>src[i][j]</code> के मूल्यों पर आधारित है <code>src[i-1][j]</code>, <code>src[i][j-1]</code>, और <code>src[i+1][j-1]</code>. (समान निर्भरताएं लागू होती हैं <code>dst[i][j]</code>. लूप ऑप्टिमाइज़ेशन # कॉमन लूप ट्रांसफ़ॉर्मेशन के प्रयोजनों के लिए, हम सोच सकते हैं <code>src[i][j]</code> और <code>dst[i][j]</code> एक ही तत्व के रूप में।) हम निर्भरताओं को चित्रित कर सकते हैं <code>src[i][j]</code> ग्राफिक रूप से, जैसा कि दाईं ओर आरेख में है।
आंतरिक लूप का प्रत्येक पुनरावृत्ति एसआरसी[i][j] के मानों के आधार पर एसआरसी [i-1] [j], एसआरसी [i] [j-1], और एसआरसी[i+1] के मानों को संशोधित करता है। [j-1]] वाली समान निर्भरताएँ डीएसटी [i] [j] पर लागू होती हैं।


<!-- This table nonsense makes the page look slightly better in Firefox on Windows XP. Is there a more portable and self-explanatory way to get the code and images not to overlap with each other? --~~~~ -->
लूप विषमन के प्रयोजनों के लिए, हम एसआरसी[i][j] और डीएसटी [i] [j] को एक ही तत्व के रूप में मान सकते हैं। हम उदाहरण दे सकते हैं एसआरसी[i][j] रेखांकन की निर्भरता, जैसा कि दाईं ओर आरेख में दर्शाया गया है ।
{|
{|
|-
|-
Line 60: Line 55:
|}
|}


[[File:Polytope model skewed.svg|thumb|right|की निर्भरताएँ <code>src</code>, पाश तिरछा करने के बाद। सरणी तत्वों को ग्रे, लाल, हरा, नीला, पीला ... क्रम में संसाधित किया जाएगा।]]एफ़िन परिवर्तन करना <math>(p,\, t) = (i,\, 2j+i)</math> मूल निर्भरता आरेख पर हमें एक नया आरेख मिलता है, जो अगली छवि में दिखाया गया है। फिर हम कोड को लूप ऑन करने के लिए फिर से लिख सकते हैं <code>p</code> और <code>t</code> के बजाय <code>i</code> और <code>j</code>, निम्नलिखित तिरछी दिनचर्या प्राप्त करना।
[[File:Polytope model skewed.svg|thumb|right|की निर्भरताएँ <code>एसआरसी</code>,लूप तिरछा करने के बाद। सरणी तत्वों को ग्रे, लाल, हरा, नीला, पीला क्रम में संसाधित किया जाएगा।]]सजातीय परिवर्तन करना <math>(p,\, t) = (i,\, 2j+i)</math> मूल निर्भरता आरेख पर हमें एक नया आरेख मिलता है, जो अगली छवि में दिखाया गया है। फिर हम कूट को लूप प्रारंभ करने के लिए पुनः लिख सकते हैं <code>p</code> और <code>t</code> के अतिरिक्त <code>i</code> और <code>j</code>, निम्नलिखित तिरछी रूटीन प्राप्त करते है ।


<!-- Please don't break this code. Test before committing! -->
<!-- Please don't break this code. Test before committing! -->
Line 92: Line 87:


== यह भी देखें ==
== यह भी देखें ==
* बहुफलकीय मॉडल का समर्थन करने वाले ढांचे
* बहुफलकीय प्रारूप का समर्थन करने वाले ढांचे
* लूप नेस्ट ऑप्टिमाइज़ेशन
* लूप नीड अनुकूलीकरण
* [[लूप अनुकूलन]]
* [[लूप अनुकूलन]]
* [[लूप अनोलिंग]]
* [[लूप अनोलिंग]]
* लूप टाइलिंग
* लूप टाइलिंग


== बाहरी लिंक और संदर्भ ==
== बाहरी लिंक और संदर्भ ==
*[https://www.infosun.fim.uni-passau.de/cl/loopo/doc/loopo_doc/node3.html बुनियादी पॉलीटॉप विधि], मार्टिन ग्रिब्ल द्वारा ट्यूटोरियल जिसमें उपरोक्त स्यूडोकोड उदाहरण के आरेख शामिल हैं
*[https://www.infosun.fim.uni-passau.de/cl/loopo/doc/loopo_doc/node3.html बुनियादी बहुफलकीय विधि], मार्टिन ग्रिब्ल द्वारा ट्यूटोरियल जिसमें उपरोक्त स्यूडोकूट उदाहरण के आरेख शामिल हैं
*[http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.30.5675 पॉलीटॉप मॉडल में कोड जनरेशन] (1998)। मार्टिन ग्रीब्ल, क्रिश्चियन लेंगौएर और सबाइन वेटज़ेल
*[http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.30.5675 बहुफलकीय प्रारूप में कूट जनरेशन] (1998)। मार्टिन ग्रीब्ल, क्रिश्चियन लेंगौएर और सबाइन वेटज़ेल
*[http://www.cloog.org/ सीएलओओजी पॉलीहेड्रल कोड जेनरेटर]
*[http://www.cloog.org/ सीएलओओजी बहुफलकीय कूट जेनरेटर]
*[http://www.chunchen.info/omega CodeGen+: Z-पॉलीहेड्रा स्कैनिंग]{{dead link|date=March 2018 |bot=InternetArchiveBot |fix-attempted=yes }}
*[http://www.chunchen.info/omega CodeGen+: Z-पॉलीहेड्रा स्कैनिंग]{{dead link|date=March 2018 |bot=InternetArchiveBot |fix-attempted=yes }}
*[http://web.cs.ucla.edu/~pouchet/software/pocc/ PoCC: बहुफलकीय संकलक संग्रह]
*[http://web.cs.ucla.edu/~pouchet/software/pocc/ PoCC: बहुफलकीय संकलक संग्रह]
*[http://pluto-compiler.sourceforge.net/ PLUTO - affine लूप नेस्ट के लिए एक स्वचालित पैरेललाइज़र और स्थानीयता अनुकूलक]
*[http://pluto-compiler.sourceforge.net/ PLUTO - affine लूप नीड के लिए एक स्वचालित पैरेललाइज़र और स्थानीयता अनुकूलक]
**{{Cite book|last1=Bondhugula|first1=Uday|last2=Hartono|first2=Albert|last3=Ramanujam|first3=J.|last4=Sadayappan|first4=P.|date=2008-01-01|title=एक व्यावहारिक स्वचालित पॉलीहेड्रल समानांतर और स्थानीयता अनुकूलक|journal=Proceedings of the 29th ACM SIGPLAN Conference on Programming Language Design and Implementation|series=PLDI '08|location=New York, NY, USA|publisher=ACM|pages=101–113|doi=10.1145/1375581.1375595|isbn=9781595938602|s2cid=7086982}}
**{{Cite book|last1=Bondhugula|first1=Uday|last2=Hartono|first2=Albert|last3=Ramanujam|first3=J.|last4=Sadayappan|first4=P.|date=2008-01-01|title=एक व्यावहारिक स्वचालित पॉलीहेड्रल समानांतर और स्थानीयता अनुकूलक|journal=Proceedings of the 29th ACM SIGPLAN Conference on Programming Language Design and Implementation|series=PLDI '08|location=New York, NY, USA|publisher=ACM|pages=101–113|doi=10.1145/1375581.1375595|isbn=9781595938602|s2cid=7086982}}
*[http://polyhedral.info/ polyhedral.info] - एक वेबसाइट जो बहुफलकीय संकलन के बारे में जानकारी एकत्र करती है
*[http://polyhedral.info/ polyhedral.info] - एक वेबसाइट जो बहुफलकीय संकलन के बारे में जानकारी एकत्र करती है
Line 110: Line 105:
* एमआईटी [http://tiramisu-compiler.org/ Tiramisu Polyhedral] फ्रेमवर्क।
* एमआईटी [http://tiramisu-compiler.org/ Tiramisu Polyhedral] फ्रेमवर्क।


श्रेणी:संकलक अनुकूलन
[[Category:All articles with dead external links]]
श्रेणी:सूडोकोड के उदाहरण वाले लेख
[[Category:Articles with dead external links from March 2018]]
श्रेणी:उदाहरण सी कोड वाले लेख
[[Category:Articles with permanently dead external links]]
 
 
[[Category: Machine Translated Page]]
[[Category:Created On 18/02/2023]]
[[Category:Created On 18/02/2023]]
[[Category:Machine Translated Page]]
[[Category:Templates Vigyan Ready]]

Latest revision as of 15:47, 27 April 2023

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

सरल उदाहरण

सी प्रोग्रामिंग भाषा में लिखे गए निम्नलिखित उदाहरण पर विचार करें:

 const int n = 100;
int i, j, a[n][n];

for (i = 1; i < n; i++) {
 for (j = 1; j < (i + 2) && j < n; j++) {
 a[i][j] = a[i - 1][j] + a[i][j - 1];
 

इस कूट के साथ आवश्यक समस्या यह है कि [i] [j] पर आंतरिक लूप के प्रत्येक पुनरावृत्ति के लिए आवश्यक है, कि पिछले पुनरावृत्ति का परिणाम, [i] [j - 1], पहले से ही उपलब्ध हो। इसलिए, इस कूट को समानांतर या पाइपलाइन नहीं किया जा सकता जैसा कि वर्तमान में लिखा गया है।

सजातीय परिवर्तन के साथ बहुतलीय प्रारूप का एक अनुप्रयोग और सीमाओं में उपयुक्त परिवर्तन, ऊपर नेस्टेड लूप को रूपांतरित कर देगा-

a[i - j][j] = a[i - j - 1][j] + a[i - j][j - 1];

इस स्थिति में, आंतरिक लूप का कोई पुनरावृत्ति पिछले पुनरावृत्ति के परिणामों पर निर्भर नहीं करता है; पूरे आंतरिक लूप को समानांतर में निष्पादित किया जा सकता है, यद्यपि बाहरी लूप का प्रत्येक पुनरावृत्ति पिछले पुनरावृत्तियों पर निर्भर करता है

विस्तृत उदाहरण

लूप तिरछा करने से पहले, एसआरसी की निर्भरता। लाल बिंदु एसआरसी[1][0]; गुलाबी बिंदु एसआरसी[2] से मेल खाता है.

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

आंतरिक लूप का प्रत्येक पुनरावृत्ति एसआरसी[i][j] के मानों के आधार पर एसआरसी [i-1] [j], एसआरसी [i] [j-1], और एसआरसी[i+1] के मानों को संशोधित करता है। [j-1]] वाली समान निर्भरताएँ डीएसटी [i] [j] पर लागू होती हैं।

लूप विषमन के प्रयोजनों के लिए, हम एसआरसी[i][j] और डीएसटी [i] [j] को एक ही तत्व के रूप में मान सकते हैं। हम उदाहरण दे सकते हैं एसआरसी[i][j] रेखांकन की निर्भरता, जैसा कि दाईं ओर आरेख में दर्शाया गया है ।

#define ERR(x, y) (dst[x][y] - src[x][y])

void dither(unsigned char** src, unsigned char** dst, int w, int h)
{
    int i, j;
    for (j = 0; j < h; ++j) {
        for (i = 0; i < w; ++i) {
            int v = src[i][j];
            if (i > 0)
                v -= ERR(i - 1, j) / 2;
            if (j > 0) {
                v -= ERR(i, j - 1) / 4;
                if (i < w - 1)
                    v -= ERR(i + 1, j - 1) / 4;
            }
            dst[i][j] = (v < 128) ? 0 : 255;
            src[i][j] = (v < 0) ? 0 : (v < 255) ? v : 255;
        }
    }
}
की निर्भरताएँ एसआरसी,लूप तिरछा करने के बाद। सरणी तत्वों को ग्रे, लाल, हरा, नीला, पीला क्रम में संसाधित किया जाएगा।

सजातीय परिवर्तन करना मूल निर्भरता आरेख पर हमें एक नया आरेख मिलता है, जो अगली छवि में दिखाया गया है। फिर हम कूट को लूप प्रारंभ करने के लिए पुनः लिख सकते हैं p और t के अतिरिक्त i और j, निम्नलिखित तिरछी रूटीन प्राप्त करते है ।

 void dither_skewed(unsigned char **src, unsigned char **dst, int w, int h)  
 {
     int t, p;
     for (t = 0; t < (w + (2 * h)); ++t) {
         int pmin = max(t % 2, t - (2 * h) + 2);
         int pmax = min(t, w - 1);
         for (p = pmin; p <= pmax; p += 2) {
             int i = p;
             int j = (t - p) / 2;
             int v = src[i][j];
             if (i > 0)
               v -= ERR(i - 1, j) / 2;
             if (j > 0)
               v -= ERR(i, j - 1) / 4;
             if (j > 0 && i < w - 1)
               v -= ERR(i + 1, j - 1) / 4;
             dst[i][j] = (v < 128) ? 0 : 255;
             src[i][j] = (v < 0) ? 0 : (v < 255) ? v : 255;
         }
     }
 }


यह भी देखें

बाहरी लिंक और संदर्भ