
class Sender():
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)

  def encode(self):
    pass

class NBackSender(Sender):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)

class Receiver():
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)

  def decode(self):
    pass

class NBackReceiver(Receiver):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)

class Channel():
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)

  def transmit(self):
    pass

  def add_noise(self):
    pass


class Message():
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)


class CodeBook():
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)

class Transmission():
  def __init__(self, sender, channel, receiver, noise_lambda=2):
    pass
  
  def run(self, times=100):
    pass


if __name__ == "__main__":
    sender = NBackSender()
    receiver = NBackReceiver()
    channel = Channel()
    transmission = Transmission(sender, channel, receiver)
    transmission.run(times=1000)
