TODO updated and small cleanups
This commit is contained in:
1 parent
4ac2ef1e6e
commit
98afb3ff9e
2 files changed
+16
-21
No files matched your search
@@ -1,12 +1,11 @@
|
|||||||
using System.Buffers.Text;
|
using System.Buffers.Text;
|
||||||
using System.IO;
|
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
|
||||||
using PerfectNumbers.Core;
|
using PerfectNumbers.Core;
|
||||||
|
|
||||||
namespace EvenPerfectBitScanner;
|
namespace EvenPerfectBitScanner;
|
||||||
|
|
||||||
|
// TODO: Convert this struct to an equivalent of a static class. Make all fields / properties / methods static and initialize it during program startup. Don't check if it's initialized within. Rely on the flow enforcing it.
|
||||||
internal struct CalculationResultHandler
|
internal struct CalculationResultHandler
|
||||||
{
|
{
|
||||||
private const string ResultsHeader = "p,searchedMersenne,detailedCheck,passedAllTests";
|
private const string ResultsHeader = "p,searchedMersenne,detailedCheck,passedAllTests";
|
||||||
@@ -26,8 +25,8 @@ internal struct CalculationResultHandler
|
|||||||
private int _primeCount;
|
private int _primeCount;
|
||||||
private bool _primeFoundAfterInit;
|
private bool _primeFoundAfterInit;
|
||||||
|
|
||||||
private bool IsInitialized => _sync is not null;
|
private readonly bool IsInitialized => _sync is not null;
|
||||||
private bool HasFileSync => _fileWriteSync is not null;
|
private readonly bool HasFileSync => _fileWriteSync is not null;
|
||||||
|
|
||||||
internal CalculationResultHandler(string resultsFileName, int writeBatchSize)
|
internal CalculationResultHandler(string resultsFileName, int writeBatchSize)
|
||||||
{
|
{
|
||||||
@@ -43,7 +42,7 @@ internal struct CalculationResultHandler
|
|||||||
_primeFoundAfterInit = false;
|
_primeFoundAfterInit = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal string ResultsFileName => _resultsFileName;
|
internal readonly string ResultsFileName => _resultsFileName;
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
internal void InitializeOutputBuffer()
|
internal void InitializeOutputBuffer()
|
||||||
@@ -262,7 +261,7 @@ internal struct CalculationResultHandler
|
|||||||
}
|
}
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
private int TryFormatResultLine(Span<byte> destination, ulong currentP, bool searchedMersenne, bool detailedCheck, bool passedAllTests)
|
private readonly int TryFormatResultLine(Span<byte> destination, ulong currentP, bool searchedMersenne, bool detailedCheck, bool passedAllTests)
|
||||||
{
|
{
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -276,7 +276,7 @@ internal static class Program
|
|||||||
orderWarmupLimitOverride ?? 5_000_000UL,
|
orderWarmupLimitOverride ?? 5_000_000UL,
|
||||||
NttGpuMath.ReductionMode,
|
NttGpuMath.ReductionMode,
|
||||||
mersenneOnGpu ? "gpu" : "cpu",
|
mersenneOnGpu ? "gpu" : "cpu",
|
||||||
(GpuContextPool.ForceCpu ? "cpu" : "gpu"),
|
GpuContextPool.ForceCpu ? "cpu" : "gpu",
|
||||||
orderOnGpu ? "gpu" : "cpu");
|
orderOnGpu ? "gpu" : "cpu");
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(_cliArguments.ResultsPrefix))
|
if (!string.IsNullOrEmpty(_cliArguments.ResultsPrefix))
|
||||||
@@ -418,6 +418,7 @@ internal static class Program
|
|||||||
GpuPrimeWorkLimiter.SetLimit(gpuPrimeThreads);
|
GpuPrimeWorkLimiter.SetLimit(gpuPrimeThreads);
|
||||||
// Configure batch size for GPU primality sieve
|
// Configure batch size for GPU primality sieve
|
||||||
PrimeTester.GpuBatchSize = gpuPrimeBatch;
|
PrimeTester.GpuBatchSize = gpuPrimeBatch;
|
||||||
|
CalculationResultHandler resultHandler = _resultHandler;
|
||||||
|
|
||||||
Stopwatch? stopwatch = null;
|
Stopwatch? stopwatch = null;
|
||||||
if (testMode)
|
if (testMode)
|
||||||
@@ -436,7 +437,7 @@ internal static class Program
|
|||||||
_byDivisorStartPrime,
|
_byDivisorStartPrime,
|
||||||
static () => _lastCompositeP = true,
|
static () => _lastCompositeP = true,
|
||||||
static () => _lastCompositeP = false,
|
static () => _lastCompositeP = false,
|
||||||
PrintResult,
|
static (candidate, searchedMersenne, detailedCheck, passedAllTests) => _resultHandler.HandleResult(candidate, searchedMersenne, detailedCheck, passedAllTests, _lastCompositeP),
|
||||||
threadCount);
|
threadCount);
|
||||||
_resultHandler.FlushBuffer();
|
_resultHandler.FlushBuffer();
|
||||||
_resultHandler.ReleaseOutputBuffer();
|
_resultHandler.ReleaseOutputBuffer();
|
||||||
@@ -494,7 +495,7 @@ internal static class Program
|
|||||||
{
|
{
|
||||||
p = buffer[j];
|
p = buffer[j];
|
||||||
passedAllTests = IsEvenPerfectCandidate(p, divisorCyclesSearchLimit, out searchedMersenne, out detailedCheck);
|
passedAllTests = IsEvenPerfectCandidate(p, divisorCyclesSearchLimit, out searchedMersenne, out detailedCheck);
|
||||||
PrintResult(p, searchedMersenne, detailedCheck, passedAllTests);
|
resultHandler.HandleResult(p, searchedMersenne, detailedCheck, passedAllTests, _lastCompositeP);
|
||||||
}
|
}
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
@@ -517,7 +518,7 @@ internal static class Program
|
|||||||
}
|
}
|
||||||
|
|
||||||
passedAllTests = IsEvenPerfectCandidate(p, divisorCyclesSearchLimit, out searchedMersenne, out detailedCheck);
|
passedAllTests = IsEvenPerfectCandidate(p, divisorCyclesSearchLimit, out searchedMersenne, out detailedCheck);
|
||||||
PrintResult(p, searchedMersenne, detailedCheck, passedAllTests);
|
resultHandler.HandleResult(p, searchedMersenne, detailedCheck, passedAllTests, _lastCompositeP);
|
||||||
|
|
||||||
if (p == maxP)
|
if (p == maxP)
|
||||||
{
|
{
|
||||||
@@ -715,6 +716,7 @@ internal static class Program
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// TODO: Move this to CliArguments
|
||||||
private static void PrintHelp()
|
private static void PrintHelp()
|
||||||
{
|
{
|
||||||
Console.WriteLine("Usage: EvenPerfectBitScanner [options]");
|
Console.WriteLine("Usage: EvenPerfectBitScanner [options]");
|
||||||
@@ -750,7 +752,6 @@ internal static class Program
|
|||||||
Console.WriteLine(" --divisor-cycles-continue continue divisor cycles generation");
|
Console.WriteLine(" --divisor-cycles-continue continue divisor cycles generation");
|
||||||
Console.WriteLine(" --divisor-cycles-limit=<value> cycle search iterations when --mersenne=divisor");
|
Console.WriteLine(" --divisor-cycles-limit=<value> cycle search iterations when --mersenne=divisor");
|
||||||
Console.WriteLine(" --use-order test primality via q order");
|
Console.WriteLine(" --use-order test primality via q order");
|
||||||
// mod-automaton removed
|
|
||||||
Console.WriteLine(" --filter-p=<path> process only p from previous run results (required for --mersenne=bydivisor)");
|
Console.WriteLine(" --filter-p=<path> process only p from previous run results (required for --mersenne=bydivisor)");
|
||||||
Console.WriteLine(" --write-batch-size=<value> overwrite frequency of disk writes (default 100 lines)");
|
Console.WriteLine(" --write-batch-size=<value> overwrite frequency of disk writes (default 100 lines)");
|
||||||
Console.WriteLine(" --gcd-filter enable early sieve based on GCD");
|
Console.WriteLine(" --gcd-filter enable early sieve based on GCD");
|
||||||
@@ -895,16 +896,6 @@ internal static class Program
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
private static void PrintResult(ulong currentP, bool searchedMersenne, bool detailedCheck, bool passedAllTests)
|
|
||||||
{
|
|
||||||
bool lastWasComposite = _lastCompositeP;
|
|
||||||
_resultHandler.HandleResult(currentP, searchedMersenne, detailedCheck, passedAllTests, lastWasComposite);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void ReportTestTime(TimeSpan elapsed)
|
private static void ReportTestTime(TimeSpan elapsed)
|
||||||
{
|
{
|
||||||
double elapsedSeconds = elapsed.TotalSeconds;
|
double elapsedSeconds = elapsed.TotalSeconds;
|
||||||
@@ -1242,6 +1233,7 @@ internal static class Program
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Convert this to extension method in ULongExtensions if one doesn't already exist. We may already calculate things like these
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
private static void ComputeBitStats(ulong value, out int bitLen, out int zeroCount, out int maxZeroBlock)
|
private static void ComputeBitStats(ulong value, out int bitLen, out int zeroCount, out int maxZeroBlock)
|
||||||
{
|
{
|
||||||
@@ -1403,9 +1395,11 @@ internal static class Program
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Convert this to extension method in ULongExtensions if one doesn't already exist
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
internal static bool IsCompositeByGcd(ulong p)
|
internal static bool IsCompositeByGcd(ulong p)
|
||||||
{
|
{
|
||||||
|
// TODO: Can this ever be true on Program's execution path?
|
||||||
if (p < 2)
|
if (p < 2)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
@@ -1415,9 +1409,11 @@ internal static class Program
|
|||||||
return BinaryGcd(p, m) > 1UL;
|
return BinaryGcd(p, m) > 1UL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Convert this to extension method in ULongExtensions if one doesn't already exist
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
private static ulong BinaryGcd(ulong a, ulong b)
|
private static ulong BinaryGcd(ulong a, ulong b)
|
||||||
{
|
{
|
||||||
|
// TODO: Are these a & b conditions ever met on Program's execution path?
|
||||||
if (a == 0UL)
|
if (a == 0UL)
|
||||||
{
|
{
|
||||||
return b;
|
return b;
|
||||||
|
|||||||
Reference in new issue
Block a user