Encoders¶
Representation of a bijection between a message space and a code.
AUTHORS:
David Lucas (2015): initial version
- class sage.coding.encoder.Encoder(code)¶
Bases:
sage.structure.sage_object.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(SubclassName, self).__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()¶
Returns 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
- encode(word)¶
Transforms 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)
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
- generator_matrix()¶
Returns 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]
- message_space()¶
Returns 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
- unencode(c, nocheck=False)¶
Return the message corresponding to the codeword
c.This is the inverse of
encode().INPUT:
c– a codeword ofcode().nocheck– (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
self
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: 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)
- unencode_nocheck(c)¶
Returns 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
self.
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: 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)
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