-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathjudge_task.py
135 lines (113 loc) · 3.9 KB
/
judge_task.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
"""Contains the task for judging matches."""
import asyncio
from dataclasses import dataclass
from typing import List, Optional
from base_agent_code_fetcher import BaseAgentCodeFetcher
from base_build_result_reporter import BaseBuildResultReporter
from base_docker_image_builder import BaseDockerImageBuilder
from base_match_judger import BaseMatchJudger
from base_match_result_reporter import BaseMatchResultReporter
from base_task import BaseTask
from build_task import BuildTask
from match_result import MatchResult
@dataclass
class JudgeTask(BaseTask):
"""Task for judging a match."""
_builder: BaseDockerImageBuilder
_build_result_reporter: BaseBuildResultReporter
_agent_code_ids: List[str]
_fetcher: BaseAgentCodeFetcher
_game_host_image_tag: str
_judger: BaseMatchJudger
_match_id: str
_match_result_reporter: BaseMatchResultReporter
_result: Optional[MatchResult] = None
def __init__(
self,
match_id: str,
game_host_image: str,
agent_code_ids: List[str],
fetcher: BaseAgentCodeFetcher,
builder: BaseDockerImageBuilder,
build_result_reporter: BaseBuildResultReporter,
judger: BaseMatchJudger,
match_result_reporter: BaseMatchResultReporter,
):
self._match_id = match_id
self._game_host_image_tag = game_host_image
self._agent_code_ids = agent_code_ids
self._fetcher = fetcher
self._builder = builder
self._build_result_reporter = build_result_reporter
self._judger = judger
self._match_result_reporter = match_result_reporter
@property
def match_id(self) -> str:
"""The ID of the match to judge."""
return self._match_id
async def execute(self) -> MatchResult:
agent_build_results = await asyncio.gather(
*[
BuildTask(
code_id,
self._fetcher,
self._builder,
self._build_result_reporter,
).execute()
for code_id in self._agent_code_ids
]
)
match_result = await self._judger.judge(
self._match_id,
self._game_host_image_tag,
[x.image for x in agent_build_results],
)
await self._match_result_reporter.report(match_result)
self._result = match_result
return match_result
@property
def result(self) -> Optional[MatchResult]:
return self._result
class JudgeTaskFactory:
"""Factory for building JudgeTask instances."""
_builder: BaseDockerImageBuilder
_build_result_reporter: BaseBuildResultReporter
_fetcher: BaseAgentCodeFetcher
_game_host_image: str
_judger: BaseMatchJudger
_match_result_reporter: BaseMatchResultReporter
def __init__(
self,
game_host_image: str,
fetcher: BaseAgentCodeFetcher,
builder: BaseDockerImageBuilder,
build_result_reporter: BaseBuildResultReporter,
judger: BaseMatchJudger,
match_result_reporter: BaseMatchResultReporter,
):
self._game_host_image = game_host_image
self._fetcher = fetcher
self._builder = builder
self._build_result_reporter = build_result_reporter
self._judger = judger
self._match_result_reporter = match_result_reporter
def create(
self,
match_id: str,
agent_code_ids: List[str],
) -> JudgeTask:
"""Creates a new JudgeTask instance.
Args:
match_id: The ID of the match to judge
agent_code_ids: The IDs of the agent code to use in the match
"""
return JudgeTask(
match_id,
self._game_host_image,
agent_code_ids,
self._fetcher,
self._builder,
self._build_result_reporter,
self._judger,
self._match_result_reporter,
)