Orchestration

Configuration lives in DenseLinker — an immutable value object with no data and nothing fitted. Prepared, per-dataset state lives in LinkageIndex, returned by index(). See Key concepts for the design-time / runtime split.

candidate_pairs_from_frame() builds the match_pairs() input — CandidatePair objects — from a DataFrame of candidate id-pairs and the two sources they reference.

DenseLinker

Pure config.

LinkageIndex

Prepared linkage state: a built BlockingIndex fused with a Matcher.

candidate_pairs_from_frame

Build CandidatePair objects from a frame of candidate id-pairs and the two sources they reference — the ergonomic input to DenseLinker.match_pairs when blocking happened elsewhere (rule-based / external / a join).