flow_graph.hrl 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. % operation A B = A |->| B
  2. % task B = operation () B = () |->| B
  3. % operation ::= func | value | dynamic | route
  4. % | pipe | parallel | sequence
  5. % | split | merge | switch | loop
  6. % func (A_1 * ... * A_n) B ::=
  7. % { in = n : number, code : fun(A_1, ..., A_n) -> B }
  8. -record(func, {in, code}).
  9. % value () B ::= { value : B }
  10. -record(value, {value}).
  11. % dynamic (A_1 * ... * A_n) (operation () B) ::=
  12. % { in = n : number, code : fun(A_1, ..., A_n) -> operation () B }
  13. -record(dynamic, {in, code}).
  14. % route_R A (route_map R A) ::=
  15. % { in = size(A) : number, out = length(R) : number,
  16. % map = R : [ (1..size(A)) ] }
  17. -record(route, {in, out, map}).
  18. % pipe (A_1 * ... * A_n) (B_1 * ... * B_m) ::=
  19. % { in = n : number, out = m : number,
  20. % ops : [ operation (A_1_1 * ... * A_1_n1) (A_2_1 * ... * A_2_n2),
  21. % operation (A_2_1 * ... * A_2_n2) (A_3_1 * ... * A_3_n3),
  22. % ...,
  23. % operation (A_i_1 * ... * A_i_ni) (B_1 * ... * B_m) ] }
  24. -record(pipe, {in, out, ops}).
  25. % parallel (flatten([A_1, ..., A_n])) (flatten([B_1, ..., B_n])) ::=
  26. % { in = size(flatten([A_1, ..., A_n])) : number,
  27. % out = size(flatten([B_1, ..., B_n])) : number,
  28. % ops : [ operation A_1 B_1, ..., operation A_n B_n ] }
  29. -record(parallel, {in, out, ops}).
  30. % sequence (flatten([A_1, ..., A_n])) (flatten([B_1, ..., B_n])) ::=
  31. % { in = size(flatten([A_1, ..., A_n])) : number,
  32. % out = size(flatten([B_1, ..., B_n])) : number,
  33. % ops : [ operation A_1 B_1, ..., operation A_n B_n ] }
  34. -record(sequence, {in, out, ops}).
  35. % split (unit (A_1 * ... * A_n)) (A_1 * ... * A_n) ::= { size = n : number }
  36. -record(split, {size}).
  37. % merge (A_1 * ... * A_n) (unit (A_1 * ... * A_n)) ::= { size = n : number }
  38. -record(merge, {size}).
  39. % switch (A_1 * ... * A_n) (B_1 + ... + B_m) ::=
  40. % { in = n : number, out = m : number,
  41. % switch : operation (A_1, ..., A_n) (Tag_1 + ... + Tag_m),
  42. % map : [ {Tag_1, operation (A_1 * ... * A_n) B_1},
  43. % ...,
  44. % {Tag_m, operation (A_1 * ... * A_n) B_m} ] }
  45. -record(switch, {in, out, switch, map}).
  46. % loop (A_1 * ... * A_n) (B_1 * ... * B_m) ::=
  47. % { in = n : number, out = m : number,
  48. % init : operation () (S_1 * ... * S_i),
  49. % op : operation (A_1 * ... * A_n * S_1 * ... * S_i)
  50. % (B_1 * ... * B_m * S_1 * ... * S_i) }
  51. -record(loop, {in, out, init, op}).