pycityagent 2.0.0a58__cp312-cp312-macosx_11_0_arm64.whl → 2.0.0a60__cp312-cp312-macosx_11_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -94,24 +94,19 @@ class CitizenAgent(Agent):
94
94
  logger.warning("Economy client is not set")
95
95
  return
96
96
  if not self._has_bound_to_economy:
97
- if self._has_bound_to_simulator:
98
- try:
99
- await self._economy_client.remove_agents([self._agent_id])
100
- except:
101
- pass
102
- person_id = await self.status.get("id")
103
- currency = await self.status.get("currency")
104
- await self._economy_client.add_agents(
105
- {
106
- "id": person_id,
107
- "currency": currency,
108
- }
109
- )
110
- self._has_bound_to_economy = True
111
- else:
112
- logger.debug(
113
- f"Binding to Economy before binding to Simulator, skip binding to Economy Simulator"
114
- )
97
+ try:
98
+ await self._economy_client.remove_agents([self._agent_id])
99
+ except:
100
+ pass
101
+ person_id = await self.status.get("id")
102
+ currency = await self.status.get("currency")
103
+ await self._economy_client.add_agents(
104
+ {
105
+ "id": person_id,
106
+ "currency": currency,
107
+ }
108
+ )
109
+ self._has_bound_to_economy = True
115
110
 
116
111
  async def handle_gather_message(self, payload: dict):
117
112
  """处理收到的消息,识别发送者"""
@@ -176,7 +171,6 @@ class InstitutionAgent(Agent):
176
171
  await self._bind_to_economy()
177
172
 
178
173
  async def _bind_to_economy(self):
179
- print("Debug:", self._economy_client, self._has_bound_to_economy)
180
174
  if self._economy_client is None:
181
175
  logger.debug("Economy client is not set")
182
176
  return
@@ -161,6 +161,7 @@ class MindBlock(Block):
161
161
  await self.cognitionBlock.forward()
162
162
 
163
163
  class SocietyAgent(CitizenAgent):
164
+ update_with_sim = UpdateWithSimulator()
164
165
  mindBlock: MindBlock
165
166
  planAndActionBlock: PlanAndActionBlock
166
167
  update_with_sim = UpdateWithSimulator()
Binary file
@@ -34,10 +34,7 @@ class AgentGroup:
34
34
  self,
35
35
  agent_class: Union[type[Agent], list[type[Agent]]],
36
36
  number_of_agents: Union[int, list[int]],
37
- memory_config_function_group: Union[
38
- Callable[[], tuple[dict, dict, dict]],
39
- list[Callable[[], tuple[dict, dict, dict]]],
40
- ],
37
+ memory_config_function_group: dict[type[Agent], Callable],
41
38
  config: dict,
42
39
  exp_name: str,
43
40
  exp_id: str | UUID,
@@ -49,14 +46,12 @@ class AgentGroup:
49
46
  mlflow_run_id: str,
50
47
  embedding_model: Embeddings,
51
48
  logging_level: int,
52
- agent_config_file: Optional[Union[str, list[str]]] = None,
49
+ agent_config_file: Optional[dict[type[Agent], str]] = None,
53
50
  ):
54
51
  logger.setLevel(logging_level)
55
52
  self._uuid = str(uuid.uuid4())
56
53
  if not isinstance(agent_class, list):
57
54
  agent_class = [agent_class]
58
- if not isinstance(memory_config_function_group, list):
59
- memory_config_function_group = [memory_config_function_group]
60
55
  if not isinstance(number_of_agents, list):
61
56
  number_of_agents = [number_of_agents]
62
57
  self.agent_class = agent_class
@@ -123,13 +118,10 @@ class AgentGroup:
123
118
  self.projector = pyproj.Proj(self.simulator.map.header["projection"])
124
119
 
125
120
  # prepare Economy client
126
- if "economy" in config["simulator_request"]:
127
- logger.info(f"-----Creating Economy client in AgentGroup {self._uuid} ...")
128
- self.economy_client = EconomyClient(
129
- config["simulator_request"]["economy"]["server"]
130
- )
131
- else:
132
- self.economy_client = None
121
+ logger.info(f"-----Creating Economy client in AgentGroup {self._uuid} ...")
122
+ self.economy_client = EconomyClient(
123
+ config["simulator_request"]["simulator"]["server"]
124
+ )
133
125
 
134
126
  # set FaissQuery
135
127
  if self.embedding_model is not None:
