#!/usr/bin/env python

'''Try to guess some decent constants for our checksum class'''

from __future__ import with_statement

#mport os
import sys
import random
import collections

#mport primes_mod
try:
	import rolling_checksum_pyx_mod as rolling_checksum_mod
except ImportError:
	import rolling_checksum_py_mod as rolling_checksum_mod

def my_range(up_to):
	'''A range that isn't limited by the size of an int'''
	value = 0
	while value < up_to:
		yield value
		value += 1

def do_one(pickno, primes, len_primes):
	'''Pick some random constants and see if they work well'''
	# width can't be super big...  Overwise things slow way down...
	width = primes[random.randint(0, 2000)]
	multiplicand = primes[random.randint(0, 10000)]
	# modulus shouldn't be super small, either
	modulus = primes[random.randint(50, 10000)]
	num_iterations = modulus * 4
	addend = primes[random.randint(0, 10000)]
	rolling_checksum = rolling_checksum_mod.Rolling_checksum(width=width, multiplicand=multiplicand, modulus=modulus, addend=addend)
	result_dict = collections.defaultdict(int)
	for _unused in my_range(num_iterations):
		byte = random.randint(0, 255)
		checksum = rolling_checksum.add_byte(byte)
		result_dict[checksum] += 1
	len_result_dict = len(result_dict)
	print >> sys.stderr, 'pickno: %d, len_result_dict: %d, %% used: %.2f, width: %d, multiplicand: %d, modulus: %d, addend: %d' % (
		pickno,
		len_result_dict,
		len_result_dict * 100.0 / modulus,
		width,
		multiplicand,
		modulus,
		addend,
		)

def main():
	'''Main function - guess some constants that'll work reasonably well'''
	random.seed(3)
	print >> sys.stderr, 'reading list of primes...'
	with open('primes-below-100000000', 'r') as file_:
		primes = [ int(line) for line in file_ ]
	print >> sys.stderr, 'done reading, starting to evaluate constants'
	len_primes = len(primes)
	for pickno in my_range(1000000):
		do_one(pickno, primes, len_primes)

main()