Skip to content

Custom Cost Function

Custom Cost Function⚓︎

This section explains how to view and modify the Python cost function used to weight network edges.

For a list of all guides on the TCAT Wiki, refer to the Guides List.


Overview⚓︎

This is an experimental feature which may not always be enabled and made visible.

Advanced users can directly edit the Python code that computes the travel cost for each edge in the pedestrian network. This allows for highly customized walkshed calculations beyond what the standard preference sliders support.


Accessing the Editor⚓︎

Open the Cost Fn tab in the left sidebar. The current cost function is displayed and can be modified in place.

Press the Save button at the bottom of the sidebar tab to apply the changes to the cost function and recalculate the walkshed.


The Generator Pattern⚓︎

The editor does not accept a cost_fun function directly. Instead, the script must define a cost_fun_generator function. The tool calls cost_fun_generator with the current UI preference settings as arguments, and the generator must return the actual cost_fun(u, v, d) function used to evaluate each edge.

def cost_fun_generator(
    G,
    base_speed=1.3,
    downhill=0.1,
    uphill=0.085,
    avoidCurbs=False,
    avoidPrimaryStreet=False,
    avoidRailway=False,
    avoidBuses=False,
    avoidFlex=False,
    sidewalkScore=False,
    timestamp=None,
    streetAvoidance=1,
):
    def cost_fun(u, v, d):
        # ... evaluate edge d and return a cost or None
    return cost_fun

cost_fun_generator Parameters⚓︎

These parameters are passed automatically by the tool based on the current UI settings when the walkshed is calculated.

Parameter Type Description
G graph The full pedestrian network graph. Useful for advanced lookups across nodes and edges.
base_speed float Base movement speed in m/s, set by the selected mobility profile.
downhill float Maximum downhill grade as a decimal (e.g., 0.1 = 10%), from the Walkshed tab.
uphill float Maximum uphill grade as a decimal (e.g., 0.085 = 8.5%), from the Walkshed tab.
avoidCurbs bool Whether to avoid raised curbs and stairs, from the Walkshed tab.
avoidPrimaryStreet bool Whether to avoid primary road segments and adjacent sidewalks.
avoidRailway bool Whether to avoid railway edges.
avoidBuses bool Whether to avoid bus edges.
avoidFlex bool Whether to avoid flex edges.
sidewalkScore bool When True, calculate a Sidewalk Score (no road edges considered)
timestamp int | None Departure time as Unix epoch milliseconds, or None for the current time.
streetAvoidance float Street avoidance factor from 0 (no penalty) to 1 (prohibitive), from the Walkshed tab.

Return Value (cost_fun(u, v, d))⚓︎

The cost_fun_generator function must return another function that will compute the actual costs. This function is called once for every edge in the network. It must return either:

  • A non-negative float representing the cost (in seconds) of traversing the edge, or
  • None, which signals that the edge should be completely excluded from the walkshed (infinite cost).
Parameter Type Description
u int The ID of the incoming node.
v int The ID of the outgoing node.
d dict A dictionary of edge attributes (see below).

Key Edge Attributes (d)⚓︎

Key Type Description
length float Length of the edge in meters.
highway str OSW highway type (e.g., "footway", "residential", "steps").
incline float Grade of the edge as a decimal (e.g., 0.08 = 8% uphill).
footway str OSW footway type (e.g., "crossing" or "sidewalk").
curbramps bool Whether a crossing has curb ramps.
indoor str "yes" if the path is indoors.
opening_hours str OSM-format opening hours string for indoor paths.
street_highway str The highway type of the adjacent street, if this is a sidewalk edge.
is_closed int 1 if the edge is currently closed.
step_count int Number of steps on a steps edge.
pathway_mode int GTFS pathway mode (2 = stairs, 4 = escalator).

Default Speed and Cost Model⚓︎

The default cost function calculates cost as:

cost = street_cost_factor × (length / speed)

...where speed is derived from a modified version of Tobler's hiking function, an empirical model relating walking speed to slope. The base walking speeds used as starting points are:

Mode Base Speed
Walking 1.3 m/s
Manual wheelchair 0.6 m/s
Powered wheelchair 2.0 m/s

Steps edges use a fixed speed of 0.5 m/s regardless of incline.


Example: Exclude Edges Under Construction⚓︎

OpenSidewalks datasets may include custom extension attributes prefixed with ext:. This example excludes any edge tagged with ext:construction=yes:

def cost_fun_generator(
    G,
    base_speed=1.3,
    downhill=0.1,
    uphill=0.085,
    avoidCurbs=False,
    avoidPrimaryStreet=False,
    avoidRailway=False,
    avoidBuses=False,
    avoidFlex=False,
    sidewalkScore=False,
    timestamp=None,
    streetAvoidance=1,
):
    def cost_fun(u, v, d):
        if d.get("ext:construction") == "yes":
            return None
        # ... rest of default logic
    return cost_fun

Example: Customize the Penalty for Crossings⚓︎

def cost_fun_generator(
    G,
    base_speed=1.3,
    downhill=0.1,
    uphill=0.085,
    avoidCurbs=False,
    avoidPrimaryStreet=False,
    avoidRailway=False,
    avoidBuses=False,
    avoidFlex=False,
    sidewalkScore=False,
    timestamp=None,
    streetAvoidance=1,
):
    def cost_fun(u, v, d):
        if d.get("footway") == "crossing":
            if avoidCurbs:
                if "curbramps" in d:
                    if not d["curbramps"]:
                        return None
                else:
                    return None
            length = d["length"]
            # 60-second penalty instead of the default 30
            return (length / base_speed) + 60
        # ... rest of default logic
    return cost_fun

Previous: Walkshed Information & Sidewalk Score

Return: Walksheds User Manual