ベスパリブ

プログラミングを主とした日記・備忘録です。ベスパ持ってないです。

Qiskitの”DAGCircuitError: 'expected %d wires, got %d'”エラー

Qiskitで、以下のようなエラーが出ることがあります。

---------------------------------------------------------------------------
DAGCircuitError                           Traceback (most recent call last)
<ipython-input-46-607b691d6215> in <module>
      3 backend = Aer.get_backend("qasm_simulator")
      4 shots = 1024
----> 5 results = execute(dj_qc, backend=backend, shots=shots).result()
      6 count = results.get_counts()
      7 plot_histogram(count)

(省略)

DAGCircuitError: 'expected 4 wires, got 7'

「DAGCircuitError」で適当にググったら以下のサイトが見つかります。

https://qiskit.org/documentation/_modules/qiskit/dagcircuit/dagcircuit.html#:~:text=raise%20DAGCircuitError(%22expected%20%25d%20wires%2C%20got%20%25d%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%25%20(wire_tot%2C%20len(wires)))

エラー名でなんとなく想像がつくのですが、このエラーは「4つのワイヤ数が期待されているのに、実際は7本のワイヤ数になってます。ワイヤ数が合ってないですよ」というエラーです。

たとえば以下のような回路でエラーが発生したとします。

f:id:takeg:20210626013855p:plain
量子回路

ここで「期待されている4本のワイヤ」というのはqubitsのワイヤ数のことです。上の回路ではq0~q3までの4本のワイヤがあるので数は合ってそうですが、"blackbox"と書かれた回路が怪しそうです。

この"blackbox"回路は以下のように作成しました。

oracle = QuantumCircuit(q_in+1, cbits, name="blackbox")
for i in range(q_in):
    oracle.cx(i, q_in)

dj_qc.append(oracle, range(q_in+1))

cbitsClassicalRegister数を指定しているのですが、これが元の回路dj_qcappendするときに指定し忘れているので、「ワイヤ数が合っていない」というエラーが発生しています。

このブラックボックス回路の場合、直し方は2通りあります。

【方法1】ブラックボックス回路はcbitsを使ってないので、作らない

この"blackbox"回路は無駄に古典ビット用の回路を作っていますが、別に使う気はないので消せばいいです。

この場合、以下のようなコードになります。

oracle = QuantumCircuit(q_in+1, name="blackbox")
for i in range(q_in):
    oracle.cx(i, q_in)

dj_qc.append(oracle, range(q_in+1))

【方法2】cbitsも元の回路にappendする

qc.appendでは、引数はqargscargsがあり、それぞれ量子ビットと古典ビットを指定できます。なので、きちんとそれぞれ指定してやります。

この場合、以下のようなコードになります。

oracle = QuantumCircuit(q_in+1, cbits, name="blackbox")
for i in range(q_in):
    oracle.cx(i, q_in)

dj_qc.append(oracle, qargs=range(q_in+1), cargs=range(cbits))