fix: preserve exact beam pattern work caps

This commit is contained in:
2026-08-29 14:39:31 +09:00
parent 974d33a137
commit 041e0c3665
2 changed files with 26 additions and 3 deletions
+2 -3
View File
@@ -368,9 +368,8 @@ export function computeReceiveBeamPattern(options) {
} }
const preliminarySampleCount = const preliminarySampleCount =
requestedSampleCount === "auto" ? 36 : requestedSampleCount; requestedSampleCount === "auto" ? 36 : requestedSampleCount;
const preliminaryMaximumEvaluationCount = microphoneCount * ( const preliminaryMaximumEvaluationCount =
preliminarySampleCount + HPBW_BISECTION_ITERATIONS * 2 microphoneCount * preliminarySampleCount;
);
if ( if (
!Number.isSafeInteger(preliminaryMaximumEvaluationCount) || !Number.isSafeInteger(preliminaryMaximumEvaluationCount) ||
preliminaryMaximumEvaluationCount > maximumEvaluations preliminaryMaximumEvaluationCount > maximumEvaluations
+24
View File
@@ -389,3 +389,27 @@ test("beam-pattern preflight rejects invalid input and excessive work", () => {
assert(frequencyLimitError instanceof RangeError, "extreme analog frequency is bounded"); assert(frequencyLimitError instanceof RangeError, "extreme analog frequency is bounded");
assert(frequencyLimitError.message.includes("1000000"), "frequency cap is explicit"); assert(frequencyLimitError.message.includes("1000000"), "frequency cap is explicit");
}); });
test("co-located pattern accepts an exact sample-only evaluation cap", () => {
const pattern = computeReceiveBeamPattern({
array: arrayFromPositions([[0, 0, 0]]),
frequencyHz: 1_000,
sampleCount: 360,
maximumEvaluations: 360,
});
assertEqual(pattern.evaluationCount, 360, "exact one-microphone sample work");
assertEqual(pattern.workload.maximumMetricEvaluationCount, 0, "constant cut reserves no HPBW work");
let error = null;
try {
computeReceiveBeamPattern({
array: arrayFromPositions([[0, 0, 0]]),
frequencyHz: 1_000,
sampleCount: 360,
maximumEvaluations: 359,
});
} catch (caught) {
error = caught;
}
assert(error instanceof RangeError, "strict cap rejects one fewer evaluation");
});