def simulate()

in clutrr/actors/ancestry.py [0:0]


    def simulate(self):
        """
        Main function to run the simulation to create a family tree

        :return:
        """
        self.node_ct = 0
        self.levels = random.randint(1,self.max_levels)
        # we are root, for now just add one head of family
        gender = 'male'
        nodes = self.add_members(gender=gender, num=1)
        parents = nodes

        for level in range(self.max_levels):
            # build generation
            generation_nodes = []
            for node in parents:
                # marry with probability p_marry
                decision_marry = np.random.choice([True,False],1,p=[self.p_marry, 1-self.p_marry])
                if decision_marry:
                    # add the partner
                    nodes =  self.add_members(gender=self.toggle_gender(node), num=1)
                    self.make_relation(node, nodes[0], relation='SO')
                    # always leave the last level as single children
                    if level != self.max_levels - 1:
                        # add the children for this parent
                        num_childs = random.randint(self.min_child, self.max_child)
                        child_nodes = self.add_members(num=num_childs)
                        if len(child_nodes) > 0:
                            for ch_node in child_nodes:
                                self.make_relation(node, ch_node, relation='child')
                                self.make_relation(nodes[0], ch_node, relation='child')
                        generation_nodes.extend(child_nodes)
            parents = generation_nodes