///|
/// Receiver calibration, coordinate mapping and exact small-code cross-check.
fn main raise {
  let code = @moonldpc.hamming7().extend_even_parity()
  let encoder = @moonldpc.Encoder::new(code)
  let word = encoder.encode([1, 0, 1, 1]) catch { _ => abort("encode") }
  let mapping = @moonldpc.Permutation::new([7, 5, 3, 1, 6, 4, 2, 0]) catch {
    _ => abort("mapping")
  }
  let samples = mapping.apply(@moonldpc.bpsk(word) catch { _ => abort("bpsk") }) catch {
    _ => abort("map samples")
  }
  let variances = Array::make(8, 0.5)
  variances[0] = 2.0
  let channel = @moonldpc.awgn_llr_per_sample(samples, variances) catch {
    _ => abort("demap")
  }
  let aligned = mapping.inverse().apply(channel) catch { _ => abort("align") }
  let exact = encoder.decode_exact(aligned) catch { _ => abort("exact") }
  if exact.word != word {
    abort("laboratory regression")
  }
  let probabilities = @moonldpc.bit_one_probabilities(exact.posterior_llr) catch {
    _ => abort("probabilities")
  }
  println("laboratory: calibrated/interleaved extended Hamming frame recovered")
  println(exact.to_json().stringify())
  println(Json(probabilities).stringify())
}