komm.EscapeCode
Escape code. It is an integer code with domain the positive integers. Let $M \geq 1$ be the divisor. For an integer $n$, let $q$ and $r$ be the quotient and the remainder of the division of $n - 1$ by $M$. The codeword for $n$ is a sequence of blocks, each one a truncated binary codeword with cardinality $M + 1$: $q$ blocks of $M$, called the escape, followed by the block of $r$.
The table below shows the codewords for the first integers, with a space between the blocks.
| $n$ | $M = 1$ | $M = 2$ | $M = 3$ | $M = 4$ |
|---|---|---|---|---|
| $1$ | 0 |
0 |
00 |
00 |
| $2$ | 1 0 |
10 |
01 |
01 |
| $3$ | 1 1 0 |
11 0 |
10 |
10 |
| $4$ | 1 1 1 0 |
11 10 |
11 00 |
110 |
| $5$ | 1 1 1 1 0 |
11 11 0 |
11 01 |
111 00 |
| $6$ | 1 1 1 1 1 0 |
11 11 10 |
11 10 |
111 01 |
| $7$ | 1 1 1 1 1 1 0 |
11 11 11 0 |
11 11 00 |
111 10 |
| $8$ | 1 1 1 1 1 1 1 0 |
11 11 11 10 |
11 11 01 |
111 110 |
Notes
- For $M = 1$ it reduces to the unary code with stop bit $0$.
- For $M = 2^b - 1$ all blocks have $b$ bits.
- The Golomb code uses the same division, but writes $q$ in unary.
- The taboo code uses the same blocks, but reserves the block of $0$ to end the codeword, instead of the block of $M$ to extend it.
Parameters:
-
divisor(int) –The divisor $M$. Must satisfy $M \geq 1$.
encode_single()
Encodes a single integer into its codeword.
Parameters:
-
integer(SupportsIndex) –The integer to be encoded. Must be in the domain of the code.
Returns:
-
codeword(Word) –The codeword of the integer. It is a tuple of bits.
Examples:
>>> code = komm.EscapeCode(3)
>>> code.encode_single(4)
(1, 1, 0, 0)
decode_single()
Decodes a single codeword from a bit iterator. This method consumes exactly the bits of one codeword, leaving the iterator at the boundary with the next one; any remaining bits are left untouched.
Parameters:
-
bits(Iterator[SupportsIndex]) –An iterator of bits starting with a complete codeword. It must be an iterator (as returned by
iter), not a general iterable, since advancing it is part of the contract.
Returns:
-
integer(int) –The decoded integer.
Notes
A ValueError is raised if the iterator is exhausted mid-codeword or if an invalid bit is found.
Examples:
>>> code = komm.EscapeCode(3)
>>> bits = iter([1, 1, 0, 0, 0, 0])
>>> code.decode_single(bits)
4
>>> list(bits) # Iterator is left at codeword boundary
[0, 0]
length()
Returns the codeword length $\ell(n)$ for a given integer $n$ in the domain of the code.
Examples:
>>> code = komm.EscapeCode(3)
>>> code.length(4)
4
encode()
Encodes a sequence of integers.
Parameters:
-
input(ArrayLike) –The sequence of integers to be encoded. Must be a 1D-array of positive integers.
Returns:
-
output(Array1D[integer]) –The concatenation of the codewords. It is a 1D-array of bits.
Examples:
>>> code = komm.EscapeCode(3)
>>> code.encode([4, 1, 3])
array([1, 1, 0, 0, 0, 0, 1, 0])
decode()
Decodes a sequence of bits.
Parameters:
-
input(ArrayLike) –The sequence of bits to be decoded. Must be a 1D-array of bits. Also, the sequence must be a concatenation of codewords (i.e., the output of the
encodemethod).
Returns:
-
output(Array1D[integer]) –The sequence of decoded integers. It is a 1D-array of positive integers.
Examples:
>>> code = komm.EscapeCode(3)
>>> code.decode([1, 1, 0, 0, 0, 0, 1, 0])
array([4, 1, 3])