|
| 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