Subversion Repositories Remote Hare Voting

Rev

Rev 63 | Rev 67 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
37 jtkorb 1
#!/p/python-2.5.1/bin/python
15 jtkorb 2
 
39 jtkorb 3
import optparse
5 jtkorb 4
import cgi
5
import string
6
import sys
7
 
15 jtkorb 8
import parseinput
9
import tally
7 jtkorb 10
 
15 jtkorb 11
fHTML = 1
5 jtkorb 12
formaction = string.split(sys.argv[0],"/")[-1]
13
 
14
def emitPreHTML(formaction):
15
    emitHTML("""Content-type: text/html\n
16
<html>
17
<body>
18
<title>Hare Ballot Calculation</title>
19
    <h1>Hare Ballot Calculation</h1>
20
    <form enctype="multipart/form-data" method=POST action=%s>
21
        <table>
22
        <tr><td>CSV file of ballots:
23
                <td><input type=file size=70 name=name>
24
        </table>
25
        <p>
63 jtkorb 26
        <input type=submit name="run1" value="Run 1 Time">
64 jtkorb 27
        <input type=submit name="run500" value="Run 500 Times">
28
	<input type=submit name="runparallel" value="Run All Ways">
5 jtkorb 29
    </form>
30
    <p>
31
Input file format is given
32
<a href="http://www.bikmort.com/wiki/index.php?title=Hare_Voting_Procedure">here</a>.
62 jtkorb 33
Little error checking is done, so be sure to review the trace output.
5 jtkorb 34
The source code is available <a href="%s?fetch=yes">here</a>.
35
<p>
36
<small>%s</small>
37
<hr>
38
<pre>
54 jtkorb 39
""" % (formaction, formaction, "$Id: vote.py 64 2007-10-15 15:48:23Z jtkorb $"))
5 jtkorb 40
    return
41
 
42
def emitPostHTML():
43
    emitHTML("""</pre>
44
</body>
45
</html>
46
""")
47
    return
48
 
49
def emitHTML(s):
50
    global fHTML
51
    if fHTML: print s
52
    return
53
 
38 jtkorb 54
def doone(nWinners, ballots):
63 jtkorb 55
    tally.traceLevel = 1
56
    tally.fParallel = 0
38 jtkorb 57
    results = tally.dotally(nWinners, ballots)
58
 
39 jtkorb 59
def domany(nTimes, nWinners, ballots):
63 jtkorb 60
    tally.traceLevel = 0
61
    tally.fParallel = 0
39 jtkorb 62
    summary = {}
63
    for i in range(nTimes):
64
        results = str(tally.dotally(nWinners, ballots))
65
        if not summary.has_key(results):
66
            summary[results] = 0
67
        summary[results] = summary[results] + 1
64 jtkorb 68
    tally.trace(0, "\nSUMMARY AFTER %d TIMES" % nTimes)
39 jtkorb 69
    l = summary.items()
70
    l.sort(lambda x,y: cmp(y[1], x[1]))
71
    for pair in l:
63 jtkorb 72
        tally.trace(0, "%3d %s" % (pair[1], pair[0]))
39 jtkorb 73
 
63 jtkorb 74
def doparallel(nWinners, ballots):
75
    tally.traceLevel = 0
76
    tally.fParallel = 1
77
    results = tally.dotally(nWinners, ballots)
78
 
39 jtkorb 79
def doweb():
5 jtkorb 80
    emitPreHTML(formaction)
81
    form = cgi.FieldStorage()
82
 
83
    if not form:
84
        emitHTML("Enter file name and press a button to see results.")
85
    elif form.has_key("fetch"):
21 jtkorb 86
        filename = string.replace(formaction, "vote.py", "tally.py")
87
        source = open(filename).read()
88
        print cgi.escape(source)
5 jtkorb 89
    elif not form.has_key("name"):
90
        emitHTML("Error: no file received")
91
    elif not form["name"].filename:
92
        emitHTML("Error: file name missing")
93
    else:
94
        name = form["name"].filename
95
        contents = form["name"].value
96
 
63 jtkorb 97
        tally.trace(0, "INPUT FILE")
98
        tally.trace(0, contents)
5 jtkorb 99
 
15 jtkorb 100
        nWinners, ballots = parseinput.parsestring(contents)
21 jtkorb 101
        if form.has_key("run1"):
38 jtkorb 102
            doone(nWinners, ballots)
64 jtkorb 103
        elif form.has_key("run500"):
104
            domany(500, nWinners, ballots)
63 jtkorb 105
        elif form.has_key("runparallel"):
106
            doparallel(nWinners, ballots)
21 jtkorb 107
        else:
108
            print "UNEXPECTED SUBMIT BUTTON: %s" % form
109
 
5 jtkorb 110
    emitPostHTML()
111
    return
112
 
39 jtkorb 113
def main():
114
    usage = "usage: %prog [options] filename.csv"
115
    parser = optparse.OptionParser(usage)
63 jtkorb 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")
39 jtkorb 120
    (options, args) = parser.parse_args()
121
 
122
    if len(args) == 0:
123
        doweb()
38 jtkorb 124
    else:
39 jtkorb 125
        nWinners, ballots = parseinput.parsefile(args[0])
63 jtkorb 126
        if options.multi:
127
            domany(1000, nWinners, ballots)
128
        elif options.para:
129
            doparallel(nWinners, ballots)
130
        else:
131
            doone(nWinners, ballots)
38 jtkorb 132
 
15 jtkorb 133
if __name__=='__main__':
39 jtkorb 134
    main()