Skip to content

Commit

Permalink
clean up lua debugging
Browse files Browse the repository at this point in the history
  • Loading branch information
Emil Tin authored and daniel-j-h committed Jan 25, 2017
1 parent 47b1a56 commit 445225b
Show file tree
Hide file tree
Showing 4 changed files with 191 additions and 150 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -94,3 +94,6 @@ node_modules
/server.ini

*.swp

# local lua debugging file
debug.lua
150 changes: 0 additions & 150 deletions profiles/debug.lua

This file was deleted.

50 changes: 50 additions & 0 deletions profiles/debug_example.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
--
-- Example of how to use debug.lua to debug profiles in a pure lua environment.
-- It makes it easy to manually set tags, run the way processing and check the result.
--
-- To use, make a copy of this file and gitignore your copy. (If you use the name ndebug.lua,
-- it's already gitignored.)
--
-- You run your copy via the lua command line:
-- > cd profiles
-- > lua5.1 debug.lua
--
-- You can then modify the input tags and rerun the file to check the output.
--
-- TODO: there are a few helper methods that are implemented in C++, which are currently
-- just mocked as empty methods in LUA. Tag processing that uses these helpers will
-- not yet work correctly in this pure LUA debugging environment.


-- for better printing
local pprint = require('lib/pprint')

-- require the debug tool
local Debug = require('lib/profile_debugger')

-- load the profile we want to debug
Debug.load_profile('foot')

-- define some input tags. they would normally by extracted from OSM data,
-- but here we can set them manually which makes debugging the profile eaiser

local way = {
highway = 'primary',
name = 'Magnolia Boulevard',
["access:forward"] = 'no'
}

-- output will go here
local result = {}

-- call the way function
Debug.way_function(way,result)

-- print input and output
pprint(way)
print("=>")
pprint(result)
print("\n")

-- report what tags where fetched, and how many times
Debug.report_tag_fetches()
138 changes: 138 additions & 0 deletions profiles/lib/profile_debugger.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
-- Enable calling our lua profile code directly from the lua command line,
-- which makes it easier to debug.
-- We simulate the normal C++ environment by defining the required globals and functions.

-- See debug_example.lua for an example of how to require and use this file.

-- for more convenient printing of tables
local pprint = require('lib/pprint')


-- globals that are normally set from C++

-- profiles code modifies this table
properties = {}

-- should match values defined in include/extractor/guidance/road_classification.hpp
road_priority_class = {
motorway = 0,
trunk = 2,
primary = 4,
secondary = 6,
tertiary = 8,
main_residential = 10,
side_residential = 11,
link_road = 14,
bike_path = 16,
foot_path = 18,
connectivity = 31,
}

-- should match values defined in include/extractor/travel_mode.hpp
mode = {
inaccessible = 0,
driving = 1,
cycling = 2,
walking = 3,
ferry = 4,
train = 5,
pushing_bike = 6,
}

-- Mock C++ helper functions which are called from LUA.
-- TODO
-- Debugging LUA code that uses these will not work correctly
-- unless we reimplement the methods in LUA.

function durationIsValid(str)
return true
end

function parseDuration(str)
return 1
end

function canonicalizeStringList(str)
return str
end



-- debug helper
local Debug = {}

-- helpers for sorting associative array
function Debug.get_keys_sorted_by_value(tbl, sortFunction)
local keys = {}
for key in pairs(tbl) do
table.insert(keys, key)
end

table.sort(keys, function(a, b)
return sortFunction(tbl[a], tbl[b])
end)

return keys
end

-- helper for printing sorted array
function Debug.print_sorted(sorted,associative)
for _, key in ipairs(sorted) do
print(associative[key], key)
end
end

function Debug.report_tag_fetches()
print("Tag fetches:")
sorted_counts = Debug.get_keys_sorted_by_value(Debug.tags.counts, function(a, b) return a > b end)
Debug.print_sorted(sorted_counts, Debug.tags.counts)
print(Debug.tags.total, 'total')
end

function Debug.load_profile(profile)
require(profile)
end

function Debug.reset_tag_fetch_counts()
Debug.tags = {
total = 0,
counts = {}
}
end

function Debug.register_tag_fetch(k)
if Debug.tags.total then
Debug.tags.total = Debug.tags.total + 1
else
Debug['tags']['total'] = 1
end

if Debug['tags']['counts'][k] then
Debug['tags']['counts'][k] = Debug['tags']['counts'][k] + 1
else
Debug['tags']['counts'][k] = 1
end

end

function Debug.way_function(way,result)

-- setup result table
result.road_classification = {}
result.forward_speed = -1
result.backward_speed = -1

-- intercept tag function normally provided via C++
function way:get_value_by_key(k)
Debug.register_tag_fetch(k)
return self[k]
end

-- reset tag counts
Debug:reset_tag_fetch_counts()

-- call the global method defined in the profile file
way_function(way,result)
end

return Debug

0 comments on commit 445225b

Please sign in to comment.