summaryrefslogtreecommitdiff
path: root/server.py
blob: 0479d1dbef58842f4725d8153187476a4de6cf04 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/usr/bin/env python3

import bottle
import random


class Max:
    def __init__(self):
        self.new(0)

    def new(self, count):
        if count == 1:
            # List has length 1: we know the answer.
            return self.done(0)

        self._count = count
        self._result = 0
        self._pos = 0
        self._rid = None
        return self.next(self._result)

    def decide(self, answer, rid):
        assert rid == self._rid
        if answer:
            # left < right: use previous "right" item
            return self.next(self._pos)
        else:
            # left >= right: use current best result
            return self.next(self._result)

    def next(self, new_result):
        self._result = new_result

        # Choose next item to compare.
        self._pos += 1

        if self._pos >= self._count:
            # We have reached the end of the list.
            return self.done(self._result)

        # Compare newly chosen item with current result.
        return self.compare(self._result, self._pos)

    def compare(self, left, right):
        self._rid = random.randint(1, 2 ** 30)
        self._pos = right
        return {
            "type": "compare",
            "left": left,
            "right": right,
            "request_id": self._rid,
        }

    def done(self, n):
        return {"type": "done", "result": n}


session = Max()


@bottle.post("/")
def root():
    msg = bottle.request.json
    print("request", msg)
    msg_type = msg.get("type")
    assert msg_type in ("compute_max", "comp_result")
    if msg_type == "compute_max":
        n = msg["length"]
        assert n > 0
        o = session.new(n)
    else:
        o = session.decide(msg["answer"], msg["request_id"])

    print("result", o, session._pos)
    bottle.response.content_type = "application/json"
    return o


bottle.run(host="localhost", port=5000)