From 041e0c36654027aede2d4c1b57e9f54c7ec453c4 Mon Sep 17 00:00:00 2001 From: MasterBabol Date: Sat, 29 Aug 2026 14:39:31 +0900 Subject: [PATCH] fix: preserve exact beam pattern work caps --- packages/acoustics-core/beam-pattern.js | 5 ++--- tests/unit/beam-pattern.test.js | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/packages/acoustics-core/beam-pattern.js b/packages/acoustics-core/beam-pattern.js index 3fe8547..c573a50 100644 --- a/packages/acoustics-core/beam-pattern.js +++ b/packages/acoustics-core/beam-pattern.js @@ -368,9 +368,8 @@ export function computeReceiveBeamPattern(options) { } const preliminarySampleCount = requestedSampleCount === "auto" ? 36 : requestedSampleCount; - const preliminaryMaximumEvaluationCount = microphoneCount * ( - preliminarySampleCount + HPBW_BISECTION_ITERATIONS * 2 - ); + const preliminaryMaximumEvaluationCount = + microphoneCount * preliminarySampleCount; if ( !Number.isSafeInteger(preliminaryMaximumEvaluationCount) || preliminaryMaximumEvaluationCount > maximumEvaluations diff --git a/tests/unit/beam-pattern.test.js b/tests/unit/beam-pattern.test.js index 6a2fccd..1ac43fd 100644 --- a/tests/unit/beam-pattern.test.js +++ b/tests/unit/beam-pattern.test.js @@ -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.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"); +});