///|
/// Recover an actual maximum matching for the selected transversal elements.
/// Pairs are (left element ID, right vertex ID), ordered by right ID.
/// Unmatched elements are omitted; returned length equals the transversal rank.
pub fn transversal_assignment(
rights : Int32,
neighbors : Array[Array[Int32]],
subset : Array[Int32],
) -> Array[(Int32, Int32)] raise MatroidError {
let m = Matroid::transversal(rights, neighbors)
let selected = checked_set(m.size, subset)
let owned = neighbors.map(row => row.copy())
let matched = Array::make(rights, -1)
for e in selected {
augment_matching(e, owned, matched, Array::make(rights, false)) |> ignore
}
let pairs = []
for r = 0; r < rights; r = r + 1 {
if matched[r] >= 0 {
pairs.push((matched[r], r))
}
}
if pairs.length() != (m.evaluate)(selected) {
raise InvalidCertificate("transversal witness rank mismatch")
}
pairs
}