Source code for digcommpy.messages

import numpy as np

_SEED = np.random.randint(0, 1000)


[docs]def unpack_to_bits(messages, num_bits): """This function converts an array of dec numbers into their binary representation. Parameters ---------- messages : list List of messages (numbers) num_bits : int Number of output bits Returns ------- binary_messages : array (N x num_bits) Converted messages as bits """ num_bits = int(num_bits) messages_bits = [list(format(x, "0>{}b".format(num_bits))) for x in messages] messages_bits = np.array(messages_bits, dtype=float) return messages_bits
[docs]def pack_to_dec(messages): """This function converts an array of binary numbers into their decimal representation. Parameters ---------- messages : array (N x num_bits) Array where each row contains one number and each column one bit Returns ------- dec_messages : array (N x 1) Converted messages as decimal numbers """ _powers = np.arange(np.shape(messages)[1], 0, -1) - 1 coeff = np.power(2, _powers).reshape((-1, 1)) return np.dot(messages, coeff).astype(int)
[docs]def generate_data(info_length, number=None, binary=False): """Generate random messages. Parameters ---------- info_length : int Number of information bits (message length) number : int, optional Number of random messages to generate (if int given) or all possible messages (if None given) binary : bool, optional If True, the messages will be returned in binary representation Returns ------- messages : array Array of generated messages. Shape is (number, info_bits) if unpacked, (numer, 1) else. """ info_length = int(info_length) if number is None: number = 2**info_length messages = np.arange(number) if binary: messages = unpack_to_bits(messages, info_length) else: number = int(number) if binary: messages = np.random.randint(0, 2, size=(number, info_length)) else: messages = np.random.randint(2**info_length, size=number) return messages
def _generate_data_generator(batch_size=50000, number=None, seed=None, **kwargs): """Generator for random messages.""" if seed is None: seed = _SEED np.random.seed(seed) if number is None: yield generate_data(number=None, **kwargs) else: size = int(number) batch_size = int(batch_size) num_batches, last_batch = divmod(size, batch_size) for batch in range(num_batches): yield generate_data(number=batch_size, **kwargs) if last_batch: yield generate_data(number=last_batch, **kwargs)