Пример #1
0
    def test_unset_variable_name_is_none(self):
        # Arrange
        assignment = Assignment()

        # Act
        value = assignment.get('UNSET')

        # Assert
        self.assertIsNone(value)
Пример #2
0
def _build_conflict_dag(
    d: DecisionLevel, unsat_clauses: Set[Clause], assignment: Assignment
) -> Tuple[AssignmentItem, Dict[AssignmentItem, Set[AssignmentItem]]]:
    succ: Dict[AssignmentItem, Set[AssignmentItem]] = {KAPPA: set()}
    queue: Set[AssignmentItem] = set()
    seen: Set[AssignmentItem] = set()
    root: Optional[AssignmentItem] = None
    for clause in unsat_clauses:
        for var in clause.get_assigned_vars(assignment):
            var_item = assignment.get(var)
            if not var_item:
                raise Exception(
                    "variable {} should be present in assignment".format(var))
            if var_item not in succ:
                succ[var_item] = set()
            succ[var_item].add(KAPPA)
            queue.add(var_item)
    while queue:
        var_item = queue.pop()
        if var_item in seen:
            continue
        seen.add(var_item)
        antecedent = var_item[3]
        if var_item[0] != d or not antecedent:
            if var_item[0] == d:
                root = var_item
            continue
        antecedent_vars = antecedent.get_assigned_vars(assignment)
        for v in antecedent_vars:
            if v == var_item[1]:
                continue
            parent_var_item = assignment.get(v)
            if not parent_var_item:
                raise Exception(
                    "variable {} should be present in assignment".format(v))
            if parent_var_item not in succ:
                succ[parent_var_item] = set()
            succ[parent_var_item].add(var_item)
            queue.add(parent_var_item)
    if not root:
        raise Exception("root should be found when building conflict tree")
    return root, succ
Пример #3
0
    def test_unset_removes_assignment(self):
        # Arrange
        variable_name = 'A'
        assignment = Assignment()
        assignment.set(variable_name, 10)

        # Act
        assignment.unset(variable_name)

        # Assert
        self.assertEqual(0, assignment.count())
        self.assertFalse(assignment.is_set(variable_name))
        self.assertIsNone(assignment.get(variable_name))
Пример #4
0
    def test_set_adds_assignment(self):
        # Arrange
        assignment = Assignment()
        variable_name = 'A'
        variable_value = 10

        # Act
        assignment.set(variable_name, variable_value)

        # Assert
        self.assertEqual(1, assignment.count())
        self.assertTrue(assignment.is_set(variable_name))
        self.assertEqual(variable_value, assignment.get(variable_name))
