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