BitContradiction filtering improvements.
This commit is contained in:
1 parent
db7fe14208
commit
241a147d70
8 files changed
+180
-86
No files matched your search
@@ -2,6 +2,7 @@
|
||||
using System.Numerics;
|
||||
using PerfectNumbers.Core;
|
||||
using ILGPU;
|
||||
using Spectre.Console;
|
||||
|
||||
namespace PerfectNumbers.Core.ByDivisor;
|
||||
|
||||
@@ -142,20 +143,20 @@ internal sealed class PrivateWorkSet
|
||||
[DeviceDependentTemplate(typeof(ComputationDevice))]
|
||||
internal static class BitContradictionSolverWithAMultiplier
|
||||
{
|
||||
#if DETAILED_LOG
|
||||
private const ulong DebugTargetP = 138000001UL;
|
||||
private static readonly BigInteger DebugTargetK = new(3);
|
||||
private static readonly ulong DebugTargetQ = checked((ulong)((DebugTargetK * DebugTargetP) << 1));
|
||||
#if DETAILED_LOG || WITH_PRUNE_STATS
|
||||
private const ulong DebugTargetP = 138000953UL;
|
||||
private static readonly BigInteger DebugTargetK = new(((337429718205079UL - 1UL) >> 1) / DebugTargetP);
|
||||
private static readonly BigInteger DebugTargetQ = ((DebugTargetK * DebugTargetP) << 1) + BigInteger.One;
|
||||
// private const ulong DebugTargetQ = 1209708008767UL;
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static bool IsTargetCase(ulong p, System.Numerics.BigInteger k) => p == DebugTargetP && k == DebugTargetK;
|
||||
private static bool IsTargetCase(ulong p, BigInteger k) => p == DebugTargetP && k == DebugTargetK;
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static void Dbg(ulong p, System.Numerics.BigInteger k, string msg)
|
||||
private static void Dbg(ulong p, BigInteger k, string msg)
|
||||
{
|
||||
if (IsTargetCase(p, k))
|
||||
Console.WriteLine(msg);
|
||||
AnsiConsole.MarkupLine(msg);
|
||||
}
|
||||
#endif
|
||||
#if WITH_PRUNE_STATS
|
||||
@@ -245,19 +246,19 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
|
||||
private static void PrintPruneStats()
|
||||
{
|
||||
Console.WriteLine("Prune stats:");
|
||||
Console.WriteLine(
|
||||
$"TryPropagateCarry1={_prunedWithTryPropagateCarry1}, " +
|
||||
$"Powmod2ZeroBeforeLastBlock={_prunedWithPowmod2ZeroBeforeLastBlock}, " +
|
||||
$"Powmod2Tracked={_prunedWithPowmod2Tracked}, " +
|
||||
$"Powmod2TrackedOptimized={_prunedWithPowmod2TrackedOptimized}, " +
|
||||
$"CarryDropHeuristic={_prunedWithCarryDropHeuristic}, " +
|
||||
$"CarryDominance67={_prunedWithCarryDominance67}, " +
|
||||
$"CarryDominance8910AndMore={_prunedWithCarryDominance8910}, " +
|
||||
$"CarryDominance15161718={_prunedWithCarryDominance15161718}, " +
|
||||
$"CarryDominanceReached10AndStayedAbove5={_prunedWithCarryDominanceReached10AndStayedAbove5}, " +
|
||||
$"CarryDominance1011121314={_prunedWithCarryDominance1011121314}, " +
|
||||
$"HighDensityWithShortLowStreaksCarry={_prunedWithHighDensityWithShortLowStreaksCarry}"
|
||||
AnsiConsole.MarkupLine("[MediumOrchid1_1]Prune stats:[/]");
|
||||
AnsiConsole.MarkupLine(
|
||||
$"[DarkOrange]TryPropagateCarry1[/]=[Yellow]{_prunedWithTryPropagateCarry1}[/], " +
|
||||
$"[DarkOrange]Powmod2ZeroBeforeLastBlock[/]=[Yellow]{_prunedWithPowmod2ZeroBeforeLastBlock}[/], " +
|
||||
$"[DarkOrange]Powmod2Tracked[/]=[Yellow]{_prunedWithPowmod2Tracked}[/], " +
|
||||
$"[MediumOrchid1_1]Powmod2TrackedOptimized[/]=[Gray100 Bold]{_prunedWithPowmod2TrackedOptimized}[/], " +
|
||||
$"[DarkOrange]CarryDropHeuristic[/]=[Yellow]{_prunedWithCarryDropHeuristic}[/], " +
|
||||
$"[DarkOrange]CarryDominance67[/]=[Yellow]{_prunedWithCarryDominance67}[/], " +
|
||||
$"[DarkOrange]CarryDominance8910AndMore[/]=[Yellow]{_prunedWithCarryDominance8910}[/], " +
|
||||
$"[DarkOrange]CarryDominance15161718[/]=[Yellow]{_prunedWithCarryDominance15161718}[/], " +
|
||||
$"[DarkOrange]CarryDominanceReached10AndStayedAbove5[/]=[Yellow]{_prunedWithCarryDominanceReached10AndStayedAbove5}[/], " +
|
||||
$"[DarkOrange]CarryDominance1011121314[/]=[Yellow]{_prunedWithCarryDominance1011121314}[/], " +
|
||||
$"[DarkOrange]HighDensityWithShortLowStreaksCarry[/]=[Yellow]{_prunedWithHighDensityWithShortLowStreaksCarry}[/]"
|
||||
);
|
||||
}
|
||||
#endif
|
||||
@@ -507,14 +508,14 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
|
||||
private static void PrintStats()
|
||||
{
|
||||
Console.WriteLine(
|
||||
$"[STATS] stableCalls={_statStableAdvanceCalls} stableCols={_statStableAdvanceColsBatched} " +
|
||||
$"scalarCols={_statScalarCols} bigShift={_statStableAdvanceBigShift} " +
|
||||
$"deltaReq={_statDeltaRequests} deltaHits={_statDeltaHits} deltaBuilds={_statDeltaBuilds}");
|
||||
Console.WriteLine(
|
||||
$"[CLEAN] checks={_statCleanChecks} false={_statCleanFalse} " +
|
||||
$"firstDirtyCol={_statFirstDirtyColumn} word={_statFirstDirtyWord} " +
|
||||
$"qWord=0x{_statFirstDirtyQ:X16} knownWord=0x{_statFirstDirtyKnown:X16}");
|
||||
AnsiConsole.MarkupLine(
|
||||
$"[red][[STATS]][/] [DarkOrange]stableCalls[/]=[Yellow]{_statStableAdvanceCalls}[/] [DarkOrange]stableCols[/]=[Yellow]{_statStableAdvanceColsBatched}[/] " +
|
||||
$"[red]scalarCols[/]=[Yellow]{_statScalarCols}[/] [DarkOrange]bigShift[/]=[Yellow]{_statStableAdvanceBigShift}[/] " +
|
||||
$"[red]deltaReq[/]=[Yellow]{_statDeltaRequests}[/] [DarkOrange]deltaHits[/]=[Yellow]{_statDeltaHits}[/] [DarkOrange]deltaBuilds[/]=[Yellow]{_statDeltaBuilds}[/]");
|
||||
AnsiConsole.MarkupLine(
|
||||
$"[red][[CLEAN]][/] [DarkOrange]checks[/]=[Yellow]{_statCleanChecks}[/] [DarkOrange]false[/]=[Yellow]{_statCleanFalse}[/] " +
|
||||
$"[red]firstDirtyCol[/]=[Yellow]{_statFirstDirtyColumn}[/] [DarkOrange]word[/]=[Yellow]{_statFirstDirtyWord}[/] " +
|
||||
$"[red]qWord[/]=[Yellow]0x{_statFirstDirtyQ:X16}[/] [DarkOrange]knownWord[/]=[Yellow]0x{_statFirstDirtyKnown:X16}[/]");
|
||||
}
|
||||
#else
|
||||
[ThreadStatic]
|
||||
@@ -1257,7 +1258,7 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
allowedMin = outLo[0];
|
||||
allowedMax = outHi[outCount - 1];
|
||||
#if DETAILED_LOG
|
||||
Console.WriteLine($"[TD] steps={steps} endRange=[{allowedMin},{allowedMax}] intervals={outCount}");
|
||||
AnsiConsole.MarkupLine($"[TD] steps={steps} endRange=[{allowedMin},{allowedMax}] intervals={outCount}");
|
||||
#endif
|
||||
|
||||
return true;
|
||||
@@ -1455,7 +1456,7 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
|
||||
if (n < 0)
|
||||
{
|
||||
// Console.WriteLine("n < 0 - excluding in pre-filter");
|
||||
// AnsiConsole.MarkupLine("n < 0 - excluding in pre-filter");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1532,7 +1533,7 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
|
||||
if (inCount <= 0)
|
||||
{
|
||||
// Console.WriteLine("inCount <= 0 - excluding in pre-filter");
|
||||
// AnsiConsole.MarkupLine("inCount <= 0 - excluding in pre-filter");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1597,7 +1598,7 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
|
||||
if (Vector.IsHardwareAccelerated)
|
||||
{
|
||||
// Console.WriteLine("SIMD accelerator ComputeForcedRemainingAndClean_Prefix");
|
||||
// AnsiConsole.MarkupLine("SIMD accelerator ComputeForcedRemainingAndClean_Prefix");
|
||||
int limit = wordsMinusOne - (wordsMinusOne % Vector<ulong>.Count);
|
||||
for (; i < limit; i += Vector<ulong>.Count)
|
||||
{
|
||||
@@ -1615,7 +1616,7 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
}
|
||||
// else
|
||||
// {
|
||||
// Console.WriteLine("No acceleration for ComputeForcedRemainingAndClean_Prefix");
|
||||
// AnsiConsole.MarkupLine("No acceleration for ComputeForcedRemainingAndClean_Prefix");
|
||||
// }
|
||||
|
||||
forced = (int)Vector.Sum(vForced);
|
||||
@@ -2343,11 +2344,14 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
{
|
||||
if (pLong == 138000953 && qExact.Equals(_testCase))
|
||||
{
|
||||
Console.WriteLine($"CarryDrop target reached: p={pLong}, q={qExact}, reason={pruneReason}, reached10={reached10}, reachedBelow5={reachedBelow5}, reached5={reached5}, zeroCount={zeroCount}");
|
||||
AnsiConsole.MarkupLine($"CarryDrop target reached: p={pLong}, q={qExact}, reason={pruneReason}, reached10={reached10}, reachedBelow5={reachedBelow5}, reached5={reached5}, zeroCount={zeroCount}");
|
||||
}
|
||||
}
|
||||
// #endif
|
||||
|
||||
// TODO: Remove this
|
||||
private static readonly BigInteger _debugCase = BigInteger.Parse("13746583730190991");
|
||||
|
||||
private static bool TryCarryDropHeuristicPrune(
|
||||
BigInteger qExact,
|
||||
ReadOnlySpan<int> qOneOffsets,
|
||||
@@ -2551,10 +2555,7 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
{
|
||||
lowestCarryAfter10 = (int)carryOut;
|
||||
}
|
||||
}
|
||||
else if (carryOut >= 10)
|
||||
{
|
||||
totalCarryAbove10++;
|
||||
|
||||
if (lastStreakBelow10 > longestStreakBelow10)
|
||||
{
|
||||
longestStreakBelow10 = lastStreakBelow10;
|
||||
@@ -2564,7 +2565,10 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
{
|
||||
shortestStreakBelow10 = lastStreakBelow10;
|
||||
}
|
||||
|
||||
}
|
||||
else if (carryOut >= 10)
|
||||
{
|
||||
totalCarryAbove10++;
|
||||
if (lastStreakBelow10 > 0)
|
||||
{
|
||||
lastStreakBelow10 = 0;
|
||||
@@ -2692,8 +2696,21 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
|
||||
bool totalCarry8CountIsEven = (totalCarry8Count & 1) == 0;
|
||||
bool totalCarry9CountIsEven = (totalCarry9Count & 1) == 0;
|
||||
bool totalCarry10CountIsEven = (totalCarry10Count & 1) == 0;
|
||||
bool totalCarry11CountIsEven = (totalCarry11Count & 1) == 0;
|
||||
if (totalCarry8CountIsEven && totalCarry9CountIsEven &&
|
||||
((totalCarry10Count & 1) == 0 || (totalCarry11Count > totalCarry10Count && totalCarry8Count > 14 && totalCarry11Count > totalCarry9Count && totalCarry11Count > totalCarry8Count))
|
||||
(
|
||||
(
|
||||
totalCarry10CountIsEven &&
|
||||
totalTransitionsOver10 > 37
|
||||
) ||
|
||||
(
|
||||
totalCarry11Count > totalCarry10Count &&
|
||||
totalCarry8Count > 14 &&
|
||||
totalCarry11Count > totalCarry9Count &&
|
||||
totalCarry11Count > totalCarry8Count
|
||||
)
|
||||
)
|
||||
)
|
||||
{
|
||||
pruneReason = CarryDropPruneReason.Dominance10AndMoreDrop;
|
||||
@@ -2703,11 +2720,40 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
return true;
|
||||
}
|
||||
|
||||
bool totalCarry10CountIsEven = (totalCarry10Count & 1) == 0;
|
||||
bool totalCarry11CountIsEven = (totalCarry11Count & 1) == 0;
|
||||
if ((!totalCarry8CountIsEven && !totalCarry10CountIsEven && totalCarry8Count + totalCarry9Count < totalCarry10Count + totalCarry11Count && totalCarryFirst32Count > 118) ||
|
||||
(totalCarry8CountIsEven && !totalCarry10CountIsEven && totalCarry8Count < 188 && totalCarry8Count + totalCarry9Count > totalCarry10Count + totalCarry11Count) ||
|
||||
(((!totalCarry8CountIsEven && !totalCarry11CountIsEven) || (totalCarry8CountIsEven && totalCarry8Count < 66) || (totalCarry8CountIsEven && totalCarry10CountIsEven && totalCarry11CountIsEven && totalCarry8Count < 72) || (!totalCarry11CountIsEven && (!totalCarry8CountIsEven || !totalCarry10CountIsEven) && totalCarry11Count > 16)) && totalCarry9Count + totalCarry11Count > totalCarry10Count + totalCarry12Count))
|
||||
if (
|
||||
(
|
||||
!totalCarry8CountIsEven && !totalCarry10CountIsEven &&
|
||||
totalCarry8Count + totalCarry9Count < totalCarry10Count + totalCarry11Count &&
|
||||
totalCarryFirst32Count > 118
|
||||
) ||
|
||||
(
|
||||
totalCarry8CountIsEven && !totalCarry10CountIsEven && totalCarry8Count < 188 &&
|
||||
totalCarry8Count + totalCarry9Count > totalCarry10Count + totalCarry11Count
|
||||
) ||
|
||||
(
|
||||
(
|
||||
(
|
||||
!totalCarry8CountIsEven && !totalCarry11CountIsEven
|
||||
) ||
|
||||
(
|
||||
totalCarry8CountIsEven && totalCarry8Count < 66
|
||||
) ||
|
||||
(
|
||||
totalCarry8CountIsEven && totalCarry10CountIsEven && totalCarry11CountIsEven &&
|
||||
totalCarry8Count < 72
|
||||
) ||
|
||||
(
|
||||
!totalCarry11CountIsEven &&
|
||||
(
|
||||
!totalCarry8CountIsEven ||
|
||||
!totalCarry10CountIsEven
|
||||
) &&
|
||||
totalCarry11Count > 16
|
||||
)
|
||||
) &&
|
||||
totalCarry9Count + totalCarry11Count > totalCarry10Count + totalCarry12Count
|
||||
)
|
||||
)
|
||||
{
|
||||
pruneReason = CarryDropPruneReason.Dominance10AndMoreDrop;
|
||||
#if WITH_PRUNE_STATS
|
||||
@@ -2727,14 +2773,23 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
|
||||
if (totalCarryAbove10 >= 840 && shortestStreakBelow10 <= 3 &&
|
||||
(
|
||||
(lastStreakBelow10 == 0 && first10 > 34) ||
|
||||
(totalCarryBelow10 < 100 && longestStreakBelow10 <= 12 && totalCarry11Count < 150 && lastStreakBelow10 < 12)
|
||||
|
||||
(
|
||||
lastStreakBelow10 == 0 && first10 > 34 && totalCarryBelow10 > 35
|
||||
) ||
|
||||
(
|
||||
totalCarryBelow10 < 100 && longestStreakBelow10 <= 12 && totalCarry11Count < 150 &&
|
||||
lastStreakBelow10 < 12 && totalCarryBelow10 > 50
|
||||
)
|
||||
)
|
||||
)
|
||||
{
|
||||
pruneReason = CarryDropPruneReason.HighDensityWithShortLowStreaks;
|
||||
#if WITH_PRUNE_STATS
|
||||
if ((ulong)pLong == DebugTargetP && qExact.Equals(DebugTargetQ))
|
||||
{
|
||||
AnsiConsole.MarkupLine($"[MediumOrchid1_1]{nameof(CarryDropPruneReason.HighDensityWithShortLowStreaks)}[/] prune reason for [DodgerBlue1]p[/]=[Gray100 Bold]{pLong}[/], [DodgerBlue1]q[/]=[Gray100 Bold]{qExact}[/]: [DarkOrange]totalCarryAbove10[/]=[Yellow]{totalCarryAbove10}[/], [DarkOrange]shortestStreakBelow10[/]=[Yellow]{shortestStreakBelow10}[/], [DarkOrange]lastStreakBelow10[/]=[Yellow]{lastStreakBelow10}[/], [DarkOrange]first10[/]=[Yellow]{first10}[/], [DarkOrange]totalCarryBelow10[/]=[Yellow]{totalCarryBelow10}[/], [DarkOrange]longestStreakBelow10[/]=[Yellow]{longestStreakBelow10}[/], [DarkOrange]totalCarry11Count[/]=[Yellow]{totalCarry11Count}[/]");
|
||||
}
|
||||
|
||||
TraceCarryDropHeuristicPrune(pLong, qExact, pruneReason, reached10, reachedBelow5, reached5, zeroCount);
|
||||
#endif
|
||||
return true;
|
||||
@@ -2749,11 +2804,11 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
(
|
||||
lastStreakBelow10 <= 89 &&
|
||||
(
|
||||
zeroCount > 4 ||
|
||||
(zeroCount < 7 && longestStreakBelow10 > 10) ||
|
||||
lastStreakBelow10 > 0 ||
|
||||
first10 < 34 ||
|
||||
totalCarry2Count < 7 ||
|
||||
totalCarry11Count < 156 ||
|
||||
(totalCarry2Count > 2 && totalCarry2Count < 7) ||
|
||||
(totalCarry11Count > 14 && totalCarry11Count < 124) ||
|
||||
totalCarry10Count > totalCarry11Count
|
||||
/* || longestStreakBelow10 < 34*/
|
||||
)
|
||||
@@ -2777,22 +2832,46 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
) ||
|
||||
(
|
||||
reached5 <= 2 &&
|
||||
totalTransitionsOver10 > 35 &&
|
||||
(lastStreakBelow10 <= 28 || lastStreakBelow10 > 35 || longestStreakBelow10 < 49 || totalCarryBelow10 > 500)
|
||||
(
|
||||
(
|
||||
totalTransitionsOver10 > 35 &&
|
||||
(
|
||||
lastStreakBelow10 > 35 ||
|
||||
totalCarryBelow10 > 400 ||
|
||||
(totalCarryBelow10 < 300 && first10 > 48) ||
|
||||
(lastStreakBelow10 <= 28 && lastStreakBelow10 > 0) ||
|
||||
(longestStreakBelow10 < 49 && first10 < 32) ||
|
||||
(totalTransitionsOver10 > 63 && longestStreakBelow10 > 40) ||
|
||||
(totalCarryBelow10 < 300 && totalCarry2Count < 8 && lastStreakBelow10 > 0) ||
|
||||
(totalTransitionsOver10 > 63 && first10 < 32) ||
|
||||
(totalTransitionsOver10 > 80 && totalCarryBelow10 > totalCarry10Count) ||
|
||||
(totalTransitionsOver10 > 100 && totalCarry10Count > totalCarryBelow10) ||
|
||||
(totalCarry10Count > totalCarryBelow10 && totalCarry11Count > 200)
|
||||
)
|
||||
) ||
|
||||
(
|
||||
totalTransitionsOver10 <= 35 &&
|
||||
(
|
||||
longestStreakBelow10 < 31 ||
|
||||
zeroCount > 10
|
||||
) &&
|
||||
zeroCount > 4
|
||||
)
|
||||
)
|
||||
) ||
|
||||
(
|
||||
reached5 >= 3 && reached5 <= 7 &&
|
||||
(
|
||||
totalTransitionsOver10 > 50 ||
|
||||
(totalTransitionsOver10 < 50 && first10 < 33)
|
||||
(totalTransitionsOver10 <= 50 && (first10 < 33 || totalCarryBelow10 > 63))
|
||||
) &&
|
||||
(
|
||||
first10 < 58 ||
|
||||
first10 > 100 ||
|
||||
totalTransitionsOver10 > 150 ||
|
||||
(totalTransitionsOver10 > 100 && longestStreakBelow10 < 49) ||
|
||||
(totalTransitionsOver10 > 100 && lastStreakBelow10 > 0) ||
|
||||
(totalTransitionsOver10 > 100 && totalCarryBelow10 > 400 && zeroCount < 5) ||
|
||||
(totalTransitionsOver10 > 90 && longestStreakBelow10 < 49) ||
|
||||
(totalTransitionsOver10 > 90 && lastStreakBelow10 > 0) ||
|
||||
(totalTransitionsOver10 > 90 && totalCarryBelow10 > 321 && (zeroCount < 5 || totalCarryBelow10 < 500)) ||
|
||||
(totalCarryBelow10 < 320)
|
||||
)
|
||||
)
|
||||
@@ -2801,13 +2880,18 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
{
|
||||
pruneReason = CarryDropPruneReason.DominanceReached10AndStayedAbove5;
|
||||
#if WITH_PRUNE_STATS
|
||||
if ((ulong)pLong == DebugTargetP && qExact.Equals(DebugTargetQ))
|
||||
{
|
||||
AnsiConsole.MarkupLine($"[MediumOrchid1_1]{nameof(CarryDropPruneReason.DominanceReached10AndStayedAbove5)}[/] prune reason for [DodgerBlue1]p[/]=[Gray100 Bold]{pLong}[/], [DodgerBlue1]q[/]=[Gray100 Bold]{qExact}[/]: [DarkOrange]reached5[/]=[Yellow]{reached5}[/], [DarkOrange]totalTransitionsOver10[/]=[Yellow]{totalTransitionsOver10}[/], [DarkOrange]lastStreakBelow10[/]=[Yellow]{lastStreakBelow10}[/], [DarkOrange]longestStreakBelow10[/]=[Yellow]{longestStreakBelow10}[/], [DarkOrange]zeroCount[/]=[Yellow]{zeroCount}[/], [DarkOrange]first10[/]=[Yellow]{first10}[/], [DarkOrange]totalCarryBelow10[/]=[Yellow]{totalCarryBelow10}[/], [DarkOrange]totalCarry2[/]=[Yellow]{totalCarry2Count}[/], [DarkOrange]totalCarry10[/]=[Yellow]{totalCarry10Count}[/], [DarkOrange]totalCarry11[/]=[Yellow]{totalCarry11Count}[/]{Environment.NewLine}");
|
||||
}
|
||||
|
||||
TraceCarryDropHeuristicPrune(pLong, qExact, pruneReason, reached10, reachedBelow5, reached5, zeroCount);
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
else if (reached10 && !reachedBelow5 && reached5 > 0)
|
||||
{
|
||||
Console.WriteLine($"Something excluded this filter for p={pLong}, q={qExact}, reached5={reached5}, totalTransitionsOver10={totalTransitionsOver10}, lastStreakBelow10={lastStreakBelow10}, longestStreakBelow10={longestStreakBelow10}, zeroCount={zeroCount}, first10={first10}, totalCarryBelow10={totalCarryBelow10}, totalCarry2={totalCarry2Count}");
|
||||
AnsiConsole.MarkupLine($"{Environment.NewLine}[MediumOrchid1_1]{nameof(CarryDropPruneReason.DominanceReached10AndStayedAbove5)}[/] filter [Red]failed[/] for [DodgerBlue1]p[/]=[Gray100 Bold]{pLong}[/], [DodgerBlue1]q[/]=[Gray100 Bold]{qExact}[/], [DarkOrange]reached5[/]=[Yellow]{reached5}[/], [DarkOrange]totalTransitionsOver10[/]=[Yellow]{totalTransitionsOver10}[/], [DarkOrange]lastStreakBelow10[/]=[Yellow]{lastStreakBelow10}[/], [DarkOrange]longestStreakBelow10[/]=[Yellow]{longestStreakBelow10}[/], [DarkOrange]zeroCount[/]=[Yellow]{zeroCount}[/], [DarkOrange]first10[/]=[Yellow]{first10}[/], [DarkOrange]totalCarryBelow10[/]=[Yellow]{totalCarryBelow10}[/], [DarkOrange]totalCarry2[/]=[Yellow]{totalCarry2Count}[/], [DarkOrange]totalCarry10[/]=[Yellow]{totalCarry10Count}[/], [DarkOrange]totalCarry11[/]=[Yellow]{totalCarry11Count}[/]{Environment.NewLine}");
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -3046,7 +3130,7 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
#if WITH_PRUNE_STATS
|
||||
if (pLong == 138000953 && qExact.Equals(_testCase))
|
||||
{
|
||||
Console.WriteLine($"Validating heuristic prune: p={pLong}, q={qExact}, reason={carryDropPruneReason}");
|
||||
AnsiConsole.MarkupLine($"Validating heuristic prune: p={pLong}, q={qExact}, reason={carryDropPruneReason}");
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -3336,7 +3420,7 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
divides = false;
|
||||
|
||||
#if DETAILED_LOG
|
||||
Console.WriteLine($"[bit-contradiction] Pruned with {nameof(TryPropagateCarry)}, reversed prefix filter");
|
||||
AnsiConsole.MarkupLine($"[bit-contradiction] Pruned with {nameof(TryPropagateCarry)}, reversed prefix filter");
|
||||
#endif
|
||||
|
||||
#if WITH_PRUNE_STATS
|
||||
@@ -4136,7 +4220,7 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
}
|
||||
else
|
||||
{
|
||||
// Console.WriteLine("Rebuilding window");
|
||||
// AnsiConsole.MarkupLine("Rebuilding window");
|
||||
Array.Clear(knownOne0, 0, wordCount);
|
||||
Array.Clear(knownOne1, 0, wordCount);
|
||||
Array.Clear(knownZero0, 0, wordCount);
|
||||
@@ -4210,7 +4294,7 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
{
|
||||
#if DETAILED_LOG
|
||||
reason = propagateReason;
|
||||
Console.WriteLine($"[bit-contradiction] Pruned with {nameof(TryAdvanceStableUnknown)} 1, remaining={remaining}");
|
||||
AnsiConsole.MarkupLine($"[bit-contradiction] Pruned with {nameof(TryAdvanceStableUnknown)} 1, remaining={remaining}");
|
||||
#endif
|
||||
|
||||
#if WITH_PRUNE_STATS
|
||||
@@ -4235,7 +4319,7 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
{
|
||||
#if DETAILED_LOG
|
||||
reason = propagateReason;
|
||||
Console.WriteLine($"[bit-contradiction] Pruned with {nameof(TryAdvanceStableUnknown)} 2, remaining={remaining}");
|
||||
AnsiConsole.MarkupLine($"[bit-contradiction] Pruned with {nameof(TryAdvanceStableUnknown)} 2, remaining={remaining}");
|
||||
#endif
|
||||
|
||||
#if WITH_PRUNE_STATS
|
||||
@@ -4282,7 +4366,7 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
// #if DETAILED_LOG
|
||||
// reason = ContradictionReason.ParityUnreachable;
|
||||
// #endif
|
||||
// // Console.WriteLine("[bit-contradiction] Pruned with CouldStillReachTopCarryZero_UpperBound");
|
||||
// // AnsiConsole.MarkupLine("[bit-contradiction] Pruned with CouldStillReachTopCarryZero_UpperBound");
|
||||
// #if WITH_PRUNE_STATS
|
||||
// Atomic.Add(ref _prunedWithCouldStillReachTopCarryZero_UpperBound, 1UL);
|
||||
// #endif
|
||||
@@ -4311,7 +4395,7 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
// reason = ContradictionReason.ParityUnreachable;
|
||||
// #endif
|
||||
|
||||
// Console.WriteLine("[bit-contradiction] Pruned with BestCaseCarryOutOneStep");
|
||||
// AnsiConsole.MarkupLine("[bit-contradiction] Pruned with BestCaseCarryOutOneStep");
|
||||
|
||||
// #if WITH_PRUNE_STATS
|
||||
// Atomic.Add(ref _prunedWithBestCaseCarryOutOneStep, 1UL);
|
||||
@@ -4353,7 +4437,7 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
{
|
||||
#if DETAILED_LOG
|
||||
reason = ContradictionReason.ParityUnreachable;
|
||||
Console.WriteLine($"[bit-contradiction] Pruned with {nameof(TryFindSingleUnknownInQ_Prefix)}, needOne={needOne}, aIndex={aIndex}, state=2");
|
||||
AnsiConsole.MarkupLine($"[bit-contradiction] Pruned with {nameof(TryFindSingleUnknownInQ_Prefix)}, needOne={needOne}, aIndex={aIndex}, state=2");
|
||||
#endif
|
||||
|
||||
#if WITH_PRUNE_STATS
|
||||
@@ -4416,7 +4500,7 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
{
|
||||
#if DETAILED_LOG
|
||||
reason = ContradictionReason.ParityUnreachable;
|
||||
Console.WriteLine($"[bit-contradiction] Pruned with {nameof(TryFindSingleUnknownInQ_Prefix)}, needOne={needOne}, aIndex={aIndex}, state=1");
|
||||
AnsiConsole.MarkupLine($"[bit-contradiction] Pruned with {nameof(TryFindSingleUnknownInQ_Prefix)}, needOne={needOne}, aIndex={aIndex}, state=1");
|
||||
#endif
|
||||
|
||||
#if WITH_PRUNE_STATS
|
||||
@@ -4594,7 +4678,7 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
{
|
||||
#if DETAILED_LOG
|
||||
reason = ContradictionReason.ParityUnreachable;
|
||||
Console.WriteLine($"[bit-contradiction] Pruned with {nameof(TryPropagateCarry)}");
|
||||
AnsiConsole.MarkupLine($"[bit-contradiction] Pruned with {nameof(TryPropagateCarry)}");
|
||||
#endif
|
||||
|
||||
#if WITH_PRUNE_STATS
|
||||
@@ -4613,12 +4697,12 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
// {
|
||||
// if (colsLeftToTop < 63)
|
||||
// {
|
||||
// Console.WriteLine("[bit-contradiction] Checking TOP-CARRY PRUNE");
|
||||
// AnsiConsole.MarkupLine("[bit-contradiction] Checking TOP-CARRY PRUNE");
|
||||
// if ((carry.Min >> colsLeftToTop) > 0)
|
||||
// {
|
||||
// #if DETAILED_LOG
|
||||
// reason = ContradictionReason.ParityUnreachable;
|
||||
// Console.WriteLine("[bit-contradiction] Pruned with TOP-CARRY PRUNE");
|
||||
// AnsiConsole.MarkupLine("[bit-contradiction] Pruned with TOP-CARRY PRUNE");
|
||||
// #endif
|
||||
// #if WITH_PRUNE_STATS
|
||||
// Atomic.Add(ref _prunedWithTopCarry, 1UL);
|
||||
@@ -4628,7 +4712,7 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// Console.WriteLine($"[bit-contradiction] TOP-CARRY PRUNE too far away from top {colsLeftToTop}");
|
||||
// AnsiConsole.MarkupLine($"[bit-contradiction] TOP-CARRY PRUNE too far away from top {colsLeftToTop}");
|
||||
// }
|
||||
// // colsLeftToTop >= 63 => shift dałby 0, więc nigdy nie tnij (konserwatywnie)
|
||||
// }
|
||||
@@ -5045,7 +5129,7 @@ internal static class BitContradictionSolverWithAMultiplier
|
||||
// if (_debugEnabled && _parityZeroLogCount < 8)
|
||||
// {
|
||||
// _parityZeroLogCount++;
|
||||
// Console.WriteLine($"[bit-contradiction] unknown==1 parity forces zero at column={column} carry=[{minSum},{maxSum}] forced={forced} chosenIndex={chosenIndex}");
|
||||
// AnsiConsole.MarkupLine($"[bit-contradiction] unknown==1 parity forces zero at column={column} carry=[{minSum},{maxSum}] forced={forced} chosenIndex={chosenIndex}");
|
||||
// }
|
||||
|
||||
// Treat the single unknown as 0 for parity.
|
||||
|
||||
+7
-4
@@ -5,6 +5,8 @@ using System.Numerics;
|
||||
using PerfectNumbers.Core.Gpu;
|
||||
using PerfectNumbers.Core.Gpu.Accelerators;
|
||||
using System.Runtime.CompilerServices;
|
||||
using Spectre.Console;
|
||||
|
||||
|
||||
|
||||
#if DivisorSet_Pow2Groups
|
||||
@@ -83,7 +85,7 @@ internal struct MersenneNumberDivisorByDivisorPrimeScanSessionWithTemplate
|
||||
{
|
||||
try
|
||||
{
|
||||
Console.WriteLine($"Processing {prime}");
|
||||
AnsiConsole.MarkupLine($"[Gray100]Processing[/] [Yellow Bold]{prime}[/]");
|
||||
string extension = ".bin";
|
||||
#if DivisorSet_Predictive
|
||||
extension = ".predictive";
|
||||
@@ -108,17 +110,18 @@ internal struct MersenneNumberDivisorByDivisorPrimeScanSessionWithTemplate
|
||||
{
|
||||
_markComposite();
|
||||
_printResult(prime, true, true, false, divisor);
|
||||
Console.WriteLine($"Finished processing {prime}");
|
||||
AnsiConsole.MarkupLine($"[DarkTurquoise]Finished processing[/] [Yellow Bold]{prime}[/]");
|
||||
return;
|
||||
}
|
||||
|
||||
_clearComposite();
|
||||
_printResult(prime, true, divisorsExhausted, true, divisor);
|
||||
Console.WriteLine($"Finished processing {prime}");
|
||||
AnsiConsole.MarkupLine($"[DarkTurquoise]Finished processing[/] [Yellow Bold]{prime}[/]");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Error processing {ex.Message} {ex.StackTrace}");
|
||||
AnsiConsole.WriteException(ex);
|
||||
// Console.WriteLine($"Error processing {ex.Message} {ex.StackTrace}");
|
||||
Environment.Exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Numerics;
|
||||
using Spectre.Console;
|
||||
|
||||
namespace PerfectNumbers.Core.Gpu;
|
||||
|
||||
@@ -34,7 +35,7 @@ internal struct MersenneNumberDivisorByDivisorGpuPrimeScanSession
|
||||
{
|
||||
try
|
||||
{
|
||||
Console.WriteLine($"Processing {prime}");
|
||||
AnsiConsole.MarkupLine($"[Gray100]Processing[/] [Yellow Bold]{prime}[/]");
|
||||
string stateFile = prime.ToString(CultureInfo.InvariantCulture) + ".bin";
|
||||
|
||||
ConfigureForPrime(stateFile);
|
||||
@@ -45,17 +46,17 @@ internal struct MersenneNumberDivisorByDivisorGpuPrimeScanSession
|
||||
{
|
||||
_markComposite();
|
||||
_printResult(prime, true, true, false, divisor);
|
||||
Console.WriteLine($"Finished processing {prime}");
|
||||
AnsiConsole.MarkupLine($"[DarkTurquoise]Finished processing[/] [Yellow Bold]{prime}[/]");
|
||||
return;
|
||||
}
|
||||
|
||||
_clearComposite();
|
||||
_printResult(prime, true, divisorsExhausted, true, divisor);
|
||||
Console.WriteLine($"Finished processing {prime}");
|
||||
AnsiConsole.MarkupLine($"[DarkTurquoise]Finished processing[/] [Yellow Bold]{prime}[/]");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Error processing {ex.Message} {ex.StackTrace}");
|
||||
AnsiConsole.WriteException(ex);
|
||||
Environment.Exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ using MersenneNumberDivisorByDivisorCpuTesterWithBitContradictionGpuOrder = Perf
|
||||
using MersenneNumberDivisorByDivisorCpuTesterWithBitTreeCpuOrder = PerfectNumbers.Core.Cpu.MersenneNumberDivisorByDivisorCpuTesterWithForBitTreeDivisorSetForCpuOrder;
|
||||
using MersenneNumberDivisorByDivisorCpuTesterWithBitTreeHybridOrder = PerfectNumbers.Core.Cpu.MersenneNumberDivisorByDivisorCpuTesterWithForBitTreeDivisorSetForHybridOrder;
|
||||
using MersenneNumberDivisorByDivisorCpuTesterWithBitTreeGpuOrder = PerfectNumbers.Core.Cpu.MersenneNumberDivisorByDivisorCpuTesterWithForBitTreeDivisorSetForGpuOrder;
|
||||
using Spectre.Console;
|
||||
|
||||
namespace PerfectNumbers.Core;
|
||||
|
||||
@@ -1199,7 +1200,7 @@ public static class MersenneNumberDivisorByDivisorTester
|
||||
{
|
||||
try
|
||||
{
|
||||
Console.WriteLine($"Processing {prime}");
|
||||
AnsiConsole.MarkupLine($"[Gray100]Processing[/] [Yellow Bold]{prime}[/]");
|
||||
string stateFile = Path.Combine(
|
||||
PerfectNumberConstants.ByDivisorStateDirectory,
|
||||
prime.ToString(CultureInfo.InvariantCulture) + ".bin");
|
||||
@@ -1235,17 +1236,18 @@ public static class MersenneNumberDivisorByDivisorTester
|
||||
|
||||
markComposite();
|
||||
printResult(prime, true, true, false, divisor);
|
||||
Console.WriteLine($"Finished processing {prime}");
|
||||
AnsiConsole.MarkupLine($"[DarkTurquoise]Finished processing[/] [Yellow Bold]{prime}[/]");
|
||||
return;
|
||||
}
|
||||
|
||||
clearComposite();
|
||||
printResult(prime, true, divisorsExhausted, true, divisor);
|
||||
Console.WriteLine($"Finished processing {prime}");
|
||||
AnsiConsole.MarkupLine($"[DarkTurquoise]Finished processing[/] [Yellow Bold]{prime}[/]");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Error processing {ex.Message} {ex.StackTrace}");
|
||||
AnsiConsole.WriteException(ex);
|
||||
// Console.WriteLine($"Error processing {ex.Message} {ex.StackTrace}");
|
||||
Environment.Exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<!-- <DefineConstants>$(DefineConstants);OVERRIDE_MIN_K</DefineConstants> -->
|
||||
<!-- <DefineConstants>$(DefineConstants);SELF_TEST</DefineConstants> -->
|
||||
<!-- <DefineConstants>$(DefineConstants);EXPORT_STAGE</DefineConstants> -->
|
||||
<!-- <DefineConstants>$(DefineConstants);WITH_PRUNE_STATS</DefineConstants> -->
|
||||
<DefineConstants>$(DefineConstants);WITH_PRUNE_STATS</DefineConstants>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
@@ -29,6 +29,7 @@
|
||||
<PackageReference Include="ILGPU.Algorithms" Version="1.5.3" />
|
||||
<PackageReference Include="LightningDB" Version="0.21.0" />
|
||||
<PackageReference Include="Microsoft.FASTER.Core" Version="2.4.0" />
|
||||
<PackageReference Include="Spectre.Console" Version="0.54.1-alpha.0.37" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
Reference in new issue
Block a user