Module IntraSumsWinnow
[hide private]
[frames] | no frames]

Source Code for Module IntraSumsWinnow

 1  #!/usr/bin/python2.5 
 2  """Winnow down list of intra-khipu sums by eliminating false positives.""" 
 3  # Originally we intended to try to find sums involving regular intervals 
 4  # as well. 
 5   
 6  from __future__ import with_statement 
 7  import warnings, sys, math 
 8  import json # package python-json in debian. 
 9  import IO # sums IO package in this directory 
10   
11  # KhipuDB & Tally are in parent dir 
12  sys.path.append('..') 
13  import KhipuDB 
14  from Tally import Tally 
15   
16 -def setup ():
17 global nums, sums, good, bad, totals 18 #print "Reading DB..." 19 #db = KhipuDB.KhipuDB() 20 print "Reading nums..." 21 nums = json.read (open ('khipu-numbers.yaml', 'r').read () ) 22 print "Reading sums..." 23 sums = IO.readSums() 24 print "Reading previously winnowed results..." 25 good = {} 26 try: 27 good = IO.readSums(filename='khipu-sums-good.json') 28 except IOError: 29 pass # no results yet 30 bad = {} 31 try: 32 bad = IO.readSums(filename='khipu-sums-bad.json') 33 except IOError: 34 pass # no results yet 35 totals = {} 36 try: 37 totals = json.read (open('khipu-sums-totals.json', 'r').read () ) 38 except IOError: 39 pass # no results yet 40 print "Done."
41
42 -def checkOne(khipuName, lst):
43 numCount = {} 44 for n in [int(n) for n in nums.get(khipuName) if n is not None]: 45 numCount[n] = numCount.get(n, 0) + 1 46 limit = int(math.log10(max(numCount.keys())))+1 47 limit += 1 # let's just be safe 48 49 t = Tally(0, fast=False, limit=limit) 50 for n, cordVal in lst: 51 t = t + (Tally(cordVal, fast=False, limit=limit) * n) 52 numCount[cordVal] -= n 53 54 for p in t.possibilities(): 55 if numCount.get(p, 0) > 0: 56 yield p
57
58 -def main():
59 maxcords=max([max(smap.keys()) for smap in sums.values()]) 60 61 for ncords in range(2,maxcords+1): 62 for k, smap in sums.iteritems(): 63 goodkn = good.setdefault(k, {}).setdefault(ncords, []) 64 badkn = bad.setdefault(k, {}).setdefault(ncords, []) 65 for l in smap.get(ncords, []): 66 if l in goodkn or l in badkn: 67 continue # we've already processed this one. 68 sumVals = list(checkOne(k, l)) 69 if len(sumVals) == 0: 70 badkn.append(l) 71 else: 72 totals[repr((k, l))] = sumVals 73 goodkn.append(l) 74 print k,ncords,l,sumVals 75 sys.stdout.flush ()
76
77 -def psyco():
78 # Import Psyco if available 79 try: 80 import psyco 81 psyco.full() 82 except ImportError: 83 pass
84 85 if __name__ == '__main__': 86 setup () 87 #psyco() 88 try: 89 main() 90 except KeyboardInterrupt: 91 pass # that's all we'll do today 92 print "Saving results." 93 # write (partial?) results 94 IO.writeSums(good, filename='khipu-sums-good.json') 95 IO.writeSums(bad, filename='khipu-sums-bad.json') 96 with open('khipu-sums-totals.json','w') as f: 97 f.write(json.write(totals)) 98