@@ -142,7 +134,7 @@ class AgentGroup:
142
134
  agent_class_i = agent_class[i]
143
135
  number_of_agents_i = number_of_agents[i]
144
136
  for j in range(number_of_agents_i):
145
- memory_config_function_group_i = memory_config_function_group[i]
137
+ memory_config_function_group_i = memory_config_function_group[agent_class_i]
146
138
  extra_attributes, profile, base = memory_config_function_group_i()
147
139
  memory = Memory(config=extra_attributes, profile=profile, base=base)
148
140
  agent = agent_class_i(
@@ -161,8 +153,8 @@ class AgentGroup:
161
153
  agent.set_avro_file(self.avro_file) # type: ignore
162
154
  if self.enable_pgsql:
163
155
  agent.set_pgsql_writer(self._pgsql_writer)
164
- if self.agent_config_file is not None and self.agent_config_file[i]:
165
- agent.load_from_file(self.agent_config_file[i])
156
+ if self.agent_config_file is not None and self.agent_config_file[agent_class_i]:
157
+ agent.load_from_file(self.agent_config_file[agent_class_i])
166
158
  if self._message_interceptor is not None:
167
159
  agent.set_message_interceptor(self._message_interceptor)
168
160
  self.agents.append(agent)
@@ -3,24 +3,24 @@ import json
3
3
  import logging
4
4
  import time
5
5
  import uuid
6
- from collections.abc import Callable, Sequence
6
+ from collections.abc import Callable
7
7
  from datetime import datetime, timezone
8
8
  from pathlib import Path
9
- from typing import Any, Optional, Type, Union
9
+ from typing import Any, Literal, Optional, Type, Union
10
10
 
11
11
  import ray
12
12
  import yaml
13
13
  from langchain_core.embeddings import Embeddings
14
14
 
15
15
  from ..agent import Agent, InstitutionAgent
16
- from ..cityagent import (BankAgent, FirmAgent, GovernmentAgent, NBSAgent,
17
- SocietyAgent, memory_config_bank, memory_config_firm,
16
+ from ..cityagent import (BankAgent, FirmAgent, GovernmentAgent, NBSAgent,SocietyAgent,
17
+ memory_config_bank, memory_config_firm,
18
18
  memory_config_government, memory_config_nbs,
19
19
  memory_config_societyagent)
20
20
  from ..cityagent.initial import bind_agent_info, initialize_social_network
21
21
  from ..environment import Simulator
22
- from ..llm import LLM, LLMConfig, SimpleEmbedding
23
- from ..memory import Memory
22
+ from ..economy.econ_client import EconomyClient
23
+ from ..llm import SimpleEmbedding
24
24
  from ..message import (MessageBlockBase, MessageBlockListenerBase,
25
25
  MessageInterceptor, Messager)
26
26
  from ..metrics import init_mlflow_connection
@@ -42,7 +42,7 @@ class AgentSimulation:
42
42
  agent_class: Union[None, type[Agent], list[type[Agent]]] = None,
43
43
  agent_config_file: Optional[dict] = None,
44
44
  metric_extractor: Optional[list[tuple[int, Callable]]] = None,
45
- enable_economy: bool = True,
45
+ enable_institution: bool = True,
46
46
  agent_prefix: str = "agent_",
47
47
  exp_name: str = "default_experiment",
48
48
  logging_level: int = logging.WARNING,
@@ -58,7 +58,7 @@ class AgentSimulation:
58
58
  if isinstance(agent_class, list):
59
59
  self.agent_class = agent_class
60
60
  elif agent_class is None:
61
- if enable_economy:
61
+ if enable_institution:
62
62
  self.agent_class = [
63
63
  SocietyAgent,
64
64
  FirmAgent,
@@ -66,27 +66,30 @@ class AgentSimulation:
66
66
  NBSAgent,
67
67
  GovernmentAgent,
68
68
  ]
69
- self.default_memory_config_func = [
70
- memory_config_societyagent,
71
- memory_config_firm,
72
- memory_config_bank,
73
- memory_config_nbs,
74
- memory_config_government,
75
- ]
69
+ self.default_memory_config_func = {
70
+ SocietyAgent: memory_config_societyagent,
71
+ FirmAgent: memory_config_firm,
72
+ BankAgent: memory_config_bank,
73
+ NBSAgent: memory_config_nbs,
74
+ GovernmentAgent: memory_config_government,
75
+ }
76
76
  else:
77
77
  self.agent_class = [SocietyAgent]
78
- self.default_memory_config_func = [memory_config_societyagent]
78
+ self.default_memory_config_func = {SocietyAgent: memory_config_societyagent}
79
79
  else:
80
80
  self.agent_class = [agent_class]
81
81
  self.agent_config_file = agent_config_file
82
82
  self.logging_level = logging_level
83
83
  self.config = config
84
84
  self.exp_name = exp_name
85
- self._simulator = Simulator(config["simulator_request"])
86
85
  _simulator_config = config["simulator_request"].get("simulator", {})
87
86
  if "server" in _simulator_config:
88
87
  raise ValueError(f"Passing Traffic Simulation address is not supported!")
89
- if enable_economy:
88
+ self._simulator = Simulator(config["simulator_request"])
89
+ self._economy_client = EconomyClient(
90
+ config["simulator_request"]["simulator"]["server"]
91
+ )
92
+ if enable_institution:
90
93
  self._economy_addr = economy_addr = self._simulator.server_addr
91
94
  if economy_addr is None:
92
95
  raise ValueError(
@@ -205,9 +208,11 @@ class AgentSimulation:
205
208
  """Directly run from config file
206
209
  Basic config file should contain:
207
210
  - simulation_config: file_path
211
+ - enable_institution: bool, default is True
208
212
  - agent_config:
209
- - agent_config_file: Optional[dict]
210
- - memory_config_func: Optional[Union[Callable, list[Callable]]]
213
+ - agent_config_file: Optional[dict[type[Agent], str]]
214
+ - memory_config_func: Optional[dict[type[Agent], Callable]]
215
+ - metric_extractor: Optional[list[tuple[int, Callable]]]
211
216
  - init_func: Optional[list[Callable[AgentSimulation, None]]]
212
217
  - group_size: Optional[int]
213
218
  - embedding_model: Optional[EmbeddingModel]
@@ -220,7 +225,7 @@ class AgentSimulation:
220
225
  - list[Step]
221
226
  - Step:
222
227
  - type: str, "step", "run", "interview", "survey", "intervene", "pause", "resume"
223
- - day: int if type is "run", else None
228
+ - days: int if type is "run", else None
224
229
  - times: int if type is "step", else None
225
230
  - description: Optional[str], description of the step
226
231
  - func: Optional[Callable[AgentSimulation, None]], only used when type is "interview", "survey" and "intervene"
@@ -243,6 +248,8 @@ class AgentSimulation:
243
248
  simulation = cls(
244
249
  config=simulation_config,
245
250
  agent_config_file=config["agent_config"].get("agent_config_file", None),
251
+ metric_extractor=config["agent_config"].get("metric_extractor", None),
252
+ enable_institution=config.get("enable_institution", True),
246
253
  exp_name=config.get("exp_name", "default_experiment"),
247
254
  logging_level=config.get("logging_level", logging.WARNING),
248
255
  )
@@ -275,7 +282,7 @@ class AgentSimulation:
275
282
  if step["type"] not in ["run", "step", "interview", "survey", "intervene"]:
276
283
  raise ValueError(f"Invalid step type: {step['type']}")
277
284
  if step["type"] == "run":
278
- await simulation.run(step.get("day", 1))
285
+ await simulation.run(step.get("days", 1))
279
286
  elif step["type"] == "step":
280
287
  times = step.get("times", 1)
281
288
  for _ in range(times):
@@ -305,6 +312,10 @@ class AgentSimulation:
305
312
  self,
306
313
  ) -> Path:
307
314
  return self._avro_path # type:ignore
315
+
316
+ @property
317
+ def economy_client(self):
318
+ return self._economy_client
308
319
 
309
320
  @property
310
321
  def groups(self):
@@ -409,7 +420,7 @@ class AgentSimulation:
409
420
  social_black_list: Optional[list[tuple[str, str]]] = None,
410
421
  message_listener: Optional[MessageBlockListenerBase] = None,
411
422
  embedding_model: Embeddings = SimpleEmbedding(),
412
- memory_config_func: Optional[Union[Callable, list[Callable]]] = None,
423
+ memory_config_func: Optional[dict[type[Agent], Callable]] = None,
413
424
  ) -> None:
414
425
  """初始化智能体
415
426
 
@@ -418,7 +429,7 @@ class AgentSimulation:
418
429
  group_size: 每个组的智能体数量,每一个组为一个独立的ray actor
419
430
  pg_sql_writers: 独立的PgSQL writer数量
420
431
  message_interceptors: message拦截器数量
421
- memory_config_func: 返回Memory配置的函数,需要返回(EXTRA_ATTRIBUTES, PROFILE, BASE)元组, 如果为列表,则每个元素表示一个智能体类创建的Memory配置函数
432
+ memory_config_func: 返回Memory配置的函数,需要返回(EXTRA_ATTRIBUTES, PROFILE, BASE)元组, 每个元素表示一个智能体类创建的Memory配置函数
422
433
  """
423
434
  if not isinstance(agent_count, list):
424
435
  agent_count = [agent_count]
@@ -429,17 +440,6 @@ class AgentSimulation:
429
440
  if memory_config_func is None:
430
441
  memory_config_func = self.default_memory_config_func
431
442
 
432
- elif not isinstance(memory_config_func, list):
433
- logger.warning(
434
- "memory_config_func is not a list, using specific memory config function"
435
- )
436
- memory_config_func = [memory_config_func]
437
-
438
- if len(memory_config_func) != len(agent_count):
439
- logger.warning(
440
- "The length of memory_config_func and agent_count does not match, using default memory_config"
441
- )
442
- memory_config_func = self.default_memory_config_func
443
443
  # 使用线程池并行创建 AgentGroup
444
444
  group_creation_params = []
445
445
 
@@ -451,7 +451,7 @@ class AgentSimulation:
451
451
  for i in range(len(self.agent_class)):
452
452
  agent_class = self.agent_class[i]
453
453
  agent_count_i = agent_count[i]
454
- memory_config_func_i = memory_config_func[i]
454
+ memory_config_func_i = memory_config_func.get(agent_class, self.default_memory_config_func[agent_class])
455
455
 
456
456
  if self.agent_config_file is not None:
457
457
  config_file = self.agent_config_file.get(agent_class, None)
@@ -481,8 +481,8 @@ class AgentSimulation:
481
481
 
482
482
  agent_classes = []
483
483
  agent_counts = []
484
- memory_config_funcs = []
485
- config_files = []
484
+ memory_config_funcs = {}
485
+ config_files = {}
486
486
 
487
487
  # 分配每种类型的机构智能体到当前组
488
488
  curr_start = start_idx
@@ -490,8 +490,8 @@ class AgentSimulation:
490
490
  if curr_start < count:
491
491
  agent_classes.append(agent_class)
492
492
  agent_counts.append(min(count - curr_start, number_of_agents))
493
- memory_config_funcs.append(mem_func)
494
- config_files.append(conf_file)
493
+ memory_config_funcs[agent_class] = mem_func
494
+ config_files[agent_class] = conf_file
495
495
  curr_start = max(0, curr_start - count)
496
496
 
497
497
  group_creation_params.append(
@@ -516,8 +516,8 @@ class AgentSimulation:
516
516
 
517
517
  agent_classes = []
518
518
  agent_counts = []
519
- memory_config_funcs = []
520
- config_files = []
519
+ memory_config_funcs = {}
520
+ config_files = {}
521
521
 
522
522
  # 分配每种类型的普通智能体到当前组
523
523
  curr_start = start_idx
@@ -525,8 +525,8 @@ class AgentSimulation:
525
525
  if curr_start < count:
526
526
  agent_classes.append(agent_class)
527
527
  agent_counts.append(min(count - curr_start, number_of_agents))
528
- memory_config_funcs.append(mem_func)
529
- config_files.append(conf_file)
528
+ memory_config_funcs[agent_class] = mem_func
529
+ config_files[agent_class] = conf_file
530
530
  curr_start = max(0, curr_start - count)
531
531
 
532
532
  group_creation_params.append(
@@ -688,14 +688,20 @@ class AgentSimulation:
688
688
  group = self._agent_uuid2group[target_agent_uuid]
689
689
  await group.update.remote(target_agent_uuid, target_key, content)
690
690
 
691
+ async def economy_update(self, target_agent_id: int, target_key: str, content: Any, mode: Literal["replace", "merge"] = "replace"):
692
+ """更新指定智能体的经济数据"""
693
+ self.economy_client.update(
694
+ id = target_agent_id,
695
+ key = target_key,
696
+ value=content,
697
+ mode=mode
698
+ )
699
+
691
700
  async def send_survey(
692
- self, survey: Survey, agent_uuids: Optional[list[str]] = None
701
+ self, survey: Survey, agent_uuids: list[str] = None
693
702
  ):
694
703
  """发送问卷"""
695
- await self.messager.connect.remote() # type:ignore
696
704
  survey_dict = survey.to_dict()
697
- if agent_uuids is None:
698
- agent_uuids = self._agent_uuids
699
705
  _date_time = datetime.now(timezone.utc)
700
706
  payload = {
701
707
  "from": SURVEY_SENDER_UUID,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pycityagent
3
- Version: 2.0.0a58
3
+ Version: 2.0.0a60
4
4
  Summary: LLM-based city environment agent building library
5
5
  Author-email: Yuwei Yan <pinkgranite86@gmail.com>, Junbo Yan <yanjb20thu@gmali.com>, Jun Zhang <zhangjun990222@gmali.com>
6
6
  License: MIT License
@@ -1,10 +1,10 @@
1
- pycityagent-2.0.0a58.dist-info/RECORD,,
2
- pycityagent-2.0.0a58.dist-info/LICENSE,sha256=n2HPXiupinpyHMnIkbCf3OTYd3KMqbmldu1e7av0CAU,1084
3
- pycityagent-2.0.0a58.dist-info/WHEEL,sha256=VujM3ypTCyUW6hcTDdK2ej0ARVMxlU1Djlh_zWnDgqk,109
4
- pycityagent-2.0.0a58.dist-info/entry_points.txt,sha256=BZcne49AAIFv-hawxGnPbblea7X3MtAtoPyDX8L4OC4,132
5
- pycityagent-2.0.0a58.dist-info/top_level.txt,sha256=yOmeu6cSXmiUtScu53a3s0p7BGtLMaV0aff83EHCTic,43
6
- pycityagent-2.0.0a58.dist-info/METADATA,sha256=AUgPOiWxGpZ5A9LMIruA_h9B0S41Zu_Z_eCY1_Z23iE,9110
7
- pycityagent/pycityagent-sim,sha256=1Nu-QYC0AuZyVWciGNa2XkYsUntbwAS15Bo7l-y6eok,35449490
1
+ pycityagent-2.0.0a60.dist-info/RECORD,,
2
+ pycityagent-2.0.0a60.dist-info/LICENSE,sha256=n2HPXiupinpyHMnIkbCf3OTYd3KMqbmldu1e7av0CAU,1084
3
+ pycityagent-2.0.0a60.dist-info/WHEEL,sha256=VujM3ypTCyUW6hcTDdK2ej0ARVMxlU1Djlh_zWnDgqk,109
4
+ pycityagent-2.0.0a60.dist-info/entry_points.txt,sha256=BZcne49AAIFv-hawxGnPbblea7X3MtAtoPyDX8L4OC4,132
5
+ pycityagent-2.0.0a60.dist-info/top_level.txt,sha256=yOmeu6cSXmiUtScu53a3s0p7BGtLMaV0aff83EHCTic,43
6
+ pycityagent-2.0.0a60.dist-info/METADATA,sha256=oyO0iwWkmdYb_ImPGko3_7auKYsx4ve45hSRRTEmYFs,9110
7
+ pycityagent/pycityagent-sim,sha256=vskCJGHJEh0B2dUfmYlVyrcy3sDZ3kBNwjqcYUZpmO8,35449490
8
8
  pycityagent/__init__.py,sha256=PUKWTXc-xdMG7px8oTNclodsILUgypANj2Z647sY63k,808
9
9
  pycityagent/pycityagent-ui,sha256=cHZjqtrQ4Fh4qtRahFNCNbT2DNHLmUexiDAa-72Z3RQ,40333378
10
10
  pycityagent/metrics/mlflow_client.py,sha256=bTrqYsRfNfjJd6l91hU8vN7JXzJC7DHiM2XbkhMuXIU,4613
@@ -28,9 +28,9 @@ pycityagent/memory/utils.py,sha256=oJWLdPeJy_jcdKcDTo9JAH9kDZhqjoQhhv_zT9qWC0w,8
28
28
  pycityagent/memory/const.py,sha256=6zpJPJXWoH9-yf4RARYYff586agCoud9BRn7sPERB1g,932
29
29
  pycityagent/memory/faiss_query.py,sha256=V3rIw6d1_xcpNqZBbAYz3qfjVNE7NfJ7xOS5SibPtVU,13180
30
30
  pycityagent/memory/state.py,sha256=TYItiyDtehMEQaSBN7PpNrnNxdDM5jGppr9R9Ufv3kA,5134
31
- pycityagent/simulation/simulation.py,sha256=RZvDC6QBHjbm4d4WVdBJICG-X7TOSiQ04elZQBJWbeo,33646
31
+ pycityagent/simulation/simulation.py,sha256=sbrX-e8gV2Wwi8k6ir7TVgQhzejpUZ85SfuiXO4E39I,33983
32
32
  pycityagent/simulation/__init__.py,sha256=P5czbcg2d8S0nbbnsQXFIhwzO4CennAhZM8OmKvAeYw,194
33
- pycityagent/simulation/agentgroup.py,sha256=UnWUQ3Ev4qDQCOasb-EN08aUQi4SWHmM6aNSdBc850Q,31693
33
+ pycityagent/simulation/agentgroup.py,sha256=V-ChLJtJUWJZnmTGllXqGk4XW4iDz9h3V89RgW0e4gg,31376
34
34
  pycityagent/simulation/storage/pg.py,sha256=xRshSOGttW-p0re0fNBOjOpb-nQ5msIE2LsdT79_E_Y,8425
35
35
  pycityagent/message/message_interceptor.py,sha256=w8XTyZStQtMjILpeAX3VMhAWcYAuaxCgSMwXQU1OryM,8951
36
36
  pycityagent/message/__init__.py,sha256=f5QH7DKPqEAMyfSlBMnl3uouOKlsoel909STlIe7nUk,276
@@ -46,7 +46,7 @@ pycityagent/utils/parsers/parser_base.py,sha256=KBKO4zLZPNdGjPAGqIus8LseZ8W3Tlt2
46
46
  pycityagent/utils/parsers/json_parser.py,sha256=tjwyPluYfkWgsvLi0hzfJwFhO3L6yQfZMKza20HaGrY,2911
47
47
  pycityagent/agent/agent_base.py,sha256=vC1nMWahwi_nVBUXVdC1CnZpqimKZApixD2m2Iqu_bg,24196
48
48
  pycityagent/agent/__init__.py,sha256=U20yKu9QwSqAx_PHk5JwipfODkDfxONtumVfnsKjWFg,180
49
- pycityagent/agent/agent.py,sha256=FNon_OPvGrh976AEHpaAQyLQN7erbGOX-BxGnCVZza8,12038
49
+ pycityagent/agent/agent.py,sha256=H5AXh92LZZzrGHH8dkwAVTKQIfI8a7xH-83iv50Qejs,11696
50
50
  pycityagent/cli/wrapper.py,sha256=9aG6D2cnmh6aIhiVXKPGKuMjVcdAa-TwzANudb2q_FU,1147
51
51
  pycityagent/workflow/__init__.py,sha256=H08Ko3eliZvuuCMajbEri-IP4-SeswYU6UjHBNA4Ze0,490
52
52
  pycityagent/workflow/prompt.py,sha256=6jI0Rq54JLv3-IXqZLYug62vse10wTI83xvf4ZX42nk,2929
@@ -87,7 +87,7 @@ pycityagent/cityagent/__init__.py,sha256=gcBQ-a50XegFtjigQ7xDXRBZrywBKqifiQFSRnE
87
87
  pycityagent/cityagent/firmagent.py,sha256=UVlNN0lpa4cC4PZVqYzQhbc5VJ2oGsA1731mhbCjnR8,4109
88
88
  pycityagent/cityagent/nbsagent.py,sha256=WIXW__6dZ5IrqBqDCjvGbrCshpXzuFRV3Ww6gkYw7p4,4387
89
89
  pycityagent/cityagent/initial.py,sha256=7hgCt_tGdnVTXGfEQOn1GTW5dAs1b-ru_FwXxRLI6tM,4549
90
- pycityagent/cityagent/societyagent.py,sha256=vvFGAr8wlZ82f4qHvpawa1VsHungDegjKn1E51bDUnc,24767
90
+ pycityagent/cityagent/societyagent.py,sha256=DKkPtCPXTpHs83hi3bvXxkQYxKqZI0YldYCyFu4yjsk,24811
91
91
  pycityagent/cityagent/message_intercept.py,sha256=HiNOtBXKq40LCmvsw2KMLxMsbmXSVcbRytAO-eI-1sU,3279
92
92
  pycityagent/cityagent/governmentagent.py,sha256=HJLuhvEmllu_1KnFEJsYCIasaBJT0BV9Cn_4Y2QGPqg,2791
93
93
  pycityagent/cityagent/blocks/dispatcher.py,sha256=mEa1r3tRS3KI1BMZR_w_sbUGzOj6aUJuiUrsHv1n2n0,2943