transform.alc 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. include "primitives.alh"
  2. include "object_operations.alh"
  3. include "modelling.alh"
  4. Element function make_matching_schedule(LHS_model : Element):
  5. Element schedule
  6. Element workset
  7. Element all_elements
  8. Integer required_size
  9. String new_element
  10. Integer counter
  11. String next
  12. // Initialize
  13. schedule = create_node()
  14. workset = create_node()
  15. all_elements = allInstances(LHS_model, "Pre_Element")
  16. required_size = read_nr_out(all_elements)
  17. // Need to keep adding to the schedule
  18. while (read_nr_out(schedule) < required_size):
  19. // workset is empty, but we still need to add to the list
  20. // Therefore, we pick a random, unbound node, and add it to the workset
  21. new_element = set_pop(all_elements)
  22. log("Pick random: " + cast_v2s(new_element))
  23. while (bool_or(set_in(schedule, new_element), is_edge(LHS_model["model"][new_element]))):
  24. log("Picked stupid: " + cast_v2s(new_element))
  25. // Element is not usable, so pick another one
  26. new_element = set_pop(all_elements)
  27. log("Picked: " + cast_v2s(new_element))
  28. set_add(workset, new_element)
  29. // Handle the workset
  30. while (read_nr_out(workset) > 0):
  31. // Still elements in the workset, so pop from these first
  32. next = set_pop(workset)
  33. log("Working on " + cast_v2s(next))
  34. // Check if element might not be already used somewhere
  35. log("Check if already in schedule")
  36. if (bool_not(set_in(schedule, next))):
  37. log("NO")
  38. list_append(schedule, next)
  39. // If it is an edge, we should also add the target and source
  40. log("Edge?")
  41. if (is_edge(LHS_model["model"][next])):
  42. log("YES")
  43. // Add the target/source to the schedule
  44. set_add(workset, reverseKeyLookup(LHS_model["model"], read_edge_src(LHS_model["model"][next])))
  45. set_add(workset, reverseKeyLookup(LHS_model["model"], read_edge_dst(LHS_model["model"][next])))
  46. // Also add all outgoing links
  47. log("Recurse")
  48. counter = read_nr_out(LHS_model["model"][next])
  49. while (counter > 0):
  50. log("Check")
  51. counter = counter - 1
  52. if (set_in_node(LHS_model["model"], read_out(LHS_model["model"][next], counter))):
  53. log("ADD")
  54. set_add(workset, reverseKeyLookup(LHS_model["model"], read_out(LHS_model["model"][next], counter)))
  55. log("DONE")
  56. return schedule!
  57. Void function transform(host_model : Element, LHS_model : Element, RHS_model : Element):
  58. Element schedule
  59. schedule = make_matching_schedule(LHS_model)
  60. output("Got schedule")
  61. while (read_nr_out(schedule) > 0):
  62. output(list_pop(schedule, 0))
  63. return!