12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- 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
|