def test__case_1(self): for i, (rule, wmes, exp) in enumerate([(Rule( Has('$x', 'on', '$y'), Has('$y', 'left-of', '$z'), Has('$z', 'color', 'red'), ), [ WME('B1', 'on', 'B2'), WME('B1', 'on', 'B3'), WME('B1', 'color', 'red'), WME('B2', 'on', 'table'), WME('B2', 'left-of', 'B3'), WME('B2', 'color', 'blue'), WME('B3', 'left-of', 'B4'), WME('B3', 'on', 'table'), WME('B3', 'color', 'red') ], [])]): with self.subTest(i=i, rule=rule, wmes=wmes, exp=exp): network = Network() production = network.add_production(rule) am0 = network.build_or_share_alpha_memory(rule[0]) am1 = network.build_or_share_alpha_memory(rule[1]) am2 = network.build_or_share_alpha_memory(rule[2]) dummy_join = am0.children[0] join_on_value_y = am1.children[0] join_on_value_z = am2.children[0] match_c0 = dummy_join.children[0] match_c0c1 = join_on_value_y.children[0] match_c0c1c2 = join_on_value_z.children[0] for wme in wmes: network.add_wme(wme) assert am0.memory == [wmes[0], wmes[1], wmes[3], wmes[7]] assert am1.memory == [wmes[4], wmes[6]] assert am2.memory == [wmes[2], wmes[8]] assert len(match_c0.memory) == 4 assert len(match_c0c1.memory) == 2 assert len(match_c0c1c2.memory) == 1 t0 = Token(Token(None, None), wmes[0]) t1 = Token(t0, wmes[4]) t2 = Token(t1, wmes[8]) assert match_c0c1c2.memory[0] == t2 network.remove_wme(wmes[0]) assert am0.memory == [wmes[1], wmes[3], wmes[7]] assert len(match_c0.memory) == 3 assert len(match_c0c1.memory) == 1 assert len(match_c0c1c2.memory) == 0
def test_network_case1(): # setup net = Network() c0 = Has('$x', 'on', '$y') c1 = Has('$y', 'left-of', '$z') c2 = Has('$z', 'color', 'red') net.add_production(Rule(c0, c1, c2)) # end am0 = net.build_or_share_alpha_memory(c0) am1 = net.build_or_share_alpha_memory(c1) am2 = net.build_or_share_alpha_memory(c2) dummy_join = am0.successors[0] join_on_value_y = am1.successors[0] join_on_value_z = am2.successors[0] match_c0 = dummy_join.children[0] match_c0c1 = join_on_value_y.children[0] match_c0c1c2 = join_on_value_z.children[0] wmes = [ WME('B1', 'on', 'B2'), WME('B1', 'on', 'B3'), WME('B1', 'color', 'red'), WME('B2', 'on', 'table'), WME('B2', 'left-of', 'B3'), WME('B2', 'color', 'blue'), WME('B3', 'left-of', 'B4'), WME('B3', 'on', 'table'), WME('B3', 'color', 'red') ] for wme in wmes: net.add_wme(wme) assert am0.items == [wmes[0], wmes[1], wmes[3], wmes[7]] assert am1.items == [wmes[4], wmes[6]] assert am2.items == [wmes[2], wmes[8]] assert len(match_c0.items) == 4 assert len(match_c0c1.items) == 2 assert len(match_c0c1c2.items) == 1 t0 = Token(Token(None, None), wmes[0]) t1 = Token(t0, wmes[4]) t2 = Token(t1, wmes[8]) assert match_c0c1c2.items[0] == t2 net.remove_wme(wmes[0]) assert am0.items == [wmes[1], wmes[3], wmes[7]] assert len(match_c0.items) == 3 assert len(match_c0c1.items) == 1 assert len(match_c0c1c2.items) == 0
def test_network_case0(): net = Network() c0 = Has('x', 'id', '1') c1 = Has('x', 'kind', '8') p0 = net.add_production(Rule(c0, c1)) w0 = WME('x', 'id', '1') w1 = WME('x', 'kind', '8') net.add_wme(w0) assert not p0.items net.remove_wme(w0) net.add_wme(w1) assert not p0.items net.add_wme(w0) net.add_wme(w1) assert p0.items
def playGames(population): global board, moves, rete_net win = draw = stall = lose = 0 # Add rules to Rete rete_net = Network() # print("\x1b[43m-----------------------------------------------\x1b[0m") for candidate in population: p = add_rule_to_Rete(rete_net, candidate['rule']) if p: print('●', print_rule(candidate['rule']), end='\n') # print(' (%d)' % length_of_rule(candidate['rule'])) candidate['p_node'] = p # save_Rete_graph(rete_net, 'rete_0') for n in range(1000): # play game N times print("\r\t\tGame ", n, end='\r') # Initialize board for i in [0, 1, 2]: for j in [0, 1, 2]: if board[i][j] != ' ': rete_net.remove_wme(WME(board[i][i], str(i), str(j))) rete_net.add_wme(WME(' ', str(i), str(j))) board[i][j] = ' ' CurrentPlayer = 'X' # In the future, may play against self moves = [] # for recording played moves for move in range(9): # Repeat playing moves in single game # print(" move", move, end='; ') if CurrentPlayer == 'X': if play_1_move(population, CurrentPlayer): # Stalled? stall += 1 break # game-over, next game else: # Player = 'O' i, j = opponentPlay() board[i][j] = 'O' # print("Opponent move: O(%d,%d)" % (i,j)) # remove old WME rete_net.remove_wme(WME(' ', str(i), str(j))) # add new WME rete_net.add_wme(WME('O', str(i), str(j))) # printBoard() # this is text mode # new_GUI.draw_board() # graphics mode # check if win / lose, assign rewards accordingly winner = hasWinner() if winner == ' ': # let the same set of rules play again # let opponent play (opponent = self? this may be implemented later) CurrentPlayer = 'O' if CurrentPlayer == 'X' else 'X' elif winner == '-': # increase the scores of all played moves by 3.0 for candidate in moves: candidate['fitness'] += 3.0 # print("Draw") draw += 1 break # next game elif winner == 'X': # increase the scores of all played moves by 10.0 for candidate in moves: candidate['fitness'] += 10.0 # print("X wins") win += 1 break # next game elif winner == 'O': # decrease the scores of all played moves by 8.0 for candidate in moves: candidate['fitness'] -= 8.0 # print("O wins") lose += 1 break # next game return win, draw, stall, lose
def playGames(population): from GUI import draw_board global board win = draw = stall = lose = 0 # Add rules to Rete rete_net = Network() for candidate in population: p = add_rule_to_Rete(rete_net, candidate['rule']) if p: print('●', print_rule(candidate['rule']), end='\n') # print(' (%d)' % length_of_rule(candidate['rule'])) candidate['p_node'] = p # save_Rete_graph(rete_net, 'rete_0') for n in range(1000): # play game N times print("\t\tGame ", n, end='\r') # Initialize board for i in [0, 1, 2]: for j in [0, 1, 2]: if board[i][j] != ' ': rete_net.remove_wme(WME(board[i][i], str(i), str(j))) rete_net.add_wme(WME(' ', str(i), str(j))) board[i][j] = ' ' CurrentPlayer = 'X' # In the future, may play against self moves = [] # for recording played moves for move in range(9): # Repeat playing moves in single game # print(" move", move, end='; ') if CurrentPlayer == 'X': # collect all playable rules playable = [] for candidate in population: p0 = candidate['p_node'] if not p0: continue if p0.items: DEBUG(len(p0.items), " instances") for item in p0.items: # item = random.choice(p0.items) # choose an instantiation randomly # Question: are all instances the same? # apply binding to rule's action (ie, post-condition) if is_var(p0.postcondition.F2): p0.postcondition.F2 = item.get_binding(p0.postcondition.F2) if p0.postcondition.F2 is None: p0.postcondition.F2 = str(random.randint(0,2)) if is_var(p0.postcondition.F3): p0.postcondition.F3 = item.get_binding(p0.postcondition.F3) if p0.postcondition.F3 is None: p0.postcondition.F3 = str(random.randint(0,2)) DEBUG("production rule = ", print_rule(candidate['rule'])) DEBUG("chosen item = ", item) DEBUG("postcond = ", p0.postcondition) # Check if the square is empty x = int(p0.postcondition.F2) y = int(p0.postcondition.F3) if board[x][y] == ' ': playable.append(candidate) candidate['fitness'] += 1.0 else: candidate['fitness'] -= 1.0 # print(len(playable), "playable rules ", end='') uniques = [] for candidate in playable: if not uniques: uniques.append(candidate) continue exists = False for u in uniques: if candidate['p_node'].postcondition == u['p_node'].postcondition: exists = True if not exists: uniques.append(candidate) # print("; unique moves =\x1b[31;1m", len(uniques), end='\x1b[0m\n') if not uniques: # print("No rules playable") stall += 1 break # next game # Choose a playable rule randomly candidate = random.choice(uniques) p0 = candidate['p_node'] x = int(p0.postcondition.F2) y = int(p0.postcondition.F3) board[x][y] = CurrentPlayer # print(" played move: X(%d,%d)" % (x,y)) # remove old WME rete_net.remove_wme(WME(' ', p0.postcondition.F2, p0.postcondition.F3)) # add new WME rete_net.add_wme(WME(CurrentPlayer, p0.postcondition.F2, p0.postcondition.F3)) # **** record move: record the rule that is fired moves.append(candidate) else: # Player = 'O' i,j = opponentPlay() board[i][j] = 'O' # print("Opponent move: O(%d,%d)" % (i,j)) # remove old WME rete_net.remove_wme(WME(' ', str(i), str(j))) # add new WME rete_net.add_wme(WME('O', str(i), str(j))) # printBoard() # this is text mode draw_board(board) # graphics mode # check if win / lose, assign rewards accordingly winner = hasWinner() if winner == ' ': # let the same set of rules play again # let opponent play (opponent = self? this may be implemented later) CurrentPlayer = 'O' if CurrentPlayer == 'X' else 'X' elif winner == '-': # increase the scores of all played moves by 3.0 for candidate in moves: candidate['fitness'] += 3.0 # print("Draw") draw += 1 break # next game elif winner == 'X': # increase the scores of all played moves by 10.0 for candidate in moves: candidate['fitness'] += 10.0 # print("X wins") win += 1 break # next game elif winner == 'O': # decrease the scores of all played moves by 8.0 for candidate in moves: candidate['fitness'] -= 8.0 # print("O wins") lose += 1 break # next game return win, draw, stall, lose