From 494a5966d316a19af9a7850901e9cb3193b3de1d Mon Sep 17 00:00:00 2001 From: Jakub Date: Tue, 9 Sep 2025 19:18:21 +0200 Subject: [PATCH 1/8] feat: add support for "Undecided" match results in outcome processing --- src/sc2_datasets/transforms/mmr_vs_result.py | 7 ++++++- src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py | 7 ++++++- src/sc2_datasets/transforms/utils.py | 8 +++++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/sc2_datasets/transforms/mmr_vs_result.py b/src/sc2_datasets/transforms/mmr_vs_result.py index 1f52879..c8dc6aa 100644 --- a/src/sc2_datasets/transforms/mmr_vs_result.py +++ b/src/sc2_datasets/transforms/mmr_vs_result.py @@ -29,7 +29,12 @@ def mmr_vs_result(sc2_replay: SC2ReplayData) -> Tuple[torch.Tensor, torch.Tensor dtype=torch.float, ) - result_dict = {"Loss": 0, "Win": 1, "Victory": 1, "Defeat": 0} + result_dict = {"Loss": 0, "Win": 1, "Victory": 1, "Defeat": 0, "Undecided": -1} + + # Check if result is "Undecided" and return None to skip this replay + if sc2_replay.toonPlayerDescMap[0].toon_player_info.result == "Undecided": + return None, None + label_tensor = torch.tensor( result_dict[sc2_replay.toonPlayerDescMap[0].toon_player_info.result], dtype=torch.int8, diff --git a/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py b/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py index 647b62e..d6fe429 100644 --- a/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py +++ b/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py @@ -59,7 +59,12 @@ def economy_average_vs_outcome( # Creating feature tensor: feature_tensor = torch.tensor(feature_list, dtype=torch.float32) - result_dict = {"Loss": 0, "Win": 1, "Victory": 1, "Defeat": 0} + result_dict = {"Loss": 0, "Win": 1, "Victory": 1, "Defeat": 0, "Undecided": -1} + + # Check if result is "Undecided" and return None to skip this replay + if sc2_replay.toonPlayerDescMap[0].toon_player_info.result == "Undecided": + return None, None + target = result_dict[sc2_replay.toonPlayerDescMap[0].toon_player_info.result] return feature_tensor, target diff --git a/src/sc2_datasets/transforms/utils.py b/src/sc2_datasets/transforms/utils.py index c3cb062..1406925 100644 --- a/src/sc2_datasets/transforms/utils.py +++ b/src/sc2_datasets/transforms/utils.py @@ -235,7 +235,13 @@ def select_outcome_1v1(sc2_replay: SC2ReplayData) -> Dict[str, int]: player_outcome = {"1": 0, "2": 0} - result_dict = {"Loss": 0, "Win": 1, "Victory": 1, "Defeat": 0} + result_dict = {"Loss": 0, "Win": 1, "Victory": 1, "Defeat": 0, "Undecided": -1} + + # Check if any player has an "Undecided" result and return None to indicate skipping + for toon_desc_map in sc2_replay.toonPlayerDescMap: + if toon_desc_map.toon_player_info.result == "Undecided": + return None + for toon_desc_map in sc2_replay.toonPlayerDescMap: result = result_dict[toon_desc_map.toon_player_info.result] player_outcome[toon_desc_map.toon_player_info.playerID] = result From 0577f2658bcf2808056bd6b75ccf9b6c5d2bd136 Mon Sep 17 00:00:00 2001 From: Jakub Date: Tue, 9 Sep 2025 19:32:05 +0200 Subject: [PATCH 2/8] fix trailing whitespace --- src/sc2_datasets/transforms/mmr_vs_result.py | 3 +-- src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py | 2 +- src/sc2_datasets/transforms/utils.py | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/sc2_datasets/transforms/mmr_vs_result.py b/src/sc2_datasets/transforms/mmr_vs_result.py index c8dc6aa..341820f 100644 --- a/src/sc2_datasets/transforms/mmr_vs_result.py +++ b/src/sc2_datasets/transforms/mmr_vs_result.py @@ -30,11 +30,10 @@ def mmr_vs_result(sc2_replay: SC2ReplayData) -> Tuple[torch.Tensor, torch.Tensor ) result_dict = {"Loss": 0, "Win": 1, "Victory": 1, "Defeat": 0, "Undecided": -1} - + # Check if result is "Undecided" and return None to skip this replay if sc2_replay.toonPlayerDescMap[0].toon_player_info.result == "Undecided": return None, None - label_tensor = torch.tensor( result_dict[sc2_replay.toonPlayerDescMap[0].toon_player_info.result], dtype=torch.int8, diff --git a/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py b/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py index d6fe429..2ebac30 100644 --- a/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py +++ b/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py @@ -60,7 +60,7 @@ def economy_average_vs_outcome( feature_tensor = torch.tensor(feature_list, dtype=torch.float32) result_dict = {"Loss": 0, "Win": 1, "Victory": 1, "Defeat": 0, "Undecided": -1} - + # Check if result is "Undecided" and return None to skip this replay if sc2_replay.toonPlayerDescMap[0].toon_player_info.result == "Undecided": return None, None diff --git a/src/sc2_datasets/transforms/utils.py b/src/sc2_datasets/transforms/utils.py index 1406925..e1967a4 100644 --- a/src/sc2_datasets/transforms/utils.py +++ b/src/sc2_datasets/transforms/utils.py @@ -236,7 +236,7 @@ def select_outcome_1v1(sc2_replay: SC2ReplayData) -> Dict[str, int]: player_outcome = {"1": 0, "2": 0} result_dict = {"Loss": 0, "Win": 1, "Victory": 1, "Defeat": 0, "Undecided": -1} - + # Check if any player has an "Undecided" result and return None to indicate skipping for toon_desc_map in sc2_replay.toonPlayerDescMap: if toon_desc_map.toon_player_info.result == "Undecided": From 81757ac0c179a85d38440304c77db073b776fed6 Mon Sep 17 00:00:00 2001 From: Jakub Date: Tue, 9 Sep 2025 22:38:26 +0200 Subject: [PATCH 3/8] Update src/sc2_datasets/transforms/mmr_vs_result.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/sc2_datasets/transforms/mmr_vs_result.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/sc2_datasets/transforms/mmr_vs_result.py b/src/sc2_datasets/transforms/mmr_vs_result.py index 341820f..ac8e2ac 100644 --- a/src/sc2_datasets/transforms/mmr_vs_result.py +++ b/src/sc2_datasets/transforms/mmr_vs_result.py @@ -31,9 +31,7 @@ def mmr_vs_result(sc2_replay: SC2ReplayData) -> Tuple[torch.Tensor, torch.Tensor result_dict = {"Loss": 0, "Win": 1, "Victory": 1, "Defeat": 0, "Undecided": -1} - # Check if result is "Undecided" and return None to skip this replay - if sc2_replay.toonPlayerDescMap[0].toon_player_info.result == "Undecided": - return None, None + # Map result to label tensor, including "Undecided" as -1 label_tensor = torch.tensor( result_dict[sc2_replay.toonPlayerDescMap[0].toon_player_info.result], dtype=torch.int8, From ce21306b9ce09dcab395a3a96915a735cea07196 Mon Sep 17 00:00:00 2001 From: Jakub Date: Tue, 9 Sep 2025 22:38:50 +0200 Subject: [PATCH 4/8] Update src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py b/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py index 2ebac30..014b66e 100644 --- a/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py +++ b/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py @@ -61,8 +61,11 @@ def economy_average_vs_outcome( result_dict = {"Loss": 0, "Win": 1, "Victory": 1, "Defeat": 0, "Undecided": -1} - # Check if result is "Undecided" and return None to skip this replay - if sc2_replay.toonPlayerDescMap[0].toon_player_info.result == "Undecided": + # Check if any player's result is "Undecided" and return None to skip this replay + if any( + player_desc.toon_player_info.result == "Undecided" + for player_desc in sc2_replay.toonPlayerDescMap.values() + ): return None, None target = result_dict[sc2_replay.toonPlayerDescMap[0].toon_player_info.result] From 26aea8156f201e96bdb15f5e6fae007dbceedd87 Mon Sep 17 00:00:00 2001 From: Jakub Date: Wed, 24 Sep 2025 16:23:37 +0200 Subject: [PATCH 5/8] feat: enhance result handling by including "Draw" and "Tie" outcomes --- src/sc2_datasets/transforms/mmr_vs_result.py | 11 ++++++++--- .../transforms/pytorch/economy_vs_outcome.py | 7 ++++--- src/sc2_datasets/transforms/utils.py | 7 ++++--- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/sc2_datasets/transforms/mmr_vs_result.py b/src/sc2_datasets/transforms/mmr_vs_result.py index ac8e2ac..a1f2d1f 100644 --- a/src/sc2_datasets/transforms/mmr_vs_result.py +++ b/src/sc2_datasets/transforms/mmr_vs_result.py @@ -29,9 +29,14 @@ def mmr_vs_result(sc2_replay: SC2ReplayData) -> Tuple[torch.Tensor, torch.Tensor dtype=torch.float, ) - result_dict = {"Loss": 0, "Win": 1, "Victory": 1, "Defeat": 0, "Undecided": -1} - - # Map result to label tensor, including "Undecided" as -1 + result_dict = {"Loss": 0, "Win": 1, "Victory": 1, "Defeat": 0, "Undecided": -1, "Draw": -1, "Tie": -1} + + # Check if result is "Undecided", "Draw", or "Tie" and return None to skip this replay + skip_results = ["Undecided", "Draw", "Tie"] + if sc2_replay.toonPlayerDescMap[0].toon_player_info.result in skip_results: + return None, None + + # Map result to label tensor label_tensor = torch.tensor( result_dict[sc2_replay.toonPlayerDescMap[0].toon_player_info.result], dtype=torch.int8, diff --git a/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py b/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py index 014b66e..ea387cc 100644 --- a/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py +++ b/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py @@ -59,11 +59,12 @@ def economy_average_vs_outcome( # Creating feature tensor: feature_tensor = torch.tensor(feature_list, dtype=torch.float32) - result_dict = {"Loss": 0, "Win": 1, "Victory": 1, "Defeat": 0, "Undecided": -1} + result_dict = {"Loss": 0, "Win": 1, "Victory": 1, "Defeat": 0, "Undecided": -1, "Draw": -1, "Tie": -1} - # Check if any player's result is "Undecided" and return None to skip this replay + # Check if any player's result is "Undecided", "Draw", or "Tie" and return None to skip this replay + skip_results = ["Undecided", "Draw", "Tie"] if any( - player_desc.toon_player_info.result == "Undecided" + player_desc.toon_player_info.result in skip_results for player_desc in sc2_replay.toonPlayerDescMap.values() ): return None, None diff --git a/src/sc2_datasets/transforms/utils.py b/src/sc2_datasets/transforms/utils.py index e1967a4..dddeba0 100644 --- a/src/sc2_datasets/transforms/utils.py +++ b/src/sc2_datasets/transforms/utils.py @@ -235,11 +235,12 @@ def select_outcome_1v1(sc2_replay: SC2ReplayData) -> Dict[str, int]: player_outcome = {"1": 0, "2": 0} - result_dict = {"Loss": 0, "Win": 1, "Victory": 1, "Defeat": 0, "Undecided": -1} + result_dict = {"Loss": 0, "Win": 1, "Victory": 1, "Defeat": 0, "Undecided": -1, "Draw": -1, "Tie": -1} - # Check if any player has an "Undecided" result and return None to indicate skipping + # Check if any player has an "Undecided", "Draw", or "Tie" result and return None to indicate skipping + skip_results = ["Undecided", "Draw", "Tie"] for toon_desc_map in sc2_replay.toonPlayerDescMap: - if toon_desc_map.toon_player_info.result == "Undecided": + if toon_desc_map.toon_player_info.result in skip_results: return None for toon_desc_map in sc2_replay.toonPlayerDescMap: From 1f0c38b8c27578561caabfcb88b5766e2727d56c Mon Sep 17 00:00:00 2001 From: Jakub Date: Wed, 24 Sep 2025 16:27:09 +0200 Subject: [PATCH 6/8] feat: skip processing for "Undecided", "Draw", and "Tie" match results in outcome functions --- src/sc2_datasets/transforms/mmr_vs_result.py | 2 +- src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py | 2 +- src/sc2_datasets/transforms/utils.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sc2_datasets/transforms/mmr_vs_result.py b/src/sc2_datasets/transforms/mmr_vs_result.py index a1f2d1f..3bba8ec 100644 --- a/src/sc2_datasets/transforms/mmr_vs_result.py +++ b/src/sc2_datasets/transforms/mmr_vs_result.py @@ -35,7 +35,7 @@ def mmr_vs_result(sc2_replay: SC2ReplayData) -> Tuple[torch.Tensor, torch.Tensor skip_results = ["Undecided", "Draw", "Tie"] if sc2_replay.toonPlayerDescMap[0].toon_player_info.result in skip_results: return None, None - + # Map result to label tensor label_tensor = torch.tensor( result_dict[sc2_replay.toonPlayerDescMap[0].toon_player_info.result], diff --git a/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py b/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py index ea387cc..13d58a2 100644 --- a/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py +++ b/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py @@ -68,7 +68,7 @@ def economy_average_vs_outcome( for player_desc in sc2_replay.toonPlayerDescMap.values() ): return None, None - + target = result_dict[sc2_replay.toonPlayerDescMap[0].toon_player_info.result] return feature_tensor, target diff --git a/src/sc2_datasets/transforms/utils.py b/src/sc2_datasets/transforms/utils.py index dddeba0..f62c212 100644 --- a/src/sc2_datasets/transforms/utils.py +++ b/src/sc2_datasets/transforms/utils.py @@ -242,7 +242,7 @@ def select_outcome_1v1(sc2_replay: SC2ReplayData) -> Dict[str, int]: for toon_desc_map in sc2_replay.toonPlayerDescMap: if toon_desc_map.toon_player_info.result in skip_results: return None - + for toon_desc_map in sc2_replay.toonPlayerDescMap: result = result_dict[toon_desc_map.toon_player_info.result] player_outcome[toon_desc_map.toon_player_info.playerID] = result From 21933b05105a064c71476ed15bed28e4af7bd067 Mon Sep 17 00:00:00 2001 From: Jakub Date: Wed, 24 Sep 2025 16:33:01 +0200 Subject: [PATCH 7/8] refactor: format result_dict for consistency across outcome functions --- src/sc2_datasets/transforms/mmr_vs_result.py | 10 +++++++++- .../transforms/pytorch/economy_vs_outcome.py | 10 +++++++++- src/sc2_datasets/transforms/utils.py | 10 +++++++++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/sc2_datasets/transforms/mmr_vs_result.py b/src/sc2_datasets/transforms/mmr_vs_result.py index 3bba8ec..b594a25 100644 --- a/src/sc2_datasets/transforms/mmr_vs_result.py +++ b/src/sc2_datasets/transforms/mmr_vs_result.py @@ -29,7 +29,15 @@ def mmr_vs_result(sc2_replay: SC2ReplayData) -> Tuple[torch.Tensor, torch.Tensor dtype=torch.float, ) - result_dict = {"Loss": 0, "Win": 1, "Victory": 1, "Defeat": 0, "Undecided": -1, "Draw": -1, "Tie": -1} + result_dict = { + "Loss": 0, + "Win": 1, + "Victory": 1, + "Defeat": 0, + "Undecided": -1, + "Draw": -1, + "Tie": -1, + } # Check if result is "Undecided", "Draw", or "Tie" and return None to skip this replay skip_results = ["Undecided", "Draw", "Tie"] diff --git a/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py b/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py index 13d58a2..701aff8 100644 --- a/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py +++ b/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py @@ -59,7 +59,15 @@ def economy_average_vs_outcome( # Creating feature tensor: feature_tensor = torch.tensor(feature_list, dtype=torch.float32) - result_dict = {"Loss": 0, "Win": 1, "Victory": 1, "Defeat": 0, "Undecided": -1, "Draw": -1, "Tie": -1} + result_dict = { + "Loss": 0, + "Win": 1, + "Victory": 1, + "Defeat": 0, + "Undecided": -1, + "Draw": -1, + "Tie": -1, + } # Check if any player's result is "Undecided", "Draw", or "Tie" and return None to skip this replay skip_results = ["Undecided", "Draw", "Tie"] diff --git a/src/sc2_datasets/transforms/utils.py b/src/sc2_datasets/transforms/utils.py index f62c212..e74313a 100644 --- a/src/sc2_datasets/transforms/utils.py +++ b/src/sc2_datasets/transforms/utils.py @@ -235,7 +235,15 @@ def select_outcome_1v1(sc2_replay: SC2ReplayData) -> Dict[str, int]: player_outcome = {"1": 0, "2": 0} - result_dict = {"Loss": 0, "Win": 1, "Victory": 1, "Defeat": 0, "Undecided": -1, "Draw": -1, "Tie": -1} + result_dict = { + "Loss": 0, + "Win": 1, + "Victory": 1, + "Defeat": 0, + "Undecided": -1, + "Draw": -1, + "Tie": -1, + } # Check if any player has an "Undecided", "Draw", or "Tie" result and return None to indicate skipping skip_results = ["Undecided", "Draw", "Tie"] From 78120cf3693bbedad2b82703aa0033337e628d7b Mon Sep 17 00:00:00 2001 From: Jakub Date: Wed, 24 Sep 2025 17:22:08 +0200 Subject: [PATCH 8/8] fix: return None for skipped replays in economy_average_vs_outcome function --- src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py b/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py index 701aff8..f234088 100644 --- a/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py +++ b/src/sc2_datasets/transforms/pytorch/economy_vs_outcome.py @@ -73,7 +73,7 @@ def economy_average_vs_outcome( skip_results = ["Undecided", "Draw", "Tie"] if any( player_desc.toon_player_info.result in skip_results - for player_desc in sc2_replay.toonPlayerDescMap.values() + for player_desc in sc2_replay.toonPlayerDescMap ): return None, None