44import service_pb2 as pb2
55from typing import Union
66from multiprocessing import Manager , Lock
7+ from utils .logger_utils import setup_logger
78import logging
89import grpc
910import argparse
1011
1112
12- logging .basicConfig (level = logging .DEBUG )
13+ console_logging_level = logging .INFO
14+ file_logging_level = logging .DEBUG
15+
16+ main_logger = setup_logger ("pmservice" , "logs/pmservice.log" , console_level = console_logging_level , file_level = file_logging_level )
17+
1318
1419class GrpcAgent :
15- def __init__ (self , agent_type , uniform_number ) -> None :
20+ def __init__ (self , agent_type , uniform_number , logger ) -> None :
1621 self .agent_type : pb2 .AgentType = agent_type
1722 self .uniform_number : int = uniform_number
1823 self .server_params : Union [pb2 .ServerParam , None ] = None
1924 self .player_params : Union [pb2 .PlayerParam , None ] = None
2025 self .player_types : dict [int , pb2 .PlayerType ] = {}
2126 self .debug_mode : bool = False
27+ self .logger : logging .Logger = logger
2228
2329 def GetAction (self , state : pb2 .State ):
30+ self .logger .debug (f"================================= cycle={ state .world_model .cycle } .{ state .world_model .stoped_cycle } =================================" )
31+ # self.logger.debug(f"State: {state}")
2432 if self .agent_type == pb2 .AgentType .PlayerT :
2533 return self .GetPlayerActions (state )
2634 elif self .agent_type == pb2 .AgentType .CoachT :
@@ -50,8 +58,19 @@ def GetPlayerActions(self, state: pb2.State):
5058 actions .append (pb2 .PlayerAction (helios_basic_move = pb2 .HeliosBasicMove ()))
5159 else :
5260 actions .append (pb2 .PlayerAction (helios_set_play = pb2 .HeliosSetPlay ()))
61+
62+ self .logger .debug (f"Actions: { actions } " )
5363 return pb2 .PlayerActions (actions = actions )
5464
65+ def GetBestPlannerAction (self , pairs : pb2 .BestPlannerActionRequest ):
66+ self .logger .debug (f"GetBestPlannerAction cycle:{ pairs .state .world_model .cycle } pairs:{ len (pairs .pairs )} unum:{ pairs .state .register_response .uniform_number } " )
67+ pairs_list : list [int , pb2 .RpcActionState ] = [(k , v ) for k , v in pairs .pairs .items ()]
68+ pairs_list .sort (key = lambda x : x [0 ])
69+ best_action = max (pairs_list , key = lambda x : - 1000 if x [1 ].action .parent_index != - 1 else x [1 ].predict_state .ball_position .x )
70+ 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 )} " )
71+ res = pb2 .BestPlannerActionResponse (index = best_action [0 ])
72+ return res
73+
5574 def GetCoachActions (self , state : pb2 .State ):
5675 actions = []
5776 actions .append (pb2 .CoachAction (do_helios_substitute = pb2 .DoHeliosSubstitute ()))
@@ -74,6 +93,21 @@ def GetTrainerActions(self, state: pb2.State):
7493 )
7594 )
7695 return pb2 .TrainerActions (actions = actions )
96+
97+ def SetServerParams (self , server_params : pb2 .ServerParam ):
98+ self .logger .debug (f"Server params received unum { server_params .register_response .uniform_number } " )
99+ # self.logger.debug(f"Server params: {server_params}")
100+ self .server_params = server_params
101+
102+ def SetPlayerParams (self , player_params : pb2 .PlayerParam ):
103+ self .logger .debug (f"Player params received unum { player_params .register_response .uniform_number } " )
104+ # self.logger.debug(f"Player params: {player_params}")
105+ self .player_params = player_params
106+
107+ def SetPlayerType (self , player_type : pb2 .PlayerType ):
108+ self .logger .debug (f"Player type received unum { player_type .register_response .uniform_number } " )
109+ # self.logger.debug(f"Player type: {player_type}")
110+ self .player_types [player_type .id ] = player_type
77111
78112class GameHandler (pb2_grpc .GameServicer ):
79113 def __init__ (self , shared_lock , shared_number_of_connections ) -> None :
@@ -82,91 +116,89 @@ def __init__(self, shared_lock, shared_number_of_connections) -> None:
82116 self .shared_number_of_connections = shared_number_of_connections
83117
84118 def GetPlayerActions (self , state : pb2 .State , context ):
85- logging .debug (f"GetPlayerActions unum { state .register_response .uniform_number } at { state .world_model .cycle } " )
119+ main_logger .debug (f"GetPlayerActions unum { state .register_response .uniform_number } at { state .world_model .cycle } " )
86120 res = self .agents [state .register_response .client_id ].GetAction (state )
87- logging .debug (f"GetPlayerActions Done unum { res } " )
88121 return res
89122
90123 def GetCoachActions (self , state : pb2 .State , context ):
91- logging .debug (f"GetCoachActions coach at { state .world_model .cycle } " )
124+ main_logger .debug (f"GetCoachActions coach at { state .world_model .cycle } " )
92125 res = self .agents [state .register_response .client_id ].GetAction (state )
93126 return res
94127
95128 def GetTrainerActions (self , state : pb2 .State , context ):
96- logging .debug (f"GetTrainerActions trainer at { state .world_model .cycle } " )
129+ main_logger .debug (f"GetTrainerActions trainer at { state .world_model .cycle } " )
97130 res = self .agents [state .register_response .client_id ].GetAction (state )
98131 return res
99132
100133 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
134+ main_logger .debug (f"Server params received unum { serverParams .register_response .uniform_number } " )
135+ self .agents [serverParams .register_response .client_id ].SetServerParams ( serverParams )
103136 res = pb2 .Empty ()
104137 return res
105138
106139 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
140+ main_logger .debug (f"Player params received unum { playerParams .register_response .uniform_number } " )
141+ self .agents [playerParams .register_response .client_id ].SetPlayerParams ( playerParams )
109142 res = pb2 .Empty ()
110143 return res
111144
112145 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
146+ main_logger .debug (f"Player type received unum { playerType .register_response .uniform_number } " )
147+ self .agents [playerType .register_response .client_id ].SetPlayerType ( playerType )
115148 res = pb2 .Empty ()
116149 return res
117150
118151 def SendInitMessage (self , initMessage : pb2 .InitMessage , context ):
119- logging .debug (f"Init message received unum { initMessage .register_response .uniform_number } " )
152+ main_logger .debug (f"Init message received unum { initMessage .register_response .uniform_number } " )
120153 self .agents [initMessage .register_response .client_id ].debug_mode = initMessage .debug_mode
121154 res = pb2 .Empty ()
122155 return res
123156
124157 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 } " )
128158 with self .shared_lock :
159+ main_logger .info (f"received register request from team_name: { register_request .team_name } "
160+ f"unum: { register_request .uniform_number } "
161+ f"agent_type: { register_request .agent_type } " )
129162 self .shared_number_of_connections .value += 1
130- logging . debug (f"Number of connections { self .shared_number_of_connections .value } " )
163+ main_logger . info (f"Number of connections { self .shared_number_of_connections .value } " )
131164 team_name = register_request .team_name
132165 uniform_number = register_request .uniform_number
133166 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 ,
167+ register_response = pb2 .RegisterResponse (client_id = self .shared_number_of_connections .value ,
136168 team_name = team_name ,
137169 uniform_number = uniform_number ,
138170 agent_type = agent_type )
139- return res
171+ logger = setup_logger (f"agent{ register_response .uniform_number } _{ register_response .client_id } " )
172+ self .agents [self .shared_number_of_connections .value ] = GrpcAgent (agent_type , uniform_number , logger )
173+ return register_response
140174
141175 def SendByeCommand (self , register_response : pb2 .RegisterResponse , context ):
142- logging .debug (f"Bye command received unum { register_response .uniform_number } " )
176+ main_logger .debug (f"Bye command received unum { register_response .uniform_number } " )
143177 # with shared_lock:
144178 self .agents .pop (register_response .client_id )
145179
146180 res = pb2 .Empty ()
147181 return res
148182
149183 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 ])
184+ main_logger .debug (f"GetBestPlannerAction cycle:{ pairs .state .world_model .cycle } pairs:{ len (pairs .pairs )} unum:{ pairs .state .register_response .uniform_number } " )
185+ res = self .agents [pairs .state .register_response .client_id ].GetBestPlannerAction (pairs )
156186 return res
187+
157188
158189def serve (port , shared_lock , shared_number_of_connections ):
159190 server = grpc .server (futures .ThreadPoolExecutor (max_workers = 22 ))
160191 game_service = GameHandler (shared_lock , shared_number_of_connections )
161192 pb2_grpc .add_GameServicer_to_server (game_service , server )
162193 server .add_insecure_port (f'[::]:{ port } ' )
163194 server .start ()
164- logging .info (f"Starting server on port { port } " )
195+ main_logger .info (f"Starting server on port { port } " )
165196
166197 server .wait_for_termination ()
167198
168199
169200def main ():
201+ main_logger .info ("Starting server" )
170202 manager = Manager ()
171203 shared_lock = Lock () # Create a Lock for synchronization
172204 shared_number_of_connections = manager .Value ('i' , 0 )
0 commit comments