I have code that runs on the default.qubit
without problem, but when I switch to a ibm_kyoto
, I get what seems to be a decomposition error. This is an example of my the circuit I am trying to run.
def QuantumLayer():
n_qubits =2
dev = qml.device("qiskit.ibmq", wires=n_qubits, backend='ibm_kyoto', ibmqx_token = XXX)
def _circuit(inputs, weights):
qml.Hadamard(wires=[0])
qml.AngleEmbedding(features=(inputs*3*torch.pi/4), wires=range(1,n_qubits), rotation='Y')
qml.ctrl(qml.adjoint(qml.AngleEmbedding(features=(inputs*3*torch.pi/4), wires=range(1,n_qubits), rotation='Y')),control=[0])
for layer in range(1):
for i in range(1, n_qubits):
qml.CRY(phi=weights[layer][i-1][0],wires=[0,i])
qml.Hadamard(wires=[0])
return qml.expval(qml.PauliZ(wires=0))
qlayer = qml.QNode(_circuit, dev, interface="torch")
weight_shapes = {"weights": (vqc_layers,n_qubits-1, 1)}
return qml.qnn.TorchLayer(qlayer, weight_shapes)
My error:
Traceback (most recent call last):
File "QCNN.py", line 290, in <module>
train_and_evaluate(quantum_model, quantum_optimizer, train_dataloader, test_dataloader, 'Quantum', device, criterion, num_epochs, model_save_dir, current_datetime)
File "QCNN.py", line 226, in train_and_evaluate
outputs = model(images)
File ".../lib/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl
return self._call_impl(*args, **kwargs)
File ".../lib/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl
return forward_call(*args, **kwargs)
File "models.py", line 17, in forward
x = self.quantum_layer(x)
File ".../lib/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl
return self._call_impl(*args, **kwargs)
File ".../lib/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl
return forward_call(*args, **kwargs)
File "modules.py", line 183, in forward
QL_output = selected_quantum_layer(x_features_unique[:, self.input_data_per_circuit*j:self.input_data_per_circuit*(j+1)])
File ".../lib/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl
return self._call_impl(*args, **kwargs)
File ".../lib/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl
return forward_call(*args, **kwargs)
File ".../lib/site-packages/pennylane/qnn/torch.py", line 402, in forward
results = self._evaluate_qnode(inputs)
File ".../lib/site-packages/pennylane/qnn/torch.py", line 423, in _evaluate_qnode
res = self.qnode(**kwargs)
File ".../lib/site-packages/pennylane/qnode.py", line 1027, in __call__
res = qml.execute(
File ".../lib/site-packages/pennylane/interfaces/execution.py", line 736, in execute
results = ml_boundary_execute(
File ".../lib/site-packages/pennylane/interfaces/torch.py", line 314, in execute
return ExecuteTapes.apply(kwargs, *parameters)
File ".../lib/site-packages/pennylane/interfaces/torch.py", line 45, in new_apply
flat_out = orig_apply(out_struct_holder, *inp)
File ".../lib/site-packages/torch/autograd/function.py", line 539, in apply
return super().apply(*args, **kwargs) # type: ignore[misc]
File ".../lib/site-packages/pennylane/interfaces/torch.py", line 49, in new_forward
out = orig_fw(ctx, *inp)
File ".../lib/site-packages/pennylane/interfaces/torch.py", line 145, in forward
res, ctx.jacs = ctx.execute_fn(ctx.tapes, **ctx.gradient_kwargs)
File ".../lib/site-packages/pennylane/interfaces/execution.py", line 588, in inner_execute_with_empty_jac
return (inner_execute(tapes), [])
File ".../lib/site-packages/pennylane/interfaces/execution.py", line 246, in inner_execute
tapes = tuple(expand_fn(t) for t in tapes)
File ".../lib/site-packages/pennylane/interfaces/execution.py", line 246, in <genexpr>
tapes = tuple(expand_fn(t) for t in tapes)
File ".../lib/site-packages/pennylane/interfaces/execution.py", line 206, in device_expansion_function
return device.expand_fn(tape, max_expansion=max_expansion)
File ".../lib/site-packages/pennylane/_device.py", line 718, in expand_fn
return self.default_expand_fn(circuit, max_expansion=max_expansion)
File ".../lib/site-packages/pennylane/_device.py", line 689, in default_expand_fn
circuit = _local_tape_expand(
File ".../lib/site-packages/pennylane/_device.py", line 90, in _local_tape_expand
expanded_tape = _local_tape_expand(obj, stop_at=stop_at, depth=depth - 1)
File ".../lib/site-packages/pennylane/_device.py", line 84, in _local_tape_expand
obj = QuantumScript(obj.decomposition(), _update=False)
File ".../lib/site-packages/pennylane/ops/op_math/controlled.py", line 502, in decomposition
decomp = _decompose_no_control_values(self)
File ".../lib/site-packages/pennylane/ops/op_math/controlled.py", line 599, in _decompose_no_control_values
return ctrl_decomp_zyz(op.base, op.control_wires)
File ".../lib/site-packages/pennylane/ops/op_math/controlled_decompositions.py", line 200, in ctrl_decomp_zyz
if not qml.math.isclose(theta / 2, 0.0, atol=1e-8, rtol=0):
File ".../lib/site-packages/autoray/autoray.py", line 80, in do
return get_lib_fn(backend, fn)(*args, **kwargs)
TypeError: isclose(): argument 'other' (position 2) must be Tensor, not float