transform.alc 2.6 KB

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