Advertisement
wintermaples

Untitled

Feb 17th, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.57 KB | None | 0 0
  1. -- サンプリング周期
  2. samplingPeriod = 10
  3.  
  4. -- samplingPeriod毎に期間を区切った、通ったアイテムの数を格納したDictのリスト
  5. samples = {}
  6.  
  7. function formatFloat(n)
  8. local myNumString = tostring(n)
  9. if string.match(myNumString, "%.") then
  10. myNumString = myNumString.."0"
  11. else
  12. myNumString = myNumString..".00"
  13. end
  14. local myFloatString = string.match(myNumString, "^(%d+%.%d%d)")
  15. return myFloatString
  16. end
  17.  
  18. function statistics_avg(samples)
  19. sum = 0
  20. for i, v in pairs(samples) do
  21. sum = sum + v
  22. end
  23. return sum / table.maxn(samples)
  24. end
  25.  
  26. function statistics_variance(samples)
  27. avg = statistics_avg(samples)
  28. variance_n = 0
  29. for i, v in pairs(samples) do
  30. variance_n = variance_n + math.pow(v - avg, 2)
  31. end
  32. return variance_n / table.maxn(samples)
  33. end
  34.  
  35. function statistics_stdev(samples)
  36. return math.sqrt(statistics_variance(samples))
  37. end
  38.  
  39. function statistics_min(samples)
  40. min = 100000000000
  41. for i, v in pairs(samples) do
  42. if v < min then
  43. min = v
  44. end
  45. end
  46. return min
  47. end
  48.  
  49. function statistics_max(samples)
  50. max = -100000000000
  51. for i, v in pairs(samples) do
  52. if v > max then
  53. max = v
  54. end
  55. end
  56. return max
  57. end
  58.  
  59. function statistics_meaningful_min(samples, sigma)
  60. avg = statistics_avg(samples)
  61. variance = statistics_variance(samples)
  62. meaningful_samples = {}
  63. for i, v in pairs(samples) do
  64. if math.abs(v - avg) <= variance * sigma then
  65. table.insert(meaningful_samples, v)
  66. end
  67. end
  68.  
  69. return statistics_min(meaningful_samples)
  70. end
  71.  
  72. function statistics_meaningful_max(samples, sigma)
  73. avg = statistics_avg(samples)
  74. variance = statistics_variance(samples)
  75. meaningful_samples = {}
  76. for i, v in pairs(samples) do
  77. if math.abs(v - avg) <= variance * sigma then
  78. table.insert(meaningful_samples, v)
  79. end
  80. end
  81.  
  82. return statistics_max(meaningful_samples)
  83. end
  84.  
  85. function table.unique (tbl)
  86. local check = {}
  87. local res = {}
  88.  
  89. -- 整数型だけユニーク化
  90. for i, v in ipairs(tbl) do
  91. if not(check[v]) then
  92. check[v] = true
  93. res[1+#res] = v
  94. end
  95. end
  96.  
  97. -- キータイプはそのまま残す
  98. for k, v in pairs (tbl) do
  99. -- 整数以外
  100. if not (type(k)=="number" and k%1==0) then
  101. res[k] = v
  102. end
  103. end
  104. return res
  105. end
  106.  
  107. function arraytostring (ary)
  108. result = "["
  109. for i, elem in pairs(ary) do
  110. result = result .. elem .. ", "
  111. end
  112. return string.sub(result, 0, string.len(result) - 2) .. "]"
  113. end
  114.  
  115. function sleepConsideringDelay(func, delaySecond)
  116. local startTime = os.clock()
  117. func()
  118. local endTime = os.clock()
  119. local delta = endTime - startTime
  120. sleep(delaySecond - delta)
  121. end
  122.  
  123. function sampling()
  124. currentSample = {}
  125. for i=1, 16 do
  126. itemDetail = turtle.getItemDetail(i)
  127. if itemDetail then
  128. currentItemNum = currentSample[itemDetail['name']]
  129. if currentItemNum == nil then
  130. currentItemNum = 0
  131. end
  132. currentSample[itemDetail['name']] = currentItemNum + itemDetail['count']
  133. end
  134.  
  135. turtle.select(i)
  136. turtle.dropDown()
  137. end
  138. table.insert(samples, currentSample)
  139. end
  140.  
  141. function aggregate(samples)
  142. -- アイテム一覧をまずは出す
  143. items = {}
  144. for i, sample in pairs(samples) do
  145. for k, v in pairs(sample) do
  146. table.insert(items, k)
  147. end
  148. end
  149. items = table.unique(items)
  150.  
  151. -- アイテム毎に数を出す
  152. -- Key: ItemName
  153. -- Value: Array[Int]
  154. aggregatedItems = {}
  155. for i, item in pairs(items) do
  156. -- あるアイテムの数値配列を作成
  157. aggregatedItem = {}
  158. for j, sample in pairs(samples) do
  159. if sample[item] ~= nil then
  160. table.insert(aggregatedItem, sample[item])
  161. else
  162. table.insert(aggregatedItem, 0)
  163. end
  164. end
  165. -- あるアイテムの数値配列を格納
  166. aggregatedItems[item] = aggregatedItem
  167. end
  168.  
  169. return aggregatedItems
  170. end
  171.  
  172. function samplingAndAggregating()
  173. sampling()
  174. aggregatedItems = aggregate(samples)
  175.  
  176. term.clear()
  177. print(string.format("SamplingPeriod: %s Seconds", samplingPeriod))
  178.  
  179. for itemName, aggregatedItemNum in pairs(aggregatedItems) do
  180. avg = statistics_avg(aggregatedItemNum)
  181. std = statistics_stdev(aggregatedItemNum)
  182. min = statistics_meaningful_min(aggregatedItemNum, 2)
  183. max = statistics_meaningful_max(aggregatedItemNum, 2)
  184. print(string.format("===== %s =====", itemName ))
  185. print(string.format("Avg,Std,Min,Max=%s,%s,%s,%s", formatFloat(avg), formatFloat(std), formatFloat(min), formatFloat(max)))
  186. end
  187. end
  188.  
  189. function startSampling()
  190. while true do
  191. sleepConsideringDelay(samplingAndAggregating, samplingPeriod)
  192. end
  193. end
  194.  
  195.  
  196. startSampling()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement