Rodrigues equation: Difference between revisions

From formulasearchengine
Jump to navigation Jump to search
en>Filipedireito
 
en>Addbot
m Bot: Removing Orphan Tag (Nolonger an Orphan) (Report Errors)
Line 1: Line 1:
Alyson is the name people use to contact me and I believe  online reader ([http://www.010-5260-5333.com/index.php?document_srl=1880&mid=board_ALMP66 http://www.010-5260-5333.com/]) it sounds fairly great when you say it. I am an invoicing officer and I'll be promoted quickly. I am really fond of to go to karaoke but I've been taking on new things recently. Some time in the past he selected to reside in North Carolina and he doesn't plan on altering it.<br><br>my web-site :: online [http://www.prograd.uff.br/novo/facts-about-growing-greater-organic-garden telephone psychic] reading ([http://jplusfn.gaplus.kr/xe/qna/78647 http://jplusfn.gaplus.kr/xe/qna/78647])
{{for|physical models of polyhedra|Polyhedron model}}
The '''polyhedral model''' (also called the '''polytope method''') is a mathematical framework for [[loop nest optimization]] in [[program optimization]]. The polytope method treats each loop iteration within nested loops as lattice points inside mathematical objects called [[polytope]]s, performs [[affine transformation]]s or more general non-affine transformations such as tiling on the polytopes, and then converts the transformed polytopes into equivalent, but optimized (depending on targeted optimization goal), loop nests through polyhedra scanning.
 
== Detailed example ==
 
 
[[Image:Polytope model unskewed.svg|thumb|right|The dependencies of <code>src</code>, before [[Loop_optimization#Common_loop_transformations|loop skewing]]. The red dot corresponds to <code>src[1][0]</code>; the purple dot corresponds to <code>src[2][2]</code>.]]
The following [[C (programming language)|C]] code implements a form of error-distribution [[dither]]ing similar to [[Floyd–Steinberg dithering]], but modified for pedagogical reasons. The two-dimensional array <code>src</code> contains <code>h</code> rows of <code>w</code> pixels, each pixel having a [[grayscale]] value between 0 and 255 inclusive. After the routine has finished, the output array <code>dst</code> will contain only pixels with value 0 or value 255. During the computation, each pixel's dithering error is collected by adding it back into the <code>src</code> array. (Notice that <code>src</code> and <code>dst</code> are both read and written during the computation; <code>src</code> is not read-only, and <code>dst</code> is not write-only.)
 
Each iteration of the [[inner loop]] modifies the values in <code>src[i][j]</code> based on the values of <code>src[i-1][j]</code>, <code>src[i][j-1]</code>, and <code>src[i+1][j-1]</code>. (The same dependencies apply to <code>dst[i][j]</code>. For the purposes of [[Loop_optimization#Common_loop_transformations|loop skewing]], we can think of <code>src[i][j]</code> and <code>dst[i][j]</code> as the same element.) We can illustrate the dependencies of <code>src[i][j]</code> graphically, as in the diagram on the right.
 
<!-- 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? --~~~~ -->
<table><tr><td width="50%">
<source lang=C>
#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 (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;
        }
    }
}
</source>
</td><td></td></tr></table>
 
[[Image:Polytope model skewed.svg|thumb|right|The dependencies of <code>src</code>, after loop skewing. The array elements will be processed in the order ''gray, red, green, blue, yellow...'']]
 
Performing the affine transformation <math>(p,\, t) = (i,\, 2j+i)</math> on the original dependency diagram gives us a new diagram, which is shown in the next image. We can then rewrite the code to loop on <code>p</code> and <code>t</code> instead of <code>i</code> and <code>j</code>, obtaining the following "skewed" routine.
 
<!-- Please don't break this code. Test before committing! -->
<table><tr><td width="50%">
<source lang=C>
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;
        }
    }
}
</source>
</td><td></td></tr></table>
 
==See also==
*[[Frameworks supporting the polyhedral model]]
*[[Loop nest optimization]]
*[[Loop unrolling]]
*[[Loop reversal]]
*[[Loop tiling]]
 
==External links and references==
*[http://www.infosun.fmi.uni-passau.de/cl/loopo/doc/loopo_doc/node3.html "The basic polytope method"], tutorial by Martin Griebl containing diagrams of the pseudocode example above
*[[Frameworks supporting the polyhedral model#Transitive closure operation|"Framework for polyhedral model"]]
*[http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.30.5675 "Code Generation in the Polytope Model"] (1998). Martin Griebl, Christian Lengauer, and Sabine Wetzel
*[http://www.cloog.org/ "The CLooG Polyhedral Code Generator"]
*[http://www.chunchen.info/omega "CodeGen+: Z-polyhedra scanning"]
 
[[Category:Compiler optimizations]]
[[Category:Articles with example pseudocode]]
[[Category:Articles with example C code]]

Revision as of 04:07, 9 January 2013

28 year-old Painting Investments Worker Truman from Regina, usually spends time with pastimes for instance interior design, property developers in new launch ec Singapore and writing. Last month just traveled to City of the Renaissance. The polyhedral model (also called the polytope method) is a mathematical framework for loop nest optimization in program optimization. The polytope method treats each loop iteration within nested loops as lattice points inside mathematical objects called polytopes, performs affine transformations or more general non-affine transformations such as tiling on the polytopes, and then converts the transformed polytopes into equivalent, but optimized (depending on targeted optimization goal), loop nests through polyhedra scanning.

Detailed example

The dependencies of src, before loop skewing. The red dot corresponds to src[1][0]; the purple dot corresponds to src[2][2].

The following C code implements a form of error-distribution dithering similar to Floyd–Steinberg dithering, but modified for pedagogical reasons. The two-dimensional array src contains h rows of w pixels, each pixel having a grayscale value between 0 and 255 inclusive. After the routine has finished, the output array dst will contain only pixels with value 0 or value 255. During the computation, each pixel's dithering error is collected by adding it back into the src array. (Notice that src and dst are both read and written during the computation; src is not read-only, and dst is not write-only.)

Each iteration of the inner loop modifies the values in src[i][j] based on the values of src[i-1][j], src[i][j-1], and src[i+1][j-1]. (The same dependencies apply to dst[i][j]. For the purposes of loop skewing, we can think of src[i][j] and dst[i][j] as the same element.) We can illustrate the dependencies of src[i][j] graphically, as in the diagram on the right.

 #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 (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;
         }
     }
 }
The dependencies of src, after loop skewing. The array elements will be processed in the order gray, red, green, blue, yellow...

Performing the affine transformation on the original dependency diagram gives us a new diagram, which is shown in the next image. We can then rewrite the code to loop on p and t instead of i and j, obtaining the following "skewed" routine.

 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;
         }
     }
 }

See also

External links and references