using System.Runtime.CompilerServices; using ILGPU; using ILGPU.Runtime; namespace PerfectNumbers.Core.Gpu; public readonly struct HeuristicGpuDivisorTables { public readonly ArrayView1D CombinedDivisorsEnding1; public readonly ArrayView1D CombinedDivisorsEnding3; public readonly ArrayView1D CombinedDivisorsEnding7; public readonly ArrayView1D CombinedDivisorsEnding9; public readonly ArrayView1D CombinedDivisorSquaresEnding1; public readonly ArrayView1D CombinedDivisorSquaresEnding3; public readonly ArrayView1D CombinedDivisorSquaresEnding7; public readonly ArrayView1D CombinedDivisorSquaresEnding9; public readonly ArrayView1D GroupADivisors; public readonly ArrayView1D GroupADivisorSquares; public readonly ArrayView1D GroupBDivisorsEnding1; public readonly ArrayView1D GroupBDivisorSquaresEnding1; public readonly ArrayView1D GroupBDivisorsEnding7; public readonly ArrayView1D GroupBDivisorSquaresEnding7; public readonly ArrayView1D GroupBDivisorsEnding9; public readonly ArrayView1D GroupBDivisorSquaresEnding9; public HeuristicGpuDivisorTables( ArrayView1D combinedDivisorsEnding1, ArrayView1D combinedDivisorsEnding3, ArrayView1D combinedDivisorsEnding7, ArrayView1D combinedDivisorsEnding9, ArrayView1D combinedDivisorSquaresEnding1, ArrayView1D combinedDivisorSquaresEnding3, ArrayView1D combinedDivisorSquaresEnding7, ArrayView1D combinedDivisorSquaresEnding9, ArrayView1D groupADivisors, ArrayView1D groupADivisorSquares, ArrayView1D groupBDivisorsEnding1, ArrayView1D groupBDivisorSquaresEnding1, ArrayView1D groupBDivisorsEnding7, ArrayView1D groupBDivisorSquaresEnding7, ArrayView1D groupBDivisorsEnding9, ArrayView1D groupBDivisorSquaresEnding9) { CombinedDivisorsEnding1 = combinedDivisorsEnding1; CombinedDivisorsEnding3 = combinedDivisorsEnding3; CombinedDivisorsEnding7 = combinedDivisorsEnding7; CombinedDivisorsEnding9 = combinedDivisorsEnding9; CombinedDivisorSquaresEnding1 = combinedDivisorSquaresEnding1; CombinedDivisorSquaresEnding3 = combinedDivisorSquaresEnding3; CombinedDivisorSquaresEnding7 = combinedDivisorSquaresEnding7; CombinedDivisorSquaresEnding9 = combinedDivisorSquaresEnding9; GroupADivisors = groupADivisors; GroupADivisorSquares = groupADivisorSquares; GroupBDivisorsEnding1 = groupBDivisorsEnding1; GroupBDivisorSquaresEnding1 = groupBDivisorSquaresEnding1; GroupBDivisorsEnding7 = groupBDivisorsEnding7; GroupBDivisorSquaresEnding7 = groupBDivisorSquaresEnding7; GroupBDivisorsEnding9 = groupBDivisorsEnding9; GroupBDivisorSquaresEnding9 = groupBDivisorSquaresEnding9; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ArrayView1D SelectCombined(byte ending) { return ending switch { 1 => CombinedDivisorsEnding1, 3 => CombinedDivisorsEnding3, 7 => CombinedDivisorsEnding7, 9 => CombinedDivisorsEnding9, _ => ArrayView1D.Empty, }; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ArrayView1D SelectCombinedSquares(byte ending) { return ending switch { 1 => CombinedDivisorSquaresEnding1, 3 => CombinedDivisorSquaresEnding3, 7 => CombinedDivisorSquaresEnding7, 9 => CombinedDivisorSquaresEnding9, _ => ArrayView1D.Empty, }; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ArrayView1D SelectGroupB(byte ending) { return ending switch { 1 => GroupBDivisorsEnding1, 7 => GroupBDivisorsEnding7, 9 => GroupBDivisorsEnding9, _ => ArrayView1D.Empty, }; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ArrayView1D SelectGroupBSquares(byte ending) { return ending switch { 1 => GroupBDivisorSquaresEnding1, 7 => GroupBDivisorSquaresEnding7, 9 => GroupBDivisorSquaresEnding9, _ => ArrayView1D.Empty, }; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ArrayView1D SelectDivisors(HeuristicGpuDivisorTableKind kind, byte ending) { return kind switch { HeuristicGpuDivisorTableKind.GroupA => GroupADivisors, HeuristicGpuDivisorTableKind.GroupBEnding1 => GroupBDivisorsEnding1, HeuristicGpuDivisorTableKind.GroupBEnding7 => GroupBDivisorsEnding7, HeuristicGpuDivisorTableKind.GroupBEnding9 => GroupBDivisorsEnding9, HeuristicGpuDivisorTableKind.Combined => SelectCombined(ending), _ => ArrayView1D.Empty, }; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ArrayView1D SelectDivisorSquares(HeuristicGpuDivisorTableKind kind, byte ending) { return kind switch { HeuristicGpuDivisorTableKind.GroupA => GroupADivisorSquares, HeuristicGpuDivisorTableKind.GroupBEnding1 => GroupBDivisorSquaresEnding1, HeuristicGpuDivisorTableKind.GroupBEnding7 => GroupBDivisorSquaresEnding7, HeuristicGpuDivisorTableKind.GroupBEnding9 => GroupBDivisorSquaresEnding9, HeuristicGpuDivisorTableKind.Combined => SelectCombinedSquares(ending), _ => ArrayView1D.Empty, }; } }