diff --git a/Skeleton.csproj b/Skeleton.csproj
index 7782305..4fe1078 100644
--- a/Skeleton.csproj
+++ b/Skeleton.csproj
@@ -4,7 +4,7 @@
net8.0
enable
disable
- 0.0.6
+ 0.0.7
hzhang
true
diff --git a/src/Algebra/CategoryOf.cs b/src/Algebra/CategoryOf.cs
index d23932c..faeb12c 100644
--- a/src/Algebra/CategoryOf.cs
+++ b/src/Algebra/CategoryOf.cs
@@ -1,6 +1,6 @@
using System.Reflection;
using Skeleton.Algebra.DimensionProviders;
-using Skeleton.Algebra.ScalarFieldStructure;
+using Skeleton.Algebra.FieldStructures;
namespace Skeleton.Algebra;
diff --git a/src/Algebra/Extensions/GeneralExt.cs b/src/Algebra/Extensions/GeneralExt.cs
index f60c4d9..8aa623e 100644
--- a/src/Algebra/Extensions/GeneralExt.cs
+++ b/src/Algebra/Extensions/GeneralExt.cs
@@ -1,5 +1,5 @@
using System.Numerics;
-using Skeleton.Algebra.ScalarFieldStructure;
+using Skeleton.Algebra.FieldStructures;
using Skeleton.Utils.Helpers;
namespace Skeleton.Algebra.Extensions;
diff --git a/src/Algebra/ScalarFieldStructure/ComplexFieldStructure.cs b/src/Algebra/FieldStructures/ComplexFieldStructure.cs
similarity index 98%
rename from src/Algebra/ScalarFieldStructure/ComplexFieldStructure.cs
rename to src/Algebra/FieldStructures/ComplexFieldStructure.cs
index d7749d4..74f512f 100644
--- a/src/Algebra/ScalarFieldStructure/ComplexFieldStructure.cs
+++ b/src/Algebra/FieldStructures/ComplexFieldStructure.cs
@@ -1,8 +1,9 @@
using System.Numerics;
-namespace Skeleton.Algebra.ScalarFieldStructure;
+namespace Skeleton.Algebra.FieldStructures;
///
+[CustomFieldStructure]
public class ComplexFieldStructure : FieldStructure
{
///
diff --git a/src/Algebra/FieldStructures/CustomFieldAutoRegister.cs b/src/Algebra/FieldStructures/CustomFieldAutoRegister.cs
new file mode 100644
index 0000000..00fcc59
--- /dev/null
+++ b/src/Algebra/FieldStructures/CustomFieldAutoRegister.cs
@@ -0,0 +1,44 @@
+using System.Diagnostics.CodeAnalysis;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+namespace Skeleton.Algebra.FieldStructures;
+
+public static class CustomFieldAutoRegister
+{
+ [SuppressMessage(
+ "Style",
+ "CA2255: The ModuleInitializer attribute should not be used in libraries",
+ Justification = "Intended for automatic field structure registration")]
+ [ModuleInitializer]
+ internal static void Initialize()
+ {
+ Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
+ foreach (Assembly assembly in assemblies)
+ {
+ foreach (Type type in assembly.GetTypes())
+ {
+ if (type.GetCustomAttribute(typeof(CustomFieldStructure)) != null)
+ {
+ Type baseType = type.BaseType;
+ if (baseType != null
+ && baseType.IsGenericType
+ && baseType.GetGenericTypeDefinition() == typeof(FieldStructure<>)
+ )
+ {
+ Type tField = baseType.GetGenericArguments()[0];
+ var instance = Activator.CreateInstance(type);
+ var registerMethod = typeof(FieldStructureRegistry)
+ .GetMethods(BindingFlags.Static | BindingFlags.Public)
+ .FirstOrDefault(m => m.Name == "Register" && m.IsGenericMethod);
+ if (registerMethod != null)
+ {
+ var genericRegister = registerMethod.MakeGenericMethod(tField);
+ genericRegister.Invoke(null, [instance]);
+ }
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Algebra/FieldStructures/CustomFieldStructure.cs b/src/Algebra/FieldStructures/CustomFieldStructure.cs
new file mode 100644
index 0000000..55774e1
--- /dev/null
+++ b/src/Algebra/FieldStructures/CustomFieldStructure.cs
@@ -0,0 +1,6 @@
+namespace Skeleton.Algebra.FieldStructures;
+[AttributeUsage(AttributeTargets.Class)]
+public class CustomFieldStructure : Attribute
+{
+
+}
\ No newline at end of file
diff --git a/src/Algebra/ScalarFieldStructure/FieldStructure.cs b/src/Algebra/FieldStructures/FieldStructure.cs
similarity index 97%
rename from src/Algebra/ScalarFieldStructure/FieldStructure.cs
rename to src/Algebra/FieldStructures/FieldStructure.cs
index c48b969..19ebe09 100644
--- a/src/Algebra/ScalarFieldStructure/FieldStructure.cs
+++ b/src/Algebra/FieldStructures/FieldStructure.cs
@@ -2,7 +2,7 @@ using System.Numerics;
using Skeleton.Algebra.Extensions;
using Skeleton.DataStructure.Packs;
-namespace Skeleton.Algebra.ScalarFieldStructure;
+namespace Skeleton.Algebra.FieldStructures;
///
/// operations / structure of the field
@@ -22,10 +22,6 @@ public abstract class FieldStructure : FieldStructure
///
public static FieldStructure Dispatch()
{
- if (typeof(TScalar) == typeof(double))
- return (RealFieldStructure.Structure as FieldStructure)!;
- if (typeof(TScalar) == typeof(Complex))
- return (ComplexFieldStructure.Structure as FieldStructure)!;
return FieldStructureRegistry.GetOperation();
}
diff --git a/src/Algebra/ScalarFieldStructure/FieldStructureRegistry.cs b/src/Algebra/FieldStructures/FieldStructureRegistry.cs
similarity index 92%
rename from src/Algebra/ScalarFieldStructure/FieldStructureRegistry.cs
rename to src/Algebra/FieldStructures/FieldStructureRegistry.cs
index f35fdcd..a8c0e37 100644
--- a/src/Algebra/ScalarFieldStructure/FieldStructureRegistry.cs
+++ b/src/Algebra/FieldStructures/FieldStructureRegistry.cs
@@ -1,4 +1,4 @@
-namespace Skeleton.Algebra.ScalarFieldStructure;
+namespace Skeleton.Algebra.FieldStructures;
///
///
diff --git a/src/Algebra/ScalarFieldStructure/RealFieldStructure.cs b/src/Algebra/FieldStructures/RealFieldStructure.cs
similarity index 97%
rename from src/Algebra/ScalarFieldStructure/RealFieldStructure.cs
rename to src/Algebra/FieldStructures/RealFieldStructure.cs
index a8de10e..e214944 100644
--- a/src/Algebra/ScalarFieldStructure/RealFieldStructure.cs
+++ b/src/Algebra/FieldStructures/RealFieldStructure.cs
@@ -1,8 +1,9 @@
using System.Numerics;
-namespace Skeleton.Algebra.ScalarFieldStructure;
+namespace Skeleton.Algebra.FieldStructures;
///
+[CustomFieldStructure]
public class RealFieldStructure : FieldStructure
{
///
diff --git a/src/Algebra/Matrices/Matrix.cs b/src/Algebra/Matrices/Matrix.cs
index 862606f..6d7eb3d 100644
--- a/src/Algebra/Matrices/Matrix.cs
+++ b/src/Algebra/Matrices/Matrix.cs
@@ -4,9 +4,9 @@ using Skeleton.Algebra.AdditionalProperties.Extensions;
using Skeleton.Algebra.AffineSpaces;
using Skeleton.Algebra.DimensionProviders;
using Skeleton.Algebra.Extensions;
+using Skeleton.Algebra.FieldStructures;
using Skeleton.Algebra.FixableObjects;
using Skeleton.Algebra.Matrices.MatrixProperty;
-using Skeleton.Algebra.ScalarFieldStructure;
using Skeleton.Algebra.Vectors;
using Skeleton.Algebra.VectorSpaces;
using Skeleton.DataStructure.Packs;
diff --git a/src/Algebra/Matrices/MatrixProperty/MatrixProperty.cs b/src/Algebra/Matrices/MatrixProperty/MatrixProperty.cs
index 01075ab..48b1107 100644
--- a/src/Algebra/Matrices/MatrixProperty/MatrixProperty.cs
+++ b/src/Algebra/Matrices/MatrixProperty/MatrixProperty.cs
@@ -1,4 +1,4 @@
-using Skeleton.Algebra.ScalarFieldStructure;
+using Skeleton.Algebra.FieldStructures;
using Skeleton.Algebra.Vectors;
namespace Skeleton.Algebra.Matrices.MatrixProperty;
diff --git a/src/Algebra/Matrices/NormalMatrices/FDiagonalMatrix.cs b/src/Algebra/Matrices/NormalMatrices/FDiagonalMatrix.cs
index 735b758..ccef98b 100644
--- a/src/Algebra/Matrices/NormalMatrices/FDiagonalMatrix.cs
+++ b/src/Algebra/Matrices/NormalMatrices/FDiagonalMatrix.cs
@@ -1,5 +1,4 @@
using Skeleton.Algebra.FixableObjects;
-using Skeleton.Algebra.ScalarFieldStructure;
namespace Skeleton.Algebra;
diff --git a/src/Algebra/Matrices/NormalMatrices/FNormalMatrix.cs b/src/Algebra/Matrices/NormalMatrices/FNormalMatrix.cs
index ac0c066..e97b7b0 100644
--- a/src/Algebra/Matrices/NormalMatrices/FNormalMatrix.cs
+++ b/src/Algebra/Matrices/NormalMatrices/FNormalMatrix.cs
@@ -1,5 +1,4 @@
using Skeleton.Algebra.FixableObjects;
-using Skeleton.Algebra.ScalarFieldStructure;
using Skeleton.DataStructure.Packs.MatrixDecompositions;
namespace Skeleton.Algebra;
diff --git a/src/Algebra/VectorSpaces/FVectorSpace.cs b/src/Algebra/VectorSpaces/FVectorSpace.cs
index 6871aa9..a6f09a6 100644
--- a/src/Algebra/VectorSpaces/FVectorSpace.cs
+++ b/src/Algebra/VectorSpaces/FVectorSpace.cs
@@ -1,4 +1,4 @@
-using Skeleton.Algebra.ScalarFieldStructure;
+using Skeleton.Algebra.FieldStructures;
using Skeleton.Algebra.VectorSpaces;
namespace Skeleton.Algebra;
diff --git a/src/Algebra/VectorSpaces/VectorSpace.cs b/src/Algebra/VectorSpaces/VectorSpace.cs
index f5abe1c..f5c0a22 100644
--- a/src/Algebra/VectorSpaces/VectorSpace.cs
+++ b/src/Algebra/VectorSpaces/VectorSpace.cs
@@ -1,7 +1,7 @@
using System.Collections;
+using Skeleton.Algebra.FieldStructures;
using Skeleton.Algebra.FixableObjects;
using Skeleton.Algebra.Matrices;
-using Skeleton.Algebra.ScalarFieldStructure;
using Skeleton.Algebra.Vectors;
using Skeleton.DataStructure.Packs;
diff --git a/src/Algebra/Vectors/FVector.cs b/src/Algebra/Vectors/FVector.cs
index 50073af..2df7ab3 100644
--- a/src/Algebra/Vectors/FVector.cs
+++ b/src/Algebra/Vectors/FVector.cs
@@ -1,6 +1,6 @@
using System.Numerics;
+using Skeleton.Algebra.FieldStructures;
using Skeleton.Algebra.FixableObjects;
-using Skeleton.Algebra.ScalarFieldStructure;
using Skeleton.Algebra.Vectors;
namespace Skeleton.Algebra;
diff --git a/src/Algebra/Vectors/Vector.cs b/src/Algebra/Vectors/Vector.cs
index bd8e98e..3d17d7a 100644
--- a/src/Algebra/Vectors/Vector.cs
+++ b/src/Algebra/Vectors/Vector.cs
@@ -2,8 +2,8 @@ using System.Collections;
using System.Numerics;
using System.Runtime.CompilerServices;
using Skeleton.Algebra.Extensions;
+using Skeleton.Algebra.FieldStructures;
using Skeleton.Algebra.FixableObjects;
-using Skeleton.Algebra.ScalarFieldStructure;
namespace Skeleton.Algebra.Vectors;
diff --git a/src/Analysis/AnalyticFunctions/Polynomials/Implements/Polynomial.cs b/src/Analysis/AnalyticFunctions/Polynomials/Implements/Polynomial.cs
index 9dd3538..ae0691a 100644
--- a/src/Analysis/AnalyticFunctions/Polynomials/Implements/Polynomial.cs
+++ b/src/Analysis/AnalyticFunctions/Polynomials/Implements/Polynomial.cs
@@ -1,6 +1,6 @@
using System.Numerics;
using Skeleton.Algebra.Extensions;
-using Skeleton.Algebra.ScalarFieldStructure;
+using Skeleton.Algebra.FieldStructures;
using Skeleton.Analysis.AnalyticFunctions.Implements;
using Skeleton.Analysis.BivariantFunctions.Real.Implements;
using Skeleton.DataStructure.Packs;