Skip to content

Commit d95fea7

Browse files
committed
chore: stage determinant-owned order-64 port
1 parent 195c4c1 commit d95fea7

1 file changed

Lines changed: 123 additions & 0 deletions

File tree

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
name: agent-port-determinant-64-current
2+
3+
on:
4+
push:
5+
branches:
6+
- agent/port-determinant-order-64-v2
7+
8+
permissions:
9+
contents: write
10+
11+
jobs:
12+
port:
13+
runs-on: ubuntu-latest
14+
steps:
15+
- uses: actions/checkout@v5
16+
with:
17+
ref: agent/port-determinant-order-64-v2
18+
fetch-depth: 0
19+
- name: Port determinant-owned input and checker bounds
20+
shell: bash
21+
run: |
22+
python - <<'PY'
23+
from pathlib import Path
24+
25+
def replace_once(path: str, old: str, new: str) -> None:
26+
file = Path(path)
27+
text = file.read_text()
28+
count = text.count(old)
29+
if count != 1:
30+
raise SystemExit(f"expected one match in {path}: {old!r}, found {count}")
31+
file.write_text(text.replace(old, new, 1))
32+
33+
replace_once(
34+
"src/jacobian/contracts/matrix_operations.py",
35+
"MAX_INPUT_SCALAR_DIGITS = 256\n",
36+
"MAX_INPUT_SCALAR_DIGITS = 256\nMAX_DETERMINANT_MATRIX_DIMENSION = 64\n",
37+
)
38+
replace_once(
39+
"src/jacobian/contracts/matrix_operations.py",
40+
'''class MatrixDeterminantRequest(ContractModel):\n """One bounded square matrix whose exact determinant is requested."""\n\n matrix: RationalMatrix\n\n @model_validator(mode="after")\n def require_square(self) -> Self:\n if len(self.matrix.entries) != len(self.matrix.entries[0]):\n raise ValueError("determinant computation requires a square matrix")\n require_matrix_scalar_digits(\n self.matrix.entries,\n maximum=MAX_INPUT_SCALAR_DIGITS,\n label="determinant input",\n )\n return self\n''',
41+
'''class DeterminantRationalMatrix(ContractModel):\n """One determinant-owned rational matrix bounded independently to order 64."""\n\n matrix_schema_version: Literal["1"] = "1"\n domain: Literal["QQ"] = "QQ"\n entries: tuple[tuple[CanonicalRational, ...], ...] = Field(\n min_length=1, max_length=MAX_DETERMINANT_MATRIX_DIMENSION\n )\n\n @model_validator(mode="after")\n def require_rectangular_nonempty_rows(self) -> Self:\n column_count = len(self.entries[0])\n if not 1 <= column_count <= MAX_DETERMINANT_MATRIX_DIMENSION:\n raise ValueError(\n "determinant matrix rows must contain between 1 and 64 entries"\n )\n if any(len(row) != column_count for row in self.entries):\n raise ValueError("determinant matrix rows must all have the same length")\n require_matrix_scalar_digits(\n self.entries,\n maximum=MAX_INPUT_SCALAR_DIGITS,\n label="determinant input",\n )\n return self\n\n\nclass MatrixDeterminantRequest(ContractModel):\n """One square rational matrix of order at most 64."""\n\n matrix: DeterminantRationalMatrix\n\n @model_validator(mode="after")\n def require_square(self) -> Self:\n if len(self.matrix.entries) != len(self.matrix.entries[0]):\n raise ValueError("determinant computation requires a square matrix")\n return self\n''',
42+
)
43+
44+
replace_once(
45+
"src/jacobian/domains/matrix_lattice/conversions.py",
46+
"from jacobian.contracts.matrices import IntegerMatrix, RationalMatrix\n",
47+
"from jacobian.contracts.matrices import IntegerMatrix, RationalMatrix\nfrom jacobian.contracts.matrix_operations import DeterminantRationalMatrix\n",
48+
)
49+
replace_once(
50+
"src/jacobian/domains/matrix_lattice/conversions.py",
51+
"def rational_matrix_to_sympy(matrix: RationalMatrix) -> Any:\n",
52+
"def rational_matrix_to_sympy(\n matrix: RationalMatrix | DeterminantRationalMatrix,\n) -> Any:\n",
53+
)
54+
55+
replace_once(
56+
"src/jacobian/math/matrices/_sympy.py",
57+
"def exact_matrix(value: MatrixBase) -> MatrixBase:\n",
58+
"def exact_matrix(\n value: MatrixBase, *, maximum_dimension: int = 32\n) -> MatrixBase:\n",
59+
)
60+
replace_once(
61+
"src/jacobian/math/matrices/_sympy.py",
62+
''' if not 1 <= value.rows <= 32 or not 1 <= value.cols <= 32:\n raise ValueError("matrix dimensions must be between 1 and 32")\n''',
63+
''' if (\n not 1 <= value.rows <= maximum_dimension\n or not 1 <= value.cols <= maximum_dimension\n ):\n raise ValueError(\n f"matrix dimensions must be between 1 and {maximum_dimension}"\n )\n''',
64+
)
65+
replace_once(
66+
"src/jacobian/math/matrices/_sympy.py",
67+
'''def determinant(matrix: MatrixBase) -> Any:\n source = exact_matrix(matrix)\n''',
68+
'''def determinant(matrix: MatrixBase) -> Any:\n source = exact_matrix(matrix, maximum_dimension=64)\n''',
69+
)
70+
71+
replace_once(
72+
"src/jacobian/domains/matrix_lattice/capabilities.py",
73+
' "Compute the determinant of one square matrix over QQ with SymPy\'s exact Bareiss algorithm.",\n',
74+
' "Compute the determinant of one square matrix over QQ through order 64 with SymPy\'s exact Bareiss algorithm.",\n',
75+
)
76+
replace_once(
77+
"src/jacobian/domains/matrix_lattice/capabilities.py",
78+
''' version="2",\n ),\n matrix_operation(\n "matrix.rank.compute",\n''',
79+
''' version="3",\n ),\n matrix_operation(\n "matrix.rank.compute",\n''',
80+
)
81+
82+
replace_once(
83+
"src/jacobian_checkers/exact_domain_operations.py",
84+
"_MAX_MATRIX_DIMENSION = 32\n",
85+
"_MAX_MATRIX_DIMENSION = 32\n_MAX_DETERMINANT_MATRIX_DIMENSION = 64\n",
86+
)
87+
replace_once(
88+
"src/jacobian_checkers/exact_domain_operations.py",
89+
'''def _q(value: object) -> fmpq:\n numerator, denominator = _fraction(value)\n return fmpq(numerator, denominator)\n''',
90+
'''def _q(value: object) -> fmpq:\n numerator, denominator = _fraction(value)\n return fmpq(numerator, denominator)\n\n\ndef _bounded_q(value: object, *, maximum_digits: int) -> fmpq:\n if not isinstance(value, dict) or set(value) != {"num", "den"}:\n raise ValueError("bounded rational is malformed")\n for component in (value["num"], value["den"]):\n if (\n not isinstance(component, str)\n or len(component.lstrip("-")) > maximum_digits\n ):\n raise ValueError("bounded rational exceeds the checker digit limit")\n return _q(value)\n''',
91+
)
92+
replace_once(
93+
"src/jacobian_checkers/exact_domain_operations.py",
94+
'''def _bounded_rational_matrix(value: object, *, maximum_digits: int) -> fmpq_mat:\n''',
95+
'''def _bounded_rational_matrix(\n value: object,\n *,\n maximum_digits: int,\n maximum_dimension: int = _MAX_MATRIX_DIMENSION,\n) -> fmpq_mat:\n''',
96+
)
97+
replace_once(
98+
"src/jacobian_checkers/exact_domain_operations.py",
99+
''' or not 1 <= len(entries) <= _MAX_MATRIX_DIMENSION\n or not isinstance(entries[0], list)\n or not 1 <= len(entries[0]) <= _MAX_MATRIX_DIMENSION\n''',
100+
''' or not 1 <= len(entries) <= maximum_dimension\n or not isinstance(entries[0], list)\n or not 1 <= len(entries[0]) <= maximum_dimension\n''',
101+
)
102+
replace_once(
103+
"src/jacobian_checkers/exact_domain_operations.py",
104+
''' matrix = _matrix_source(source)\n if matrix.nrows() != matrix.ncols():\n return False\n return bool(_q(result["determinant"]) == matrix.det())\n''',
105+
''' if set(source) != {"matrix"}:\n return False\n matrix = _bounded_rational_matrix(\n source["matrix"],\n maximum_digits=_MAX_MATRIX_INPUT_DIGITS,\n maximum_dimension=_MAX_DETERMINANT_MATRIX_DIMENSION,\n )\n if matrix.nrows() != matrix.ncols():\n return False\n declared = _bounded_q(\n result["determinant"], maximum_digits=_MAX_MATRIX_OUTPUT_DIGITS\n )\n return bool(declared == matrix.det())\n''',
106+
)
107+
108+
Path("tests/domain/matrix/test_determinant_order_64.py").write_text('''from __future__ import annotations\n\nfrom collections.abc import Iterator\nfrom pathlib import Path\n\nimport pytest\nfrom tests.support.exact_domain import open_exact_domain_services\nfrom tests.support.services import DomainTestServices\n\nfrom jacobian.contracts.capabilities import CapabilityRequest\nfrom jacobian.contracts.results import ExecutionStatus\nfrom jacobian.domains.matrix_lattice import build_matrix_bundle\n\n\ndef _q(value: int) -> dict[str, str]:\n return {"num": str(value), "den": "1"}\n\n\ndef _matrix(entries: list[list[int]]) -> dict[str, object]:\n return {"entries": [[_q(value) for value in row] for row in entries]}\n\n\ndef _truncated_legendre_matrix(prime: int) -> dict[str, object]:\n order = (prime - 5) // 2\n\n def entry(row: int, column: int) -> int:\n residue = (row - column) % prime\n if residue == 0:\n character = 0\n else:\n character = (\n 1 if pow(residue, (prime - 1) // 2, prime) == 1 else -1\n )\n return 1 + character\n\n return _matrix(\n [[entry(row, column) for column in range(order)] for row in range(order)]\n )\n\n\n@pytest.fixture\ndef matrix_services(tmp_path: Path) -> Iterator[DomainTestServices]:\n with open_exact_domain_services(\n tmp_path / "state", build_matrix_bundle()\n ) as services:\n yield services\n\n\ndef test_order_33_determinant_computes_and_verifies(\n matrix_services: DomainTestServices,\n) -> None:\n payload = {"matrix": _truncated_legendre_matrix(71)}\n computed = matrix_services.core.capabilities.invoke(\n CapabilityRequest(capability_id="matrix.determinant.compute", input=payload)\n )\n verified = matrix_services.core.capabilities.invoke(\n CapabilityRequest(\n capability_id="matrix.determinant.verify",\n input={"input": payload, "candidate": computed.output["result"]},\n )\n )\n assert computed.execution.status is ExecutionStatus.COMPLETED\n assert computed.output["result"]["determinant"] == _q(529)\n assert verified.execution.status is ExecutionStatus.COMPLETED\n assert verified.output["status"] == "VERIFIED"\n assert verified.verification_record_uri is not None\n\n\ndef test_determinant_rejects_order_above_64(\n matrix_services: DomainTestServices,\n) -> None:\n matrix = _matrix(\n [\n [1 if row == column else 0 for column in range(65)]\n for row in range(65)\n ]\n )\n result = matrix_services.core.capabilities.invoke(\n CapabilityRequest(\n capability_id="matrix.determinant.compute",\n input={"matrix": matrix},\n )\n )\n assert result.execution.status is ExecutionStatus.ERROR\n assert result.artifact_uris == ()\n''')
109+
110+
Path("tests/unit/contracts/test_determinant_contract.py").write_text('''from __future__ import annotations\n\nfrom jacobian.contracts.matrix_operations import MatrixDeterminantRequest\nfrom jacobian.schema_registry import model_schema\n\n\ndef test_determinant_schema_publishes_64_by_64_input_bound() -> None:\n schema = model_schema(MatrixDeterminantRequest)\n matrix = schema["$defs"]["DeterminantRationalMatrix"]\n assert matrix["properties"]["entries"]["maxItems"] == 64\n row = matrix["properties"]["entries"]["items"]\n assert row["maxItems"] == 64\n''')
111+
112+
Path(".github/workflows/agent-port-determinant-64-current.yml").unlink()
113+
PY
114+
- name: Validate focused source
115+
run: python -m compileall -q src/jacobian/contracts/matrix_operations.py src/jacobian/domains/matrix_lattice src/jacobian/math/matrices src/jacobian_checkers/exact_domain_operations.py tests/domain/matrix/test_determinant_order_64.py tests/unit/contracts/test_determinant_contract.py
116+
- name: Commit port
117+
shell: bash
118+
run: |
119+
git config user.name github-actions[bot]
120+
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
121+
git add -A
122+
git commit -m "feat(matrix): extend exact determinant to order 64"
123+
git push origin HEAD:agent/port-determinant-order-64-v2

0 commit comments

Comments
 (0)