Channels¶
Given an input space and an output space, a channel takes element from the input space (the message) and transforms it into an element of the output space (the transmitted message).
This file contains the following elements:
Channel
, the abstract class for ChannelsStaticErrorRateChannel
, which creates a specific number of errors in each transmitted messageErrorErasureChannel
, which creates a specific number of errors and a specific number of erasures in each transmitted message
-
class
sage.coding.channel_constructions.
Channel
(input_space, output_space)¶ Bases:
sage.structure.sage_object.SageObject
Abstract top-class for Channel objects.
All channel objects must inherit from this class. To implement a channel subclass, one should do the following:
- inherit from this class,
- call the super constructor,
- override
transmit_unsafe()
.
While not being mandatory, it might be useful to reimplement representation methods (
_repr_
and_latex_
).This abstract class provides the following parameters:
input_space
– the space of the words to transmitoutput_space
– the space of the transmitted words
-
input_space
()¶ Returns the input space of
self
.EXAMPLES:
sage: n_err = 2 sage: Chan = channels.StaticErrorRateChannel(GF(59)^6, n_err) sage: Chan.input_space() Vector space of dimension 6 over Finite Field of size 59
-
output_space
()¶ Returns the output space of
self
.EXAMPLES:
sage: n_err = 2 sage: Chan = channels.StaticErrorRateChannel(GF(59)^6, n_err) sage: Chan.output_space() Vector space of dimension 6 over Finite Field of size 59
-
transmit
(message)¶ Returns
message
, modified accordingly with the algorithm of the channel it was transmitted through.Checks if
message
belongs to the input space, and returns an exception if not. Note thatmessage
itself is never modified by the channel.INPUT:
message
– a vector
OUTPUT:
- a vector of the output space of
self
EXAMPLES:
sage: F = GF(59)^6 sage: n_err = 2 sage: Chan = channels.StaticErrorRateChannel(F, n_err) sage: msg = F((4, 8, 15, 16, 23, 42)) sage: set_random_seed(10) sage: Chan.transmit(msg) (4, 8, 4, 16, 23, 53)
We can check that the input
msg
is not modified:sage: msg (4, 8, 15, 16, 23, 42)
If we transmit a vector which is not in the input space of
self
:sage: n_err = 2 sage: Chan = channels.StaticErrorRateChannel(GF(59)^6, n_err) sage: msg = (4, 8, 15, 16, 23, 42) sage: Chan.transmit(msg) Traceback (most recent call last): ... TypeError: Message must be an element of the input space for the given channel
Note
One can also call directly
Chan(message)
, which does the same asChan.transmit(message)
-
transmit_unsafe
(message)¶ Returns
message
, modified accordingly with the algorithm of the channel it was transmitted through.This method does not check if
message
belongs to the input space of``self``.This is an abstract method which should be reimplemented in all the subclasses of Channel.
-
class
sage.coding.channel_constructions.
ErrorErasureChannel
(space, number_errors, number_erasures)¶ Bases:
sage.coding.channel_constructions.Channel
Channel which adds errors and erases several positions in any message it transmits.
The output space of this channel is a cartesian product between its input space and a VectorSpace of the same dimension over GF(2)
The main purpose of communication channels is to transmit messages, which can be achieved with two methods:
with the method
Channel.transmit()
. Considering a channelChan
and a messagemsg
, transmittingmsg
withChan
can be done this way:Chan.transmit(msg)
It can also be written in a more convenient way:
Chan(msg)
with the method
transmit_unsafe()
. It does the exact same thing astransmit()
except that it does not check ifmsg
belongs to the input space ofChan
:Chan.transmit_unsafe(msg)
INPUT:
space
– the input and output spacenumber_errors
– the number of errors created in each transmitted message. It can be either an integer of a tuple. If an tuple is passed as an argument, the number of errors will be a random integer between the two bounds of this tuple.number_erasures
– the number of erasures created in each transmitted message. It can be either an integer of a tuple. If an tuple is passed as an argument, the number of erasures will be a random integer between the two bounds of this tuple.
EXAMPLES:
We construct a ErrorErasureChannel which adds 2 errors and 2 erasures to any transmitted message:
sage: n_err, n_era = 2, 2 sage: Chan = channels.ErrorErasureChannel(GF(59)^40, n_err, n_era) sage: Chan Error-and-erasure channel creating 2 errors and 2 erasures of input space Vector space of dimension 40 over Finite Field of size 59 and output space The cartesian product of (Vector space of dimension 40 over Finite Field of size 59, Vector space of dimension 40 over Finite Field of size 2)
We can also pass the number of errors and erasures as a couple of integers:
sage: n_err, n_era = (1, 10), (1, 10) sage: Chan = channels.ErrorErasureChannel(GF(59)^40, n_err, n_era) sage: Chan Error-and-erasure channel creating between 1 and 10 errors and between 1 and 10 erasures of input space Vector space of dimension 40 over Finite Field of size 59 and output space The cartesian product of (Vector space of dimension 40 over Finite Field of size 59, Vector space of dimension 40 over Finite Field of size 2)
-
number_erasures
()¶ Returns the number of erasures created by
self
.EXAMPLES:
sage: n_err, n_era = 0, 3 sage: Chan = channels.ErrorErasureChannel(GF(59)^6, n_err, n_era) sage: Chan.number_erasures() (3, 3)
-
number_errors
()¶ Returns the number of errors created by
self
.EXAMPLES:
sage: n_err, n_era = 3, 0 sage: Chan = channels.ErrorErasureChannel(GF(59)^6, n_err, n_era) sage: Chan.number_errors() (3, 3)
-
transmit_unsafe
(message)¶ Returns
message
with as many errors asself._number_errors
in it, and as many erasures asself._number_erasures
in it.If
self._number_errors
was passed as an tuple for the number of errors, it will pick a random integer between the bounds of the tuple and use it as the number of errors. It does the same withself._number_erasures
.All erased positions are set to 0 in the transmitted message. It is guaranteed that the erasures and the errors will never overlap: the received message will always contains exactly as many errors and erasures as expected.
This method does not check if
message
belongs to the input space of``self``.INPUT:
message
– a vector
OUTPUT:
a couple of vectors, namely:
- the transmitted message, which is
message
with erroneous and erased positions - the erasure vector, which contains
1
at the erased positions of the transmitted message , 0 elsewhere.
- the transmitted message, which is
EXAMPLES:
sage: F = GF(59)^11 sage: n_err, n_era = 2, 2 sage: Chan = channels.ErrorErasureChannel(F, n_err, n_era) sage: msg = F((3, 14, 15, 9, 26, 53, 58, 9, 7, 9, 3)) sage: set_random_seed(10) sage: Chan.transmit_unsafe(msg) ((31, 0, 15, 9, 38, 53, 58, 9, 0, 9, 3), (0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0))
-
class
sage.coding.channel_constructions.
StaticErrorRateChannel
(space, number_errors)¶ Bases:
sage.coding.channel_constructions.Channel
Channel which adds a static number of errors to each message it transmits.
The input space and the output space of this channel are the same.
The main purpose of communication channels is to transmit messages, which can be achieved with two methods:
with the method
Channel.transmit()
. Considering a channelChan
and a messagemsg
, transmittingmsg
withChan
can be done this way:Chan.transmit(msg)
It can also be written in a more convenient way:
Chan(msg)
with the method
transmit_unsafe()
. It does the exact same thing astransmit()
except that it does not check ifmsg
belongs to the input space ofChan
:Chan.transmit_unsafe(msg)
INPUT:
space
– the space of both input and outputnumber_errors
– the number of errors added to each transmitted message It can be either an integer of a tuple. If a tuple is passed as argument, the number of errors will be a random integer between the two bounds of the tuple.
EXAMPLES:
We construct a StaticErrorRateChannel which adds 2 errors to any transmitted message:
sage: n_err = 2 sage: Chan = channels.StaticErrorRateChannel(GF(59)^40, n_err) sage: Chan Static error rate channel creating 2 errors, of input and output space Vector space of dimension 40 over Finite Field of size 59
We can also pass a tuple for the number of errors:
sage: n_err = (1, 10) sage: Chan = channels.StaticErrorRateChannel(GF(59)^40, n_err) sage: Chan Static error rate channel creating between 1 and 10 errors, of input and output space Vector space of dimension 40 over Finite Field of size 59
-
number_errors
()¶ Returns the number of errors created by
self
.EXAMPLES:
sage: n_err = 3 sage: Chan = channels.StaticErrorRateChannel(GF(59)^6, n_err) sage: Chan.number_errors() (3, 3)
-
transmit_unsafe
(message)¶ Returns
message
with as many errors asself._number_errors
in it.If
self._number_errors
was passed as a tuple for the number of errors, it will pick a random integer between the bounds of the tuple and use it as the number of errors.This method does not check if
message
belongs to the input space of``self``.INPUT:
message
– a vector
OUTPUT:
- a vector of the output space
EXAMPLES:
sage: F = GF(59)^6 sage: n_err = 2 sage: Chan = channels.StaticErrorRateChannel(F, n_err) sage: msg = F((4, 8, 15, 16, 23, 42)) sage: set_random_seed(10) sage: Chan.transmit_unsafe(msg) (4, 8, 4, 16, 23, 53)
-
sage.coding.channel_constructions.
format_interval
(t)¶ Returns a formatted string representation of
t
.This method should be called by any representation function in Channel classes.
Note
This is a helper function, which should only be used when implementing new channels.
INPUT:
t
– a list or a tuple
OUTPUT:
- a string
TESTS:
sage: t = (5, 5) sage: sage.coding.channel_constructions.format_interval(t) '5' sage: t = (2, 10) sage: sage.coding.channel_constructions.format_interval(t) 'between 2 and 10'
-
sage.coding.channel_constructions.
random_error_vector
(n, F, error_positions)¶ Return a vector of length
n
overF
filled with random non-zero coefficients at the positions given byerror_positions
.Note
This is a helper function, which should only be used when implementing new channels.
INPUT:
n
– the length of the vectorF
– the field over which the vector is definederror_positions
– the non-zero positions of the vector
OUTPUT:
- a vector of
F
AUTHORS:
This function is taken from codinglib (https://bitbucket.org/jsrn/codinglib/) and was written by Johan Nielsen.
EXAMPLES:
sage: sage.coding.channel_constructions.random_error_vector(5, GF(2), [1,3]) (0, 1, 0, 1, 0)