///|
// =====================================================================
// diag.mbt — 對角矩陣空間 Diag(n) ≅ R^n(逐點運算)
// =====================================================================

/// D-1 對角空間維數
pub fn diag_dim(n : Int) -> Int {
  n
}

/// D-2 對角加法(逐點)
pub fn diag_add(a : Array[Double], b : Array[Double]) -> Array[Double] {
  euc_add(a, b)
}

/// D-3 對角純量乘法
pub fn diag_scale(c : Double, a : Array[Double]) -> Array[Double] {
  euc_scale(c, a)
}

/// D-4 對角矩陣乘法 ≙ 逐點積
pub fn diag_mul(a : Array[Double], b : Array[Double]) -> Array[Double] {
  euc_hadamard(a, b)
}

/// D-5 對角內積 ≙ Σ aᵢbᵢ(Frobenius 內積的限制)
pub fn diag_inner(a : Array[Double], b : Array[Double]) -> Double {
  euc_inner(a, b)
}

/// D-6 作用於向量:diag(a)·x
pub fn diag_apply(a : Array[Double], x : Array[Double]) -> Array[Double] {
  euc_hadamard(a, x)
}

/// D-7 行列式 = 對角線之積
pub fn diag_det(a : Array[Double]) -> Double {
  let mut p = 1.0
  for x in a {
    p = p * x
  }
  p
}

/// D-8 逆(無零分量時)
pub fn diag_inv(a : Array[Double]) -> Option[Array[Double]] {
  let mut ok = true
  for x in a {
    if x == 0.0 {
      ok = false
    }
  }
  if !ok {
    Option::None
  } else {
    let out : Array[Double] = []
    for x in a {
      out.push(1.0 / x)
    }
    Some(out)
  }
}

/// D-9 轉為完整矩陣(與 Diag(n) → M_n 之嵌入)
pub fn diag_to_mat(a : Array[Double]) -> Mat {
  mat_diag(a)
}

/// D-10 Diag(n) 內積空間字典
pub fn diag_ip(n : Int) -> IPSp[Array[Double]] {
  ips_make(euc_sp(n), diag_inner)
}

/// D-11 譜半徑(對角矩陣之算子範數)
pub fn diag_spectral_radius(a : Array[Double]) -> Double {
  euc_inf_norm(a)
}

/// D-12 跡 = 分量和
pub fn diag_trace(a : Array[Double]) -> Double {
  euc_sum(a)
}