1
2 """Winnow down list of intra-khipu sums by eliminating false positives."""
3
4
5
6 from __future__ import with_statement
7 import warnings, sys, math
8 import json
9 import IO
10
11
12 sys.path.append('..')
13 import KhipuDB
14 from Tally import Tally
15
17 global nums, sums, good, bad, totals
18
19
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
30 bad = {}
31 try:
32 bad = IO.readSums(filename='khipu-sums-bad.json')
33 except IOError:
34 pass
35 totals = {}
36 try:
37 totals = json.read (open('khipu-sums-totals.json', 'r').read () )
38 except IOError:
39 pass
40 print "Done."
41
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
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
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
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
78
79 try:
80 import psyco
81 psyco.full()
82 except ImportError:
83 pass
84
85 if __name__ == '__main__':
86 setup ()
87
88 try:
89 main()
90 except KeyboardInterrupt:
91 pass
92 print "Saving results."
93
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