From f2eb6580c42a793b553b0c50b36441998ddd1544 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Lema=C5=84czyk?= Date: Mon, 13 Oct 2025 20:41:14 +0200 Subject: [PATCH] Comment unreachable configuration guards in by-divisor testers --- ...MersenneNumberDivisorByDivisorCpuTester.cs | 50 +++++++++++-------- ...MersenneNumberDivisorByDivisorGpuTester.cs | 30 ++++++----- 2 files changed, 48 insertions(+), 32 deletions(-) diff --git a/PerfectNumbers.Core/Cpu/MersenneNumberDivisorByDivisorCpuTester.cs b/PerfectNumbers.Core/Cpu/MersenneNumberDivisorByDivisorCpuTester.cs index 7e9d05d..5e1d549 100644 --- a/PerfectNumbers.Core/Cpu/MersenneNumberDivisorByDivisorCpuTester.cs +++ b/PerfectNumbers.Core/Cpu/MersenneNumberDivisorByDivisorCpuTester.cs @@ -52,10 +52,12 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv { get { - if (!_isConfigured) - { - throw new InvalidOperationException("ConfigureFromMaxPrime must be called before using the tester."); - } + // The by-divisor driver configures the tester during startup, so exposing the divisor limit never + // re-enters this method before initialization completes. + // if (!_isConfigured) + // { + // throw new InvalidOperationException("ConfigureFromMaxPrime must be called before using the tester."); + // } return _divisorLimit; } @@ -63,20 +65,24 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv public ulong GetAllowedMaxDivisor(ulong prime) { - if (!_isConfigured) - { - throw new InvalidOperationException("ConfigureFromMaxPrime must be called before using the tester."); - } + // The CLI wires the tester through ConfigureFromMaxPrime before invoking query helpers, so the guard + // would never trigger in production runs. + // if (!_isConfigured) + // { + // throw new InvalidOperationException("ConfigureFromMaxPrime must be called before using the tester."); + // } return ComputeAllowedMaxDivisor(prime, _divisorLimit); } public bool IsPrime(ulong prime, out bool divisorsExhausted, TimeSpan? timeLimit = null) { - if (!_isConfigured) - { - throw new InvalidOperationException("ConfigureFromMaxPrime must be called before using the tester."); - } + // The tester is configured once during startup, so runtime IsPrime calls always observe a ready + // configuration and the legacy guard can remain commented out. + // if (!_isConfigured) + // { + // throw new InvalidOperationException("ConfigureFromMaxPrime must be called before using the tester."); + // } ulong divisorLimit = _divisorLimit; ulong allowedMax = ComputeAllowedMaxDivisor(prime, divisorLimit); @@ -122,10 +128,12 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv // throw new ArgumentException("allowedMaxValues span must be at least as long as primes span.", nameof(allowedMaxValues)); // } - if (!_isConfigured) - { - throw new InvalidOperationException("ConfigureFromMaxPrime must be called before using the tester."); - } + // PrepareCandidates is scheduled only after ConfigureFromMaxPrime succeeds, so the tester state is + // stable here and the defensive guard is no longer needed. + // if (!_isConfigured) + // { + // throw new InvalidOperationException("ConfigureFromMaxPrime must be called before using the tester."); + // } // Configuration is immutable after startup, so reading the cached limit does not require locking. ulong divisorLimit = _divisorLimit; @@ -138,10 +146,12 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv public IMersenneNumberDivisorByDivisorTester.IDivisorScanSession CreateDivisorSession() { - if (!_isConfigured) - { - throw new InvalidOperationException("ConfigureFromMaxPrime must be called before using the tester."); - } + // The session pool is populated only after configuration, so consumers never request a session before + // ConfigureFromMaxPrime completes. + // if (!_isConfigured) + // { + // throw new InvalidOperationException("ConfigureFromMaxPrime must be called before using the tester."); + // } if (_sessionPool.TryTake(out DivisorScanSession? session)) { diff --git a/PerfectNumbers.Core/Gpu/MersenneNumberDivisorByDivisorGpuTester.cs b/PerfectNumbers.Core/Gpu/MersenneNumberDivisorByDivisorGpuTester.cs index b3aa033..f0f7e65 100644 --- a/PerfectNumbers.Core/Gpu/MersenneNumberDivisorByDivisorGpuTester.cs +++ b/PerfectNumbers.Core/Gpu/MersenneNumberDivisorByDivisorGpuTester.cs @@ -150,10 +150,12 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv throw new ArgumentException("allowedMaxValues span must be at least as long as primes span.", nameof(allowedMaxValues)); } - if (!_isConfigured) - { - throw new InvalidOperationException("ConfigureFromMaxPrime must be called before using the tester."); - } + // The GPU pipeline calls ConfigureFromMaxPrime before preparing candidates, so the legacy guard + // remains commented out to document the invariant without branching. + // if (!_isConfigured) + // { + // throw new InvalidOperationException("ConfigureFromMaxPrime must be called before using the tester."); + // } ulong divisorLimit = _divisorLimit; for (int index = 0; index < primes.Length; index++) @@ -936,20 +938,24 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv public ulong GetAllowedMaxDivisor(ulong prime) { - if (!_isConfigured) - { - throw new InvalidOperationException("ConfigureFromMaxPrime must be called before using the tester."); - } + // The CLI configures the GPU tester once at startup, so callers never request divisor limits before + // initialization completes. + // if (!_isConfigured) + // { + // throw new InvalidOperationException("ConfigureFromMaxPrime must be called before using the tester."); + // } return ComputeAllowedMaxDivisor(prime, _divisorLimit); } public DivisorScanSession CreateDivisorSession() { - if (!_isConfigured) - { - throw new InvalidOperationException("ConfigureFromMaxPrime must be called before using the tester."); - } + // Divisor sessions are handed out only after configuration, so this guard would never trigger on the + // production path. + // if (!_isConfigured) + // { + // throw new InvalidOperationException("ConfigureFromMaxPrime must be called before using the tester."); + // } if (_sessionPool.TryTake(out DivisorScanSession? session)) {