arithmetic/src/linearalgebra/matrix/matrix.tmpl


%
%  Quake functions to instantiate operations on generic matrices.
%

readonly proc MatrixBasic (nm, rfield) is
  local vector   = nm & "Vector"
  local vrep     = nm & "VectorRep"
  local base     = nm & "Matrix"
  local impl     = base & "Basic"
  MatrixGeneral(nm, rfield, "Basic")
  build_generic_impl (impl, "MatrixBasic", [rfield, vector, vrep])
end

readonly proc MatrixFast (nm, rfield) is
  local vector   = nm & "Vector"
  local base     = nm & "Matrix"
  local impl     = base & "Fast"
  local support  = nm & "MatrixSupport"
  local decomp   = nm & "MatrixDecomposition"
  MatrixGeneral(nm, rfield, "Fast")
  build_generic_impl (impl, "MatrixFast", [rfield, vector, support, decomp])
end

readonly proc MatrixGeneral (nm, rfield, implsuf) is
  local vector   = nm & "Vector"
  local base     = nm & "Matrix"
  local support  = nm & "MatrixSupport"
  local impl     = base & implsuf
  build_generic_intf (impl, "Matrix" & implsuf, [rfield, vector, support], VISIBLE)
  build_generic_intf (base,    "Matrix",        [rfield, vector, support, impl], VISIBLE)
  build_generic_impl (base,    "Matrix",        [rfield, vector])
  build_generic_intf (support, "MatrixSupport", [rfield], VISIBLE)
  build_generic_impl (support, "MatrixSupport", [rfield])
end

readonly proc MatrixTrans (nm, field) is
  local rfield = field & "Basic"
  local rtrans = field & "Trans"
  local ctrans = nm & "Trans"
  local cvsup  = nm & "VectorRep"
  local mfield = nm & "Matrix"
  local mtrans = nm & "MatrixTrans"
  local eigen  = nm & "EigenSystem"
  build_generic_intf (mtrans, "MatrixTrans", [rfield,                        mfield], VISIBLE)
  build_generic_impl (mtrans, "MatrixTrans", [rfield, rtrans, ctrans, cvsup, mfield, eigen])
end

readonly proc MatrixDecomposition (nm, rfield) is
  local basic   = nm & "MatrixDecomposition"
  local rtrans  = nm & "Trans"
  local vector  = nm & "Vector"
  local vrep    = nm & "VectorRep"
  local mfield  = nm & "Matrix"
  build_generic_intf (basic, "MatrixDecomposition", [rfield,         vector, mfield], VISIBLE)
  build_generic_impl (basic, "MatrixDecomposition", [rfield, rtrans, vector, mfield])
end

readonly proc EigenSystem (nm, rfield, cfield) is
  local basic   = nm & "EigenSystem"
  local rtrans  = nm & "Trans"
  local vector  = nm & "Vector"
  local vrep    = nm & "VectorRep"
  local cvector = cfield & "Vector"
  local mfield  = nm & "Matrix"
  build_generic_intf (basic, "EigenSystem", [        rtrans, vector, cvector, mfield], VISIBLE)
  build_generic_impl (basic, "EigenSystem", [rfield, rtrans, vector, mfield])
end

readonly proc CharPolynomial (nm, rfield) is
  local basic   = nm & "CharPolynomial"
  local rtfield = nm & "Root"
  local mfield  = nm & "Matrix"
  build_generic_intf (basic, "CharPolynomial", [        rtfield, mfield], VISIBLE)
  build_generic_impl (basic, "CharPolynomial", [rfield, rtfield, mfield])
end

readonly proc MatrixFmtLex (nm, rfield) is
  local rfmt   = nm & "FmtLex"
  local vector = nm & "Vector"
  local vfmt   = nm & "VectorFmtLex"
  local mfield = nm & "Matrix"
  local mfmt   = nm & "MatrixFmtLex"
  build_generic_intf (mfmt, "MatrixFmtLex", [rfmt,               mfield], VISIBLE)
  build_generic_impl (mfmt, "MatrixFmtLex", [rfmt, vector, vfmt, mfield])
end