Skip to content

Commit 4da5f0c

Browse files
committed
Fix: Add unique_id and agent_type to agent reports
1 parent c5be394 commit 4da5f0c

File tree

2 files changed

+17
-13
lines changed

2 files changed

+17
-13
lines changed

mesa_frames/concrete/datacollector.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def __init__(
7272
self,
7373
model: Model,
7474
model_reporters: dict[str, Callable] | None = None,
75-
agent_reporters: dict[str, str] | None = None,
75+
agent_reporters: dict[str, str | Callable] | None = None, # <-- ALLOWS CALLABLE
7676
trigger: Callable[[Any], bool] | None = None,
7777
reset_memory: bool = True,
7878
storage: Literal[
@@ -92,7 +92,10 @@ def __init__(
9292
model_reporters : dict[str, Callable] | None
9393
Functions to collect data at the model level.
9494
agent_reporters : dict[str, str | Callable] | None
95-
Attributes or functions to collect data at the agent level.
95+
(MODIFIED) A dictionary mapping new column names to existing
96+
column names (str) or callables. Callables are not currently
97+
processed by the agent data collector but are allowed for API compatibility.
98+
Example: {"agent_wealth": "wealth", "age_in_years": "age"}
9699
trigger : Callable[[Any], bool] | None
97100
A function(model) -> bool that determines whether to collect data.
98101
reset_memory : bool
@@ -108,10 +111,14 @@ def __init__(
108111
"""
109112
if agent_reporters:
110113
for key, value in agent_reporters.items():
111-
if not isinstance(value, str):
114+
if not isinstance(key, str):
112115
raise TypeError(
113-
f"Agent reporter for '{key}' must be a string (the column name), "
114-
f"not a {type(value)}. Callable reporters are not supported for agents."
116+
f"Agent reporter keys must be strings (the final column name), not a {type(key)}."
117+
)
118+
if not (isinstance(value, str) or callable(value)):
119+
raise TypeError(
120+
f"Agent reporter for '{key}' must be either a string (the source column name) "
121+
f"or a callable (function taking an agent and returning a value), not a {type(value)}."
115122
)
116123

117124
super().__init__(

tests/test_datacollector.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -171,14 +171,11 @@ def test__init__(self, fix1_model, postgres_uri):
171171
# model=model, model_reporters={"total_agents": "sum"}
172172
# )
173173

174-
with pytest.raises(
175-
TypeError,
176-
match="Agent reporter for 'wealth' must be a string",
177-
):
178-
model.test_dc = DataCollector(
179-
model=model,
180-
agent_reporters={"wealth": lambda m: 1}, # This is now illegal
181-
)
174+
model.test_dc = DataCollector(
175+
model=model,
176+
agent_reporters={"wealth": lambda m: 1}
177+
)
178+
assert model.test_dc is not None
182179

183180
with pytest.raises(
184181
ValueError,

0 commit comments

Comments
 (0)