30
30
# local_not_with {'E': {1|3}, 'N': set(), 'W': {1|3}}
31
31
32
32
33
- from domino_probability_calc import calculate_tile_probabilities , PlayerTiles ,generate_scenarios , generate_sample
34
- from domino_game_analyzer import DominoTile
33
+ from domino_probability_calc import calculate_tile_probabilities ,generate_scenarios , generate_sample
34
+ from domino_data_types import DominoTile , PlayerTiles , PlayerPosition_SOUTH , GameState , PlayerPosition
35
+ from analytic_agent_player_parallel import AnalyticAgentPlayer
36
+ from domino_game_tracker import domino_game_state_our_perspective , generate_sample_from_game_state
37
+ from domino_utils import history_to_domino_tiles_history
38
+ from get_best_move2 import list_possible_moves
35
39
import copy
36
40
37
41
def test_calculate_probabilities ():
@@ -62,65 +66,147 @@ def test_calculate_probabilities():
62
66
print (f" P({ player } has { tile } ) = { prob :.6f} " )
63
67
print ()
64
68
65
- def test_calculate_probabilities2 ():
66
- # tile 0|6
67
- # probabilities[tile] {'N': 0.3333333333333333, 'E': 0.0, 'W': 0.0}
68
- # not_with {'E': set(), 'N': {5|6, 1|4}, 'W': {1|4}}
69
- # not_with_local {'E': set(), 'N': {5|6, 1|4}, 'W': {1|4}}
70
- # known_with_local {'W': {0|6}}
71
- # prob.sum 0.3333333333333333
72
- # scenarios []
73
- # player_tiles PlayerTiles(N=1, E=1, W=1)
74
- # Remaining tiles: [0|0, 0|1, 0|2, 0|6, 1|3, 1|4, 1|5, 1|6, 2|2, 2|3, 2|6, 3|3, 5|6]
75
-
76
- remaining_tiles = set ([
77
- DominoTile (0 , 0 ), DominoTile (0 , 1 ), DominoTile (0 , 2 ), DominoTile (0 , 6 ),
78
- DominoTile (1 , 3 ), DominoTile (1 , 4 ), DominoTile (1 , 5 ), DominoTile (1 , 6 ),
79
- DominoTile (2 , 2 ), DominoTile (2 , 3 ), DominoTile (2 , 6 ), DominoTile (3 , 3 ),
80
- DominoTile (5 , 6 )
81
- # DominoTile(2, 4), DominoTile(3, 6) # Tiles in human player's hand
82
- ])
83
-
84
- # Define not_with based on _knowledge_tracker
85
- not_with = {
86
- 'E' : set (),
87
- 'N' : {DominoTile (5 , 6 ), DominoTile (1 , 4 )},
88
- 'W' : {DominoTile (1 , 4 )}
89
- }
69
+ # def test_calculate_probabilities2():
70
+ # # tile 0|6
71
+ # # probabilities[tile] {'N': 0.3333333333333333, 'E': 0.0, 'W': 0.0}
72
+ # # not_with {'E': set(), 'N': {5|6, 1|4}, 'W': {1|4}}
73
+ # # not_with_local {'E': set(), 'N': {5|6, 1|4}, 'W': {1|4}}
74
+ # # known_with_local {'W': {0|6}}
75
+ # # prob.sum 0.3333333333333333
76
+ # # scenarios []
77
+ # # player_tiles PlayerTiles(N=1, E=1, W=1)
78
+ # # Remaining tiles: [0|0, 0|1, 0|2, 0|6, 1|3, 1|4, 1|5, 1|6, 2|2, 2|3, 2|6, 3|3, 5|6]
79
+
80
+ # remaining_tiles = set([
81
+ # DominoTile(0, 0), DominoTile(0, 1), DominoTile(0, 2), DominoTile(0, 6),
82
+ # DominoTile(1, 3), DominoTile(1, 4), DominoTile(1, 5), DominoTile(1, 6),
83
+ # DominoTile(2, 2), DominoTile(2, 3), DominoTile(2, 6), DominoTile(3, 3),
84
+ # DominoTile(5, 6)
85
+ # # DominoTile(2, 4), DominoTile(3, 6) # Tiles in human player's hand
86
+ # ])
87
+
88
+ # # Define not_with based on _knowledge_tracker
89
+ # not_with = {
90
+ # 'E': set(),
91
+ # 'N': {DominoTile(5, 6), DominoTile(1, 4)},
92
+ # 'W': {DominoTile(1, 4)}
93
+ # }
94
+
95
+ # # Define player_tiles (assuming 7 tiles per player at the start)
96
+ # player_tiles = PlayerTiles(N=1, E=1, W=1)
97
+
98
+ # # Call calculate_tile_probabilities
99
+ # # probabilities = calculate_tile_probabilities(remaining_tiles, not_with, player_tiles)
100
+ # # Print the results
101
+ # # for tile, probs in probabilities.items():
102
+ # # print(f"Tile {tile}:")
103
+ # # for player, prob in probs.items():
104
+ # # print(f" P({player} has {tile}) = {prob:.6f}")
105
+ # # print()
106
+
107
+ # player_tiles = PlayerTiles(N=4, E=4, W=5)
108
+ # sample = generate_sample(remaining_tiles, not_with, player_tiles)
109
+ # print('sample',sample)
110
+
111
+
112
+
113
+ # def test_generate_scenarios():
114
+ # player_tiles = [DominoTile(5,6)]
115
+ # not_with = {'E': set(), 'N': set(), 'W': {DominoTile(5,6)}}
116
+ # known_with = {'N': set(), 'E': set(), 'W': set()}
117
+ # player_tiles = PlayerTiles(N=5, E=6, W=6)
118
+ # scenarios = generate_scenarios(player_tiles, not_with, known_with)
119
+ # print(scenarios)
120
+ # print("known_with['N'].union(known_with['E']).union(known_with['W'])",known_with['N'].union(known_with['E']).union(known_with['W']))
121
+ # not_with_local = copy.deepcopy(not_with)
122
+ # # If found a duplication in not_with, it's added now to known_with and need to be removed from not_with
123
+ # if any(len(s)>0 for s in known_with.values()):
124
+ # for p, p_set in not_with_local.items():
125
+ # not_with_local[p] = not_with_local[p] - known_with['N'].union(known_with['E']).union(known_with['W'])
126
+ # print('not_with_local',not_with_local)
127
+
128
+
129
+ def test_initial_moves () -> None :
130
+
131
+ # Player's hand: [4|6, 1|3, 2|2, 3|4, 0|4, 2|6, 2|3]
132
+ # Remaining tiles: [0|0, 0|1, 0|2, 0|3, 0|5, 0|6, 1|1, 1|2, 1|4, 1|5, 1|6, 2|4, 2|5, 3|3, 3|5, 3|6, 4|4, 4|5, 5|5, 5|6, 6|6]
133
+ # Move Statistics (based on 5 samples):
134
+
135
+ # Move: Play 3|4 on the left
136
+ # Count: 5
137
+ # Mean Score: -5.5000
138
+ # Standard Deviation: 46.9441
139
+ # Median Score: -30.0000
140
+ # Mode Score: -30.0000
141
+ # Min Score: -44.0000
142
+ # Max Score: 68.0000
143
+
144
+ # Best Move Overall:
145
+ # Best move: Play 3|4 on the left
146
+ # Mean Expected Score: -5.5000
147
+ # First move: (3, 4)
148
+ ai_player = AnalyticAgentPlayer ()
149
+ verbose = True
150
+ # unplayed_tiles = self.get_unplayed_tiles(game_state, player_hand)
151
+ unplayed_tiles = [(0 ,0 ), (0 ,1 ), (0 ,2 ), (0 ,3 ), (0 ,5 ), (0 ,6 ), (1 ,1 ), (1 ,2 ), (1 ,4 ), (1 ,5 ), (1 ,6 ), (2 ,4 ), (2 ,5 ), (3 ,3 ), (3 ,5 ), (3 ,6 ), (4 ,4 ), (4 ,5 ), (5 ,5 ), (5 ,6 ), (6 ,6 )]
152
+ _unplayed_tiles = DominoTile .loi_to_domino_tiles (unplayed_tiles )
153
+
154
+ player_hand = [(4 ,6 ), (1 ,3 ), (2 ,2 ), (3 ,4 ), (0 ,4 ), (2 ,6 ), (2 ,3 )]
155
+ _player_hand = DominoTile .loi_to_domino_tiles (player_hand )
156
+
157
+ # _moves = history_to_domino_tiles_history(game_state.history)
158
+ _moves = history_to_domino_tiles_history ([])
159
+ _remaining_tiles = set (_unplayed_tiles )
160
+ # _initial_player_tiles = {p: 7 for p in PlayerPosition}
161
+ _initial_player_tiles = {p : 7 for p in range (4 )}
162
+ # _starting_player = PlayerPosition((game_state.history[0][0] - self.position)%4) if len(game_state.history)>0 else PlayerPosition.SOUTH
163
+ _starting_player = PlayerPosition_SOUTH
164
+
165
+ current_player , _final_remaining_tiles , _board_ends , _player_tiles_count , _knowledge_tracker = domino_game_state_our_perspective (
166
+ _remaining_tiles , _moves , _initial_player_tiles , current_player = _starting_player )
167
+
168
+ if verbose :
169
+ ai_player .print_verbose_info (_player_hand , _unplayed_tiles , _knowledge_tracker , _player_tiles_count , _starting_player )
170
+
171
+ # num_samples = 1000 if len(game_state.history) > 8 else 100 if len(game_state.history) > 4 else 25 if len(game_state.history) > 0 else 1
172
+ num_samples = 1
173
+ best_move = ai_player .get_best_move (set (_player_hand ), _remaining_tiles , _knowledge_tracker , _player_tiles_count , _board_ends , num_samples , verbose = True )
174
+
175
+ # inferred_knowledge: dict[PlayerPosition, set[DominoTile]] = {
176
+ # player: set() for player in range(4)
177
+ # }
178
+
179
+ # sample = generate_sample_from_game_state(
180
+ # # PlayerPosition.SOUTH,
181
+ # PlayerPosition_SOUTH,
182
+ # set(_player_hand),
183
+ # set(_unplayed_tiles),
184
+ # _player_tiles_count,
185
+ # inferred_knowledge
186
+ # )
187
+
188
+ # sample_hands = (
189
+ # frozenset(_player_hand),
190
+ # frozenset(sample['E']),
191
+ # frozenset(sample['N']),
192
+ # frozenset(sample['W'])
193
+ # )
194
+
195
+ # sample_state = GameState(
196
+ # player_hands=sample_hands,
197
+ # # current_player=PlayerPosition.SOUTH,
198
+ # current_player=PlayerPosition_SOUTH,
199
+ # left_end=_board_ends[0],
200
+ # right_end=_board_ends[1],
201
+ # consecutive_passes=0
202
+ # )
203
+
204
+ # possible_moves = list_possible_moves(sample_state)
205
+
206
+ # print('possible_moves', possible_moves)
90
207
91
- # Define player_tiles (assuming 7 tiles per player at the start)
92
- player_tiles = PlayerTiles (N = 1 , E = 1 , W = 1 )
93
-
94
- # Call calculate_tile_probabilities
95
- # probabilities = calculate_tile_probabilities(remaining_tiles, not_with, player_tiles)
96
- # Print the results
97
- # for tile, probs in probabilities.items():
98
- # print(f"Tile {tile}:")
99
- # for player, prob in probs.items():
100
- # print(f" P({player} has {tile}) = {prob:.6f}")
101
- # print()
102
-
103
- player_tiles = PlayerTiles (N = 4 , E = 4 , W = 5 )
104
- sample = generate_sample (remaining_tiles , not_with , player_tiles )
105
- print ('sample' ,sample )
106
-
107
-
108
-
109
- def test_generate_scenarios ():
110
- player_tiles = [DominoTile (5 ,6 )]
111
- not_with = {'E' : set (), 'N' : set (), 'W' : {DominoTile (5 ,6 )}}
112
- known_with = {'N' : set (), 'E' : set (), 'W' : set ()}
113
- player_tiles = PlayerTiles (N = 5 , E = 6 , W = 6 )
114
- scenarios = generate_scenarios (player_tiles , not_with , known_with )
115
- print (scenarios )
116
- print ("known_with['N'].union(known_with['E']).union(known_with['W'])" ,known_with ['N' ].union (known_with ['E' ]).union (known_with ['W' ]))
117
- not_with_local = copy .deepcopy (not_with )
118
- # If found a duplication in not_with, it's added now to known_with and need to be removed from not_with
119
- if any (len (s )> 0 for s in known_with .values ()):
120
- for p , p_set in not_with_local .items ():
121
- not_with_local [p ] = not_with_local [p ] - known_with ['N' ].union (known_with ['E' ]).union (known_with ['W' ])
122
- print ('not_with_local' ,not_with_local )
123
208
124
209
if __name__ == "__main__" :
125
- test_calculate_probabilities2 ()
126
- # test_generate_scenarios()
210
+ # test_calculate_probabilities2()
211
+ # test_generate_scenarios()
212
+ test_initial_moves ()
0 commit comments