Пример #5
0
class Game:
    def __init__(self, players, roles, include_ai=0):
        if len(roles) != len(players) + 3 + (include_ai):
            raise Exception('you done fd up. %s != %s' % (players, roles))

        self.roles = [Role(r) for r in roles]
        self.players = [
            Player(p.name, inform=p.inform, ask=p.ask) for p in players
        ] + [Center(i) for i in range(3)]
        for i in range(include_ai):
            self.players.append(
                AIPlayer('AI_' + str(i), self.roles, self.players))
        self.assignment = Assignment({}, roles)
        self.assign()
        self.inform_players()
        print self.assignment

    def assign(self):
        self.originals = {}
        roles = self.roles[:]
        for player in self.players:
            ri = random.randint(0, len(roles) - 1)
            self.assignment.assign(player, roles[ri])
            self.originals[player] = roles[ri]
            del roles[ri]

    def inform_players(self, some_msg=None):
        for player in self.players:
            if player.active:
                if some_msg is not None:
                    player.inform(some_msg, None)
                else:
                    msg = 'You look at your card.'
                    statement = RoleClaim(player, self.assignment.get(player),
                                          ORIGINAL)
                    player.inform(msg, statement)

    def active_players(self):
        return [p for p in self.players if p.active]

    def get_players_for_role(self, role, solo=True):
        ps = filter(lambda x: self.assignment.get(x) == role and x.active,
                    self.players)
        print 'Players for', role, [p.name for p in ps]
        if solo and len(ps) > 1:
            raise Exception('There should only be one %s.' % role)
        return ps

    def vote(self):
        votes = {}
        for player in self.active_players():
            msg = 'Who do you want to kill?'
            choice = player.select(msg, self.active_players() + [None])
            if not choice:
                return None
            else:
                votes[player.name] = choice.name
        return votes

    def play_night(self):
        self.current = self.assignment.copy()
        r = DOPPLEGANGER
        ps = self.get_players_for_role(r)
        if ps:
            player = ps[0]
            msg = '%s, wake up. Select one other player\'s role to impersonate.' % r
            opponent = player.select(msg, self.active_players())
            self.dopplegang = self.current.get(opponent)

        r = WEREWOLF
        ps = self.get_players_for_role(r, solo=False)
        for player in ps:
            for opponent in ps:
                if player != opponent:
                    msg = '%s, wake up. See the other werewolves.' % r
                    player.inform(msg, RoleClaim(opponent, WEREWOLF, ORIGINAL))
            if len(ps) == 1:
                msg = 'Werewolf, wake up. You may choose a card from the center to look at.'
                opponent = player.select(
                    msg, [p for p in self.players if not p.active])
                player.inform(
                    'You learn:',
                    RoleClaim(opponent, self.current.get(opponent), ORIGINAL))

        r = MINION
        werewolves = ps
        ps = self.get_players_for_role(r)
        if ps:
            player = ps[0]
            for w in werewolves:
                msg = '%s, wake up. See the werewolves.' % r
                player.inform(msg, RoleClaim(w, WEREWOLF, ORIGINAL))

        r = MASON
        ps = self.get_players_for_role(r, solo=False)
        for player in ps:
            for opponent in ps:
                if player != opponent:
                    msg = '%s, wake up. See the other masons.' % r
                    player.inform(msg, RoleClaim(opponent, MASON, ORIGINAL))

        r = SEER
        ps = self.get_players_for_role(r)
        if ps:
            player = ps[0]
            opponents_card = 'A single opponent\'s card.'
            center_card = 'Two cards from the center.'
            msg = 'Seer, wake up. You may choose to look at one other player\'s card or two cards from the center.'
            choice = player.select(msg, [opponents_card, center_card])
            active = choice == opponents_card
            msg = 'Seer, select a card to look at.'
            opponent = player.select(
                msg, [p for p in self.players if p.active == active])
            player.inform(
                'You learn',
                RoleClaim(opponent, self.current.get(opponent), AFTER_DOPPLE))
            if not active:
                opponent = player.select(
                    msg, [p for p in self.players if p.active == active])
                player.inform(
                    'You learn:',
                    RoleClaim(opponent, self.current.get(opponent),
                              AFTER_DOPPLE))

        r = ROBBER
        ps = self.get_players_for_role(r)
        if ps:
            player = ps[0]
            msg = 'Robber, wake. You may swap cards with one other player.'
            opponent = player.select(
                msg, [p for p in self.players if p.active] + [None])
            if opponent:
                opponent_role = self.current.get(opponent)
                player_role = self.current.get(player)
                player.inform('You look at your new card.',
                              RoleClaim(player, opponent_role, AFTER_ROBBER))
                player.inform('Which means...',
                              RoleClaim(opponent, player_role, AFTER_ROBBER))
                player.inform('and...',
                              RoleClaim(opponent, opponent_role, AFTER_DOPPLE))
                self.current.assign(player, opponent_role)
                self.current.assign(opponent, player_role)

        r = TROUBLEMAKER
        ps = self.get_players_for_role(r)
        if ps:
            player = ps[0]
            msg = '%s, wake up. You may swap the cards of two other players.' % r
            # TODO cannot swap with self
            opp1 = player.select(msg, self.active_players() + [None])
            if opp1:
                msg = '...and the other player.'
                opp2 = player.select(
                    msg, [p for p in self.players if p.active and p != opp1])
                opp1_role = self.current.get(opp1)
                self.current.assign(opp1, self.current.get(opp2))
                self.current.assign(opp2, opp1_role)

        r = DRUNK
        ps = self.get_players_for_role(r)
        if ps:
            player = ps[0]
            msg = '%s, wake up. Select a card from the center to swap with your own.' % r
            center = player.select(msg,
                                   [p for p in self.players if not p.active])
            center_role = self.current.get(center)
            self.current.assign(center, self.current.get(player))
            self.current.assign(player, center_role)

        r = INSOMNIAC
        ps = self.get_players_for_role(r)
        if ps:
            player = ps[0]
            msg = '%s, wake up. Look at your card.' % r
            player.inform(msg,
                          RoleClaim(player, self.current.get(player), FINAL))

        print
        print self.current
        return str(self.current)
