blob: 73b530c7c75b51044e6686751bf3c847b54bd1b1 [file] [log] [blame]
-- 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