4
4
import service_pb2 as pb2
5
5
from typing import Union
6
6
from multiprocessing import Manager , Lock
7
+ from utils .logger_utils import setup_logger
7
8
import logging
8
9
import grpc
9
10
import argparse
11
+ import datetime
10
12
11
13
12
- logging .basicConfig (level = logging .DEBUG )
14
+ console_logging_level = logging .INFO
15
+ file_logging_level = logging .DEBUG
16
+
17
+ main_logger = None
18
+ log_dir = None
19
+
13
20
14
21
class GrpcAgent :
15
- def __init__ (self , agent_type , uniform_number ) -> None :
22
+ def __init__ (self , agent_type , uniform_number , logger ) -> None :
16
23
self .agent_type : pb2 .AgentType = agent_type
17
24
self .uniform_number : int = uniform_number
18
25
self .server_params : Union [pb2 .ServerParam , None ] = None
19
26
self .player_params : Union [pb2 .PlayerParam , None ] = None
20
27
self .player_types : dict [int , pb2 .PlayerType ] = {}
21
28
self .debug_mode : bool = False
29
+ self .logger : logging .Logger = logger
22
30
23
31
def GetAction (self , state : pb2 .State ):
32
+ self .logger .debug (f"================================= cycle={ state .world_model .cycle } .{ state .world_model .stoped_cycle } =================================" )
33
+ # self.logger.debug(f"State: {state}")
24
34
if self .agent_type == pb2 .AgentType .PlayerT :
25
35
return self .GetPlayerActions (state )
26
36
elif self .agent_type == pb2 .AgentType .CoachT :
@@ -50,8 +60,19 @@ def GetPlayerActions(self, state: pb2.State):
50
60
actions .append (pb2 .PlayerAction (helios_basic_move = pb2 .HeliosBasicMove ()))
51
61
else :
52
62
actions .append (pb2 .PlayerAction (helios_set_play = pb2 .HeliosSetPlay ()))
63
+
64
+ self .logger .debug (f"Actions: { actions } " )
53
65
return pb2 .PlayerActions (actions = actions )
54
66
67
+ def GetBestPlannerAction (self , pairs : pb2 .BestPlannerActionRequest ):
68
+ self .logger .debug (f"GetBestPlannerAction cycle:{ pairs .state .world_model .cycle } pairs:{ len (pairs .pairs )} unum:{ pairs .state .register_response .uniform_number } " )
69
+ pairs_list : list [int , pb2 .RpcActionState ] = [(k , v ) for k , v in pairs .pairs .items ()]
70
+ pairs_list .sort (key = lambda x : x [0 ])
71
+ best_action = max (pairs_list , key = lambda x : - 1000 if x [1 ].action .parent_index != - 1 else x [1 ].predict_state .ball_position .x )
72
+ self .logger .debug (f"Best action: { best_action [0 ]} { best_action [1 ].action .description } to { best_action [1 ].action .target_unum } in ({ round (best_action [1 ].action .target_point .x , 2 )} ,{ round (best_action [1 ].action .target_point .y , 2 )} ) e:{ round (best_action [1 ].evaluation ,2 )} " )
73
+ res = pb2 .BestPlannerActionResponse (index = best_action [0 ])
74
+ return res
75
+
55
76
def GetCoachActions (self , state : pb2 .State ):
56
77
actions = []
57
78
actions .append (pb2 .CoachAction (do_helios_substitute = pb2 .DoHeliosSubstitute ()))
@@ -74,6 +95,21 @@ def GetTrainerActions(self, state: pb2.State):
74
95
)
75
96
)
76
97
return pb2 .TrainerActions (actions = actions )
98
+
99
+ def SetServerParams (self , server_params : pb2 .ServerParam ):
100
+ self .logger .debug (f"Server params received unum { server_params .register_response .uniform_number } " )
101
+ # self.logger.debug(f"Server params: {server_params}")
102
+ self .server_params = server_params
103
+
104
+ def SetPlayerParams (self , player_params : pb2 .PlayerParam ):
105
+ self .logger .debug (f"Player params received unum { player_params .register_response .uniform_number } " )
106
+ # self.logger.debug(f"Player params: {player_params}")
107
+ self .player_params = player_params
108
+
109
+ def SetPlayerType (self , player_type : pb2 .PlayerType ):
110
+ self .logger .debug (f"Player type received unum { player_type .register_response .uniform_number } " )
111
+ # self.logger.debug(f"Player type: {player_type}")
112
+ self .player_types [player_type .id ] = player_type
77
113
78
114
class GameHandler (pb2_grpc .GameServicer ):
79
115
def __init__ (self , shared_lock , shared_number_of_connections ) -> None :
@@ -82,97 +118,101 @@ def __init__(self, shared_lock, shared_number_of_connections) -> None:
82
118
self .shared_number_of_connections = shared_number_of_connections
83
119
84
120
def GetPlayerActions (self , state : pb2 .State , context ):
85
- logging .debug (f"GetPlayerActions unum { state .register_response .uniform_number } at { state .world_model .cycle } " )
121
+ main_logger .debug (f"GetPlayerActions unum { state .register_response .uniform_number } at { state .world_model .cycle } " )
86
122
res = self .agents [state .register_response .client_id ].GetAction (state )
87
- logging .debug (f"GetPlayerActions Done unum { res } " )
88
123
return res
89
124
90
125
def GetCoachActions (self , state : pb2 .State , context ):
91
- logging .debug (f"GetCoachActions coach at { state .world_model .cycle } " )
126
+ main_logger .debug (f"GetCoachActions coach at { state .world_model .cycle } " )
92
127
res = self .agents [state .register_response .client_id ].GetAction (state )
93
128
return res
94
129
95
130
def GetTrainerActions (self , state : pb2 .State , context ):
96
- logging .debug (f"GetTrainerActions trainer at { state .world_model .cycle } " )
131
+ main_logger .debug (f"GetTrainerActions trainer at { state .world_model .cycle } " )
97
132
res = self .agents [state .register_response .client_id ].GetAction (state )
98
133
return res
99
134
100
135
def SendServerParams (self , serverParams : pb2 .ServerParam , context ):
101
- logging .debug (f"Server params received unum { serverParams .register_response .uniform_number } " )
102
- self .agents [serverParams .register_response .client_id ].server_params = serverParams
136
+ main_logger .debug (f"Server params received unum { serverParams .register_response .uniform_number } " )
137
+ self .agents [serverParams .register_response .client_id ].SetServerParams ( serverParams )
103
138
res = pb2 .Empty ()
104
139
return res
105
140
106
141
def SendPlayerParams (self , playerParams : pb2 .PlayerParam , context ):
107
- logging .debug (f"Player params received unum { playerParams .register_response .uniform_number } " )
108
- self .agents [playerParams .register_response .client_id ].player_params = playerParams
142
+ main_logger .debug (f"Player params received unum { playerParams .register_response .uniform_number } " )
143
+ self .agents [playerParams .register_response .client_id ].SetPlayerParams ( playerParams )
109
144
res = pb2 .Empty ()
110
145
return res
111
146
112
147
def SendPlayerType (self , playerType : pb2 .PlayerType , context ):
113
- logging .debug (f"Player type received unum { playerType .register_response .uniform_number } " )
114
- self .agents [playerType .register_response .client_id ].player_types [ playerType . id ] = playerType
148
+ main_logger .debug (f"Player type received unum { playerType .register_response .uniform_number } " )
149
+ self .agents [playerType .register_response .client_id ].SetPlayerType ( playerType )
115
150
res = pb2 .Empty ()
116
151
return res
117
152
118
153
def SendInitMessage (self , initMessage : pb2 .InitMessage , context ):
119
- logging .debug (f"Init message received unum { initMessage .register_response .uniform_number } " )
154
+ main_logger .debug (f"Init message received unum { initMessage .register_response .uniform_number } " )
120
155
self .agents [initMessage .register_response .client_id ].debug_mode = initMessage .debug_mode
121
156
res = pb2 .Empty ()
122
157
return res
123
158
124
159
def Register (self , register_request : pb2 .RegisterRequest , context ):
125
- logging .debug (f"received register request from team_name: { register_request .team_name } "
126
- f"unum: { register_request .uniform_number } "
127
- f"agent_type: { register_request .agent_type } " )
128
160
with self .shared_lock :
161
+ main_logger .info (f"received register request from team_name: { register_request .team_name } "
162
+ f"unum: { register_request .uniform_number } "
163
+ f"agent_type: { register_request .agent_type } " )
129
164
self .shared_number_of_connections .value += 1
130
- logging . debug (f"Number of connections { self .shared_number_of_connections .value } " )
165
+ main_logger . info (f"Number of connections { self .shared_number_of_connections .value } " )
131
166
team_name = register_request .team_name
132
167
uniform_number = register_request .uniform_number
133
168
agent_type = register_request .agent_type
134
- self .agents [self .shared_number_of_connections .value ] = GrpcAgent (agent_type , uniform_number )
135
- res = pb2 .RegisterResponse (client_id = self .shared_number_of_connections .value ,
169
+ register_response = pb2 .RegisterResponse (client_id = self .shared_number_of_connections .value ,
136
170
team_name = team_name ,
137
171
uniform_number = uniform_number ,
138
172
agent_type = agent_type )
139
- return res
173
+ logger = setup_logger (f"agent{ register_response .uniform_number } _{ register_response .client_id } " , log_dir )
174
+ self .agents [self .shared_number_of_connections .value ] = GrpcAgent (agent_type , uniform_number , logger )
175
+ return register_response
140
176
141
177
def SendByeCommand (self , register_response : pb2 .RegisterResponse , context ):
142
- logging .debug (f"Bye command received unum { register_response .uniform_number } " )
178
+ main_logger .debug (f"Bye command received unum { register_response .uniform_number } " )
143
179
# with shared_lock:
144
180
self .agents .pop (register_response .client_id )
145
181
146
182
res = pb2 .Empty ()
147
183
return res
148
184
149
185
def GetBestPlannerAction (self , pairs : pb2 .BestPlannerActionRequest , context ):
150
- logging .debug (f"GetBestPlannerAction cycle:{ pairs .state .world_model .cycle } pairs:{ len (pairs .pairs )} unum:{ pairs .state .register_response .uniform_number } " )
151
- pairs_list : list [int , pb2 .RpcActionState ] = [(k , v ) for k , v in pairs .pairs .items ()]
152
- pairs_list .sort (key = lambda x : x [0 ])
153
- best_action = max (pairs_list , key = lambda x : - 1000 if x [1 ].action .parent_index != - 1 else x [1 ].predict_state .ball_position .x )
154
- logging .debug (f"Best action: { best_action [0 ]} { best_action [1 ].action .description } to { best_action [1 ].action .target_unum } in ({ round (best_action [1 ].action .target_point .x , 2 )} ,{ round (best_action [1 ].action .target_point .y , 2 )} ) e:{ round (best_action [1 ].evaluation ,2 )} " )
155
- res = pb2 .BestPlannerActionResponse (index = best_action [0 ])
186
+ main_logger .debug (f"GetBestPlannerAction cycle:{ pairs .state .world_model .cycle } pairs:{ len (pairs .pairs )} unum:{ pairs .state .register_response .uniform_number } " )
187
+ res = self .agents [pairs .state .register_response .client_id ].GetBestPlannerAction (pairs )
156
188
return res
189
+
157
190
158
191
def serve (port , shared_lock , shared_number_of_connections ):
159
192
server = grpc .server (futures .ThreadPoolExecutor (max_workers = 22 ))
160
193
game_service = GameHandler (shared_lock , shared_number_of_connections )
161
194
pb2_grpc .add_GameServicer_to_server (game_service , server )
162
195
server .add_insecure_port (f'[::]:{ port } ' )
163
196
server .start ()
164
- logging .info (f"Starting server on port { port } " )
197
+ main_logger .info (f"Starting server on port { port } " )
165
198
166
199
server .wait_for_termination ()
167
200
168
201
169
202
def main ():
170
- manager = Manager ()
171
- shared_lock = Lock () # Create a Lock for synchronization
172
- shared_number_of_connections = manager .Value ('i' , 0 )
203
+ global main_logger , log_dir
173
204
parser = argparse .ArgumentParser (description = 'Run play maker server' )
174
205
parser .add_argument ('-p' , '--rpc-port' , required = False , help = 'The port of the server' , default = 50051 )
206
+ parser .add_argument ('-l' , '--log-dir' , required = False , help = 'The directory of the log file' ,
207
+ default = f'logs/{ datetime .datetime .now ().strftime ("%Y-%m-%d_%H-%M-%S" )} ' )
175
208
args = parser .parse_args ()
209
+ log_dir = args .log_dir
210
+ main_logger = setup_logger ("pmservice" , log_dir , console_level = console_logging_level , file_level = file_logging_level )
211
+ main_logger .info ("Starting server" )
212
+ manager = Manager ()
213
+ shared_lock = Lock () # Create a Lock for synchronization
214
+ shared_number_of_connections = manager .Value ('i' , 0 )
215
+
176
216
serve (args .rpc_port , shared_lock , shared_number_of_connections )
177
217
178
218
if __name__ == '__main__' :
0 commit comments