Пример #6
0
class Game:
    def __init__(self, players, roles, include_ai=0):
        if len(roles) != len(players) + 3 + (include_ai):
            raise Exception('you done fd up. %s != %s' % (players, roles))

        self.roles = [Role(r) for r in roles]
        self.players = [Player(p.name, inform=p.inform, ask=p.ask) for p in players] + [Center(i) for i in range(3)]
        for i in range(include_ai):
            self.players.append(AIPlayer('AI_' + str(i), self.roles, self.players))
        self.assignment = Assignment({}, roles)
        self.assign()
        self.inform_players()
        print self.assignment

    def assign(self):
        self.originals = {}
        roles = self.roles[:]
        for player in self.players:
            ri = random.randint(0, len(roles) - 1)
            self.assignment.assign(player, roles[ri])
            self.originals[player] = roles[ri]
            del roles[ri]

    def inform_players(self, some_msg=None):
        for player in self.players:
            if player.active:
                if some_msg is not None:
                    player.inform(some_msg, None)
                else:
                    msg = 'You look at your card.'
                    statement = RoleClaim(player, self.assignment.get(player), ORIGINAL)
                    player.inform(msg, statement)

    def active_players(self):
        return [p for p in self.players if p.active]

    def get_players_for_role(self, role, solo=True):
        ps = filter(lambda x: self.assignment.get(x) == role and x.active, self.players)
        print 'Players for', role, [p.name for p in ps]
        if solo and len(ps) > 1:
            raise Exception('There should only be one %s.' % role)
        return ps

    def vote(self):
        votes = {}
        for player in self.active_players():
            msg = 'Who do you want to kill?'
            choice = player.select(msg, self.active_players() + [None])
            if not choice:
                return None
            else:
                votes[player.name] = choice.name
        return votes

    def play_night(self):
        self.current = self.assignment.copy()
        r = DOPPLEGANGER
        ps = self.get_players_for_role(r)
        if ps:
            player = ps[0]
            msg = '%s, wake up. Select one other player\'s role to impersonate.' % r
            opponent = player.select(msg, self.active_players())
            self.dopplegang = self.current.get(opponent)

        r = WEREWOLF
        ps = self.get_players_for_role(r, solo=False)
        for player in ps:
            for opponent in ps:
                if player != opponent:
                    msg = '%s, wake up. See the other werewolves.' % r
                    player.inform(msg, RoleClaim(opponent, WEREWOLF, ORIGINAL))
            if len(ps) == 1:
                msg = 'Werewolf, wake up. You may choose a card from the center to look at.'
                opponent = player.select(msg, [p for p in self.players if not p.active])
                player.inform('You learn:', RoleClaim(opponent, self.current.get(opponent), ORIGINAL))

        r = MINION
        werewolves = ps
        ps = self.get_players_for_role(r)
        if ps:
            player = ps[0]
            for w in werewolves:
                msg = '%s, wake up. See the werewolves.' % r
                player.inform(msg, RoleClaim(w, WEREWOLF, ORIGINAL))

        r = MASON
        ps = self.get_players_for_role(r, solo=False)
        for player in ps:
            for opponent in ps:
                if player != opponent:
                    msg = '%s, wake up. See the other masons.' % r
                    player.inform(msg, RoleClaim(opponent, MASON, ORIGINAL))

        r = SEER
        ps = self.get_players_for_role(r)
        if ps:
            player = ps[0]
            opponents_card = 'A single opponent\'s card.'
            center_card = 'Two cards from the center.'
            msg = 'Seer, wake up. You may choose to look at one other player\'s card or two cards from the center.'
            choice = player.select(msg, [opponents_card, center_card])
            active = choice == opponents_card
            msg = 'Seer, select a card to look at.'
            opponent = player.select(msg, [p for p in self.players if p.active == active])
            player.inform('You learn', RoleClaim(opponent, self.current.get(opponent), AFTER_DOPPLE))
            if not active:
                opponent = player.select(msg, [p for p in self.players if p.active == active])
                player.inform('You learn:', RoleClaim(opponent, self.current.get(opponent), AFTER_DOPPLE))

        r = ROBBER
        ps = self.get_players_for_role(r)
        if ps:
            player = ps[0]
            msg = 'Robber, wake. You may swap cards with one other player.'
            opponent = player.select(msg, [p for p in self.players if p.active] + [None])
            if opponent:
                opponent_role = self.current.get(opponent)
                player_role = self.current.get(player)
                player.inform('You look at your new card.', RoleClaim(player, opponent_role, AFTER_ROBBER))
                player.inform('Which means...', RoleClaim(opponent, player_role, AFTER_ROBBER))
                player.inform('and...', RoleClaim(opponent, opponent_role, AFTER_DOPPLE))
                self.current.assign(player, opponent_role)
                self.current.assign(opponent, player_role)

        r = TROUBLEMAKER
        ps = self.get_players_for_role(r)
        if ps:
            player = ps[0]
            msg = '%s, wake up. You may swap the cards of two other players.' % r
            # TODO cannot swap with self
            opp1 = player.select(msg, self.active_players() + [None])
            if opp1:
                msg = '...and the other player.'
                opp2 = player.select(msg, [p for p in self.players if p.active and p != opp1])
                opp1_role = self.current.get(opp1)
                self.current.assign(opp1, self.current.get(opp2))
                self.current.assign(opp2, opp1_role)

        r = DRUNK
        ps = self.get_players_for_role(r)
        if ps:
            player = ps[0]
            msg = '%s, wake up. Select a card from the center to swap with your own.' % r
            center = player.select(msg, [p for p in self.players if not p.active])
            center_role = self.current.get(center)
            self.current.assign(center, self.current.get(player))
            self.current.assign(player, center_role)

        r = INSOMNIAC
        ps = self.get_players_for_role(r)
        if ps:
            player = ps[0]
            msg = '%s, wake up. Look at your card.' % r
            player.inform(msg, RoleClaim(player, self.current.get(player), FINAL))

        print
        print self.current
        return str(self.current)