diff --git a/fs-succinct/sole_common.asy b/fs-succinct/sole_common.asy new file mode 100644 index 0000000000000000000000000000000000000000..9710212ae8d74591ca48a0ae5544a303322f422e --- /dev/null +++ b/fs-succinct/sole_common.asy @@ -0,0 +1,58 @@ +import ads; + +real blockwidth = 1; +real blockheight = 0.5; +real arrowheight = 1; +real rowheight = blockheight + arrowheight; + + +void mixarrow(int row, int col) { + real x = col * blockwidth; + real y = -row * rowheight - blockheight; + path arr1 = (x + blockwidth/2, y) {S} .. {S} (x + blockwidth, y - arrowheight / 2) {S} .. {S} (x + 1.5*blockwidth, y - arrowheight); + path arr2 = reflect((x + blockwidth, 0), (x+blockwidth, 1)) * arr1; + draw(arr1, Arrow); + draw(arr2, Arrow); +} + +void thruarrow(int row, int col) { + real x = col * blockwidth; + real y = -row * rowheight - blockheight; + draw((x+blockwidth/2, y)--(x+blockwidth/2, y-arrowheight), Arrow); + +} + +void block(int row, int col, string alphabet) { + real xbase = col * blockwidth; + real ybase = -row * rowheight; + if (alphabet == "...") { + label("$\cdots$", (xbase+blockwidth/2, ybase-blockheight/2), (0,0)); + + } else { + if (alphabet != "EOF" && alphabet != "0") + draw((xbase,ybase)--(xbase+blockwidth, ybase)--(xbase+blockwidth, ybase-blockheight)--(xbase, ybase-blockheight)--cycle); + label("$"+alphabet+"$", (xbase+blockwidth/2, ybase-blockheight/2), (0,0)); + } +} + +void blocks(int row ... string alphabets[]) { + for (int i = 0; i < alphabets.length; ++i) { + block(row, i, alphabets[i]); + } +} + +void thruarrows(int row, int col, int cnt) { + for (int i = 0; i < cnt; ++i) + thruarrow(row, col+i); +} + +void mixarrows(int row, int col, int cnt) { + for (int i = 0; i < cnt; i += 2) + mixarrow(row, col+i); +} + +void passlabel(int row, string lbl) { + label("{\it " + lbl + "}", (-1, -row*rowheight-blockheight - arrowheight/2), W); +} + + diff --git a/fs-succinct/succinct.tex b/fs-succinct/succinct.tex index 15991bc94a14b304fb7ca98f962621b216afe2f2..e5f4f676b8863391994daad1c5c647bf699ffca9 100644 --- a/fs-succinct/succinct.tex +++ b/fs-succinct/succinct.tex @@ -154,24 +154,27 @@ into a pair from alphabets $[C]$ and $[D]$ as long as $C\cdot D possible input combinations). We will use this kind of alphabet re-encoding by pair heavily in the SOLE -encoding. The best way to explain the exact scheme is with a diagram: +encoding. The best way to explain the exact scheme is with a diagram (fig. \figref{sole}). \figure[sole]{sole.pdf}{}{SOLE alphabet re-encoding scheme} There are two re-encoding phases. The first transforms blocks with alphabet $[B+1]$ into blocks with variable alphabet sizes (of the form of alternating -$[B+3k]$, $[B-3k]$). The second phase runs phase shifted by one block and converts -the variable-alphabet blocks into blocks with alphabet $[B]$. +$[B+3k]$, $[B-3k]$). This is the origin of the name: after this pass, +odd-numbered blocks have smaller alphabets than even-numbered ones. The second +pass runs phase shifted by one block and converts the variable-alphabet blocks +into blocks with alphabet $[B]$. What is the redundancy of this scheme? That depends on whether the original number of blocks (after padding) is even or odd. Figure \figref{sole} showed the case for an odd number. For an even number, the ending is a little bit different (fig. \figref{sole_even}). -You can easily check that this is reversible: after decoding phase 2, the last block -will always be either 0 (for the odd case) or EOF (for the even case). +You can easily check that this is reversible: after performing the inverse of +pass 2, the last block will always be either 0 (for the odd case) or EOF (for +the even case). -\figure[sole_even]{sole_even.pdf}{}{SOLE alphabet re-encoding scheme} +\figure[sole_even]{sole_even.pdf}{}{SOLE alphabet re-encoding scheme, alternate ending with even number of blocks} Now we can finally analyze redundancy. Let us count how the number of blocks increases throughout the encoding passes.