Mercurial > hg > config
annotate python/example/possibilities.py @ 929:7c4be71a560b default tip
remove old aliases
| author | Jeff Hammel <k0scist@gmail.com> | 
|---|---|
| date | Mon, 20 Oct 2025 15:22:19 -0700 | 
| parents | ef6731a4ad86 | 
| children | 
| rev | line source | 
|---|---|
| 
776
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
1 #!/usr/bin/env python | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
2 | 
| 777 | 3 """ | 
| 4 """ | |
| 5 | |
| 
776
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
6 # imports | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
7 import argparse | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
8 import sys | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
9 import time | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
10 from pprint import pprint | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
11 | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
12 costs = {1:1, | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
13 7:3, | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
14 30:25} | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
15 | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
16 A = [1, 2, 4, 5, 7, 29, 30] | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
17 | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
18 def possibilities(A): | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
19 possibilities = [[(1, date) for date in A]] | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
20 for_consideration = [0] | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
21 while True: | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
22 if not for_consideration: | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
23 break | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
24 _for_consideration = [] | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
25 for item in for_consideration: | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
26 basis = possibilities[item][:] | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
27 tickets = [i[0] for i in basis] | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
28 if set(tickets) == set([7]): | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
29 continue | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
30 index = 0 | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
31 potential = [] | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
32 while True: | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
33 try: | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
34 pos = tickets.find(1, index) | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
35 except ValueError: | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
36 break | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
37 potential = basis[:] | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
38 potential[pos] = (7, basis[pos][-1]) | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
39 | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
40 try: | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
41 while A[index] < date+6: | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
42 index += 1 | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
43 except IndexError: | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
44 pass | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
45 | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
46 return possibilities | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
47 | 
| 777 | 48 | 
| 
776
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
49 def fill_space(A, spans): | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
50 """ | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
51 A -- the space to be filled | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
52 spans -- the discrete length of each space | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
53 """ | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
54 if not A: | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
55 return [] | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
56 | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
57 A = sorted(A) | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
58 | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
59 possibilities = [] | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
60 | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
61 # [(ticket_value, index_into_A)] | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
62 working_set = [[(value, 0)] for value in spans] | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
63 # print "working set" | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
64 # pprint(working_set) | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
65 while working_set: | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
66 item = working_set.pop() | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
67 last_span, index = item[-1] | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
68 last_date = A[index] | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
69 e = None | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
70 index += 1 | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
71 try: | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
72 while last_date + last_span > A[index]: | 
| 777 | 73 # print ('index: {}'.format(index)) | 
| 
776
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
74 index += 1 | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
75 except IndexError as e: | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
76 possibilities.append(item) | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
77 continue | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
78 | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
79 # print "item:" | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
80 # pprint(item) | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
81 extension = [item[:] + [(span, index)] | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
82 for span in spans] | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
83 | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
84 working_set.extend(extension) | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
85 | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
86 # fill possibility indices with dates | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
87 retval = [[(A[index], span) for span, index in possibility] | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
88 for possibility in possibilities] | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
89 return retval | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
90 | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
91 | 
| 777 | 92 def sorted_costs(A, costs=tuple(costs.items())): | 
| 93 | |
| 94 costs = dict(costs) | |
| 
776
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
95 | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
96 # determine possibility spaces | 
| 777 | 97 spaces = fill_space(A, spans=costs.keys()) | 
| 
776
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
98 | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
99 # determine costs | 
| 777 | 100 retval = [] | 
| 101 for space in spaces: | |
| 102 cost = sum([costs[value] for date, value in space]) | |
| 103 retval.append((cost, space)) | |
| 104 | |
| 105 # sort by cost | |
| 106 retval.sort(key=lambda x: x[0]) | |
| 107 | |
| 108 return retval | |
| 
776
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
109 | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
110 if __name__ == '__main__': | 
| 
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
111 | 
| 777 | 112 parser = argparse.ArgumentParser(description=__doc__) | 
| 113 options = parser.parse_args() | |
| 
776
 
67fa26b40dc6
add example program for time-spacing
 
Jeff Hammel <k0scist@gmail.com> 
parents:  
diff
changeset
 | 
114 | 
| 777 | 115 dates = sorted(A) | 
| 116 | |
| 117 print "Dates: {}".format(', '.join([str(i) for i in dates])) | |
| 118 for cost, value in sorted_costs(A, costs): | |
| 119 print ("{} : {}".format(cost, value)) | 
