class Google(State): basic_info = StateVariable(dtype=PersonBasicInfo, default_val=None, help="basic person info from Google") scholar_info = StateVariable(dtype=ScholarInfo, default_val=None, help="scholar info from google scholar")
class ColabPoolEnvStateQueryMessage(State): name = StateVariable( dtype=str, default_val=None, help="name of the the name of the pool whose state is queried") message_id = StateVariable(dtype=str, default_val=None, help="id used to identify response messages")
def __init__(self): super().__init__() self.stateful_srv_clct_ref = DCERef(StatefulServiceCLCT, write=True, read=False) self.stateless_srv_clct_ref = DCERef(StatelessServiceCLCT, write=True, read=False) self.service_to_add = StateVariable(value_cls=SrvWithPodName, default_val=None, help="需要添加的service信息")
class GuessNumberAgent(Agent): """基于 rule base 做的一个猜数字的agent""" env = ObjectRef.bind_at_runtime() action = StateVariable(dtype=int, default_val=0, help="action") def __init__(self): super().__init__() self._upper_bound = 1000 # 这个可以认为是 agent 的内部变量,可以先不用成为 state variable , 更像是 model parameter self._lower_bound = 0 @state_var_change_handler(state_vars="init_action_space", state_var_source=env) @pick_one_change def on_init_action_space(self, state_var_owner_pk: Any, state_var_name: str, state_var_value: Any): self._upper_bound = state_var_value.upper_bound self._lower_bound = state_var_value.lower_bound @state_var_change_handler(state_vars="state", state_var_source=env) @pick_one_change def on_env_state_changed(self, state_var_owner_pk: Any, state_var_name: str, state_var_value: Any): if state_var_value > 0: # 猜的数字大了,调整上边界 self._upper_bound = self.action.VALUE self.action.VALUE = get_random_int(self._lower_bound, self._upper_bound) elif state_var_value < 0: # 猜的数字小了,调整下边界 self._lower_bound = self.action.VALUE self.action.VALUE = get_random_int(self._lower_bound, self._upper_bound) else: self.action.VALUE = get_random_int(self._lower_bound, self._upper_bound) logger.info(f"[Agent] guess in range [{self._lower_bound},{self._upper_bound}]") @state_var_change_handler(state_vars="reward", state_var_source=env) def on_env_reward(self, state_var_owner_pk: Any, state_vars: Dict[str, Any], triggering_state_var_names: List[str]): # do nothing , 做成 RL Model 时有用 pass
class TestEnv(Env): _test_var = StateVariable(dtype=int, help="test var") def __init__(self, _): super().__init__() @state_var_change_handler(state_vars=[_test_var, TestState.val]) @pick_one_change def on_test_var_change(self, state_var_owner_pk: Any, state_var_name: str, test_var: int): print(f"{state_var_owner_pk} {state_var_name} {test_var}") @timer(interval=5.0) async def on_timer(self): test_val = 'abcde' test_val_object = create_stateful_object(self.pk, TestState) test_val_object[TestState.val].VALUE = test_val return StatefulObjectAndCommitStream(test_val_object, self.state_vars_storage.stream) @staticmethod async def run_test(): import faust.types test_env = TestEnv("abcd") test_env_status_topic = faust.types.TP(topic="test_env", partition=1) test_env.bind(topic_define=test_env_status_topic) await test_env.start() print("started") test_env._test_var.VALUE = 1 print("assigned") await test_env.commit_state_var_changes() print("published")
class GuessNumberGameEnv(Env): agent = ObjectRef.bind_at_runtime() init_action_space = StateVariable(dtype=NumberRange, default_val=NumberRange(1, 100), help="初始状态,竞猜数字的最大范围") init_state_space = StateVariable(dtype=NumberRange, default_val=NumberRange(-1, 1), help="状态空间,-1 ~ 1 的值") state = StateVariable(dtype=int, default_val=0, help="-1:数字小了,0:随机猜一个,1:数字大了") reward = StateVariable(dtype=float, default_val=0., help="reward") def __init__(self): super().__init__() self._real_num: int = 0 """真实的数字,可以不是 state variable,暂假定一个 episode 中 env inst 不会 deactivate""" def _reset(self) -> int: """模拟 gym.Env 的 reset """ state_space = self.init_action_space.VALUE self._real_num = get_random_int(state_space.lower_bound, state_space.upper_bound) return 0 @state_var_change_handler(state_vars=[Activatable.active]) def on_active_flag_change(self, state_var_owner_pk: Any, state_vars: Dict[str, Any], triggering_state_var_names: List[str]): v = state_vars['active'] if v == 1: # 标记 active 当做是 start new episode,后续可以单独做一个 episode 的 variable self.init_action_space.VALUE = NumberRange(1, 100) self.init_state_space.VALUE = NumberRange(-1, 1) self.state.VALUE = self._reset() logger.info(f"[Env] Game start... , real number is {self._real_num}") @state_var_change_handler(state_vars=["action"], state_var_source=agent) def on_agent_action(self, state_var_owner_pk: Any, state_vars: Dict[str, Any], triggering_state_var_names: List[str]): action = state_vars['action'] if action == self._real_num: self.reward.VALUE = 1000. logger.info(f"[Env] Bingo!") elif action > self._real_num: self.state.VALUE = 1 self.reward.VALUE = -0.01 # 假设每猜错一次,有负的reward logger.info(f"[Env] Greater than real num . Guess num. : {action} , Real num. {self._real_num}") elif action < self._real_num: self.state.VALUE = -1 self.reward.VALUE = -0.01 logger.info(f"[Env] Less than real num . Guess num. : {action} , Real num. {self._real_num}")
class WebPageMonitorEnv(Env): """该 Env 模拟监控用户浏览器上的 HTML 内容""" html = StateVariable(dtype=str, default_val=None, help="网页的html内容") @state_var_change_handler(state_vars=[Activatable.active]) @pick_one_change def on_active_flag_change(self, state_var_owner_pk: Any, state_var_name: str, state_var_value: Any): if state_var_value == 1: # 标记 active 当做是 start new episode,后续可以单独做一个 episode 的 variable self.html.VALUE = "dummy" logger.info( f"[Env] {self.__class__.__qualname__} started, send out html value {self.html.VALUE}" )
class HeartBeatMessage(State): sender = StateVariable(dtype=str, default_val=None, help="name of the sender") time = StateVariable(dtype=str, default_val=None, help="")
class ColabPoolEnvState(Activatable): name = StateVariable(dtype=str, default_val=None, help="name of the pool")
class ColabPoolEnvStateQueryResponseMessage(State): name = StateVariable(dtype=str, default_val=None, help="name of the pool") query_message_id = StateVariable(dtype=str, default_val=None, help="id of the query message")
class Yahoo(State): basic_info = StateVariable(dtype=PersonBasicInfo, default_val=None, help="basic person info from Yahoo")
class URLBasedPerson(State): url = StateVariable(dtype=str, default_val=None, help="url identify the author")
class TestState(State): val = StateVariable(dtype=str, default_val=None, help="val of test state")