Skip to content

[Bug]: selecting attributes from Multiagent AgentsDF raises an error if attribute not in every Agent #163

Open
@Ben-geo

Description

@Ben-geo

📝 Description

Lets say we have a multi agent AgentsDF

agent1 : wealth , age
agent2 : age

if agents_df : AgentsDF has these 2 agents and then agents_df["wealth"] will raise an error

🔄 Steps to Reproduce

class ExampleAgentSet1(AgentSetPolars):
    def __init__(self, model: ModelDF):
        super().__init__(model)
        self["wealth"] = pl.Series("wealth", [1, 2, 3, 4])
        self["age"] = pl.Series("age", [10, 20, 30, 40])

    def add_wealth(self, amount: int) -> None:
        self["wealth"] += amount

    def step(self) -> None:
        self.add_wealth(1)

class ExampleAgentSet2(AgentSetPolars):
    def __init__(self, model: ModelDF):
        super().__init__(model)
        self["wealth"] = pl.Series("wealth", [10, 20, 30, 40])
        self["age"] = pl.Series("age", [11, 22, 33, 44])

    def add_wealth(self, amount: int) -> None:
        self["wealth"] += amount

    def step(self) -> None:
        self.add_wealth(2)

class ExampleAgentSet3(AgentSetPolars):
    def __init__(self, model: ModelDF):
        super().__init__(model)
        self["age"] = pl.Series("age", [1, 2, 3, 4])

    def age_agents(self, amount: int) -> None:
        self["age"] += amount

    def step(self) -> None:
        self.age_agents(1)



class ExampleModel(ModelDF):
    def __init__(self, agents: AgentsDF):
        super().__init__()
        self.agents = agents

    def step(self):
        self.agents.do("step")



@pytest.fixture
def fix1_AgentSetPolars() -> ExampleAgentSet1:
    return ExampleAgentSet1(ModelDF())

@pytest.fixture
def fix2_AgentSetPolars() -> ExampleAgentSet2:
    return ExampleAgentSet2(ModelDF())

@pytest.fixture
def fix3_AgentSetPolars() -> ExampleAgentSet3:
    return ExampleAgentSet3(ModelDF())


@pytest.fixture
def fix_AgentsDF(fix1_AgentSetPolars: ExampleAgentSet1,fix2_AgentSetPolars : ExampleAgentSet2, fix3_AgentSetPolars: ExampleAgentSet3) -> AgentsDF:
    model = ModelDF()
    agents = AgentsDF(model)
    agents.add([fix1_AgentSetPolars,fix2_AgentSetPolars,fix3_AgentSetPolars])
    return agents


@pytest.fixture
def fix1_model(fix_AgentsDF: AgentsDF) -> ExampleModel:
    return ExampleModel(fix_AgentsDF)

model = fix1_mpdel
w = model.agents["wealth"]

🎯 Expected Behavior

I think it just needs to skip the agents without the specific column

🚨 Actual Behavior

No response

🖥️ Python Version

No response

Operating System

No response

Relevant Packages

No response

📊 Relevant Log Output

No response

➕ Additional Context

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingtriageNeeds initial review and categorization

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions