def main():
    """
    Sliding window example.

    This example shows how to use sliding window encoder and decoder
    stacks. The sliding window is special in that it does not require
    that all symbols are available at the encoder before encoding can
    start. In addition it uses feedback between the decoder and encoder
    such that symbols that have already been received at the decoder
    are not included in the encoding again (saving computations).
    """
    # Set the number of symbols (i.e. the generation size in RLNC
    # terminology) and the size of a symbol in bytes
    symbols = 42
    symbol_size = 160
    # In the following we will make an encoder/decoder factory.
    # The factories are used to build actual encoders/decoders
    encoder_factory = kodo.SlidingWindowEncoderFactoryBinary(
        max_symbols=symbols, max_symbol_size=symbol_size)

    encoder = encoder_factory.build()

    decoder_factory = kodo.SlidingWindowDecoderFactoryBinary(
        max_symbols=symbols, max_symbol_size=symbol_size)

    decoder = decoder_factory.build()

    # Create some data to encode. In this case we make a buffer
    # with the same size as the encoder's block size (the max.
    # amount a single encoder can encode)
    # Just for fun - fill the input data with random data
    data_in = os.urandom(encoder.block_size())

    # Lets split the data into symbols and feed the encoder one symbol at a
    # time
    symbol_storage = [
        bytes(data_in[i:i + symbol_size])
        for i in range(0, len(data_in), symbol_size)
    ]

    while not decoder.is_complete():

        # Encode a packet into the payload buffer
        packet = encoder.encode()

        # Send the data to the decoders, here we just for fun
        # simulate that we are loosing 50% of the packets
        if random.choice([True, False]):
            continue

        # Packet got through - pass that packet to the decoder
        decoder.decode(packet)

        # Randomly choose to insert a symbol
        if random.choice([True, False]) and encoder.rank() < symbols:
            # For an encoder the rank specifies the number of symbols
            # it has available for encoding
            rank = encoder.rank()
            encoder.set_symbol(rank, symbol_storage[rank])

        # Transmit the feedback
        feedback = decoder.write_feedback()

        # Simulate loss of feedback
        if random.choice([True, False]):
            continue

        encoder.read_feedback(feedback)

    # The decoder is complete, now copy the symbols from the decoder
    data_out = decoder.copy_symbols()

    # Check we properly decoded the data
    if data_out == data_in:
        print("Data decoded correctly")
    else:
        print("Unexpected failure to decode please file a bug report :)")
        sys.exit(1)
Beispiel #2
0
    result['symbol_len'] = kodo_object.symbol_size()
    result['gen_size'] = kodo_object.symbols()
    return result


if __name__ == "__main__":

    if len(sys.argv) > 2:
        encoder_decoder = sys.argv[1]
        SYMBOL_SIZE = int(sys.argv[2])

    if coding_mode == "encode":
        if encoder_decoder == "FullVector":
            fw_fac = kodo.FullVectorEncoderFactoryBinary(GEN_SIZE, SYMBOL_SIZE)
        elif encoder_decoder == "SlidingWindow":
            fw_fac = kodo.SlidingWindowEncoderFactoryBinary(
                GEN_SIZE, SYMBOL_SIZE)
        redundancy = 10
    elif coding_mode in ("decode", "recode"):
        if encoder_decoder == "FullVector":
            fw_fac = kodo.FullVectorDecoderFactoryBinary(GEN_SIZE, SYMBOL_SIZE)
        elif encoder_decoder == "SlidingWindow":
            fw_fac = kodo.SlidingWindowDecoderFactoryBinary(
                GEN_SIZE, SYMBOL_SIZE)
    else:
        fw_fac = None

    encoder_info = convert_encoder(fw_fac)

    JSONL_FILE_PATH = "pd_{}_{}_{}.jsonl".format(encoder_decoder, SYMBOL_SIZE,
                                                 GEN_SIZE)