Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- サンプリング周期
- samplingPeriod = 10
- -- samplingPeriod毎に期間を区切った、通ったアイテムの数を格納したDictのリスト
- samples = {}
- function formatFloat(n)
- local myNumString = tostring(n)
- if string.match(myNumString, "%.") then
- myNumString = myNumString.."0"
- else
- myNumString = myNumString..".00"
- end
- local myFloatString = string.match(myNumString, "^(%d+%.%d%d)")
- return myFloatString
- end
- function statistics_avg(samples)
- sum = 0
- for i, v in pairs(samples) do
- sum = sum + v
- end
- return sum / table.maxn(samples)
- end
- function statistics_variance(samples)
- avg = statistics_avg(samples)
- variance_n = 0
- for i, v in pairs(samples) do
- variance_n = variance_n + math.pow(v - avg, 2)
- end
- return variance_n / table.maxn(samples)
- end
- function statistics_stdev(samples)
- return math.sqrt(statistics_variance(samples))
- end
- function statistics_min(samples)
- min = 100000000000
- for i, v in pairs(samples) do
- if v < min then
- min = v
- end
- end
- return min
- end
- function statistics_max(samples)
- max = -100000000000
- for i, v in pairs(samples) do
- if v > max then
- max = v
- end
- end
- return max
- end
- function statistics_meaningful_min(samples, sigma)
- avg = statistics_avg(samples)
- variance = statistics_variance(samples)
- meaningful_samples = {}
- for i, v in pairs(samples) do
- if math.abs(v - avg) <= variance * sigma then
- table.insert(meaningful_samples, v)
- end
- end
- return statistics_min(meaningful_samples)
- end
- function statistics_meaningful_max(samples, sigma)
- avg = statistics_avg(samples)
- variance = statistics_variance(samples)
- meaningful_samples = {}
- for i, v in pairs(samples) do
- if math.abs(v - avg) <= variance * sigma then
- table.insert(meaningful_samples, v)
- end
- end
- return statistics_max(meaningful_samples)
- end
- function table.unique (tbl)
- local check = {}
- local res = {}
- -- 整数型だけユニーク化
- for i, v in ipairs(tbl) do
- if not(check[v]) then
- check[v] = true
- res[1+#res] = v
- end
- end
- -- キータイプはそのまま残す
- for k, v in pairs (tbl) do
- -- 整数以外
- if not (type(k)=="number" and k%1==0) then
- res[k] = v
- end
- end
- return res
- end
- function arraytostring (ary)
- result = "["
- for i, elem in pairs(ary) do
- result = result .. elem .. ", "
- end
- return string.sub(result, 0, string.len(result) - 2) .. "]"
- end
- function sleepConsideringDelay(func, delaySecond)
- local startTime = os.clock()
- func()
- local endTime = os.clock()
- local delta = endTime - startTime
- sleep(delaySecond - delta)
- end
- function sampling()
- currentSample = {}
- for i=1, 16 do
- itemDetail = turtle.getItemDetail(i)
- if itemDetail then
- currentItemNum = currentSample[itemDetail['name']]
- if currentItemNum == nil then
- currentItemNum = 0
- end
- currentSample[itemDetail['name']] = currentItemNum + itemDetail['count']
- end
- turtle.select(i)
- turtle.dropDown()
- end
- table.insert(samples, currentSample)
- end
- function aggregate(samples)
- -- アイテム一覧をまずは出す
- items = {}
- for i, sample in pairs(samples) do
- for k, v in pairs(sample) do
- table.insert(items, k)
- end
- end
- items = table.unique(items)
- -- アイテム毎に数を出す
- -- Key: ItemName
- -- Value: Array[Int]
- aggregatedItems = {}
- for i, item in pairs(items) do
- -- あるアイテムの数値配列を作成
- aggregatedItem = {}
- for j, sample in pairs(samples) do
- if sample[item] ~= nil then
- table.insert(aggregatedItem, sample[item])
- else
- table.insert(aggregatedItem, 0)
- end
- end
- -- あるアイテムの数値配列を格納
- aggregatedItems[item] = aggregatedItem
- end
- return aggregatedItems
- end
- function samplingAndAggregating()
- sampling()
- aggregatedItems = aggregate(samples)
- term.clear()
- print(string.format("SamplingPeriod: %s Seconds", samplingPeriod))
- for itemName, aggregatedItemNum in pairs(aggregatedItems) do
- avg = statistics_avg(aggregatedItemNum)
- std = statistics_stdev(aggregatedItemNum)
- min = statistics_meaningful_min(aggregatedItemNum, 2)
- max = statistics_meaningful_max(aggregatedItemNum, 2)
- print(string.format("===== %s =====", itemName ))
- print(string.format("Avg,Std,Min,Max=%s,%s,%s,%s", formatFloat(avg), formatFloat(std), formatFloat(min), formatFloat(max)))
- end
- end
- function startSampling()
- while true do
- sleepConsideringDelay(samplingAndAggregating, samplingPeriod)
- end
- end
- startSampling()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement