///|
/// Greedily shorten a birth-time representative by adding boundaries of
/// available cells one dimension higher. Each accepted XOR preserves the
/// homology class and filtration scale, but does not guarantee a global minimum.
pub fn simplify_representative(
  analysis : Analysis,
  interval_index : Int,
) -> Array[Int] raise TopologyError {
  if interval_index < 0 || interval_index >= analysis.intervals.length() {
    raise TopologyError("representative interval index out of range")
  }
  let interval = analysis.intervals[interval_index]
  if interval.dimension != 1 && interval.dimension != 2 {
    raise TopologyError("representative simplification requires H1 or H2")
  }
  let cells = analysis.filtration.cells
  let mut chain = interval.representative.copy()
  chain.sort_by(fn(a, b) { a - b })
  let mut last = -1
  for index in chain {
    if index <= last ||
      index >= cells.length() ||
      index < 0 ||
      cells[index].dimension != interval.dimension ||
      cells[index].value > interval.birth {
      raise TopologyError("invalid representative for birth filtration")
    }
    last = index
  }
  let mut changed = true
  while changed {
    changed = false
    for cell in cells {
      if cell.dimension == interval.dimension + 1 &&
        cell.value <= interval.birth {
        let candidate = xor_columns(chain, cell.boundary)
        if candidate.length() < chain.length() {
          chain = candidate
          changed = true
        }
      }
    }
  }
  chain
}