diff --git a/README.md b/README.md index a13559a..992bbde 100644 --- a/README.md +++ b/README.md @@ -47,8 +47,9 @@ body = CircuitJobCreationPayload.from_dict({ "shots": 100, "input": { "gateset": "qis", + "qubits": 2, "circuit": [ - {"gate": "h", "targets": [0]}, + {"gate": "h", "target": 0}, {"gate": "cnot", "control": 0, "target": 1}, ], }, diff --git a/ionq_core/models/qis_circuit_input.py b/ionq_core/models/qis_circuit_input.py index d8c1ac2..358b3c5 100644 --- a/ionq_core/models/qis_circuit_input.py +++ b/ionq_core/models/qis_circuit_input.py @@ -14,7 +14,6 @@ from ..models.qis_circuit_input_gateset import check_qis_circuit_input_gateset from ..models.qis_circuit_input_gateset import QisCircuitInputGateset -from ..types import UNSET, Unset from typing import cast if TYPE_CHECKING: @@ -32,14 +31,14 @@ class QisCircuitInput: """ Attributes: + qubits (int): circuit (list[GateQisGate]): gateset (QisCircuitInputGateset): - qubits (float | Unset): """ + qubits: int circuit: list[GateQisGate] gateset: QisCircuitInputGateset - qubits: float | Unset = UNSET @@ -47,6 +46,8 @@ class QisCircuitInput: def to_dict(self) -> dict[str, Any]: from ..models.gate_qis_gate import GateQisGate + qubits = self.qubits + circuit = [] for circuit_item_data in self.circuit: circuit_item = circuit_item_data.to_dict() @@ -56,17 +57,14 @@ def to_dict(self) -> dict[str, Any]: gateset: str = self.gateset - qubits = self.qubits - field_dict: dict[str, Any] = {} field_dict.update({ + "qubits": qubits, "circuit": circuit, "gateset": gateset, }) - if qubits is not UNSET: - field_dict["qubits"] = qubits return field_dict @@ -76,6 +74,8 @@ def to_dict(self) -> dict[str, Any]: def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: from ..models.gate_qis_gate import GateQisGate d = dict(src_dict) + qubits = d.pop("qubits") + circuit = [] _circuit = d.pop("circuit") for circuit_item_data in (_circuit): @@ -91,12 +91,10 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: - qubits = d.pop("qubits", UNSET) - qis_circuit_input = cls( + qubits=qubits, circuit=circuit, gateset=gateset, - qubits=qubits, ) return qis_circuit_input diff --git a/openapi-overlay.yaml b/openapi-overlay.yaml new file mode 100644 index 0000000..00c0976 --- /dev/null +++ b/openapi-overlay.yaml @@ -0,0 +1,23 @@ +overlay: 1.0.0 +info: + title: ionq-core-python local OpenAPI fixes + version: 0.1.0 + description: | + Patches applied to openapi.json before client generation. The upstream + spec marks QisCircuitInput.qubits as optional and floating-point, but + the simulator preflight rejects payloads without it (surfacing as + UnexpectedCompilationError) and qubit counts are non-negative integers. + +actions: + - target: $.components.schemas.QisCircuitInput.required + remove: true + - target: $.components.schemas.QisCircuitInput + update: + required: + - circuit + - gateset + - qubits + - target: $.components.schemas.QisCircuitInput.properties.qubits + update: + type: integer + format: int32 diff --git a/tests/integration/test_simulator_job.py b/tests/integration/test_simulator_job.py index fb748ca..602535d 100644 --- a/tests/integration/test_simulator_job.py +++ b/tests/integration/test_simulator_job.py @@ -25,8 +25,9 @@ "shots": 100, "input": { "gateset": "qis", + "qubits": 2, "circuit": [ - {"gate": "h", "targets": [0]}, + {"gate": "h", "target": 0}, {"gate": "cnot", "control": 0, "target": 1}, ], }, diff --git a/tests/test_api.py b/tests/test_api.py index 1a665e9..176829a 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -112,7 +112,7 @@ def test_sync(self, httpx_mock, auth_client): "type": "ionq.circuit.v1", "backend": "simulator", "shots": 100, - "input": {"gateset": "qis", "circuit": [{"gate": "h", "targets": [0]}]}, + "input": {"gateset": "qis", "qubits": 1, "circuit": [{"gate": "h", "target": 0}]}, } ) result = create_job.sync(client=auth_client, body=body)