ちょっとIBM Qを触ってみたので、QISKitについてまとめておきます。

2017年11月時点の記事であり、最新の内容ではありません。


導入



  • IBM Qについて




  • QISKit


    • IBM Researchと研究者によって与えられている、IBM Qにジョブ投げするためのKit


    • Githubにチュートリアル用のJupyter, Python SDK, Swift SDK, JavaScript SDK, Python API, またユーザガイドやopenqasmのガイド等が存在


    • なぜか公式が英語と日本語に対応しており、Python SDKではマニュアルを読めば簡単に実装可能


      • また公式の開発速度が結構な速度なので、公式の解説が最も頼りになります

      • 日本語対応は終了している模様です(2019年追記)




    • 量子コンピュータで1+1を計算する[実装編]: Python SDKの実装例の記事



QISKitにでてきたOpenQASMとは何か, APIとSDKの違いは何かについては以下では記述します。


OpenQASM


  • OpenQASM: 量子アセンブリ言語(quantum assembly language (QASM))

  • OpenQASMは量子回路を記述するための言語です

  • IBM QのComposer画面から、OpenQASMを用いて回路設計が可能です


    • 手順:
      "Switch to Qasm Editor"をクリックすると、
      スクリーンショット 2017-11-26 18.54.27.png
      QASMで回路を設計できるようになります
      スクリーンショット 2017-11-26 18.54.50.png



  • QISKitのSDK, APIは内部でOpenQASMを記述しています

  • Cross et al. (2017) Open Quantum Assembly Languageで詳細が記述されています


SDK

例えば1+1のシミュレータ計算は下記のように計算できますが、

from qiskit import QuantumProgram

import json

def read_api():
f_api = open("../api_token.json", "r")
api_dic = json.load(f_api)
QX_TOKEN = api_dic["api"]
QX_URL = "https://quantumexperience.ng.bluemix.net/api"
return(QX_TOKEN, QX_URL)

class Q_Circuit():
_Name = "summation"
_Num_qr = 4
_Num_cr = 4

def summation():
qp = QuantumProgram()
token, url = read_api()
qp.set_api(token, url)

#Qbitの設定
qr = qp.create_quantum_register("qr", Q_Circuit._Num_qr)
cr = qp.create_classical_register("cr", Q_Circuit._Num_cr)
qc = qp.create_circuit(Q_Circuit._Name, [qr], [cr])

#回路部分
qc.h(qr[0])
qc.h(qr[1])
qc.ccx(qr[0], qr[1], qr[2])
qc.cx(qr[0], qr[3])
qc.cx(qr[1], qr[3])

qc.measure(qr, cr)
print(qp.get_qasm(Q_Circuit._Name)) #QASMコードの取得
result = qp.execute([Q_Circuit._Name], shots=1024) #計算の実行
print(result.get_data(Q_Circuit._Name))

if __name__ == '__main__':
summation()

print(qp.get_qasm(Q_Circuit._Name)) で取得できるように、またqiskitの中身( _quantumcircuit.py, _quantumregister.py )を見ればわかるように、内部ではOPENQASMが使われています。

(executeはデフォルトがbackend="local_qasm_simulator")


API

APIはより直接的に、OpenQASMそのものを記述してIBM Qに送ります(参考コード)。

1+1の場合、先程のOPENQASMを利用して、シミュレータで、

from IBMQuantumExperience import IBMQuantumExperience

import json

def read_api():
f_api = open("../api_token.json", "r")
api_dic = json.load(f_api)
QX_TOKEN = api_dic["api"]
QX_URL = "https://quantumexperience.ng.bluemix.net/api"
return(QX_TOKEN, QX_URL)

def Qasm_Code():
qasm = """//OPENQASM 2.0
OPENQASM 2.0;
include "qelib1.inc";
qreg q[4];
creg c[4];
h q[0];
h q[1];
ccx q[0],q[1],q[2];
cx q[0],q[3];
cx q[1],q[3];
measure q[3] -> c[0];
measure q[2] -> c[1];
measure q[1] -> c[2];
measure q[0] -> c[3];
"""

return(qasm)

def main():
token, url = read_api()
IBMQ = IBMQuantumExperience(token)
qasm = Qasm_Code()
result = IBMQ.run_experiment(qasm, shots= 1024,name='api_test', timeout=60)
print(result.values() )

if __name__ == '__main__':
main()

とすることで計算を実行できます。(run_experimentのデフォルトがbackend='simulator',

IBMQuantumExperience.py)

ibmqx4に計算を投げる場合はrun_experimentをbackend="ibmqx4"と指定します。

(上記の回路設計ではibmqx4では計算が走らないので、適宜qasmを変える必要があります)

API経由で投げた計算は、IBM QのComposerページのQuantum Scoresに結果が溜まってしまうのが注意点です。