in multiset_codec/codecs.py [0:0]
def VariableLengthSequence(symbol_codec: Codec, max_seq_length: int) -> Codec:
'''
Encodes a variable-length sequence by sequentially encoding symbols with the
symbol_codec, followed by encoding the size of the sequence.
'''
sequence_codec = Sequence(symbol_codec)
seq_length_codec = substack(Uniform(max_seq_length+1), lambda h: h[:1])
def encode(ans_state, sequence, *context):
(ans_state, *context) = \
sequence_codec.encode(ans_state, reversed(sequence), *context)
(ans_state,) = seq_length_codec.encode(ans_state, len(sequence))
return (ans_state, *context)
def decode(ans_state, *context):
(ans_state, seq_length) = seq_length_codec.decode(ans_state)
(ans_state, sequence, *context) = \
sequence_codec.decode(ans_state, seq_length[0], *context)
return (ans_state, sequence, *context)
return Codec(encode, decode)