Skip to content
AITroveRead. Build. Understand.
Make this comfortable

Direct and indirect exposure maps for branch rollouts

Last updated: 5 Oct 20265 min read
tutorial
AdvancedBy AITrove Editorial

An exposure map classifies each branch-period by its own rollout status and the rollout status of branches connected to it before outcomes are compared.

Define the interference boundary

North receives a triage screen in April. West shares staff and an overflow queue with North, so West may change even without the screen. A map built from pre-rollout staffing and routing records assigns each branch one of three states in a month: direct treatment, indirect exposure through a treated neighbor, or neither. This does not prove the map captures every channel. The comparison-pool lesson excludes indirectly exposed controls when estimating a direct contrast.

Keep the two effects distinct

A direct effect compares a branch with the screen against an otherwise comparable branch without the screen under a specified neighbor-exposure condition. An indirect effect compares untreated branches exposed to treated neighbors with untreated branches whose neighbors are also untreated. The populations, assumptions and actions differ. A rise in West’s breach rate caused by overflow would be an indirect effect, not a failure of North’s local workflow. Do not call one pooled treated-versus-untreated number both effects.

Freeze the network before assignment

The example uses an adjacency list created from pre-rollout operations. If a new queue route appears after the screen launches, using that later network to choose controls can condition on a consequence of treatment. Retain the pre-period map and separately audit actual post-rollout routing. A branch with several treated neighbors may need an exposure intensity rather than a binary flag; choose that mapping before inspecting outcomes.

Verify coverage and changes

For each month, count direct, indirect and unexposed branches. Every branch should occupy exactly one class. If all possible controls become indirectly exposed, a direct-effect comparison against unexposed branches has no support. A branch can move from unexposed to indirect when its neighbor adopts; its own adoption later moves it to direct. The spillover contrast uses the untreated categories only.

Do not assume a map identifies causality

Indirect exposure may be correlated with branch size, geography or staffing. Estimation needs a comparison trend argument or an assignment design, plus a stable outcome definition and no spillovers beyond the mapped boundary. Shared region shocks may make branches dependent even if the adjacency list has no edge. Report the map’s construction date and units with uncertain connections.

Implementation

python
def rollout_exposure(first_use_month, neighbors, month):
    if month <= 0 or set(first_use_month) != set(neighbors):
        raise ValueError("invalid month or incomplete network")
    branches = set(first_use_month)
    if any(branch in linked or not set(linked) <= branches
           for branch, linked in neighbors.items()):
        raise ValueError("invalid neighbor list")
    treated = {branch for branch, first_use in first_use_month.items()
               if first_use is not None and first_use <= month}
    exposure = {}
    for branch, linked in neighbors.items():
        if branch in treated:
            exposure[branch] = "direct"
        elif set(linked) & treated:
            exposure[branch] = "indirect"
        else:
            exposure[branch] = "unexposed"
    return exposure

first_use = {"North": 4, "West": None, "South": None, "Harbor": 6}
network = {"North": ["West"], "West": ["North"],
           "South": [], "Harbor": []}
states = rollout_exposure(first_use, network, 5)
assert states == {"North": "direct", "West": "indirect",
                  "South": "unexposed", "Harbor": "unexposed"}

Performance and operating cost

For B branches and E neighbor links, classification costs O(B + E) expected time and O(B) output space beyond the input map. A large routing network needs versioned adjacency storage and an audit of cross-boundary connections.

Common Mistakes

  • Do not infer that a branch is unexposed only from its own feature flag.
  • Do not build the primary comparison network from post-rollout traffic.
  • Do not combine direct and indirect effects without naming a new estimand.

Read next

Continue the workflow: A spillover difference-in-differences contrast.

ai-data
data-science
Storage details