def test_unset_variable_name_is_none(self): # Arrange assignment = Assignment() # Act value = assignment.get('UNSET') # Assert self.assertIsNone(value)
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
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))
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))
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)
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)