Element function make_matching_schedule(LHS_model : Element): Element schedule Element workset Element all_elements Integer required_size String new_element Element tmp schedule = create_node() workset = create_node() all_elements = allInstances(LHS_model, "Pre_Element") //TODO is this completely true? // Calculate the size of the final match required_size = read_nr_out(all_elements) while (read_nr_out(schedule) < required_size): // Need to keep adding to the schedule // workset is empty, but we still need to add to the list // Therefore, we pick a random, unbound node, and add it to the workset new_element = set_pop(all_elements) while (bool_or(set_in(schedule, new_element), (is_edge(LHS_model["model"][new_element]))): new_element = set_pop(all_elements) set_add(workset, new_element) while (read_nr_out(workset) > 0): // Still elements in the workset, so pop from these first next = set_pop(workset) if (bool_not(set_in(schedule, next))): list_append(schedule, next) if (is_edge(next)): // Add the target/source to the schedule if (bool_not(set_in(schedule, read_edge_src(next)))): // Add source set_add(workset, read_edge_src(next)) if (bool_not(set_in(schedule, read_edge_dst(next)))): // Add destination set_add(workset, read_edge_dst(next)) // Also add all outgoing and incoming elements tmp = allOutgoingAssociations(next) while (read_nr_out(tmp) > 0): set_add(workset, set_pop(tmp)) tmp = allIncomingAssociations(next) while (read_nr_out(tmp) > 0): set_add(workset, set_pop(tmp)) return schedule