nodesBySpaceId lets the tour planner pull the candidate set
for each space without rescanning the flat list — most planners
pick one viewpoint per visited space, so the per-space bucket is
the natural access pattern.
Viewpoints grouped by their owning SpaceGraphNode.id.
Empty arrays are valid — some spaces may have no usable
viewpoints (e.g. tiny utility closets the sampler couldn't
place a clearance-respecting camera in).
Collection of candidate viewpoints across every space in the source SpaceGraph. Produced by a ViewpointSampler and consumed by a TourPlanner.
nodesBySpaceIdlets the tour planner pull the candidate set for each space without rescanning the flat list — most planners pick one viewpoint per visited space, so the per-space bucket is the natural access pattern.