clean up lua debugging
This commit is contained in:
parent
47b1a56b12
commit
445225bf6d
3
.gitignore
vendored
3
.gitignore
vendored
@ -94,3 +94,6 @@ node_modules
|
|||||||
/server.ini
|
/server.ini
|
||||||
|
|
||||||
*.swp
|
*.swp
|
||||||
|
|
||||||
|
# local lua debugging file
|
||||||
|
debug.lua
|
@ -1,150 +0,0 @@
|
|||||||
-- 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.
|
|
||||||
|
|
||||||
-- Usage:
|
|
||||||
-- > cd profiles
|
|
||||||
-- > lua5.1 debug.lua
|
|
||||||
|
|
||||||
|
|
||||||
-- 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,
|
|
||||||
}
|
|
||||||
|
|
||||||
-- input tags, normally extracted from OSM data
|
|
||||||
local way = {
|
|
||||||
--highway = 'footway',
|
|
||||||
amenity = 'parking',
|
|
||||||
name = 'Hyper Drive',
|
|
||||||
--foot = 'yes',
|
|
||||||
--oneway = 'yes',
|
|
||||||
--access = 'no'
|
|
||||||
--["access:forward"] = 'no'
|
|
||||||
--width = '3',
|
|
||||||
--maxspeed = '30',
|
|
||||||
--['maxspeed:advisory'] = '25',
|
|
||||||
--service = 'alley',
|
|
||||||
--['oneway:bicycle'] = 'yes',
|
|
||||||
--junction = 'roundabout',
|
|
||||||
--['name:pronunciation'] = 'fuerloong',
|
|
||||||
--route = 'ferry',
|
|
||||||
--duration = '00:01:00',
|
|
||||||
--hov = 'designated',
|
|
||||||
--hov:lanes:forward"] = 'designated',
|
|
||||||
--destination = 'Berlin',
|
|
||||||
--["destination:ref"] = 'Nuremberg',
|
|
||||||
--["destination:ref:forward"] = 'Hamburg;Dresden',
|
|
||||||
}
|
|
||||||
-- tag function normally provided via C++
|
|
||||||
function way:get_value_by_key(k)
|
|
||||||
if not self['_debug'] then
|
|
||||||
self['_debug'] = {
|
|
||||||
_counts = {}
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
if self['_debug']['_total'] then
|
|
||||||
self['_debug']['_total'] = self['_debug']['_total'] + 1
|
|
||||||
else
|
|
||||||
self['_debug']['_total'] = 1
|
|
||||||
end
|
|
||||||
|
|
||||||
if self['_debug']['_counts'][k] then
|
|
||||||
self['_debug']['_counts'][k] = self['_debug']['_counts'][k] + 1
|
|
||||||
else
|
|
||||||
self['_debug']['_counts'][k] = 1
|
|
||||||
end
|
|
||||||
|
|
||||||
return self[k]
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Mock C++ helper functions which are called from LUA.
|
|
||||||
-- FIXME
|
|
||||||
-- Debugging LUA code that uses these will not work correctly
|
|
||||||
-- unless we reimplement themethods in LUA.
|
|
||||||
|
|
||||||
function durationIsValid(str)
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
function parseDuration(str)
|
|
||||||
return 1
|
|
||||||
end
|
|
||||||
|
|
||||||
function canonicalizeStringList(str)
|
|
||||||
return str
|
|
||||||
end
|
|
||||||
|
|
||||||
-- helpers for sorting associative array
|
|
||||||
function 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 print_sorted(sorted,associative)
|
|
||||||
for _, key in ipairs(sorted) do
|
|
||||||
print(associative[key], key)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- start state of result table, normally set form C++
|
|
||||||
local result = {
|
|
||||||
road_classification = {},
|
|
||||||
forward_speed = -1,
|
|
||||||
backward_speed = -1,
|
|
||||||
}
|
|
||||||
|
|
||||||
-- the profile we want to debug
|
|
||||||
require("foot")
|
|
||||||
|
|
||||||
-- call the way function
|
|
||||||
way_function(way,result)
|
|
||||||
|
|
||||||
-- and print the output
|
|
||||||
pprint(way)
|
|
||||||
print("=>")
|
|
||||||
pprint(result)
|
|
||||||
print("\n")
|
|
||||||
--print("Tag fetches:")
|
|
||||||
--sorted_counts = get_keys_sorted_by_value(way._debug._counts, function(a, b) return a > b end)
|
|
||||||
--print_sorted(sorted_counts, way._debug._counts)
|
|
||||||
--print(way._debug._total, 'total')
|
|
50
profiles/debug_example.lua
Normal file
50
profiles/debug_example.lua
Normal file
@ -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
profiles/lib/profile_debugger.lua
Normal file
138
profiles/lib/profile_debugger.lua
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user