Qiskit 0.14 リリースノート
0.14.0
Terra 0.11.0
前奏曲
0.11.0 リリースにはいくつかの新機能とバグ修正が含まれている。 今回のリリースの最大の変更点は、パルススケジューラーの追加だ。 これにより、ユーザーは量子プログラムを QuantumCircuit 、それを回路を実装する量子ハードウェアを制御する基礎となるパルス命令にマッピングすることができる。
新機能
-
BackendPropertiesからユーザー固有のデータを簡単に取得できる 5 つの新しいコマンドを追加:gate_propertygate_error,gate_length,qubit_property,t1,t2,readout_errorandfrequency. これらは、バックエンドのプロパティの特定の値を返します。 例:from qiskit.test.mock import FakeOurense backend = FakeOurense() properties = backend.properties() gate_property = properties.gate_property('u1') gate_error = properties.gate_error('u1', 0) gate_length = properties.gate_length('u1', 0) qubit_0_property = properties.qubit_property(0) t1_time_0 = properties.t1(0) t2_time_0 = properties.t2(0) readout_error_0 = properties.readout_error(0) frequency_0 = properties.frequency(0) -
命令オブジェクトがパラメータ化されているかどうかをチェックするメソッド
Instruction.is_parameterized()が追加されました。 このメソッドは、インストラクションがParameterExpressionまたはParameterオブジェクトをパラメタのひとつに持つ場合にのみ、Trueを返す。 -
新しい分析パスを追加
Layout2qDistance. このパスでは、property_set['layout']が設定されると、レイアウトの選択に「得点」をつけることができる。 スコアは、回路内の各2量子ビットゲートが直接接続されていない場合の距離の合計となる。 この採点では、カップリングマップの方向性は考慮されない。 数字が小さいほど、より良いレイアウトを選択できる。例えば、線形結合マップ
[0]--[2]--[1]、次のような回路を考える:qr = QuantumRegister(2, 'qr') circuit = QuantumCircuit(qr) circuit.cx(qr[0], qr[1])レイアウトが
{qr[0]:0, qr[1]:1}の場合、Layout2qDistanceはproperty_set['layout_score'] = 1を設定する。 レイアウトが{qr[0]:0, qr[1]:2}の場合、結果はproperty_set['layout_score'] = 0となる。 スコアは低ければ低いほどいい。 -
QuantumCircuitのcxメソッドのエイリアスとしてqiskit.QuantumCircuit.cnotを追加。cnot」と「cx」はしばしば同じ意味で使われるが、cxメソッドはどちらの名前でも呼び出すことができる。 -
QuantumCircuitのccxメソッドのエイリアスとしてqiskit.QuantumCircuit.toffoliを追加。toffoli」と「ccx」はしばしば同じ意味で使われるが、ccxメソッドはどちらの名前でも呼び出せる。 -
QuantumCircuitのcswapメソッドのエイリアスとしてqiskit.QuantumCircuit.fredkinを追加。fredkin、cswapという名前はしばしば同じ意味で使われるが、cswapメソッドはどちらの名前でも呼び出すことができる。 -
qiskit.visualization.circuit_drawer()のlatex出力モードとqiskit.circuit.QuantumCircuit.draw()メソッドに、ゲートラベルとパラメーターから生のラテックスをパススルーするモードが追加された。 このための構文は、matplotlibの mathtextモードの構文に似ている。 ラベル文字列の' $'文字のペアの間の任意の部分は、生のラテックスとして扱われ、生成された出力ラテックスに直接渡される。 これは、latexドロワーで生成された回路図に、より高度な書式を追加するために活用できます。このリリース以前は、すべてのゲート・ラベルは utf8 -> latex変換にかけられ、出力されるlatexが期待通りに文字列をコンパイルすることを確認していた。 これは、' $' ペアの外にあるラベルのすべての部分で起こることである。 また、ラベルにドル記号を使用する場合は、ラベル文字列の中でドル記号をエスケープしてください(例:
'\$')。このパススルーと、 utf8 -> latex変換をミックス&マッチすることで、例えば、欲しいラベルを正確に作成することができる:
from qiskit import circuit circ = circuit.QuantumCircuit(2) circ.h([0, 1]) circ.append(circuit.Gate(name='α_gate', num_qubits=1, params=[0]), [0]) circ.append(circuit.Gate(name='α_gate$_2$', num_qubits=1, params=[0]), [1]) circ.append(circuit.Gate(name='\$α\$_gate', num_qubits=1, params=[0]), [1]) circ.draw(output='latex')は、最初のカスタム・ゲートのラベルを
α_gateとレンダリングし、2番目は添え字が2でα_gateとなり、最後のカスタム・ゲートのラベルは$α$_gateとなる。 -
制御されたゲートを表現するための
ControlledGateクラスを追加。 コントロールゲートのインスタンスは、Gateオブジェクトのcontrol(n)メソッドで作成される。nはコントロールの数を表す。 新しいゲートでは、制御された量子ビットの前に制御量子ビットが来る。 例:from qiskit import QuantumCircuit from qiskit.extensions import HGate hgate = HGate() circ = QuantumCircuit(4) circ.append(hgate.control(3), [0, 1, 2, 3]) print(circ)以下が生成されます。
q_0: |0>──■── │ q_1: |0>──■── │ q_2: |0>──■── ┌─┴─┐ q_3: |0>┤ H ├ └───┘ -
meas_levelパラメータおよびフィールドの許容値には、 IntEnum クラスqiskit.qobj.utils.MeasLevelのメンバを使用できるようになりました。 これは、execute(またはmeas_levelが指定されている他の場所)をパルス実験で呼び出すときに使用できる。 例:from qiskit import QuantumCircuit, transpile, schedule, execute from qiskit.test.mock import FakeOpenPulse2Q from qiskit.qobj.utils import MeasLevel, MeasReturnType backend = FakeOpenPulse2Q() qc = QuantumCircuit(2, 2) qc.h(0) qc.cx(0,1) qc_transpiled = transpile(qc, backend) sched = schedule(qc_transpiled, backend) execute(sched, backend, meas_level=MeasLevel.CLASSIFIED)この例では、
meas_level=MeasLevel.CLASSIFIEDとmeas_level=2。 -
制約解決に基づく新しいレイアウト・セレクターを搭載。 CSPLayoutはレイアウトを見つける問題を制約問題としてモデル化し、それを解くために再帰的バックトラックを使用する。
cmap16 = CouplingMap(FakeRueschlikon().configuration().coupling_map) qr = QuantumRegister(5, 'q') circuit = QuantumCircuit(qr) circuit.cx(qr[0], qr[1]) circuit.cx(qr[0], qr[2]) circuit.cx(qr[0], qr[3]) pm = PassManager(CSPLayout(cmap16)) circuit_after = pm.run(circuit) print(pm.property_set['layout'])Layout({ 1: Qubit(QuantumRegister(5, 'q'), 1), 2: Qubit(QuantumRegister(5, 'q'), 0), 3: Qubit(QuantumRegister(5, 'q'), 3), 4: Qubit(QuantumRegister(5, 'q'), 4), 15: Qubit(QuantumRegister(5, 'q'), 2) })パラメータ
CSPLayout(...,strict_direction=True)はより制限的だが、CXDirectionの後に実行する必要がないことを保証する。pm = PassManager(CSPLayout(cmap16, strict_direction=True)) circuit_after = pm.run(circuit) print(pm.property_set['layout'])Layout({ 8: Qubit(QuantumRegister(5, 'q'), 4), 11: Qubit(QuantumRegister(5, 'q'), 3), 5: Qubit(QuantumRegister(5, 'q'), 1), 6: Qubit(QuantumRegister(5, 'q'), 0), 7: Qubit(QuantumRegister(5, 'q'), 2) })制約系が解けない場合、レイアウト・プロパティは設定されない。
circuit.cx(qr[0], qr[4]) pm = PassManager(CSPLayout(cmap16)) circuit_after = pm.run(circuit) print(pm.property_set['layout'])None -
PulseBackendConfiguration (通常は backend.configuration ()としてアクセス)は、そのデータと PulseChannelSpec に存在する機能を探索するための便利なメソッドで拡張されている。 PulseChannelSpec は将来的に非推奨となる。 例:
backend = provider.get_backend(backend_name) config = backend.configuration() q0_drive = config.drive(0) # or, DriveChannel(0) q0_meas = config.measure(0) # MeasureChannel(0) q0_acquire = config.acquire(0) # AcquireChannel(0) config.hamiltonian # Returns a dictionary with hamiltonian info config.sample_rate() # New method which returns 1 / dt -
PulseDefaults(通常のアクセスはbackend.defaults())には、circuit_instruction_mapという属性があり、 CmdDef のメソッドを持つ。 新しいcircuit_instruction_mapは、 CmdDef が持っていたものを超える3つの新しい関数を持つInstructionScheduleMapオブジェクトである:- qubit_instructions(qubits)は、量子ビットに定義された操作を返す
- opが定義されていない場合、assert_has(instruction, qubits)はエラーを発生する
- remove(命令, qubits) popと同様だが、パラメータを必要としない
とは若干の違いがある。 CmdDef:
__init__引数を取らないcmdsおよびcmd_qubitsは非推奨となり、instructionsおよびqubits_with_instruction
例:
backend = provider.get_backend(backend_name) inst_map = backend.defaults().circuit_instruction_map qubit = inst_map.qubits_with_instruction('u3')[0] x_gate = inst_map.get('u3', qubit, P0=np.pi, P1=0, P2=np.pi) pulse_schedule = x_gate(DriveChannel(qubit)) -
qiskit.visualization.pulse_drawer()関数とqiskit.pulse.Schedule.draw()メソッドに、新しい kwarg パラメータshow_framechange_channelsが追加され、パルスの視覚化でフレームチェンジインストラクションのみを持つチャンネルの表示をオプションで無効にできるようになった。 この新しいkwargがFalseに設定されている場合、出力パルススケジュールの視覚化には、フレーム変化のみを含むチャンネルは含まれません。例:
from qiskit.pulse import * from qiskit.pulse import library as pulse_lib gp0 = pulse_lib.gaussian(duration=20, amp=1.0, sigma=1.0) sched = Schedule() channel_a = DriveChannel(0) channel_b = DriveChannel(1) sched += Play(gp0, channel_a) sched = sched.insert(60, ShiftPhase(-1.57, channel_a)) sched = sched.insert(30, ShiftPhase(-1.50, channel_b)) sched = sched.insert(70, ShiftPhase(1.50, channel_b)) sched.draw(show_framechange_channels=False) -
新しい効用関数(
qiskit.result.marginal_counts())が追加され、関心のあるいくつかの指標に対するカウントのマージナル化が可能になった。 これは、必要以上に多くの量子ビットが測定され、その一部分だけの観測カウントを得たい場合に有効である。 -
passmanager.run(...)、複数の回路が呼び出された場合、これらの回路のトランスピレーションは並行して実行される。 -
PassManagers は、角括弧演算子を使用して、パスのサブセットを含む新しい PassManager を作成するためにスライスできるようになりました。 これにより、 PassManager の一部を実行または描画することができ、テストや視覚化が容易になる。 例えば、 PassManager pmの最初の3つのパスを描画したり、サーキットの2番目のパスだけを実行してみましょう:
pm[0:4].draw() circuit2 = pm[1].run(circuit)また、 PassManagers を2つ追加するか、 PassManager にパス/パスリストを直接追加することで、 PassManagers を作成できるようになった。
pm = pm1[0] + pm2[1:3] pm += [setLayout, unroller] -
Qiskitに基本的な
schedulerモジュールが追加されました。 スケジューラは、入力されたトランスパイルQuantumCircuitをパルスScheduleにスケジューリングする。 スケジューラは入力として、ScheduleとパルスBackend、または特定の量子ビットの回路Instructionオブジェクトをパルスに関連付けるCmdDef、およびどの測定が一緒に行われなければならないかを決定するmeas_mapのいずれかを受け付ける。スケジューリングの例:
from qiskit import QuantumCircuit, transpile, schedule from qiskit.test.mock import FakeOpenPulse2Q backend = FakeOpenPulse2Q() qc = QuantumCircuit(2, 2) qc.h(0) qc.cx(0,1) qc_transpiled = transpile(qc, backend) schedule(qc_transpiled, backend)現在、スケジューラは、as_late_as_possible (
alap) と as_soon_as_possible (asap) という2つのスケジューリング・ポリシーをサポートしており、それぞれ、回路内の量子ビットをまたいでパルス命令ができるだけ遅く発生するように、またはできるだけ早く発生するようにスケジューリングする。 スケジューリングポリシーは、例えば、入力引数methodで選択することができる:schedule(qc_transpiled, backend, method='alap')パルス
Scheduleを、QuantumCircuitで使用されるゲートなどのカスタム回路命令にマッピングすることで、QuantumCircuit内で使用することは容易である。 これを行うには、まずカスタムゲートを定義し、ゲートが適用される各クビットについて、CmdDef。 このゲートは、QuantumCircuit。 スケジューリング時に、ゲートは基礎となるパルス・スケジュールにマッピングされる。 このテクニックを使うと、Ignisなどの既存のqiskitモジュールと簡単に統合できます。例:
from qiskit import pulse, circuit, schedule from qiskit.pulse import pulse_lib custom_cmd_def = pulse.CmdDef() # create custom gate custom_gate = circuit.Gate(name='custom_gate', num_qubits=1, params=[]) # define schedule for custom gate custom_schedule = pulse.Schedule() custom_schedule += pulse_lib.gaussian(20, 1.0, 10)(pulse.DriveChannel) # add schedule to custom gate with same name custom_cmd_def.add('custom_gate', (0,), custom_schedule) # use custom gate in a circuit custom_qc = circuit.QuantumCircuit(1) custom_qc.append(custom_gate, qargs=[0]) # schedule the custom gate schedule(custom_qc, cmd_def=custom_cmd_def, meas_map=[[0]])
既知の問題
- 複数の回路で
passmanager.run(...)を起動したときに並列にトランスパイルする機能は、Windows ではサポートされていません。 詳細は #2988を参照。
アップグレードの注意
qiskit.pulse.channels.SystemTopologyクラスはPulseChannelSpecのヘルパークラスとして使用された。PulseChannelSpecの非推奨化に伴い削除され、BackendConfigurationの変更により不要となった。- 0.9 リリースで非推奨とされていた、量子ビットと古典ビットのタプル表現は削除されました。
Qubit、Clbitオブジェクトの使用は、量子ビットと古典ビットを表現する新しい方法である。 - 以前は非推奨とされていた、単一文字列としての基本セットの表現は削除された。 文字列のリストが新しい望ましい方法だ。
- 0.9 リリースで非推奨とされたメソッド
BaseModel.as_dictは削除され、メソッドBaseModel.to_dictが採用された。 - PulseDefaults ( backend.defaults ()として通常アクセス)において、
qubit_freq_estとmeas_freq_estが GHz ではなく Hz で返されるようになった。 これは、新しい戻り値が 1e9 ㊟その前の値であることを意味する。 - ディルは必要条件として加えられた。 これは、
passmanager.run()を2つ以上の回路で並列動作させるために必要である。 - 0.9 リリースで非推奨とされていたゲート
UBaseは削除された。 代わりにゲートU3Gate。 - 0.9 リリースで非推奨とされていたゲート
CXBaseは削除された。 代わりにゲートCnotGate。 snapshotlabelパラメータを暗黙のうちに文字列に変換するために使用される命令。 この変換は削除され、文字列が提供されない場合はエラーが発生します。- 0.9 リリースで非推奨とされていたゲート
U0Gateは削除された。 ディレイを挿入するには、代わりにゲートIdGate。
非推奨のメモ
-
qiskit.pulse.CmdDefクラスは廃止されました。 代わりに、qiskit.pulse.InstructionScheduleMap。 パルス対応システムのInstructionScheduleMapオブジェクトはbackend.defaults().instruction_schedulesでアクセスできる。 -
PulseChannelSpecは非推奨となっている。 代わりにBackendConfiguration。 バックエンドの設定には、通常backend.configuration()としてアクセスします。 コンフィグは、 PulseChannelSpec, の機能のほとんどを拡張したもので、以下のように若干の変更が加えられている。0は例示的な量子ビットインデックスである:pulse_spec.drives[0] -> config.drive(0) pulse_spec.measures[0] -> config.measure(0) pulse_spec.acquires[0] -> config.acquire(0) pulse_spec.controls[0] -> config.control(0)デバイスに存在しない量子ビットのチャンネルを取得しようとすると、
BackendConfigurationError。PulseChannelSpec のメソッド
memoryslotsとregisterslotsは、バックエンド設定に移行されていない。 これらの古典的なリソースは、バックエンドシステムの物理的な構成によって制約されることはない。 直接インスタンス化してください:pulse_spec.memoryslots[0] -> MemorySlot(0) pulse_spec.registerslots[0] -> RegisterSlot(0)qubitsメソッドはバックエンド設定に移行されない。qubitsの結果はこのように構築できる:[q for q in range(backend.configuration().n_qubits)] -
Qubitpulse.channels。 使うべきではない。 BackendConfiguration (または backend.configuration ()) を通して、チャンネル <=> の量子ビットマッピングを得ることが可能である。 -
関数
qiskit.visualization.circuit_drawer.qx_color_scheme()は廃止されました。 この関数はもう内部的には使われておらず、現在の IBM QX スタイルを反映していない。 この関数を使用してローカルにスタイル辞書を生成していた場合は、その出力を保存し、その辞書を直接使用する必要があります。 -
Exception
TranspilerAccessErrorは廃止されました。 同じ機能を提供するために、代わりに代替関数TranspilerError。 この代替関数は、まったく同じ機能を提供するが、より汎用性が高い。 -
Pulseのバッファは非推奨。 バッファが0でない場合は、代わりにDelayを使うように警告が出される。 その他のオプションとしては、パルス命令( 0.+0.j )にサンプルを追加したり、次のパルスの開始時間を
schedule.duration + bufferに設定したりすることができる。 -
sympy.Basic、sympy.Expr、sympy.Matrix型を命令パラメータとして渡すことは非推奨であり、将来のリリースで削除される予定である。 入力を、サポートされているタイプのいずれかに変換する必要がある:intfloatcomplexstrnp.ndarray
バグ修正
- トランスパイラの Collect2qBlocks と CommutationAnalysis パスは、Parameterized ゲートを含む回路を処理できず、Parameterized 回路を最適化レベル2以上でトランスパイルできなかった。 これらのパスは、パラメータ化されたゲートを不透明として扱うように修正された。
- align_measures関数に、Measure刺激パルスがAcquireパルスと正しく整列されず、エラーになる問題があった。 現在では、修正されています。
numpy.random.seedの使用は削除され、qiskit 関数の呼び出しが今後numpy.randomjob.queue_position()がNoneを返すとき、ジョブ・モニターで発生するレースコンディションを修正した。Noneはjob.queue_position()からの有効なリターンである。memory=True、kwargが渡されたときにバックエンドのサポートがチェックされるようになった。QiskitErrorサポートされていない場合は、その結果が表示される。- カップリングマップなしでトランスパイルした場合、トランスパイルする回路の量子ビット数のチェックはなかった。 トランスパイル・プロセスは、バックエンドに回路を割り当てるのに十分な量子ビットがあるかどうかをチェックする。
その他の注意事項
qiskit.result.marginal_counts()関数は、 qiskit-ignisqiskit.ignis.verification.tomography.marginal_counts()の同様のユーティリティ関数を置き換えるもので、 将来の qiskit-ignis リリースでは非推奨となる予定です。- すべてのsympyパラメータ出力型のサポートがqiskit-terraから削除されました(または、指摘されているように非推奨となりました)。 これには、
QuantumCircuitオブジェクト、qasm astノード、Qobjオブジェクトのsympy型パラメータが含まれる。
エア 0.3
変更なし
イグニス 0.2
変更なし
アクア 0.6
変更なし
IBM Q プロバイダー 0.4
前奏曲
0.4.0 リリースは、新しい IBM Q API の全機能を使用する最初のリリースである。 特に、 IBM Q からより多くの情報を取得できるように IBMQJob クラスが刷新され、大規模または複雑なジョブをより高レベルでシームレスに使用できるジョブ・マネージャ・クラスが追加されました。 レガシーの IBM Q Experience または QConsole からのアップグレードがまだの場合は、 IBM Q Provider 0.3 (Qiskit 0.11 ) のリリースノートで移行方法の詳細をご確認ください。 レガシーアカウントは本リリースをもってサポート終了となります。
新機能
職務内容の変更
IBMQJob クラスが改訂され、新機能とともにリモート・ジョブの内容をより忠実に模倣するようになった:
- ジョブ送信時に
IBMQBackend.run(..., job_name='...')を指定することで、ジョブに名前を割り当てることができるようになりました。 この名前はIBMQJob.name()、フィルタリングに使うことができる。 - ジョブ送信時にオプションのパラメータ(
job_share_level)により、ジョブを異なるレベル(グローバル、ハブ毎、グループ毎、プロジェクト毎)の他のユーザーと共有できるようになりました。 IBMQJobインスタンスの属性が増え、リモートの IBM Qジョブの内容が反映されるようになった。 このことは、 IBM Q APIによって導入された新しい属性は、自動的に即座に使用可能になることを意味する(例えば、job.new_api_attribute)。新しい属性は、安定したとみなされた時点でメソッドに昇格します(例えば、job.name())。.error_message()ジョブが失敗した理由についての詳細情報を返す。.queue_position()には、更新を強制するためのrefreshパラメータを指定します。.result()失敗したジョブの部分的な結果を返すために、オプションのpartialパラメータを受け取ります。get_counts()のようなResultメソッドは、失敗した実験に適用すると例外を発生させるので注意すること。
この変更には、クラスの低レベルの修正が含まれていることに注意してください。 インスタンスを手動で作成していた場合は、その点に注意してほしい:
- 新機能に対応するため、コンストラクタのシグネチャが変更された。
.submit()メソッドを直接呼び出すことはできなくなり、ジョブは同期IBMQBackend.run()またはジョブ・マネージャー経由で投入されることになります。
ジョブ・マネージャー
複数の回路やパルス・スケジュールで構成されるジョブを処理するための上位メカニズムとして、新しいジョブ・マネージャー(IBMQJobManager)が導入された。 ジョブ・マネージャーは透明なインターフェイスを提供し、インプットを効率的な作業単位にインテリジェントに分割し、さまざまなコンポーネントを最大限に活用することを目指している。 今後のバージョンアップで拡張され、ジョブ提出の推奨エントリーポイントになる予定だ。
その .run() メソッドは、回路またはパルススケジュールのリストを受け取り、 ManagedJobSet instance を返す。これは、これらのジョブのステータスと結果を追跡するために使用できる。 例:
from qiskit.providers.ibmq.managed import IBMQJobManager
from qiskit.circuit.random import random_circuit
from qiskit import IBMQ
from qiskit.compiler import transpile
provider = IBMQ.load_account()
backend = provider.backends.ibmq_ourense
circs = []
for _ in range(1000000):
circs.append(random_circuit(2, 2))
transpile(circs, backend=backend)
# Farm out the jobs.
jm = IBMQJobManager()
job_set = jm.run(circs, backend=backend, name='foo')
job_set.statuses() # Gives a list of job statuses
job_set.report() # Prints detailed job information
results = job_set.results()
counts = results.get_counts(5) # Returns data for experiment 5provider.backends 変更
以前はバックエンドのリストを返す関数であった provider.backends メンバは、サービスに昇格した。 このことは、 .backends() メソッドとして、また、機能を拡張した .backends アトリビュートとしても使用できることを意味している:
-
には、そのプロバイダの既存のバックエンドが属性として含まれており、オートコンプリートに使用することができます。 例:
my_backend = provider.get_backend('ibmq_qasm_simulator')上記は、以下と等価です。
my_backend = provider.backends.ibmq_qasm_simulator -
provider.backends.jobs()およびprovider.backends.retrieve_job()メソッドは、プロバイダー全体のジョブを検索するために使用できる。
その他の変更
backend.properties()関数は、オプションのdatetimeパラメータを受け付けるようになった。 指定された場合、この関数は、指定された datetime フィルタに最も近いがそれより古いバックエンドのプロパティを返します。- いくつかの
warningsは、logger.warningメッセージにトーンダウンしている。