relationship#
Relationship system for managing many-to-many relationships between roles.
This module provides a base class for defining relationships between roles, storing edges (connections) between agents with edge-specific data. Uses COO (Coordinate List) sparse format for efficient storage and querying.
Design Notes#
Relationships store edges between source and target roles
Edge data stored in parallel NumPy arrays (COO format)
Supports many-to-many, one-to-many, and many-to-one cardinality
Auto-registration via __init_subclass__ hook
Query methods use vectorized NumPy operations
Examples
Define a loan relationship using @relationship decorator:
>>> from bamengine import relationship, get_role, Float
>>>
>>> @relationship(source=get_role("Borrower"), target=get_role("Lender"))
... class LoanBook:
... principal: Float
... rate: Float
... debt: Float
Access relationship in simulation:
>>> import bamengine as be
>>> sim = be.Simulation.init(n_firms=100, n_banks=10, seed=42)
>>> loans = sim.get_relationship("LoanBook")
>>> # Query loans from specific borrower
>>> borrower_id = 5
>>> mask = loans.source_ids[: loans.size] == borrower_id
>>> borrower_loans = loans.principal[: loans.size][mask]
Traditional syntax:
>>> from dataclasses import dataclass
>>> from bamengine.core import Relationship
>>> from bamengine.typing import Float, Int
>>>
>>> @dataclass(slots=True)
... class Employment(Relationship):
... source_role = get_role("Borrower")
... target_role = get_role("Lender")
... wage: Float
... contract_duration: Int
See also
RoleBase class for component state
relationship()Simplified @relationship decorator
LoanBookConcrete relationship between Borrower and Lender
Classes#
Base class for defining relationships between roles. |