Relationship
Class for agent relationships.
__init__(self, agent1, agent2, duration, bond_type, id=None)
special
Constructor for a Relationship
Parameters:
Name | Type | Description | Default |
---|---|---|---|
agent1 |
Agent |
first agent |
required |
agent2 |
Agent |
second agent |
required |
duration |
int |
target duration of relationship |
required |
bond_type |
str |
type of bond for the relationship [params.classes.bond_types] |
required |
id |
Optional[int] |
unique identifier |
None |
Source code in titan/agent.py
def __init__(
self,
agent1: Agent,
agent2: Agent,
duration: int,
bond_type: str,
id: Optional[int] = None,
):
"""
Constructor for a Relationship
args:
agent1: first agent
agent2: second agent
duration: target duration of relationship
bond_type: type of bond for the relationship [params.classes.bond_types]
id: unique identifier
"""
# make sure these agents can be in a relationship
assert agent1 != agent2, "Cannot create relationship with same agent"
for rel in agent1.relationships:
assert agent2 != rel.get_partner(agent1), "Agents already partnered!"
# self.id is unique ID number used to track each person agent.
self.agent1 = agent1
self.agent2 = agent2
if id is not None:
self.id = id
else:
self.id = self.next_rel_id
self.update_id_counter(self.id)
# Relationship properties
self.duration = duration
self.total_duration = duration
self.bond_type = bond_type
self.bond()
bond(self)
Bond two agents. Adds the relationship to each agent's relationships
set, then adds each partner to the others' partner list.
Source code in titan/agent.py
def bond(self) -> None:
"""
Bond two agents. Adds the relationship to each agent's `relationships` set, then adds each partner to the others' partner list.
"""
# Append relationship to relationships list for each agent
self.agent1.relationships.add(self)
self.agent2.relationships.add(self)
# Pair agent with partner and partner with agent
self.agent1.partners[self.bond_type].add(self.agent2)
self.agent2.partners[self.bond_type].add(self.agent1)
get_number_of_sex_acts(self, rand_gen)
Number of sex acts in the relationship during the time step.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
rand_gen |
|
np random number generator (e.g. self.run_random in model) |
required |
Returns:
Type | Description |
---|---|
int |
number of sex acts |
Source code in titan/agent.py
def get_number_of_sex_acts(self, rand_gen) -> int:
"""
Number of sex acts in the relationship during the time step.
args:
rand_gen: np random number generator (e.g. self.run_random in model)
returns:
number of sex acts
"""
agent = safe_random_choice([self.agent1, self.agent2], rand_gen)
freq_params = agent.location.params.partnership.sex.frequency[self.bond_type]
if freq_params.type == "bins":
i = get_independent_bin(rand_gen, freq_params.bins)
return safe_random_int(
freq_params.bins[i].min, freq_params.bins[i].max, rand_gen
)
elif freq_params.type == "distribution":
return round(safe_dist(freq_params.distribution, rand_gen))
else:
raise Exception("Sex acts must be defined as bin or distribution")
get_partner(self, agent)
Given an agent in the relationship, return the other agent
Parameters:
Name | Type | Description | Default |
---|---|---|---|
agent |
Agent |
one of the agents in the relationship |
required |
Returns:
Type | Description |
---|---|
Agent |
the agent's partner |
Source code in titan/agent.py
def get_partner(self, agent: "Agent") -> "Agent":
"""
Given an agent in the relationship, return the other agent
args:
agent: one of the agents in the relationship
returns:
the agent's partner
"""
if agent == self.agent1:
return self.agent2
elif agent == self.agent2:
return self.agent1
else:
raise ValueError("Agent must be in this relationship")
progress(self, force=False)
Progress a relationship to the next time step (decrementing remaining target duration), or end a relationship if the duration is 0 or if force
is set to True
Parameters:
Name | Type | Description | Default |
---|---|---|---|
force |
bool |
whether to force the relationship to end |
False |
Source code in titan/agent.py
def progress(self, force: bool = False) -> bool:
"""
Progress a relationship to the next time step (decrementing remaining target duration), or end a relationship if the duration is 0 or if `force` is set to `True`
args:
force: whether to force the relationship to end
"""
if self.duration <= 0 or force:
self.unbond()
return True
else:
self.duration -= 1
return False
unbond(self)
Unbond two agents. Removes relationship from relationship sets. Removes partners in each others' partner list.
Source code in titan/agent.py
def unbond(self):
"""
Unbond two agents. Removes relationship from relationship sets.
Removes partners in each others' partner list.
"""
# Remove relationship to relationships list for each agent
self.agent1.relationships.remove(self)
self.agent2.relationships.remove(self)
# Unpair agent with partner and partner with agent
self.agent1.partners[self.bond_type].remove(self.agent2)
self.agent2.partners[self.bond_type].remove(self.agent1)