Evaluate a matrix between two players using manual thread management.
(self, player1_name: str, player2_name: str)
| 245 | self.logger.debug(f"Worker {worker_id} stopped") |
| 246 | |
| 247 | def _evaluate_matrix(self, player1_name: str, player2_name: str): |
| 248 | """Evaluate a matrix between two players using manual thread management.""" |
| 249 | symmetric = player1_name == player2_name |
| 250 | matrix_id = f"{player1_name}_vs_{player2_name}" |
| 251 | self.logger.info(f"Evaluating {matrix_id} matrix: {player1_name} vs {player2_name}") |
| 252 | |
| 253 | # Initialize matrix structure |
| 254 | self.matrices.setdefault(matrix_id, {}) |
| 255 | for i in range(self.rounds + 1): |
| 256 | self.matrices[matrix_id].setdefault(str(i), {}) |
| 257 | |
| 258 | # Create task queue and populate it directly |
| 259 | task_queue = Queue() |
| 260 | task_count = 0 |
| 261 | |
| 262 | for i in range(self.rounds + 1): |
| 263 | j_range = range(i) if symmetric else range(self.rounds + 1) |
| 264 | for j in j_range: |
| 265 | # Skip if already completed |
| 266 | try: |
| 267 | if self.matrices[matrix_id][str(i)][str(j)]: |
| 268 | continue |
| 269 | except KeyError: |
| 270 | pass |
| 271 | task_queue.put( |
| 272 | {"player1_name": player1_name, "player2_name": player2_name, "i": i, "j": j, "matrix_id": matrix_id} |
| 273 | ) |
| 274 | task_count += 1 |
| 275 | |
| 276 | if task_count == 0: |
| 277 | self.logger.info(f"All matrix cells for {matrix_id} already completed") |
| 278 | return |
| 279 | |
| 280 | self.logger.info(f"Executing {task_count} matrix cells using {self.max_workers} dedicated workers") |
| 281 | |
| 282 | # Start worker threads - each bound to a specific game worker |
| 283 | self.logger.debug("Starting worker threads") |
| 284 | workers = [] |
| 285 | for worker_id in range(self.max_workers): |
| 286 | worker = Thread(target=self._worker_thread, args=(worker_id, task_queue)) |
| 287 | worker.start() |
| 288 | workers.append(worker) |
| 289 | |
| 290 | self.logger.debug("Waiting for tasks to complete") |
| 291 | task_queue.join() |
| 292 | self.logger.debug("Workers finished") |
| 293 | for worker in workers: |
| 294 | worker.join() |
| 295 | |
| 296 | self.logger.info(f"Completed matrix evaluation for {matrix_id}") |
| 297 | |
| 298 | def evaluate_all_matrices(self) -> dict: |
| 299 | """Evaluate vs matrix between the two players.""" |
no outgoing calls
no test coverage detected