示例#1
0
    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
示例#2
0
 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)
示例#3
0
文件: env.py 项目: gcallah/Indra
    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
示例#4
0
 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)
示例#5
0
 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)
示例#6
0
 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
示例#7
0
 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)
示例#8
0
    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)
示例#9
0
 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[:]
示例#10
0
    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)
示例#11
0
 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()
示例#12
0
 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)