Many tests done, still more to come.
[szyfrow.git] / szyfrow / keyword_cipher.py
index 2cf3290463d50ae6fbe9bb93e901eb9ba3ec8a19..446c6c42076d73f15739cd2346a6181b8da4d4ca 100644 (file)
@@ -2,12 +2,8 @@ from enum import Enum
 # from itertools import starmap
 import multiprocessing
 import math
-from support.utilities import *
-from support.language_models import *
-
-from logger import logger
-import logging
-# logger.setLevel(logging.DEBUG)
+from szyfrow.support.utilities import *
+from szyfrow.support.language_models import *
 
 
 class KeywordWrapAlphabet(Enum):
@@ -106,19 +102,10 @@ def keyword_break(message, wordlist=keywords, fitness=Pletters):
         for keyword in wordlist:
             plaintext = keyword_decipher(message, keyword, wrap_alphabet)
             fit = fitness(plaintext)
-            logger.debug('Keyword break attempt using key {0} (wrap={1}) '
-                         'gives fit of {2} and decrypt starting: {3}'.format(
-                             keyword, wrap_alphabet, fit,
-                             sanitise(plaintext)[:50]))
             if fit > best_fit:
                 best_fit = fit
                 best_keyword = keyword
                 best_wrap_alphabet = wrap_alphabet
-    logger.info('Keyword break best fit with key {0} (wrap={1}) gives fit of '
-                '{2} and decrypt starting: {3}'.format(best_keyword,
-                    best_wrap_alphabet, best_fit, sanitise(
-                        keyword_decipher(message, best_keyword,
-                                         best_wrap_alphabet))[:50]))
     return (best_keyword, best_wrap_alphabet), best_fit
 
 def keyword_break_mp(message, wordlist=keywords, fitness=Pletters,
@@ -152,9 +139,6 @@ def keyword_break_mp(message, wordlist=keywords, fitness=Pletters,
 def keyword_break_worker(message, keyword, wrap_alphabet, fitness):
     plaintext = keyword_decipher(message, keyword, wrap_alphabet)
     fit = fitness(plaintext)
-    logger.debug('Keyword break attempt using key {0} (wrap={1}) gives fit of '
-                 '{2} and decrypt starting: {3}'.format(keyword, 
-                     wrap_alphabet, fit, sanitise(plaintext)[:50]))
     return (keyword, wrap_alphabet), fit
 
 
@@ -164,7 +148,7 @@ def monoalphabetic_break_hillclimbing(message,
                               cipher_alphabet=None, 
                               swap_index_finder=None,
                               fitness=Pletters, chunksize=1):
-    return simulated_annealing_break(message, 
+    return monoalphabetic_sa_break(message, 
                               workers=1, 
                               initial_temperature=0,
                               max_iterations=max_iterations,
@@ -181,7 +165,7 @@ def monoalphabetic_break_hillclimbing_mp(message,
                               cipher_alphabet=None, 
                               swap_index_finder=None,
                               fitness=Pletters, chunksize=1):
-    return simulated_annealing_break(message, 
+    return monoalphabetic_sa_break(message, 
                               workers=workers, 
                               initial_temperature=0,
                               max_iterations=max_iterations,
@@ -197,7 +181,7 @@ def gaussian_swap_index(a):
 def uniform_swap_index(a):
     return random.randrange(26)
 
-def simulated_annealing_break(message, workers=10, 
+def monoalphabetic_sa_break(message, workers=10, 
                               initial_temperature=200,
                               max_iterations=20000,
                               plain_alphabet=None, 
@@ -231,12 +215,12 @@ def simulated_annealing_break(message, workers=10,
                             initial_temperature, max_iterations, fitness,
                             i))
     with multiprocessing.Pool() as pool:
-        breaks = pool.starmap(simulated_annealing_break_worker,
+        breaks = pool.starmap(monoalphabetic_sa_break_worker,
                               worker_args, chunksize)
     return max(breaks, key=lambda k: k[1])
 
 
-def simulated_annealing_break_worker(message, plain_alphabet, cipher_alphabet, 
+def monoalphabetic_sa_break_worker(message, plain_alphabet, cipher_alphabet, 
                                      swap_index_finder,
                                      t0, max_iterations, fitness,
                                      logID):
@@ -278,12 +262,6 @@ def simulated_annealing_break_worker(message, plain_alphabet, cipher_alphabet,
             # print('exception triggered: new_fit {}, current_fit {}, temp {}'.format(new_fitness, current_fitness, temperature))
             sa_chance = 0
         if (new_fitness > current_fitness or random.random() < sa_chance):
-            # logger.debug('Simulated annealing: iteration {}, temperature {}, '
-            #     'current alphabet {}, current_fitness {}, '
-            #     'best_plaintext {}'.format(i, temperature, current_alphabet, 
-            #     current_fitness, best_plaintext[:50]))
-
-            # logger.debug('new_fit {}, current_fit {}, temp {}, sa_chance {}'.format(new_fitness, current_fitness, temperature, sa_chance))
             current_fitness = new_fitness
             current_alphabet = alphabet
             
@@ -291,11 +269,7 @@ def simulated_annealing_break_worker(message, plain_alphabet, cipher_alphabet,
             best_alphabet = current_alphabet
             best_fitness = current_fitness
             best_plaintext = plaintext
-        if i % 500 == 0:
-            logger.debug('Simulated annealing worker {}: iteration {}, temperature {}, '
-                'current alphabet {}, plain alphabet {}, current_fitness {}, '
-                'best_plaintext {}'.format(logID, i, temperature, current_alphabet, plain_alphabet,
-                current_fitness, plaintext[:50]))
+
         temperature = max(temperature - dt, 0.001)
 
     return best_alphabet, best_fitness # current_alphabet, current_fitness