def runN(self, periods=DEF_TIME): """ Run our model for N periods. Return the total number of actions taken. """ acts = 0 for i in range(periods): # before members act, give birth to new agents # we will have tuple of agent and group # do group += agent if self.womb is not None: for (agent, group) in self.womb: join(group, agent) del self.womb[:] if self.switches is not None: for (agent, grp1, grp2) in self.switches: switch(agent, grp1, grp2) del self.switches[:] for mbr in self.pop_hist.pops: if mbr in self.members and self.is_mbr_comp(mbr): self.pop_hist.record_pop(mbr, self.pop_count(mbr)) else: self.pop_hist.record_pop(mbr, 0) curr_acts = super().__call__() acts += curr_acts return acts
def __init__(self, name, attrs=None, members=None, duration=INF): self.members = OrderedDict() super().__init__(name, attrs=attrs, duration=duration) if members is not None: for member in members: join(self, member)
def __setitem__(self, key, member): """ In contrast to agent, which sets a double val for setitem, for composites, we are going to set the 'key'th member. """ join(self, member)
def test_join_group(self): """ Test joining a group. This test is here rather than in agent because it requires Composite! """ join(self.calc, self.hardy) self.assertEqual(create_mem_str(self.calc), NL + H)
def __iadd__(self, other): """ Add other to set self. If other is a composite, add all its members. If other is an atom, add it. """ if is_composite(other): for key in other: join(self, other[key]) else: join(self, other) return self
def __init__(self, name, attrs=None, members=None, duration=INF, action=None, member_creator=None, num_members=None): self.members = OrderedDict() super().__init__(name, attrs=attrs, duration=duration, action=action) if members is not None: for member in members: join(self, member) if member_creator is not None: for i in range(num_members): self += member_creator(name, i)
def __init__(self, name, attrs=None, members=None, duration=INF, action=None, member_creator=None, num_members=None, serial_obj=None, reg=True, **kwargs): self.num_members_ever = 0 self.members = OrderedDict() self.execution_key = CLI_EXEC_KEY if EXEC_KEY in kwargs: self.execution_key = kwargs[EXEC_KEY] super().__init__(name, attrs=attrs, duration=duration, action=action, serial_obj=serial_obj, reg=False, **kwargs) self.type = type(self).__name__ if serial_obj is not None: self.restore(serial_obj) else: if members is not None: for member in members: join(self, member) if num_members is None: num_members = 1 # A default if they forgot to pass this. self.num_members_ever = num_members self.member_creator = None if member_creator is not None: self.member_creator = member_creator # If we have a member creator function, call it # `num_members` times to create group members. for i in range(num_members): join(self, member_creator(self.name, i, **kwargs)) if reg: add_group(self.name, self, execution_key=self.execution_key)
def handle_womb(self): """ The womb just contains group names -- they will be repeated as many times as that group needs to add members. We name the new members in the `member_creator()` method. This should be re-written as dict with: {"group_name": #agents_to_create} """ if self.womb is not None: for group_nm in self.womb: group = regis.get_registration(group_nm) if group is not None and group.member_creator is not None: group.num_members_ever += 1 agent = group.member_creator("", group.num_members_ever) agent.env = group.env regis.register(agent.name, agent) join(group, agent) del self.womb[:]
def __init__(self, name, attrs=None, members=None, duration=INF, action=None, member_creator=None, num_members=None, serial_obj=None, reg=True, **kwargs): self.num_members_ever = 0 self.members = OrderedDict() super().__init__(name, attrs=attrs, duration=duration, action=action, serial_obj=serial_obj, reg=False) # we need to get rid of these uses of type!!! # (but carefully, of course) self.type = "composite" if serial_obj is not None: self.restore(serial_obj) else: if members is not None: for member in members: join(self, member) if num_members is None: num_members = 1 # A default if they forgot to pass this. self.num_members_ever = num_members self.member_creator = None if member_creator is not None: self.member_creator = member_creator # If we have a member creator function, call it # `num_members` times to create group members. for i in range(num_members): # += adds members join( self, member_creator(self.name, i, **kwargs)) if reg: add_group(self.name, self) register(self.name, self)
def handle_womb(self): """ The womb just contains group names -- they will be repeated as many times as that group needs to add members. We name the new members in the `member_creator()` method. This should be re-written as dict with: {"group_name": #agents_to_create} """ if self.womb is not None: for group_nm in self.womb: group = regis.get_group(group_nm, execution_key=self.execution_key) if group is not None and group.member_creator is not None: group.num_members_ever += 1 agent = group \ .member_creator("", group.num_members_ever, execution_key=self.execution_key) regis.register(agent.name, agent, execution_key=self.execution_key) join(group, agent) if self.random_placing: self.place_member(agent, None) self.womb.clear()
def test_join_group(self): """ This test is here rather than in agent because it requires Composite! """ join(self.calc, self.hardy) self.assertEqual(create_mem_str(self.calc), NL + H)