#!/bin/python3 import argparse, subprocess, re, tempfile, os import numpy as np import matplotlib.pyplot as plt from gen_values import generate_test_file def run_agcd(input_file): cmd = ["./target/release/approximate-gcd", "agcd", input_file] try: result = subprocess.run(cmd, capture_output=True, text=True, check=True) output = result.stdout match = re.search(r"Recovered p: (\d+)", output) return int(match.group(1)) if match else None except subprocess.CalledProcessError as e: print(f"Error running command for input_file={input_file}: {e}") return None except (AttributeError, ValueError) as e: print(f"Error parsing output for input_file={input_file}: {e}") return None def plot_curves(noise_bits, p_bits, test_numbers, successes): plt.figure(figsize=(10, 6)) plt.plot(test_numbers, successes, marker='o') plt.xlabel('Number of Test Values') plt.ylabel('Success (1 = Correct, 0 = Incorrect)') plt.title(f'Success vs. Number of Test Values\n(noise_bits={noise_bits}, p_bits={p_bits})') plt.grid(True) plt.ylim(-0.1, 1.1) plt.yticks([0, 1]) plt.xticks(test_numbers) plt.savefig('success_plot.png') plt.show() def main(): parser = argparse.ArgumentParser(description='Test AGCD with varying number of test values.') parser.add_argument('--noise_bits', type=int, default=8, help='Number of noise bits') parser.add_argument('--p_bits', type=int, default=128, help='Number of bits for p') parser.add_argument('--min_values', type=int, default=2, help='Minimum number of test values') parser.add_argument('--max_values', type=int, default=100, help='Maximum number of test values') args = parser.parse_args() noise_bits = args.noise_bits p_bits = args.p_bits test_numbers = range(args.min_values, args.max_values + 1) successes = [] for num_values in test_numbers: # Create temporary test file with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.txt') as tmp_file: true_p = generate_test_file(noise_bits, num_values, p_bits, tmp_file.name) # Run AGCD recovered_p = run_agcd(tmp_file.name) # Check if recovery was successful success = 1 if recovered_p != None and abs(recovered_p - true_p) <= 4 else 0 successes.append(success) # Clean up os.unlink(tmp_file.name) print(f"Number of values: {num_values}, Success: {'Yes' if success else 'No'}") # Plot the results plot_curves(noise_bits, p_bits, test_numbers, successes) if __name__ == "__main__": main()