Skip to content

Commit 8461501

Browse files
Grace Lee Rui YueGrace Lee Rui Yue
authored andcommitted
Clarify Gaussian polynomial term ordering
1 parent 71fa917 commit 8461501

2 files changed

Lines changed: 39 additions & 4 deletions

File tree

src/jacobian/contracts/probability.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,10 @@ class GaussianPolynomial(ContractModel):
127127
terms: tuple[GaussianPolynomialTerm, ...] = Field(
128128
min_length=1,
129129
max_length=MAX_GAUSSIAN_POLYNOMIAL_TERMS,
130+
description=(
131+
"Nonzero sparse terms ordered lexicographically by their complete "
132+
"exponent vectors, for example [0, 1] before [1, 0]."
133+
),
130134
)
131135

132136
@model_validator(mode="after")
@@ -136,10 +140,13 @@ def require_canonical_sparse_polynomial(self) -> Self:
136140
raise ValueError(
137141
"every Gaussian polynomial exponent vector must match variable_count"
138142
)
139-
if any(left >= right for left, right in pairwise(exponents)):
140-
raise ValueError(
141-
"Gaussian polynomial terms must use strictly increasing exponent order"
142-
)
143+
for left, right in pairwise(exponents):
144+
if left >= right:
145+
raise ValueError(
146+
"Gaussian polynomial terms must use strictly increasing "
147+
"lexicographic exponent-vector order; first offending adjacent "
148+
f"pair is {list(left)} then {list(right)}"
149+
)
143150
return self
144151

145152

tests/domain/probability/test_finite_probability.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,34 @@ def test_multivariate_gaussian_polynomial_moment_uses_independence(
349349
assert result.output["result"]["expanded_monomial_count"] == 5
350350

351351

352+
def test_gaussian_polynomial_rejects_nonlexicographic_terms_with_recovery_detail(
353+
domain_services: DomainTestServices,
354+
) -> None:
355+
result = domain_services.core.capabilities.invoke(
356+
CapabilityRequest(
357+
capability_id="probability.gaussian_polynomial.moment.compute",
358+
input={
359+
"polynomial": {
360+
"variable_count": 2,
361+
"terms": [
362+
{"coefficient": _complex(1), "exponents": [1, 0]},
363+
{"coefficient": _complex(1), "exponents": [0, 1]},
364+
],
365+
},
366+
"order": 2,
367+
},
368+
)
369+
)
370+
371+
assert result.execution.status is ExecutionStatus.ERROR
372+
diagnostic = result.diagnostics[0]
373+
assert diagnostic.code == "INVALID_FINITE_PROBABILITY_REQUEST"
374+
assert diagnostic.hint is not None
375+
assert "lexicographic exponent-vector order" in diagnostic.hint
376+
assert "[1, 0] then [0, 1]" in diagnostic.hint
377+
assert result.artifact_uris == ()
378+
379+
352380
def test_gaussian_polynomial_zero_order_is_the_constant_one(
353381
domain_services: DomainTestServices,
354382
) -> None:

0 commit comments

Comments
 (0)