X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=find_best_caesar_break_parameters.py;h=edab90fcc2c55bfe5dc6b74b425413837030f1cd;hb=24f26cf9ca0538229ae503dd26b972532fa0c9de;hp=a07f30f096684ac3f282be95fb3ecfe1f7eba45a;hpb=1c65dba2a525fd559fc326cbd9fc2cde4441c9d5;p=cipher-tools.git diff --git a/find_best_caesar_break_parameters.py b/find_best_caesar_break_parameters.py index a07f30f..edab90f 100644 --- a/find_best_caesar_break_parameters.py +++ b/find_best_caesar_break_parameters.py @@ -2,6 +2,7 @@ import random import collections from cipher import * from cipherbreak import * +import itertools corpus = sanitise(''.join([open('shakespeare.txt', 'r').read(), open('sherlock-holmes.txt', 'r').read(), @@ -12,7 +13,7 @@ euclidean_scaled_english_counts = norms.euclidean_scale(english_counts) metrics = [{'func': norms.l1, 'name': 'l1'}, {'func': norms.l2, 'name': 'l2'}, - {'func': norms.l3, 'name': 'l2'}, + {'func': norms.l3, 'name': 'l3'}, {'func': norms.cosine_distance, 'name': 'cosine_distance'}, {'func': norms.harmonic_mean, 'name': 'harmonic_mean'}, {'func': norms.geometric_mean, 'name': 'geometric_mean'}, @@ -32,25 +33,33 @@ trials = 5000 scores = collections.defaultdict(int) -with open('caesar_break_parameter_trials.csv', 'w') as f: - print('metric,scaling,message_length,score', file = f) - for metric in metrics: - for scaling in scalings: - for message_length in message_lengths: - for i in range(trials): - sample_start = random.randint(0, corpus_length - message_length) - sample = corpus[sample_start:(sample_start + message_length)] - key = random.randint(1, 25) - sample_ciphertext = caesar_encipher(sample, key) - (found_key, score) = caesar_break(sample_ciphertext, - metric=metric['func'], - target_counts=scaling['corpus_frequency'], - message_frequency_scaling=scaling['scaling']) - if found_key == key: - scores[(metric['name'], scaling['name'], message_length)] += 1 - print(', '.join([metric['name'], - scaling['name'], - str(message_length), - str(scores[(metric['name'], scaling['name'], message_length)] / trials) ]), - file = f) -print() +def eval_all(): + list(itertools.starmap(eval_one_parameter_set, + itertools.product(metrics, scalings, message_lengths))) + +def eval_one_parameter_set(metric, scaling, message_length): + for _ in range(trials): + sample_start = random.randint(0, corpus_length - message_length) + sample = corpus[sample_start:(sample_start + message_length)] + key = random.randint(1, 25) + sample_ciphertext = caesar_encipher(sample, key) + found_key, _ = caesar_break(sample_ciphertext, + metric=metric['func'], + target_counts=scaling['corpus_frequency'], + message_frequency_scaling=scaling['scaling']) + if found_key == key: + scores[(metric['name'], scaling['name'], message_length)] += 1 + return scores[(metric['name'], scaling['name'], message_length)] + +def show_results(): + with open('caesar_break_parameter_trials.csv', 'w') as f: + print(',message_length', file = f) + print('metric+scaling,', ','.join([str(l) for l in message_lengths]), file = f) + for (metric, scaling) in itertools.product(metrics, scalings): + print('{}:{}'.format(metric['name'], scaling['name']), end='', file=f) + for l in message_lengths: + print(',', scores[(metric['name'], scaling['name'], l)] / trials, end='', file=f) + print('', file = f) + +eval_all() +show_results()