Encoders¶
Representation of a bijection between a message space and a code.
AUTHORS:
David Lucas (2015): initial version
- class sage.coding.encoder.Encoder(code)[source]¶
Bases:
SageObjectAbstract top-class for
Encoderobjects.Every encoder class for linear codes (of any metric) should inherit from this abstract class.
To implement an encoder, you need to:
inherit from
Encoder,call
Encoder.__init__in the subclass constructor. Example:super().__init__(code). By doing that, your subclass will have itscodeparameter initialized.Then, if the message space is a vector space, default implementations of
encode()andunencode_nocheck()methods are provided. These implementations rely ongenerator_matrix()which you need to override to use the default implementations.If the message space is not of the form \(F^k\), where \(F\) is a finite field, you cannot have a generator matrix. In that case, you need to override
encode(),unencode_nocheck()andmessage_space().By default, comparison of
Encoder(using methods__eq__and__ne__) are by memory reference: if you build the same encoder twice, they will be different. If you need something more clever, override__eq__and__ne__in your subclass.As
Encoderis not designed to be instantiated, it does not have any representation methods. You should implement_repr_and_latex_methods in the subclass.
REFERENCES:
- code()[source]¶
Return the code for this
Encoder.EXAMPLES:
sage: G = Matrix(GF(2), [[1,1,1,0,0,0,0], [1,0,0,1,1,0,0], ....: [0,1,0,1,0,1,0], [1,1,0,1,0,0,1]]) sage: C = LinearCode(G) sage: E = C.encoder() sage: E.code() == C True
>>> from sage.all import * >>> G = Matrix(GF(Integer(2)), [[Integer(1),Integer(1),Integer(1),Integer(0),Integer(0),Integer(0),Integer(0)], [Integer(1),Integer(0),Integer(0),Integer(1),Integer(1),Integer(0),Integer(0)], ... [Integer(0),Integer(1),Integer(0),Integer(1),Integer(0),Integer(1),Integer(0)], [Integer(1),Integer(1),Integer(0),Integer(1),Integer(0),Integer(0),Integer(1)]]) >>> C = LinearCode(G) >>> E = C.encoder() >>> E.code() == C True
- encode(word)[source]¶
Transform an element of the message space into a codeword.
This is a default implementation which assumes that the message space of the encoder is \(F^{k}\), where \(F\) is
sage.coding.linear_code_no_metric.AbstractLinearCodeNoMetric.base_field()and \(k\) issage.coding.linear_code_no_metric.AbstractLinearCodeNoMetric.dimension(). If this is not the case, this method should be overwritten by the subclass.Note
encode()might be a partial function overself’smessage_space(). One should use the exceptionEncodingErrorto catch attempts to encode words that are outside of the message space.One can use the following shortcut to encode a word with an encoder
E:E(word)INPUT:
word– a vector of the message space of theself
OUTPUT: a vector of
code()EXAMPLES:
sage: G = Matrix(GF(2), [[1,1,1,0,0,0,0], [1,0,0,1,1,0,0], ....: [0,1,0,1,0,1,0], [1,1,0,1,0,0,1]]) sage: C = LinearCode(G) sage: word = vector(GF(2), (0, 1, 1, 0)) sage: E = codes.encoders.LinearCodeGeneratorMatrixEncoder(C) sage: E.encode(word) (1, 1, 0, 0, 1, 1, 0)
>>> from sage.all import * >>> G = Matrix(GF(Integer(2)), [[Integer(1),Integer(1),Integer(1),Integer(0),Integer(0),Integer(0),Integer(0)], [Integer(1),Integer(0),Integer(0),Integer(1),Integer(1),Integer(0),Integer(0)], ... [Integer(0),Integer(1),Integer(0),Integer(1),Integer(0),Integer(1),Integer(0)], [Integer(1),Integer(1),Integer(0),Integer(1),Integer(0),Integer(0),Integer(1)]]) >>> C = LinearCode(G) >>> word = vector(GF(Integer(2)), (Integer(0), Integer(1), Integer(1), Integer(0))) >>> E = codes.encoders.LinearCodeGeneratorMatrixEncoder(C) >>> E.encode(word) (1, 1, 0, 0, 1, 1, 0)
If
wordis not in the message space ofself, it will return an exception:sage: word = random_vector(GF(7), 4) sage: E.encode(word) Traceback (most recent call last): ... ValueError: The value to encode must be in Vector space of dimension 4 over Finite Field of size 2
>>> from sage.all import * >>> word = random_vector(GF(Integer(7)), Integer(4)) >>> E.encode(word) Traceback (most recent call last): ... ValueError: The value to encode must be in Vector space of dimension 4 over Finite Field of size 2
- generator_matrix()[source]¶
Return a generator matrix of the associated code of
self.This is an abstract method and it should be implemented separately. Reimplementing this for each subclass of
Encoderis not mandatory (as a generator matrix only makes sense when the message space is of the \(F^k\), where \(F\) is the base field ofcode().)EXAMPLES:
sage: G = Matrix(GF(2), [[1,1,1,0,0,0,0], [1,0,0,1,1,0,0], ....: [0,1,0,1,0,1,0], [1,1,0,1,0,0,1]]) sage: C = LinearCode(G) sage: E = C.encoder() sage: E.generator_matrix() [1 1 1 0 0 0 0] [1 0 0 1 1 0 0] [0 1 0 1 0 1 0] [1 1 0 1 0 0 1]
>>> from sage.all import * >>> G = Matrix(GF(Integer(2)), [[Integer(1),Integer(1),Integer(1),Integer(0),Integer(0),Integer(0),Integer(0)], [Integer(1),Integer(0),Integer(0),Integer(1),Integer(1),Integer(0),Integer(0)], ... [Integer(0),Integer(1),Integer(0),Integer(1),Integer(0),Integer(1),Integer(0)], [Integer(1),Integer(1),Integer(0),Integer(1),Integer(0),Integer(0),Integer(1)]]) >>> C = LinearCode(G) >>> E = C.encoder() >>> E.generator_matrix() [1 1 1 0 0 0 0] [1 0 0 1 1 0 0] [0 1 0 1 0 1 0] [1 1 0 1 0 0 1]
- message_space()[source]¶
Return the ambient space of allowed input to
encode(). Note thatencode()is possibly a partial function over the ambient space.EXAMPLES:
sage: G = Matrix(GF(2), [[1,1,1,0,0,0,0], [1,0,0,1,1,0,0], ....: [0,1,0,1,0,1,0], [1,1,0,1,0,0,1]]) sage: C = LinearCode(G) sage: E = C.encoder() sage: E.message_space() Vector space of dimension 4 over Finite Field of size 2
>>> from sage.all import * >>> G = Matrix(GF(Integer(2)), [[Integer(1),Integer(1),Integer(1),Integer(0),Integer(0),Integer(0),Integer(0)], [Integer(1),Integer(0),Integer(0),Integer(1),Integer(1),Integer(0),Integer(0)], ... [Integer(0),Integer(1),Integer(0),Integer(1),Integer(0),Integer(1),Integer(0)], [Integer(1),Integer(1),Integer(0),Integer(1),Integer(0),Integer(0),Integer(1)]]) >>> C = LinearCode(G) >>> E = C.encoder() >>> E.message_space() Vector space of dimension 4 over Finite Field of size 2
- unencode(c, nocheck=False)[source]¶
Return the message corresponding to the codeword
c.This is the inverse of
encode().INPUT:
c– a codeword ofcode()nocheck– boolean (default:False); checks ifcis incode(). You might set this toTrueto disable the check for saving computation. Note that ifcis not inself()andnocheck = True, then the output ofunencode()is not defined (except that it will be in the message space ofself).
OUTPUT: an element of the message space of
selfEXAMPLES:
sage: G = Matrix(GF(2), [[1,1,1,0,0,0,0], [1,0,0,1,1,0,0], ....: [0,1,0,1,0,1,0], [1,1,0,1,0,0,1]]) sage: C = LinearCode(G) sage: c = vector(GF(2), (1, 1, 0, 0, 1, 1, 0)) sage: c in C True sage: E = codes.encoders.LinearCodeGeneratorMatrixEncoder(C) sage: E.unencode(c) (0, 1, 1, 0)
>>> from sage.all import * >>> G = Matrix(GF(Integer(2)), [[Integer(1),Integer(1),Integer(1),Integer(0),Integer(0),Integer(0),Integer(0)], [Integer(1),Integer(0),Integer(0),Integer(1),Integer(1),Integer(0),Integer(0)], ... [Integer(0),Integer(1),Integer(0),Integer(1),Integer(0),Integer(1),Integer(0)], [Integer(1),Integer(1),Integer(0),Integer(1),Integer(0),Integer(0),Integer(1)]]) >>> C = LinearCode(G) >>> c = vector(GF(Integer(2)), (Integer(1), Integer(1), Integer(0), Integer(0), Integer(1), Integer(1), Integer(0))) >>> c in C True >>> E = codes.encoders.LinearCodeGeneratorMatrixEncoder(C) >>> E.unencode(c) (0, 1, 1, 0)
- unencode_nocheck(c)[source]¶
Return the message corresponding to
c.When
cis not a codeword, the output is unspecified.AUTHORS:
This function is taken from codinglib [Nie]
INPUT:
c– a codeword ofcode()
OUTPUT: an element of the message space of
selfEXAMPLES:
sage: G = Matrix(GF(2), [[1,1,1,0,0,0,0], [1,0,0,1,1,0,0], ....: [0,1,0,1,0,1,0], [1,1,0,1,0,0,1]]) sage: C = LinearCode(G) sage: c = vector(GF(2), (1, 1, 0, 0, 1, 1, 0)) sage: c in C True sage: E = codes.encoders.LinearCodeGeneratorMatrixEncoder(C) sage: E.unencode_nocheck(c) (0, 1, 1, 0)
>>> from sage.all import * >>> G = Matrix(GF(Integer(2)), [[Integer(1),Integer(1),Integer(1),Integer(0),Integer(0),Integer(0),Integer(0)], [Integer(1),Integer(0),Integer(0),Integer(1),Integer(1),Integer(0),Integer(0)], ... [Integer(0),Integer(1),Integer(0),Integer(1),Integer(0),Integer(1),Integer(0)], [Integer(1),Integer(1),Integer(0),Integer(1),Integer(0),Integer(0),Integer(1)]]) >>> C = LinearCode(G) >>> c = vector(GF(Integer(2)), (Integer(1), Integer(1), Integer(0), Integer(0), Integer(1), Integer(1), Integer(0))) >>> c in C True >>> E = codes.encoders.LinearCodeGeneratorMatrixEncoder(C) >>> E.unencode_nocheck(c) (0, 1, 1, 0)
Taking a vector that does not belong to
Cwill not raise an error but probably just give a non-sensical result:sage: c = vector(GF(2), (1, 1, 0, 0, 1, 1, 1)) sage: c in C False sage: E = codes.encoders.LinearCodeGeneratorMatrixEncoder(C) sage: E.unencode_nocheck(c) (0, 1, 1, 0) sage: m = vector(GF(2), (0, 1, 1, 0)) sage: c1 = E.encode(m) sage: c == c1 False
>>> from sage.all import * >>> c = vector(GF(Integer(2)), (Integer(1), Integer(1), Integer(0), Integer(0), Integer(1), Integer(1), Integer(1))) >>> c in C False >>> E = codes.encoders.LinearCodeGeneratorMatrixEncoder(C) >>> E.unencode_nocheck(c) (0, 1, 1, 0) >>> m = vector(GF(Integer(2)), (Integer(0), Integer(1), Integer(1), Integer(0))) >>> c1 = E.encode(m) >>> c == c1 False