refactor: remove unnecessary class static access

This commit is contained in:
h z
2024-12-12 11:08:29 +00:00
parent 0c3bd83eaa
commit a4a3a5f5ba
9 changed files with 50 additions and 72 deletions

View File

@@ -489,7 +489,7 @@ public abstract class Matrix<TScalar, TVector, TMatrix> : Matrix<TVector, TMatri
/// <returns></returns> /// <returns></returns>
public virtual TScalar Trace() public virtual TScalar Trace()
{ {
TScalar res = StaticAccess<TScalar>.AdditionUnit; TScalar res = Structure.AdditionUnit;
for (int i = 1; i <= Dim; i++) for (int i = 1; i <= Dim; i++)
res = Structure.Addition(res, this[i, i]); res = Structure.Addition(res, this[i, i]);
return res; return res;
@@ -932,9 +932,10 @@ public abstract class Matrix<TScalar, TVector, TMatrix> : Matrix<TVector, TMatri
for (int r = 1; r <= Dim; r++) for (int r = 1; r <= Dim; r++)
{ {
int p = 1; int p = 1;
while (p < Dim && Structure.IsEqualApprox(res[r, p], StaticAccess<TScalar>.AdditionUnit))
while (p < Dim && Structure.IsEqualApprox(res[r, p], Structure.AdditionUnit))
p += 1; p += 1;
if (!Structure.IsEqualApprox(res[r, p], StaticAccess<TScalar>.AdditionUnit)) if (!Structure.IsEqualApprox(res[r, p], Structure.AdditionUnit))
{ {
pivotCol.Add(p); pivotCol.Add(p);
conj[r] = conj[r] / res[r, p]; conj[r] = conj[r] / res[r, p];
@@ -1090,7 +1091,7 @@ public abstract class Matrix<TScalar, TVector, TMatrix> : Matrix<TVector, TMatri
void ScaleToUnit(int i, int j) void ScaleToUnit(int i, int j)
{ {
TScalar scale = u[i, j]; TScalar scale = u[i, j];
if (Structure.IsEqualApprox(scale, StaticAccess<TScalar>.AdditionUnit)) if (Structure.IsEqualApprox(scale, Structure.AdditionUnit))
return; return;
u[i] /= scale; u[i] /= scale;
l[i, false] *= scale; l[i, false] *= scale;
@@ -1101,7 +1102,7 @@ public abstract class Matrix<TScalar, TVector, TMatrix> : Matrix<TVector, TMatri
{ {
bool pivotNotFound = Structure.IsEqualApprox( bool pivotNotFound = Structure.IsEqualApprox(
u[i, i], u[i, i],
StaticAccess<TScalar>.AdditionUnit Structure.AdditionUnit
); );
for (int j = i; j <= Dim; j++) for (int j = i; j <= Dim; j++)
{ {
@@ -1110,7 +1111,7 @@ public abstract class Matrix<TScalar, TVector, TMatrix> : Matrix<TVector, TMatri
pivotNotFound && pivotNotFound &&
!Structure.IsEqualApprox( !Structure.IsEqualApprox(
u[j, i], u[j, i],
StaticAccess<TScalar>.AdditionUnit Structure.AdditionUnit
) )
) )
{ {
@@ -1120,10 +1121,10 @@ public abstract class Matrix<TScalar, TVector, TMatrix> : Matrix<TVector, TMatri
} }
if (pivotNotFound) if (pivotNotFound)
det = StaticAccess<TScalar>.AdditionUnit; det = Structure.AdditionUnit;
for (int j = i + 1; j <= Dim; j++) for (int j = i + 1; j <= Dim; j++)
{ {
if (Structure.IsEqualApprox(u[j, i], StaticAccess<TScalar>.AdditionUnit)) if (Structure.IsEqualApprox(u[j, i], Structure.AdditionUnit))
continue; continue;
u[j] -= u[i]; u[j] -= u[i];
l[i, false] += l[j, false]; l[i, false] += l[j, false];
@@ -1149,7 +1150,7 @@ public abstract class Matrix<TScalar, TVector, TMatrix> : Matrix<TVector, TMatri
TVector ei = id[i]; TVector ei = id[i];
TVector x = qia[i, false].UpTruncateBy(i - 1); TVector x = qia[i, false].UpTruncateBy(i - 1);
TScalar alpha = TScalar alpha =
Structure.IsEqualApprox(Structure.Abs(x[i]), StaticAccess<TScalar>.AdditionUnit) Structure.IsEqualApprox(Structure.Abs(x[i]), Structure.AdditionUnit)
? Structure.MultiplicationUnit ? Structure.MultiplicationUnit
: Structure.Division(x[i], Structure.Abs(x[i])); : Structure.Division(x[i], Structure.Abs(x[i]));
alpha = Structure.RealMul(alpha, x.Magnitude); alpha = Structure.RealMul(alpha, x.Magnitude);
@@ -1157,7 +1158,7 @@ public abstract class Matrix<TScalar, TVector, TMatrix> : Matrix<TVector, TMatri
TVector vi = ui.Normalize; TVector vi = ui.Normalize;
TScalar dm = vi.Conj() * x; TScalar dm = vi.Conj() * x;
TScalar omg = Structure.Division(x.Conj() * vi, dm); TScalar omg = Structure.Division(x.Conj() * vi, dm);
if (Structure.IsEqualApprox(dm, StaticAccess<TScalar>.AdditionUnit)) if (Structure.IsEqualApprox(dm, Structure.AdditionUnit))
omg = Structure.MultiplicationUnit; omg = Structure.MultiplicationUnit;
TMatrix qi = TMatrix qi =
id - Structure.Addition( id - Structure.Addition(
@@ -1207,7 +1208,7 @@ public abstract class Matrix<TScalar, TVector, TMatrix> : Matrix<TVector, TMatri
TMatrix res = Copy(); TMatrix res = Copy();
for (int i = 1; i <= d; i++) for (int i = 1; i <= d; i++)
for (int j = 1; j <= d; j++) for (int j = 1; j <= d; j++)
res[i, j] = StaticAccess<TScalar>.AdditionUnit; res[i, j] = Structure.AdditionUnit;
return res; return res;
} }
@@ -1223,7 +1224,7 @@ public abstract class Matrix<TScalar, TVector, TMatrix> : Matrix<TVector, TMatri
int dim = Dim; int dim = Dim;
for (int i = d; i <= dim; i++) for (int i = d; i <= dim; i++)
for (int j = d; j <= dim; j++) for (int j = d; j <= dim; j++)
res[i, j] = StaticAccess<TScalar>.AdditionUnit; res[i, j] = Structure.AdditionUnit;
return res; return res;
} }
@@ -1238,7 +1239,7 @@ public abstract class Matrix<TScalar, TVector, TMatrix> : Matrix<TVector, TMatri
for (int r = i; r >= 1; r--) for (int r = i; r >= 1; r--)
{ {
if (Structure.IsEqualApprox(this[i, i], this[r, r])) if (Structure.IsEqualApprox(this[i, i], this[r, r]))
col[r] = StaticAccess<TScalar>.MultiplicationUnit; col[r] = Structure.MultiplicationUnit;
else else
col[r] = Structure.Division( col[r] = Structure.Division(
Structure.AdditionInverse(col * this[r]), Structure.AdditionInverse(col * this[r]),

View File

@@ -22,13 +22,13 @@ public class MatrixProperty<TScalar, TVector, TMatrix>
/// M[i, j] = 0 if i!= j /// M[i, j] = 0 if i!= j
/// </summary> /// </summary>
public bool IsDiagonal => Mat.OffDiagonals public bool IsDiagonal => Mat.OffDiagonals
.All(x => Structure.IsEqualApprox(x, StaticAccess<TScalar>.AdditionUnit)); .All(x => Structure.IsEqualApprox(x, Structure.AdditionUnit));
/// <summary> /// <summary>
/// exist of inv(M) /// exist of inv(M)
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public bool IsInvertible => !Structure.IsEqualApprox(Mat.Det(), StaticAccess<TScalar>.AdditionUnit); public bool IsInvertible => !Structure.IsEqualApprox(Mat.Det(), Structure.AdditionUnit);
/// <summary> /// <summary>
/// M M* = M* M /// M M* = M* M
@@ -49,7 +49,7 @@ public class MatrixProperty<TScalar, TVector, TMatrix>
{ {
for (int i = 2; i <= Mat.Dim; i++) for (int i = 2; i <= Mat.Dim; i++)
for (int j = 1; j < i; j++) for (int j = 1; j < i; j++)
if (!Structure.IsEqualApprox(Mat[i, j], StaticAccess<TScalar>.AdditionUnit)) if (!Structure.IsEqualApprox(Mat[i, j], Structure.AdditionUnit))
return false; return false;
return true; return true;
} }
@@ -64,7 +64,7 @@ public class MatrixProperty<TScalar, TVector, TMatrix>
{ {
for (int i = 1; i <= Mat.Dim; i++) for (int i = 1; i <= Mat.Dim; i++)
for (int j = i + 1; j <= Mat.Dim; j++) for (int j = i + 1; j <= Mat.Dim; j++)
if (!Structure.IsEqualApprox(Mat[i, j], StaticAccess<TScalar>.AdditionUnit)) if (!Structure.IsEqualApprox(Mat[i, j], Structure.AdditionUnit))
return false; return false;
return true; return true;
} }
@@ -83,7 +83,7 @@ public class MatrixProperty<TScalar, TVector, TMatrix>
/// <summary> /// <summary>
/// tr(M) = 0 /// tr(M) = 0
/// </summary> /// </summary>
public bool IsTraceless => Structure.IsEqualApprox(Mat.Trace(), StaticAccess<TScalar>.AdditionUnit); public bool IsTraceless => Structure.IsEqualApprox(Mat.Trace(), Structure.AdditionUnit);
/// <summary> /// <summary>
/// M M^T = I /// M M^T = I

View File

@@ -41,8 +41,8 @@ public partial class CategoryOf<TDimension>
{ {
for (int j = i + 1; j <= Dim; j++) for (int j = i + 1; j <= Dim; j++)
{ {
this[i, j] = StaticAccess<TScalar>.AdditionUnit; this[i, j] = Structure.AdditionUnit;
this[j, i] = StaticAccess<TScalar>.AdditionUnit; this[j, i] = Structure.AdditionUnit;
} }
} }
base.Fix(); base.Fix();

View File

@@ -80,8 +80,8 @@ public partial class CategoryOf<TDimension>
{ {
for (int j = 1 + 1; j <= FDim; j++) for (int j = 1 + 1; j <= FDim; j++)
{ {
this[i, j] = StaticAccess<TScalar>.AdditionUnit; this[i, j] = Structure.AdditionUnit;
this[j, i] = StaticAccess<TScalar>.AdditionUnit; this[j, i] = Structure.AdditionUnit;
} }
} }
InternalFix(); InternalFix();

View File

@@ -26,16 +26,9 @@ public abstract class FieldStructure<TScalar> : FieldStructure
return (RealFieldStructure.Structure as FieldStructure<TScalar>)!; return (RealFieldStructure.Structure as FieldStructure<TScalar>)!;
if (typeof(TScalar) == typeof(Complex)) if (typeof(TScalar) == typeof(Complex))
return (ComplexFieldStructure.Structure as FieldStructure<TScalar>)!; return (ComplexFieldStructure.Structure as FieldStructure<TScalar>)!;
return ScalarFieldStructureProvider.GetOperation<TScalar>(); return FieldStructureRegistry.GetOperation<TScalar>();
}
/// <inheritdoc />
public FieldStructure()
{
StaticAccess<TScalar>.AdditionUnit = AdditionUnit;
StaticAccess<TScalar>.MultiplicationUnit = MultiplicationUnit;
StaticAccess<TScalar>.Structure = this;
} }
/// <summary> /// <summary>
/// addition in field /// addition in field

View File

@@ -3,17 +3,24 @@ namespace Skeleton.Algebra.ScalarFieldStructure;
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public static class ScalarFieldStructureProvider public static class FieldStructureRegistry
{ {
/// <summary> /// <summary>
/// Register customer field structure /// Register customer field structure
/// </summary> /// </summary>
/// <param name="structure"></param> /// <param name="structure"></param>
/// <typeparam name="TScalar"></typeparam> /// <typeparam name="TScalar"></typeparam>
public static void Register<TScalar>(FieldStructure<TScalar> structure) public static void Register<TScalar>(FieldStructure<TScalar> structure)
=> Cache[typeof(TScalar)] = structure; => FieldStructureRegistry<TScalar>.Structure = structure;
internal static FieldStructure<TScalar> GetOperation<TScalar>()
=> FieldStructureRegistry<TScalar>.Structure;
}
internal static class FieldStructureRegistry<TScalar>
{
internal static FieldStructure<TScalar> Structure { get; set; }
}
internal static FieldStructure<TScalar> GetOperation<TScalar>()
=> (Cache[typeof(TScalar)] as FieldStructure<TScalar>)!;
private static readonly Dictionary<Type, FieldStructure> Cache = new ();
}

View File

@@ -1,23 +0,0 @@
namespace Skeleton.Algebra.ScalarFieldStructure;
/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
public static class StaticAccess<T>
{
/// <summary>
///
/// </summary>
public static T AdditionUnit { get; set; }
/// <summary>
///
/// </summary>
public static T MultiplicationUnit { get; set; }
/// <summary>
///
/// </summary>
public static FieldStructure<T> Structure { get; set; }
}

View File

@@ -115,7 +115,7 @@ public static partial class CategoryOf<TDimension>
protected override TScalar Dot(FVector other) protected override TScalar Dot(FVector other)
{ {
TScalar res = StaticAccess<TScalar>.AdditionUnit; TScalar res = Structure.AdditionUnit;
for (int i = 1; i <= FDim; i++) for (int i = 1; i <= FDim; i++)
res = FieldStructure.Addition(res, FieldStructure.Multiplication(this[i], other[i])); res = FieldStructure.Addition(res, FieldStructure.Multiplication(this[i], other[i]));
return res; return res;

View File

@@ -197,7 +197,7 @@ public abstract class Vector<TScalar, TVector> : Vector<TVector>, IEnumerable<TS
{ {
Elements = new TScalar[Dim]; Elements = new TScalar[Dim];
for (int i = 1; i <= Dim; i++) for (int i = 1; i <= Dim; i++)
Elements[i] = StaticAccess<TScalar>.AdditionUnit; Elements[i] = Structure.AdditionUnit;
} }
@@ -272,15 +272,15 @@ public abstract class Vector<TScalar, TVector> : Vector<TVector>, IEnumerable<TS
public bool IsLinearDependantWith(TVector v) public bool IsLinearDependantWith(TVector v)
{ {
bool started = false; bool started = false;
TScalar comDiv = StaticAccess<TScalar>.AdditionUnit; TScalar comDiv = Structure.AdditionUnit;
for (int i = 1; i <= v.Dim; i++) for (int i = 1; i <= v.Dim; i++)
{ {
if ( if (
Structure.IsEqualApprox(v[i], StaticAccess<TScalar>.AdditionUnit) && Structure.IsEqualApprox(v[i], Structure.AdditionUnit) &&
Structure.IsEqualApprox(this[i], StaticAccess<TScalar>.AdditionUnit) Structure.IsEqualApprox(this[i], Structure.AdditionUnit)
) )
continue; continue;
if (Structure.IsEqualApprox(v[i], StaticAccess<TScalar>.AdditionUnit)) if (Structure.IsEqualApprox(v[i], Structure.AdditionUnit))
return false; return false;
TScalar ratio = Structure.Division(this[i], v[i]); TScalar ratio = Structure.Division(this[i], v[i]);
if (!started) if (!started)
@@ -345,7 +345,7 @@ public abstract class Vector<TScalar, TVector> : Vector<TVector>, IEnumerable<TS
get get
{ {
for (int i = 0; i <= Dim; i++) for (int i = 0; i <= Dim; i++)
if (!Structure.IsEqualApprox(Elements[^(i + 1)], StaticAccess<TScalar>.AdditionUnit)) if (!Structure.IsEqualApprox(Elements[^(i + 1)], Structure.AdditionUnit))
return i; return i;
return Dim; return Dim;
} }
@@ -356,7 +356,7 @@ public abstract class Vector<TScalar, TVector> : Vector<TVector>, IEnumerable<TS
get get
{ {
for(int i = 0;i<Dim; i++) for(int i = 0;i<Dim; i++)
if (!Structure.IsEqualApprox(Elements[i], StaticAccess<TScalar>.AdditionUnit)) if (!Structure.IsEqualApprox(Elements[i], Structure.AdditionUnit))
return i; return i;
return Dim; return Dim;
} }
@@ -462,7 +462,7 @@ public abstract class Vector<TScalar, TVector> : Vector<TVector>, IEnumerable<TS
get get
{ {
TVector res = new(); TVector res = new();
res.Elements = Enumerable.Range(0, Dim).Select(_ => StaticAccess<TScalar>.AdditionUnit).ToArray(); res.Elements = Enumerable.Range(0, Dim).Select(_ => Structure.AdditionUnit).ToArray();
return res; return res;
} }
} }
@@ -478,7 +478,7 @@ public abstract class Vector<TScalar, TVector> : Vector<TVector>, IEnumerable<TS
{ {
TVector res = Copy(); TVector res = Copy();
for (int i = 1; i <= d; i++) for (int i = 1; i <= d; i++)
res[i] = StaticAccess<TScalar>.AdditionUnit; res[i] = Structure.AdditionUnit;
return res; return res;
} }
@@ -492,7 +492,7 @@ public abstract class Vector<TScalar, TVector> : Vector<TVector>, IEnumerable<TS
{ {
TVector res = Copy(); TVector res = Copy();
for (int i = d; i < Dim; i++) for (int i = d; i < Dim; i++)
res[i] = StaticAccess<TScalar>.AdditionUnit; res[i] = Structure.AdditionUnit;
return res; return res;
} }