Subversion Repositories Local Hare Voting

Rev

Rev 62 | Rev 64 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 62 Rev 63
Line 21... Line 21...
21
        <table>
21
        <table>
22
        <tr><td>CSV file of ballots:
22
        <tr><td>CSV file of ballots:
23
                <td><input type=file size=70 name=name>
23
                <td><input type=file size=70 name=name>
24
        </table>
24
        </table>
25
        <p>
25
        <p>
26
        <input type=submit name="run1" value="Run">
26
        <input type=submit name="run1" value="Run 1 Time">
-
 
27
        <input type=submit name="run1000" value="Run 1000 Times">
-
 
28
	<input type=submit name="runparallel" value="Run Parallel Universes">
27
    </form>
29
    </form>
28
    <p>
30
    <p>
29
Input file format is given
31
Input file format is given
30
<a href="http://www.bikmort.com/wiki/index.php?title=Hare_Voting_Procedure">here</a>.
32
<a href="http://www.bikmort.com/wiki/index.php?title=Hare_Voting_Procedure">here</a>.
31
Little error checking is done, so be sure to review the trace output.
33
Little error checking is done, so be sure to review the trace output.
32
The source code is available <a href="%s?fetch=yes">here</a>.
34
The source code is available <a href="%s?fetch=yes">here</a>.
33
<p>
35
<p>
34
<small>%s</small>
36
<small>%s</small>
35
<hr>
37
<hr>
36
<pre>
38
<pre>
37
""" % (formaction, formaction, "$Id: vote.py 62 2007-09-24 13:57:27Z jtkorb $"))
39
""" % (formaction, formaction, "$Id: vote.py 63 2007-09-25 03:00:26Z jtkorb $"))
38
    return
40
    return
39
 
41
 
40
def emitPostHTML():
42
def emitPostHTML():
41
    emitHTML("""</pre>
43
    emitHTML("""</pre>
42
</body>
44
</body>
Line 48... Line 50...
48
    global fHTML
50
    global fHTML
49
    if fHTML: print s
51
    if fHTML: print s
50
    return
52
    return
51
 
53
 
52
def doone(nWinners, ballots):
54
def doone(nWinners, ballots):
-
 
55
    tally.traceLevel = 1
-
 
56
    tally.fParallel = 0
53
    results = tally.dotally(nWinners, ballots)
57
    results = tally.dotally(nWinners, ballots)
54
    tally.fTrace = 1
-
 
55
    tally.trace("\nFINAL RESULTS")
-
 
56
    for winner in results:
-
 
57
        tally.trace("\t%s" % winner)
-
 
58
 
58
 
59
def domany(nTimes, nWinners, ballots):
59
def domany(nTimes, nWinners, ballots):
-
 
60
    tally.traceLevel = 0
60
    tally.fTrace = 0
61
    tally.fParallel = 0
61
    summary = {}
62
    summary = {}
62
    for i in range(nTimes):
63
    for i in range(nTimes):
63
        results = str(tally.dotally(nWinners, ballots))
64
        results = str(tally.dotally(nWinners, ballots))
64
        if not summary.has_key(results):
65
        if not summary.has_key(results):
65
            summary[results] = 0
66
            summary[results] = 0
66
        summary[results] = summary[results] + 1
67
        summary[results] = summary[results] + 1
67
    tally.fTrace = 1
-
 
68
    tally.trace("SUMMARY AFTER %d TIMES" % nTimes)
68
    tally.trace(0, "SUMMARY AFTER %d TIMES" % nTimes)
69
    l = summary.items()
69
    l = summary.items()
70
    l.sort(lambda x,y: cmp(y[1], x[1]))
70
    l.sort(lambda x,y: cmp(y[1], x[1]))
71
    for pair in l:
71
    for pair in l:
72
        tally.trace("%3d %s" % (pair[1], pair[0]))
72
        tally.trace(0, "%3d %s" % (pair[1], pair[0]))
-
 
73
 
-
 
74
def doparallel(nWinners, ballots):
-
 
75
    tally.traceLevel = 0
-
 
76
    tally.fParallel = 1
-
 
77
    results = tally.dotally(nWinners, ballots)
73
 
78
 
74
def doweb():
79
def doweb():
75
    emitPreHTML(formaction)
80
    emitPreHTML(formaction)
76
    form = cgi.FieldStorage()
81
    form = cgi.FieldStorage()
77
 
82
 
Line 87... Line 92...
87
        emitHTML("Error: file name missing")
92
        emitHTML("Error: file name missing")
88
    else:
93
    else:
89
        name = form["name"].filename
94
        name = form["name"].filename
90
        contents = form["name"].value
95
        contents = form["name"].value
91
 
96
 
92
        tally.trace("INPUT FILE")
97
        tally.trace(0, "INPUT FILE")
93
        tally.trace(contents)
98
        tally.trace(0, contents)
94
 
99
 
95
        nWinners, ballots = parseinput.parsestring(contents)
100
        nWinners, ballots = parseinput.parsestring(contents)
96
        if form.has_key("run1"):
101
        if form.has_key("run1"):
97
            doone(nWinners, ballots)
102
            doone(nWinners, ballots)
-
 
103
        elif form.has_key("run1000"):
-
 
104
            domany(1000, nWinners, ballots)
-
 
105
        elif form.has_key("runparallel"):
-
 
106
            doparallel(nWinners, ballots)
98
        else:
107
        else:
99
            print "UNEXPECTED SUBMIT BUTTON: %s" % form
108
            print "UNEXPECTED SUBMIT BUTTON: %s" % form
100
                
109
                
101
    emitPostHTML()
110
    emitPostHTML()
102
    return
111
    return
103
 
112
 
104
def main():
113
def main():
105
    usage = "usage: %prog [options] filename.csv"
114
    usage = "usage: %prog [options] filename.csv"
106
    parser = optparse.OptionParser(usage)
115
    parser = optparse.OptionParser(usage)
-
 
116
    parser.add_option("-m", "--multiple", dest="multi", action="store_true",
-
 
117
                      help="run process multiple (1000) times")
-
 
118
    parser.add_option("-p", "--parallel", dest="para", action="store_true",
-
 
119
                      help="run process in parallel universes")
107
    (options, args) = parser.parse_args()
120
    (options, args) = parser.parse_args()
108
 
121
 
109
    if len(args) == 0:
122
    if len(args) == 0:
110
        doweb()
123
        doweb()
111
    else:
124
    else:
112
        nWinners, ballots = parseinput.parsefile(args[0])
125
        nWinners, ballots = parseinput.parsefile(args[0])
-
 
126
        if options.multi:
-
 
127
            domany(1000, nWinners, ballots)
-
 
128
        elif options.para:
-
 
129
            doparallel(nWinners, ballots)
-
 
130
        else:
113
        doone(nWinners, ballots)
131
            doone(nWinners, ballots)
114
 
132
 
115
if __name__=='__main__':
133
if __name__=='__main__':
116
    main()
134
    main()