You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

118 lines
3.9 KiB

  1. mdp
  2. const int MULT_DUR_1 = 8;
  3. const int ADD_DUR_1 = 4;
  4. const double P1_SUCCESS = 1.0;
  5. const int MULT_DUR_2 = 3;
  6. const int ADD_DUR_2 = 3;
  7. const double P2_SUCCESS = 0.8;
  8. // target state (all tasks complete)
  9. label "tasks_complete" = (task6=3);
  10. label "no_P1_mult" = (mult_tick_1=0);
  11. label "no_P2_mult" = (mult_tick_2=0);
  12. // reward structure: elapsed time
  13. rewards "time"
  14. task6!=3 : 1;
  15. endrewards
  16. // reward structures: energy consumption
  17. rewards "energy"
  18. p1=0 : 10/1000; // processor 1 idle
  19. p1>0 : 100/1000; // processor 1 working
  20. p2=0 : 10/1000; // processor 2 idle
  21. p2>0 : 100/1000; // processor 2 working
  22. endrewards
  23. module scheduler
  24. //┌t1─┐ ┌t3─────┐ ┌t5───────┐
  25. //│A+B│-->│Cx(A+B)│-->│DxCx(A+B)│--. ┌t6─────────────────────┐
  26. //└───┘\ └───────┘ └─────────┘ \___\│DxCx(A+B)+((A+B)+(CxD))│
  27. //┌t2─┐ \ ┌t4─────────┐ / /└───────────────────────┘
  28. //│CxD│-->│(A+B)+(CxD)│------------°
  29. //└───┘ └───────────┘
  30. task1 : [0..3]; // A+B, add
  31. task2 : [0..3]; // CxD, mult
  32. task3 : [0..3]; // Cx(A+B), mult
  33. task4 : [0..3]; // (A+B)+(CxD), add
  34. task5 : [0..3]; // DxCx(A+B), mult
  35. task6 : [0..3]; // (DxCx(A+B)) + ((A+B)+(CxD)), add
  36. p1_idle : bool init true;
  37. p2_idle : bool init true;
  38. // task status:
  39. // 0 - not started
  40. // 1 - running on processor 1
  41. // 2 - running on processor 2
  42. // 3 - task complete
  43. // start task 1
  44. [t1p1] task1=0 & p1_idle-> (task1'=1) & (p1_idle'=false);
  45. [t1p2] task1=0 & p2_idle-> (task1'=2) & (p2_idle'=false);
  46. // start task 2
  47. [t2p1] task2=0 & p1_idle-> (task2'=1) & (p1_idle'=false);
  48. [t2p2] task2=0 & p2_idle-> (task2'=2) & (p2_idle'=false);
  49. // start task 3 (must wait for task 1 to complete)
  50. [t3p1] task3=0 & task1=3 & p1_idle-> (task3'=1) & (p1_idle'=false);
  51. [t3p2] task3=0 & task1=3 & p2_idle-> (task3'=2) & (p2_idle'=false);
  52. // start task 4 (must wait for tasks 1 and 2 to complete)
  53. [t4p1] task4=0 & task1=3 & task2=3 & p1_idle-> (task4'=1) & (p1_idle'=false);
  54. [t4p2] task4=0 & task1=3 & task2=3 & p2_idle-> (task4'=2) & (p2_idle'=false);
  55. // start task 5 (must wait for task 3 to complete)
  56. [t5p1] task5=0 & task3=3 & p1_idle-> (task5'=1) & (p1_idle'=false);
  57. [t5p2] task5=0 & task3=3 & p2_idle-> (task5'=2) & (p2_idle'=false);
  58. // start task 6 (must wait for tasks 4 and 5 to complete)
  59. [t6p1] task6=0 & task4=3 & task5=3 & p1_idle -> (task6'=1) & (p1_idle'=false);
  60. [t6p2] task6=0 & task4=3 & task5=3 & p2_idle -> (task6'=2) & (p2_idle'=false);
  61. // a task finishes on processor 1
  62. [p1_done] task1=1 & p1=3 -> (task1'=3) & (p1_idle'=true);
  63. [p1_done] task2=1 & p1=3 -> (task2'=3) & (p1_idle'=true);
  64. [p1_done] task3=1 & p1=3 -> (task3'=3) & (p1_idle'=true);
  65. [p1_done] task4=1 & p1=3 -> (task4'=3) & (p1_idle'=true);
  66. [p1_done] task5=1 & p1=3 -> (task5'=3) & (p1_idle'=true);
  67. [p1_done] task6=1 & p1=3 -> (task6'=3) & (p1_idle'=true);
  68. // a task finishes on processor 2
  69. [p2_done] task1=2 & p2=3 -> (task1'=3) & (p2_idle'=true);
  70. [p2_done] task2=2 & p2=3 -> (task2'=3) & (p2_idle'=true);
  71. [p2_done] task3=2 & p2=3 -> (task3'=3) & (p2_idle'=true);
  72. [p2_done] task4=2 & p2=3 -> (task4'=3) & (p2_idle'=true);
  73. [p2_done] task5=2 & p2=3 -> (task5'=3) & (p2_idle'=true);
  74. [p2_done] task6=2 & p2=3 -> (task6'=3) & (p2_idle'=true);
  75. [] task6=3 -> 1 : true;
  76. [] task6=3 -> 1 : true;
  77. endmodule
  78. // processor 1
  79. module P1
  80. p1 : [0..3]; // 0 inactive, 1 - adding, 2 - multiplying, 3 - done
  81. mult_tick_1 : ;
  82. add_tick_1 : ;
  83. [p1_done] p1=3 -> 1: (p1'=0) & (mult_tick_1'=0) & (add_tick_1'=0); // finished task
  84. endmodule
  85. // processor 2
  86. // Note: You may also use module renaming to define processor 2
  87. module P2
  88. p2 : [0..3]; // 0 inactive, 1 - adding, 2 - multiplying, 3 - done
  89. mult_tick_2 : ;
  90. add_tick_2 : ;
  91. [p2_done] p2=3 -> 1: (p2'=0) & (mult_tick_2'=0) & (add_tick_2'=0); // finished task
  92. endmodule