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」で適当にググったら以下のサイトが見つかります。
エラー名でなんとなく想像がつくのですが、このエラーは「4つのワイヤ数が期待されているのに、実際は7本のワイヤ数になってます。ワイヤ数が合ってないですよ」というエラーです。
たとえば以下のような回路でエラーが発生したとします。
ここで「期待されている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))
cbits
でClassicalRegister
数を指定しているのですが、これが元の回路dj_qc
にappend
するときに指定し忘れているので、「ワイヤ数が合っていない」というエラーが発生しています。
このブラックボックス回路の場合、直し方は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
では、引数はqargs
とcargs
があり、それぞれ量子ビットと古典ビットを指定できます。なので、きちんとそれぞれ指定してやります。
この場合、以下のようなコードになります。
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))