///|
/// Small dense matrix type used for low-dimensional covariance diagnostics.
pub struct SquareMatrix {
  size : Int
  data : Array[Double]
}

///|
pub fn SquareMatrix::new(size : Int, fill? : Double = 0.0) -> SquareMatrix {
  let safe_size = if size < 1 { 1 } else { size }
  { size: safe_size, data: Array::make(safe_size * safe_size, fill) }
}

///|
pub fn SquareMatrix::identity(size : Int) -> SquareMatrix {
  let matrix = SquareMatrix::new(size)
  for i in 0.. Int {
  self.size
}

///|
pub fn SquareMatrix::get(
  self : SquareMatrix,
  row : Int,
  column : Int,
) -> Double {
  if row < 0 || column < 0 || row >= self.size || column >= self.size {
    0.0
  } else {
    self.data[row * self.size + column]
  }
}

///|
pub fn SquareMatrix::set(
  self : SquareMatrix,
  row : Int,
  column : Int,
  value : Double,
) -> Unit {
  if row >= 0 && column >= 0 && row < self.size && column < self.size {
    self.data[row * self.size + column] = value
  }
}

///|
pub fn SquareMatrix::diagonal(self : SquareMatrix) -> Array[Double] {
  let result : Array[Double] = []
  for i in 0.. SquareMatrix {
  let result = SquareMatrix::new(self.size)
  for row in 0.. SquareMatrix {
  let size = if self.size < other.size { self.size } else { other.size }
  let result = SquareMatrix::new(size)
  for row in 0.. SquareMatrix {
  let result = SquareMatrix::new(self.size)
  for row in 0.. SquareMatrix {
  let size = if self.size < other.size { self.size } else { other.size }
  let result = SquareMatrix::new(size)
  for row in 0.. Double {
  let size = if vector.length() < self.size {
    vector.length()
  } else {
    self.size
  }
  let mut result = 0.0
  for row in 0.. Unit {
  for i in 0.. Double {
  if self.size == 1 {
    self.get(0, 0)
  } else if self.size == 2 {
    self.get(0, 0) * self.get(1, 1) - self.get(0, 1) * self.get(1, 0)
  } else {
    let mut determinant = 0.0
    for column in 0.. Double {
  let size = if vector.length() < means.length() {
    vector.length()
  } else {
    means.length()
  }
  let mut total = 0.0
  for i in 0..