Guest User

Untitled

a guest
Jan 15th, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.30 KB | None | 0 0
  1. //---------------------------------------------------------------
  2. // Just matching sample
  3. let select (es: Event list) =
  4. match es with
  5. | [x] -> x
  6. | {data = Request _}::_ -> List.last es
  7. | {data = Active (Active.Failure _)}::_ -> List.last es
  8. | _ -> List.last es
  9.  
  10.  
  11. //---------------------------------------------------------------
  12. // Heavy composition usage
  13. let run hour limit initial =
  14. let faults =
  15. Assets.State.Get.assets
  16. >> Assets.Get.platforms
  17. >> List.collect (fault 0)
  18. >> Assets.State.Add.events
  19. |> repeat
  20.  
  21. let finalize =
  22. Assets.State.Get.assets
  23. >> Assets.Get.platforms
  24. >> List.collect (track "Finalize" limit)
  25. >> Assets.State.Add.events
  26. |> repeat
  27. >> hour >> applyf limit
  28. >> Assets.State.Get.assets
  29. >> Assets.State.To.platforms (degrade limit)
  30.  
  31. [initial.assets.time..limit]
  32. |> List.fold hour (faults initial)
  33. |> finalize
  34. |> ignore
  35.  
  36.  
  37. //---------------------------------------------------------------
  38. // My big composition root where I configure the whole simulation
  39. let route ready threshold spares lifetimes rates limits durations =
  40. function
  41. | {data = Period z} as x ->
  42. match z with
  43. | Period.Check o -> Period.check o durations
  44. | Period.Replace -> Period.replace durations
  45. | Period.Stock -> Period.stock spares
  46. | Period.Mission -> Period.mission ready durations
  47. >> Outcome.map id (Period.initial x.time z)
  48. | {data = Request z} as y ->
  49. match z with
  50. | Request.Check x -> Request.check x y.time
  51. | Request.Refresh x -> Request.repair Low durations y.time x
  52. | Request.Repair x -> Request.repair High durations y.time x
  53. | Request.Recovery x -> Request.replace Fail x y.time
  54. | Request.Replace x -> Request.replace Low x y.time
  55. | Request.Mission xs -> Request.mission xs y.time
  56. | {data = Done _} -> pairf [] >> Enabled
  57. | {data = Active z} as y ->
  58. match z with
  59. | Active.Check x -> Active.check durations x y.time
  60. | Active.Refresh x -> Active.repair Low limits lifetimes rates x y.time
  61. | Active.Repair x -> Active.repair High limits lifetimes rates x y.time
  62. | Active.Recovery x -> Active.replace Fail limits lifetimes x y.time
  63. | Active.Replace x -> Active.replace Low limits lifetimes x y.time
  64. | Active.Mission x -> Active.mission threshold x y.time
  65. | Active.Failure x -> Active.failure durations x.platform x.block y.time
  66.  
  67.  
  68. //---------------------------------------------------------------
  69. // Detection of wear level
  70. module Detect =
  71. let level life = function
  72. | Fixable (l,h,f) ->
  73. [0;l;h;f]
  74. |> List.map ((-) f)
  75. |> List.rev
  76. |> List.findIndex ((<=) life)
  77. |> function
  78. | 0 -> Fail
  79. | 1 -> High
  80. | 2 -> Low
  81. | 3 -> Norm
  82. | _ -> crash "Wrong index"
  83. | Unfixable f ->
  84. [0;f]
  85. |> List.findIndex ((<=) life)
  86. |> function
  87. | 0 -> Fail
  88. | 1 -> Norm
  89. | _ -> crash "Wrong index"
  90.  
  91.  
  92. //---------------------------------------------------------------
  93. // Func that performs a repair of broken platforms
  94. let perform p (b:Block) =
  95. if b.level = Fail then crash "Failed Block in Repair: %A" b
  96. if b.status = Stopped then crash "Stopped Block in Repair: %A" b
  97.  
  98. let active =
  99. let ends = duration + assets.time
  100. blockd p team b
  101. |> match team with
  102. | Low -> Active.Refresh
  103. | High -> Active.Repair
  104. | x -> crash "Not Low or High team in Request.repair but %A" x
  105. |> Create.active ends (Token.Time ends)
  106.  
  107. let assets =
  108. assets
  109. |> Assets.Remove.team team
  110. |> Assets.Update.platform p.id
  111. (degrade assets.time
  112. >> Platform.Set.uptime assets.time
  113. >> Platform.Update.block b.id Block.stop
  114. >> Platform.Update.status)
  115.  
  116. pair assets (active::track "Repair" assets.time p) |> Enabled
  117.  
  118.  
  119. //---------------------------------------------------------------
  120. // Funcs from Costs module
  121. let confidence (samples: float list) interval =
  122. let lenght = float samples.Length
  123. let freedom = max (lenght - 1.0) 1.0
  124. let theta = (interval + 1.0) / 2.0
  125. let mean = Statistics.Mean samples
  126. let stdev = Statistics.StandardDeviation samples
  127. let student = StudentT.InvCDF (0.0, 1.0, freedom, theta)
  128. let t = student * (stdev / sqrt lenght)
  129. (mean - t, mean + t)
  130.  
  131. let indicators (data:float list) =
  132. let (lower,upper) = confidence data 0.95
  133. [List.sum data
  134. Statistics.Mean data
  135. Statistics.Median data
  136. Statistics.StandardDeviation data
  137. upper
  138. lower
  139. Statistics.Maximum data
  140. Statistics.UpperQuartile data
  141. Statistics.LowerQuartile data
  142. Statistics.Minimum data]
  143.  
  144. let calculate data =
  145. data
  146. |> List.ofSeq
  147. |> List.group Get.block
  148. |> List.append ["!Total", List.ofSeq data]
  149. |> List.maps block
  150. |> List.sortf
  151. |> List.rev
  152. |> List.snd
Add Comment
Please, Sign In to add comment