| Index: tools/lua/bbh_filter.lua
|
| diff --git a/tools/lua/bbh_filter.lua b/tools/lua/bbh_filter.lua
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..73b530c7c75b51044e6686751bf3c847b54bd1b1
|
| --- /dev/null
|
| +++ b/tools/lua/bbh_filter.lua
|
| @@ -0,0 +1,148 @@
|
| +-- bbh_filter.lua
|
| +--
|
| +-- This script outputs info about 'interesting' skp files,
|
| +-- where the definition of 'interesting' changes but is roughly:
|
| +-- "Interesting for bounding box hierarchy benchmarks."
|
| +--
|
| +-- Currently, the approach is to output, in equal ammounts, the names of the files that
|
| +-- have most commands, and the names of the files that use the least popular commands.
|
| +
|
| +function count_entries(table)
|
| + local count = 0
|
| + for _,_ in pairs(table) do
|
| + count = count + 1
|
| + end
|
| + return count
|
| +end
|
| +
|
| +verbCounts = {}
|
| +
|
| +function reset_current()
|
| + -- Data about the skp in transit
|
| + currentInfo = {
|
| + fileName = '',
|
| + verbs = {},
|
| + numOps = 0
|
| + }
|
| +end
|
| +reset_current()
|
| +
|
| +numOutputFiles = 10 -- This is per measure.
|
| +globalInfo = {} -- Saves currentInfo for each file to be used at the end.
|
| +output = {} -- Stores {fileName, {verb, count}} tables.
|
| +
|
| +function tostr(t)
|
| + local str = ""
|
| + for k, v in next, t do
|
| + if #str > 0 then
|
| + str = str .. ", "
|
| + end
|
| + if type(k) == "number" then
|
| + str = str .. "[" .. k .. "] = "
|
| + else
|
| + str = str .. tostring(k) .. " = "
|
| + end
|
| + if type(v) == "table" then
|
| + str = str .. "{ " .. tostr(v) .. " }"
|
| + else
|
| + str = str .. tostring(v)
|
| + end
|
| + end
|
| + return str
|
| +end
|
| +
|
| +function sk_scrape_startcanvas(c, fileName) end
|
| +
|
| +function sk_scrape_endcanvas(c, fileName)
|
| + globalInfo[fileName] = currentInfo
|
| + globalInfo[fileName].fileName = fileName
|
| + reset_current()
|
| +end
|
| +
|
| +function sk_scrape_accumulate(t)
|
| + -- dump the params in t, specifically showing the verb first, which we
|
| + -- then nil out so it doesn't appear in tostr()
|
| + --
|
| + verbCounts[t.verb] = (verbCounts[t.verb] or 0) + 1
|
| + currentInfo.verbs[t.verb] = (currentInfo.verbs[t.verb] or 0) + 1
|
| + currentInfo.numOps = currentInfo.numOps + 1
|
| +
|
| + t.verb = nil
|
| +end
|
| +
|
| +function sk_scrape_summarize()
|
| + verbWeights = {} -- {verb, weight}, where 0 < weight <= 1
|
| +
|
| + meta = {}
|
| + for k,v in pairs(verbCounts) do
|
| + table.insert(meta, {key=k, value=v})
|
| + end
|
| + table.sort(meta, function (a,b) return a.value > b.value; end)
|
| + maxValue = meta[1].value
|
| + io.write("-- ==================\n")
|
| + io.write("------------------------------------------------------------------ \n")
|
| + io.write("-- Command\t\t\tNumber of calls\t\tPopularity\n")
|
| + io.write("------------------------------------------------------------------ \n")
|
| + for k, v in pairs(meta) do
|
| + verbWeights[v.key] = v.value / maxValue
|
| +
|
| + -- Poor man's formatting:
|
| + local padding = "\t\t\t"
|
| + if (#v.key + 3) < 8 then
|
| + padding = "\t\t\t\t"
|
| + end
|
| + if (#v.key + 3) >= 16 then
|
| + padding = "\t\t"
|
| + end
|
| +
|
| + io.write ("-- ",v.key, padding, v.value, '\t\t\t', verbWeights[v.key], "\n")
|
| + end
|
| +
|
| + meta = {}
|
| + function calculate_weight(verbs)
|
| + local weight = 0
|
| + for name, count in pairs(verbs) do
|
| + weight = weight + (1 / verbWeights[name]) * count
|
| + end
|
| + return weight
|
| + end
|
| + for n, info in pairs(globalInfo) do
|
| + table.insert(meta, info)
|
| + end
|
| +
|
| + local visitedFiles = {}
|
| +
|
| + -- Prints out information in lua readable format
|
| + function output_with_metric(metric_func, description, numOutputFiles)
|
| + table.sort(meta, metric_func)
|
| + print(description)
|
| + local iter = 0
|
| + for i, t in pairs(meta) do
|
| + if not visitedFiles[t.fileName] then
|
| + visitedFiles[t.fileName] = true
|
| + io.write ("{\nname = \"", t.fileName, "\", \nverbs = {\n")
|
| + for verb,count in pairs(globalInfo[t.fileName].verbs) do
|
| + io.write(' ', verb, " = ", count, ",\n")
|
| + end
|
| + io.write("}\n},\n")
|
| +
|
| + iter = iter + 1
|
| + if iter >= numOutputFiles then
|
| + break
|
| + end
|
| + end
|
| + end
|
| + end
|
| +
|
| + output_with_metric(
|
| + function(a, b) return calculate_weight(a.verbs) > calculate_weight(b.verbs); end,
|
| + "\n-- ================== skps with calling unpopular commands.", 10)
|
| + output_with_metric(
|
| + function(a, b) return a.numOps > b.numOps; end,
|
| + "\n-- ================== skps with the most calls.", 50)
|
| +
|
| + local count = count_entries(visitedFiles)
|
| +
|
| + print ("-- Spat", count, "files")
|
| +end
|
| +
|
|
|