redesign matrix design
This commit is contained in:
@@ -46,7 +46,7 @@ namespace StgSharp.Mathematics.Numeric
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public unsafe struct MatrixKernelEnumeration
|
||||
public unsafe struct MatrixKernelBoarder
|
||||
{
|
||||
|
||||
public readonly delegate* unmanaged[Cdecl]
|
||||
@@ -55,9 +55,9 @@ namespace StgSharp.Mathematics.Numeric
|
||||
public readonly delegate* unmanaged[Cdecl]<int, int, MatrixKernelEnumerator*, bool> IsInBuffer;
|
||||
|
||||
[Obsolete("Do not use constructor, use static method instead", true)]
|
||||
public MatrixKernelEnumeration() { }
|
||||
public MatrixKernelBoarder() { }
|
||||
|
||||
public MatrixKernelEnumeration(
|
||||
public MatrixKernelBoarder(
|
||||
delegate* unmanaged[Cdecl]
|
||||
<int, int, MatrixKernelEnumerator*, long> getOffset,
|
||||
delegate* unmanaged[Cdecl]<int, int, MatrixKernelEnumerator*, bool> inBuffer)
|
||||
@@ -66,24 +66,128 @@ namespace StgSharp.Mathematics.Numeric
|
||||
IsInBuffer = inBuffer;
|
||||
}
|
||||
|
||||
private static delegate* unmanaged[Cdecl]<int, int, MatrixKernelEnumerator*, bool> IsInBufferDenseSquarePtr { get; } = (delegate* unmanaged[Cdecl]<int, int, MatrixKernelEnumerator*, bool>)&IsInBufferDenseSquare;
|
||||
private static delegate* unmanaged[Cdecl]<int, int, MatrixKernelEnumerator*, long> GetIndexOffsetDenseSquarePtr { get; } =
|
||||
(delegate* unmanaged[Cdecl]<int, int, MatrixKernelEnumerator*, long>)&GetIndexOffsetDenseSquare;
|
||||
|
||||
public static MatrixKernelEnumeration Create(MatrixLayout layout)
|
||||
private static delegate* unmanaged[Cdecl]<int, int, MatrixKernelEnumerator*, long> GetIndexOffsetUpperTrianglePtr { get; } =
|
||||
(delegate* unmanaged[Cdecl]<int, int, MatrixKernelEnumerator*, long>)&GetIndexOffsetUpperTriangle;
|
||||
|
||||
private static delegate* unmanaged[Cdecl]<int, int, MatrixKernelEnumerator*, long> GetIndexOffsetLowerTrianglePtr { get; } =
|
||||
(delegate* unmanaged[Cdecl]<int, int, MatrixKernelEnumerator*, long>)&GetIndexOffsetLowerTriangle;
|
||||
|
||||
private static delegate* unmanaged[Cdecl]<int, int, MatrixKernelEnumerator*, bool> IsInBufferDenseSquarePtr { get; } =
|
||||
(delegate* unmanaged[Cdecl]<int, int, MatrixKernelEnumerator*, bool>)&IsInBufferDenseSquare;
|
||||
|
||||
private static delegate* unmanaged[Cdecl]<int, int, MatrixKernelEnumerator*, bool> IsInBufferUpperTrianglePtr { get; } =
|
||||
(delegate* unmanaged[Cdecl]<int, int, MatrixKernelEnumerator*, bool>)&IsInBufferUpperTriangle;
|
||||
|
||||
private static delegate* unmanaged[Cdecl]<int, int, MatrixKernelEnumerator*, bool> IsInBufferLowerTrianglePtr { get; } =
|
||||
(delegate* unmanaged[Cdecl]<int, int, MatrixKernelEnumerator*, bool>)&IsInBufferLowerTriangle;
|
||||
|
||||
public static MatrixKernelBoarder Create(MatrixLayout layout)
|
||||
{
|
||||
return layout switch
|
||||
{
|
||||
MatrixLayout.DenseSquare => new MatrixKernelEnumeration(null, IsInBufferDenseSquarePtr),
|
||||
MatrixLayout.DenseSquare => new MatrixKernelBoarder(GetIndexOffsetDenseSquarePtr, IsInBufferDenseSquarePtr),
|
||||
|
||||
MatrixLayout.UpperTriangle => throw new NotImplementedException(),
|
||||
MatrixLayout.UpperTriangle => new MatrixKernelBoarder(GetIndexOffsetUpperTrianglePtr, IsInBufferUpperTrianglePtr),
|
||||
MatrixLayout.LowerTriangle => new MatrixKernelBoarder(GetIndexOffsetLowerTrianglePtr, IsInBufferLowerTrianglePtr),
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(layout)),
|
||||
};
|
||||
}
|
||||
|
||||
private static bool IsInBufferDenseSquare(
|
||||
int col,
|
||||
int row,
|
||||
[UnmanagedCallersOnly(CallConvs =[ typeof(CallConvCdecl) ])]
|
||||
private static long GetIndexOffsetDenseSquare(
|
||||
int x_kernel,
|
||||
int y_kernel,
|
||||
MatrixKernelEnumerator* enumerator)
|
||||
{
|
||||
return true;
|
||||
long x = x_kernel;
|
||||
long y = y_kernel;
|
||||
long rows = enumerator->KernelRowLength;
|
||||
return x * rows + y;
|
||||
}
|
||||
|
||||
[UnmanagedCallersOnly(CallConvs =[ typeof(CallConvCdecl) ])]
|
||||
private static long GetIndexOffsetLowerTriangle(
|
||||
int x_kernel,
|
||||
int y_kernel,
|
||||
MatrixKernelEnumerator* enumerator)
|
||||
{
|
||||
long order = GetTriangularOrder(enumerator);
|
||||
long x = x_kernel;
|
||||
long y = y_kernel;
|
||||
|
||||
long prefixColumns = x * order - (x * (x - 1L)) / 2L;
|
||||
return prefixColumns + (y - x);
|
||||
}
|
||||
|
||||
[UnmanagedCallersOnly(CallConvs =[ typeof(CallConvCdecl) ])]
|
||||
private static long GetIndexOffsetUpperTriangle(
|
||||
int x_kernel,
|
||||
int y_kernel,
|
||||
MatrixKernelEnumerator* enumerator)
|
||||
{
|
||||
long x = x_kernel;
|
||||
long y = y_kernel;
|
||||
|
||||
long prefixColumns = (x * (x + 1L)) / 2L;
|
||||
return prefixColumns + y;
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static long GetTriangularOrder(MatrixKernelEnumerator* enumerator)
|
||||
{
|
||||
return Math.Min(enumerator->KernelColumnLength, enumerator->KernelRowLength);
|
||||
}
|
||||
|
||||
[UnmanagedCallersOnly(CallConvs =[ typeof(CallConvCdecl) ])]
|
||||
private static bool IsInBufferDenseSquare(
|
||||
int x_kernel,
|
||||
int y_kernel,
|
||||
MatrixKernelEnumerator* enumerator)
|
||||
{
|
||||
return IsWithinKernelDomain(enumerator, x_kernel, y_kernel);
|
||||
}
|
||||
|
||||
[UnmanagedCallersOnly(CallConvs =[ typeof(CallConvCdecl) ])]
|
||||
private static bool IsInBufferLowerTriangle(
|
||||
int x_kernel,
|
||||
int y_kernel,
|
||||
MatrixKernelEnumerator* enumerator)
|
||||
{
|
||||
return IsWithinTriangularDomain(enumerator, x_kernel, y_kernel) && y_kernel >= x_kernel;
|
||||
}
|
||||
|
||||
[UnmanagedCallersOnly(CallConvs =[ typeof(CallConvCdecl) ])]
|
||||
private static bool IsInBufferUpperTriangle(
|
||||
int x_kernel,
|
||||
int y_kernel,
|
||||
MatrixKernelEnumerator* enumerator)
|
||||
{
|
||||
return IsWithinTriangularDomain(enumerator, x_kernel, y_kernel) && y_kernel <= x_kernel;
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static bool IsWithinKernelDomain(
|
||||
MatrixKernelEnumerator* enumerator,
|
||||
int x_kernel,
|
||||
int y_kernel)
|
||||
{
|
||||
return x_kernel >= 0 &&
|
||||
y_kernel >= 0 &&
|
||||
x_kernel < enumerator->KernelColumnLength &&
|
||||
y_kernel < enumerator->KernelRowLength;
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static bool IsWithinTriangularDomain(
|
||||
MatrixKernelEnumerator* enumerator,
|
||||
int x_kernel,
|
||||
int y_kernel)
|
||||
{
|
||||
long order = GetTriangularOrder(enumerator);
|
||||
return x_kernel >= 0 && y_kernel >= 0 && x_kernel < order && y_kernel < order;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -98,6 +202,18 @@ namespace StgSharp.Mathematics.Numeric
|
||||
[FieldOffset(8)] public readonly int KernelColumnLength;
|
||||
[FieldOffset(12)] public readonly int KernelRowLength;
|
||||
|
||||
public MatrixSize(
|
||||
int elementColumnLength,
|
||||
int elementRowLength,
|
||||
int kernelColumnLength,
|
||||
int kernelRowLength)
|
||||
{
|
||||
ElementColumnLength = elementColumnLength;
|
||||
ElementRowLength = elementRowLength;
|
||||
KernelColumnLength = kernelColumnLength;
|
||||
KernelRowLength = kernelRowLength;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Explicit)]
|
||||
|
||||
Reference in New Issue
Block a user