diff --git a/README.md b/README.md index c20196a..81f907c 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ All commands assume you are in the project root directory. ```bash python3 main.py \ - --message "This is a 40-character test message...." \ + --message "Lorem ipsum dolor sit amet. consectetuer" \ --trials 1 \ --mode local ``` @@ -44,7 +44,7 @@ python3 main.py \ ```bash python3 main.py \ - --message "This is a 40-character test message...." \ + --message "Lorem ipsum dolor sit amet. consectetuer" \ --trials 500 \ --mode local ``` @@ -55,7 +55,7 @@ This will write `input.txt` and `output.txt` in your working directory. ```bash python3 main.py \ - --message "This is a 40-character test message...." \ + --message "Lorem ipsum dolor sit amet. consectetuer" \ --trials 1 \ --mode server \ --input_file input.txt \ diff --git a/main.py b/main.py index 4e4cb9a..5d63376 100644 --- a/main.py +++ b/main.py @@ -21,14 +21,12 @@ def transmit(msg, C): ''' return encoder.encode_message(msg, C) - def receive_local(c): ''' Sends the samples through the local channel simulation. ''' return channel.channel(c) - def receive_server(c, hostname, port): ''' Sends the samples to the remote server via client.py. If INPUT_FILE and/or @@ -72,7 +70,6 @@ def receive_server(c, hostname, port): os.remove(out_name) return Y - def receive(c, mode, hostname, port): ''' Wrapper to choose local or server channel. @@ -82,18 +79,23 @@ def receive(c, mode, hostname, port): elif mode == 'server': return receive_server(c, hostname, port) else: - raise ValueError('Mode must be \'local\' or \'server\'') - + raise ValueError("Mode must be 'local' or 'server'") def test_performance(msg, num_trials, mode, hostname, port): ''' - Runs num_trials transmissions of msg through the specified channel and reports accuracy. + Runs num_trials transmissions of msg through the specified channel and reports + per-trial decoded messages and error counts, plus overall accuracy. ''' if len(msg) != 40: raise ValueError('Message must be exactly 40 characters.') # Build codebook for 64 symbols, 40 blocks C = encoder.make_codebook(r=5, num_blocks=40) + successes = 0 + + print(f"Original message: {msg}") + print(f"Running {num_trials} trials over '{mode}' channel...\n") + for i in range(num_trials): # Transmit c = transmit(msg, C) @@ -101,16 +103,19 @@ def test_performance(msg, num_trials, mode, hostname, port): Y = receive(c, mode, hostname, port) # Decode est = decoder.decode_blocks(Y, C) - if est == msg: + # Count character errors + errors = sum(1 for a, b in zip(est, msg) if a != b) + # Tally success if no errors + if errors == 0: successes += 1 - pct = successes / num_trials * 100 - # Display results - print(f'Message: {msg}') - print(f'Trials: {num_trials}') - print(f'Mode: {mode}') - print(f'Correct decodings: {successes}') - print(f'Accuracy: {pct:.2f}%') + # Print trial result + print(f"Trial {i+1:3d}: Decoded: '{est}' | Errors: {errors}") + pct = successes / num_trials * 100 + print("\n=== Summary ===") + print(f"Total trials: {num_trials}") + print(f"Perfect decodings: {successes}") + print(f"Overall accuracy: {pct:.2f}%") def parse_args(): parser = argparse.ArgumentParser(description='Test communication system performance.') @@ -132,7 +137,6 @@ def parse_args(): if __name__ == '__main__': args = parse_args() - # Set global paths INPUT_FILE = args.input_file OUTPUT_FILE = args.output_file test_performance(args.message, args.trials, args.mode, args.hostname, args.port)