近幾年湃缎,量子計算不僅在量子硬件方面有所發(fā)展,在量子算法的開發(fā)方面也迎來了改進(jìn)冕广。隨著 NISQ(Noisy Intermediate Scale Quantum) 計算機(jī)的推出睬辐,開發(fā)用于探索這些機(jī)器強(qiáng)大能力的算法越來越重要。然而隘谣,在 NISQ 處理器上設(shè)計量子算法時的一個常見問題是如何充分利用這些有限的量子器件熄求。此外,一些量子處理器具有復(fù)雜的幾何約束和其他細(xì)微差別,忽略這些因素將導(dǎo)致錯誤的量子計算瑟押,或影響優(yōu)化和修改的計算結(jié)果氢烘。
量子計算機(jī)能夠高效運(yùn)行 Shor 因子分解算法,能夠解決對于經(jīng)典計算機(jī)來說不可行的因子分解問題,但我們需要數(shù)量非常龐大的量子位——可能需要數(shù)百萬個颅痊。雖然代價巨大,但這項開銷卻是必須的,但目前大多數(shù)量子算法對噪聲的影響都非常敏感膜毁。
(一)含噪中型量子
簡介
NISQ 是含噪中型量子(Noisy Intermediate-Scale Quantum) 的簡稱杂瘸。這個概念由美國理論物理學(xué)家 John Preskill 提出。
**噪聲(Noisy) **指的是現(xiàn)階段由于對量子比特未能完全控制所產(chǎn)生的不準(zhǔn)確性,正是這種不準(zhǔn)確性在短期內(nèi)嚴(yán)重制約了量子設(shè)備實現(xiàn)其目標(biāo);“中型” 指的是在接下來的幾年中悠夯,量子計算機(jī)將要實現(xiàn)的量子規(guī)模大小瞳氓,屆時裹刮,量子比特的數(shù)目將可能從 50 到幾百個不等擦囊。擁有 50-100 量子比特、以及高保真量子門 (Quantum Gate) 的計算機(jī),便可稱為 NISQ 計算機(jī),憑借量子糾纏概念中的量子復(fù)雜性和量子糾錯這兩個原則幌陕,NISQ 計算機(jī)能夠執(zhí)行超越經(jīng)典的數(shù)字計算機(jī)的任務(wù)搬卒。
量子計算機(jī)的優(yōu)勢與掣肘
我們知道依托于量子態(tài)疊加和量子糾纏失暴,量子計算機(jī)可以發(fā)揮出比經(jīng)典計算機(jī)更強(qiáng)大的性能來。而至少有三點理由是可以充分的說明這個說法的:
1
經(jīng)典難解問題的量子算法现恼。針對目前對于經(jīng)典計算機(jī)來說很難的某些問題喳逛,已經(jīng)發(fā)明了量子算法姐呐,可以很容易地解決這些問題麦轰。最著名的例子就是如何尋找一個很大的整數(shù)復(fù)合它素因子的問題。通常我們認(rèn)為因式分解很難,因為許多聰明人幾十年來一直試圖找到更好的因式分解算法,但都沒有成功。憑借量子計算機(jī)強(qiáng)大的算力,量子計算機(jī)在這方面取得了很大的成功。
2
復(fù)雜性理論的論證徙菠。理論計算機(jī)的研究者們基于復(fù)雜性理論提供了論據(jù)问慎,表明(在合理的假設(shè)下)容易用量子計算機(jī)制備具有超經(jīng)典特性的量子態(tài)。具體而言片酝,如果我們測量所有處于這種狀態(tài)下的量子比特猴仑,我們就是從一個相關(guān)的概率分布中取樣,而這個概率分布是無法用任何有效的經(jīng)典手段取樣的榴捡,但是量子計算機(jī)可以做到翰蠢。
3
沒有任何已知的經(jīng)典算法可以模擬量子計算機(jī)。雖然,我們認(rèn)為量子計算強(qiáng)大的論據(jù),有可能僅僅是因為我們不知道如何用經(jīng)典計算機(jī)來模擬量子計算機(jī)似炎,但是物理學(xué)家為了尋找更好的模擬量子計算機(jī)的方法也已經(jīng)經(jīng)過了幾十年仆嗦,仍未有收獲谆甜≡匝啵或許,這也能側(cè)面佐證這一觀點是正確的了榆纽。
明白了量子計算機(jī)為什么具有優(yōu)勢的理由后唠摹,有必要了解一下為什么現(xiàn)如今物理形態(tài)的量子計算機(jī)仍然處于實驗室與研究的階段的原因。
量子計算機(jī)憑借量子特性獲得巨大算力卖局,同樣也因為量子特性產(chǎn)生了使用問題。目前我們無法在不對體系產(chǎn)生不可控干擾的情況下觀察一個量子系統(tǒng)。這意味著,如果我們想用一個量子系統(tǒng)來存儲和可靠地處理信息湃鹊,那么我們需要讓這個系統(tǒng)與外界完全隔離唆途。但與此同時温赔,我們希望量子比特間有強(qiáng)烈的相互作用,以便我們能夠處理信息;我們還需要能夠從外部控制該系體,并最終讀出量子比特培廓,以便我們能夠找到計算的結(jié)果。
最終的結(jié)果就是霞怀,雖然我們能夠利用量子糾錯的原理來保護(hù)量子系統(tǒng)不受外界干擾(通過將量子系統(tǒng)編碼在一個非常高度糾纏的狀態(tài)中),但因為要確認(rèn)計算結(jié)果,對量子系統(tǒng)的干擾還是不可避免地產(chǎn)生了廉沮。為了利用量子糾錯的原理颓遏,我們在量子比特數(shù)上還有非常大的開銷,但目前我們能夠掌握的量子比特數(shù)還不足以提供非持褪保可靠的容錯數(shù)篙梢,所以不可避免的受到噪聲干擾吊说,這也是 NISQ 概念提出的背景。
當(dāng)程序在超過 50 個量子位元的裝置上執(zhí)行時爬舰,工作量就會龐大到難以在傳統(tǒng)電腦上進(jìn)行模擬了官还,此時我們需要量子計算機(jī)來完成這些傳統(tǒng)電腦無法完成的工作。但是因為目前的量子技術(shù)無法提供對于算法來說足夠的容錯能力,導(dǎo)致必須在物理層面上使用不完美的量子位元英岭。相關(guān)的研究工作者們一直在致力于解決如何在不完美的 NISQ 處理器上開發(fā)量子演算的算法蚪战,得到正確的計算結(jié)果令杈。
Criq 算法框架就是谷歌為了改善精確度和降低量子計算中的噪聲而設(shè)計的框架,這是專為 NISQ 算法打造的框架坝咐。
(二)Cirq 簡介
Cirq 是一個 Python 框架弱贼,由 Google Quantum AI 團(tuán)隊發(fā)布辱姨,用于編寫、操作和優(yōu)化量子電路,然后在量子計算機(jī)和量子模擬器上運(yùn)行它們。Cirq 是主要用于含噪中型量子的計算機(jī)開源框架沉填,為處理當(dāng)今含噪聲的中等規(guī)模量子計算機(jī)提供了有意義的思路。
Cirq 算法框架能夠讓研究人員為特定的量子處理器編寫量子算法迹蛤,用戶可以對量子電路的精確控制帮掉,將量子門適當(dāng)?shù)胤胖糜谠O(shè)備上掖蛤,并在量子硬件的約束范圍內(nèi)對這些量子門進(jìn)行調(diào)度释树。為了編寫和編譯量子電路,Cirq 的數(shù)據(jù)結(jié)構(gòu)是專門優(yōu)化過的该窗,能夠讓開發(fā)者更加充分地利用 NISQ 架構(gòu)夜畴。另外玲销,Cirq 支持在本地模擬器上運(yùn)行這些算法炉菲,并可以輕松地與量子硬件或更大的規(guī)模的云端模擬器集成起來堕战,為實驗成果提供了很好的延續(xù)性。
Cirq 算法框架是在 Apache2 協(xié)議下開源的拍霜,可以自由修改或嵌入到任何商業(yè)或開源軟件包中嘱丢。我們可以通過官方網(wǎng)站安裝它:
**1.安裝 **cirq:pip
python -m pip install --upgrade pip
python -m pip install cirq
2.在 cirq.contrib 中安裝功能的依賴項:
python -m pip install cirq-core[contrib]
3.運(yùn)行一個簡單的示例檢查程序是否安裝成功:
import cirq
# Pick a qubit.
qubit = cirq.GridQubit(0, 0)
# Create a circuit
circuit = cirq.Circuit(
cirq.X(qubit)**0.5, # Square root of NOT.
cirq.measure(qubit, key='m') # Measurement.
)
print("Circuit:")
print(circuit)
# Simulate the circuit several times.
simulator = cirq.Simulator()
result = simulator.run(circuit, repetitions=20)
print("Results:")
print(result)
輸出示例:
Circuit:
(0, 0): ───X^0.5───M('m')───
Results:
m=11000111111011001000
Google Quantum AI 團(tuán)隊還發(fā)布了 OpenFermion-Cirq 項目,這是一個基于 Cirq 的應(yīng)用程序示例祠饺。OpenFermion 是一個為化學(xué)問題開發(fā)的量子計算平臺越驻,而 OpenFermion-Cirq 則是一個開源庫,可將量子模擬算法編譯成 Cirq。比如缀旁,它可以完成搭建量子變分算法记劈,模擬分子或者復(fù)雜材料的性質(zhì)等等。
(三)Cirq 實例
成功安裝之后并巍,我們可以通過一些示例來看看目木,Cirq 究竟可以完成什么樣的任務(wù)。
1.構(gòu)建電路
Cirq 中量子程序的主要表示方法是類懊渡,A 是所有在同一抽象時間片段中的行為的集合刽射,An 是對量子比特的特定子集起作用的某種效應(yīng),最常見的類型是 .CircuitCircuitMomentsMomentOperationsOperationOperationGateOperation
這個結(jié)構(gòu)的基礎(chǔ)就是量子位的概念距贷。在 Cirq 中柄冲,量子位和其他量子對象是由 Cirq.Qid 基類的子類實例來識別的,不同子類的 Qid 可以用于不同的情況忠蝗。例如现横,谷歌的設(shè)備多使用的量子比特同城被安排在一個正方形網(wǎng)格的頂點上。為此阁最,可以通過 cirq.GridQubit 類將 cirq.Qid 子類化戒祠,比如我們可以用下面的方法創(chuàng)建一個3乘3的量子比特網(wǎng)格:
qubits = [cirq.GridQubit(x, y) for x in range(3) for y in range(3)]
print(qubits[0])
輸出:
(0,0)
下一個層級是 cirq.Gate 的概念。一個 cirq.Gate 代表了發(fā)生在一個量子比特上的物理過程速种,門的一個非常重要的屬性是它可以被應(yīng)用于一個或多個量子比特姜盈,可以通過下面所示的方法完成:
# This is an Pauli X gate. It is an object instance.
x_gate = cirq.X
# Applying it to the qubit at location (0, 0) (defined above)
# turns it into an operation.
x_op = x_gate(qubits[0])
print(x_op)
輸出:
X((0, 0))
cirq.Moment 只是一個操作的集合,每個操作都是在不同的量子比特集合上進(jìn)行的配阵,在概念上表示這些操作發(fā)生在這個抽象的時間片段上馏颂。這個結(jié)構(gòu)本身并不需要與量子計算機(jī)上實際操作的調(diào)度有關(guān),也可以不通過模擬器運(yùn)行棋傍。比如救拉,利用 Moment Moment X CZ 在三個量子比特的基礎(chǔ)上構(gòu)造矩陣:
cz = cirq.CZ(qubits[0], qubits[1])
x = cirq.X(qubits[2])
moment = cirq.Moment(x, cz)
print(moment)
結(jié)果為:
? 0 1 2
?─┼───────
0 │ @─@ X
│
以上展示的方法不是構(gòu)造矩陣的唯一方法,但它能夠說明A只是對不相交的量子比特集所作操作的集合瘫拣。
如果要利用 Cirq 來構(gòu)建電路亿絮,我們可以通過很多種方法來構(gòu)建,比如將Circuit.append 添加到電路上:
q0, q1, q2 = [cirq.GridQubit(i, 0) for i in range(3)]
circuit = cirq.Circuit()
circuit.append([cirq.CZ(q0, q1),
cirq.H(q2)])
print(circuit)
輸出結(jié)果為:
(0, 0): ───@───
│
(1, 0): ───@───
(2, 0): ───H───
除此之外麸拄,我們還可以添加新的 Moment Circuit 在電路中:
circuit.append([cirq.H(q0), cirq.CZ(q1, q2)])print(circuit)
結(jié)果為:
(0, 0): ───@───H───
│
(1, 0): ───@───@───
│
(2, 0): ───H───@───H───
當(dāng)然為了實現(xiàn)更多進(jìn)階操作派昧,Cirq 框架在建立電路方面還有很多其他的功能提供,比如對電路進(jìn)行切片和迭代拢切、嵌套電路和電路操作等等蒂萎。這里我們將展示一下如何對電路進(jìn)行切片和迭代的操作。
當(dāng)對電路進(jìn)行迭代時淮椰,迭代中的每個項都是一個 moment :
circuit = cirq.Circuit(cirq.H(q0), cirq.CZ(q0, q1))
for moment in circuit:
print(moment)
輸出結(jié)果為:
? 0
?─┼───
0 │ H
│
? 0
?─┼───
0 │ @
│ │
1 │ @
│
同時岖是,切片 A 會產(chǎn)生一個新的帮毁、只與切片對應(yīng)的矩陣 Circuit Circuit
circuit = cirq.Circuit(cirq.H(q0), cirq.CZ(q0, q1), cirq.H(q1), cirq.CZ(q0, q1))
print(circuit[1:3])
(0, 0): ───@───────
│
(1, 0): ───@───H───
這兩種方法有兩種非常有用的應(yīng)用,一種是去掉最后的 moment(通常只是測量值)還有一種就是反轉(zhuǎn)電路 circuit[:-1]豺撑、circuit[::-1]。
2.模擬電路
Cirq 可以通過使用經(jīng)典計算機(jī)模擬量子計算黔牵,來計算量子電路的影響聪轿。Cirq 除了能夠模擬一個像數(shù)學(xué)理論所期望那樣的完美無噪聲的量子計算機(jī),還可以模擬更逼真的猾浦、受誤差和噪聲影響的量子計算機(jī)陆错,并且還能夠?qū)⒎抡娼Y(jié)果可視化,制作出基態(tài)直方圖金赦。
在進(jìn)行模擬操作時音瓷,我們知道擁有實現(xiàn)噪聲量子演化的物體是很有用的,Cirq 支持通過噪聲的算子和來表示對噪聲進(jìn)行建模夹抗,并可以通過 DensityMatrixSimulator 模塊模擬任何含噪的量子電路绳慎,因為它存儲了整個密度矩陣ρ,這種模擬策略通過直接作用于每個量子信道的克勞斯算子來更新狀態(tài)漠烧,具體操作如下:
"""Simulating a circuit with the density matrix simulator."""
# Get a circuit.
qbit = cirq.GridQubit(0, 0)
circuit = cirq.Circuit(
cirq.X(qbit),
cirq.amplitude_damp(0.1).on(qbit))
# Display it.
print("Simulating circuit:")
print(circuit)
# Simulate with the density matrix simulator.
dsim = cirq.DensityMatrixSimulator()
rho = dsim.simulate(circuit).
final_density_matrix
# Display the final density matrix.
print("\nFinal density matrix:")
print(rho)
輸出:
Simulating circuit:
(0, 0): ───X───AD(0.1)───
Final density matrix:
[[0.1 +0.j 0. +0.j]
[0. +0.j 0.90000004+0.j]]
在實際使用過程中杏愤,為了滿足更多的使用場景及模擬需求,Cirq 在模擬電路時還支持在電路中自由的增加噪聲已脓。通常電路僅使用酉操作來定義珊楼,但在 Cirq 中,我們可以給每個電路插入一個噪聲通道度液,具體代碼操作如下:
"""One method to insert noise in a circuit."""
# Define some noiseless circuit.
circuit = cirq.testing.random_circuit(
qubits=3, n_moments=3, op_density=1,
random_state=11)
# Display the noiseless circuit.
print("Circuit without noise:")
print(circuit)
# Add noise to the circuit.
noisy = circuit.with_noise(cirq.depolarize(p=0.01))
# Display it.
print("\nCircuit with noise:")
print(noisy)
輸出結(jié)果:
Circuit without noise:
┌──┐
0: ───@───X─────×────
│ │ │
1: ───@───┼────S┼────
│ │
2: ───Z───@─────×────
└──┘
Circuit with noise:
┌──┐
0: ───@───D(0.01)[cirq.VirtualTag()]───X───D(0.01)[cirq.VirtualTag()]─────×────D(0.01)[cirq.VirtualTag()]───
│ │ │
1: ───@───D(0.01)[cirq.VirtualTag()]───┼───D(0.01)[cirq.VirtualTag()]────S┼────D(0.01)[cirq.VirtualTag()]───
│ │
2: ───Z───D(0.01)[cirq.VirtualTag()]───@───D(0.01)[cirq.VirtualTag()]─────×────D(0.01)[cirq.VirtualTag()]───
└──┘
在完成對電路的自定義操作后厕宗,再輸出結(jié)果時,我們可以選擇使用 Cirq 輸出直方圖堕担,更直觀的去展示模擬結(jié)果已慢,具體操作方法如下:
q = cirq.LineQubit.range(4)
circuit = cirq.Circuit([cirq.H.on_each(*q), cirq.measure(*q)])
result = cirq.Simulator().run(circuit, repetitions=100)
_ = cirq.plot_state_histogram(result, plt.subplot())
plt.show()
當(dāng)遇到某些數(shù)據(jù)結(jié)果較為稀疏的電路圖時蛇受,還可以通過僅繪制直方圖中的非零條目來時直方圖更易閱讀:
q = cirq.LineQubit.range(6)
circuit = cirq.Circuit([cirq.H(q[0]),
[cirq.CNOT(q[0], q[i]) for i in range(1, 6, 1)],
cirq.measure(*q, key='measure_all')])
result = cirq.Simulator().run(circuit, repetitions=100)
_ = cirq.plot_state_histogram(result, plt.subplot())
histogram = result.histogram(key = 'measure_all')
_ = cirq.plot_state_histogram(histogram, plt.subplot())
plt.show()
這樣編輯之后輸出的直方圖結(jié)果為:
3.轉(zhuǎn)換電路
為了保證量子電路能夠在量子硬件設(shè)備上運(yùn)行兢仰,或者提高電路在設(shè)備上的可靠性把将,Cirq 提供了幾種轉(zhuǎn)換電路的方法忆矛。
Cirq 中的轉(zhuǎn)換器是可以隨時被調(diào)用的察蹲,它滿足 cirq.TRANSFORMER 這一 API请垛,并且它能夠?qū)⒁粋€輸入電路轉(zhuǎn)換成一個輸出電路。為了將用戶自定義的電路編譯成可以在特定設(shè)備或模擬器上執(zhí)行的等效電路洽议,通常需要進(jìn)行電路轉(zhuǎn)換宗收,編譯過程通常包括以下步驟:
門分解:只是用屬于設(shè)備目標(biāo)門集的門重寫電路,及設(shè)備可以執(zhí)行的門集亚兄。
量子位映射和路由:將輸入電路中的邏輯量子位映射到設(shè)備上的物理量子位混稽,并插入適當(dāng)?shù)慕粨Q操作,使最終電路著重于硬件拓?fù)洹?/p>
電路優(yōu)化:執(zhí)行具體的硬件優(yōu)化审胚,比如使用更有效地重寫來合并和替換連接1和2操作的組件匈勋,通過電路換算 Z 門,調(diào)整門的瞬間等等膳叨。
Cirq 提供了許多開箱即用的轉(zhuǎn)換器洽洁,它們可以用作單獨(dú)的編譯通道,并且還提供了一個通用框架菲嘴,讓用戶使用強(qiáng)大的原語創(chuàng)建自己的轉(zhuǎn)換器饿自,并將一堆轉(zhuǎn)換器捆綁在一起,以便為特定目標(biāo)編譯電路城豁。
Cirq 內(nèi)置轉(zhuǎn)換器的功能豐富多樣,如支持免編譯標(biāo)簽间聊、支持遞歸變換子電路、編譯目標(biāo)門集等等。這里我們簡單介紹一下 Cirq 是如何將電路編譯為 NISQ 目標(biāo)的飘言。通常 Cirq 只需要在輸入電路上一個接一個的運(yùn)行少量單獨(dú)的編譯傳遞谆吴,就能夠?qū)㈦娐肪幾g為 NISQ 目標(biāo)。
這些操作的前置條件是要對轉(zhuǎn)換器進(jìn)行預(yù)處理鲜锚,預(yù)處理包括優(yōu)化绒极,例如將 1/2 量子位酉的連接分量合并到單個酉矩陣中,然后將其替換為有效的分析分解铡俐;完成預(yù)處理后,進(jìn)入到轉(zhuǎn)換器的后處理步驟滩报,一般包括清理和優(yōu)化,例如丟棄可忽略不計的操作,將單個量子位旋轉(zhuǎn)換為所需的形式握截,電路對準(zhǔn)等等。代碼如下:
# Original QFT Circuit on 3 qubits.
q = cirq.LineQubit.range(3)
circuit = cirq.Circuit(cirq.QuantumFourierTransformGate(3).on(*q), cirq.measure(*q))
print("Original Circuit:", circuit, "\n", sep="\n")
# Compile the circuit for CZ Target Gateset.
gateset = cirq.CZTargetGateset(allow_partial_czs=True)
cz_circuit = cirq.optimize_for_target_gateset(circuit, gateset = gateset)
cirq.testing.assert_circuits_with_terminal_measurements_are_equivalent(circuit, cz_circuit)
print("Circuit compiled for CZ Target Gateset:", cz_circuit, "\n", sep="\n")
輸出結(jié)果為:
Original Circuit:
0: ───qft───M───
│ │
1: ───#2────M───
│ │
2: ───#3────M───
Circuit compiled for CZ Target Gateset:
0: ───PhX(0.5)^0.5───@────────PhXZ(a=1.11e-16,x=1,z=0)───────────PhX(0.5)^0.5───@───PhX(-0.5)^0.5───@───PhX(0.5)^0.5────@────────PhXZ(a=0.5,x=0.5,z=-1.0)───M───
│ │ │ │ │
1: ──────────────────@^-0.5───PhXZ(a=-1,x=0.5,z=-0.5)────@──────────────────────┼───────────────────┼───────────────────┼───────────────────────────────────M───
│ │ │ │ │
2: ──────────────────────────────────────────────────────@^0.5───PhX(0.5)^0.5───@───PhX(0.5)^0.5────@───PhX(-0.5)^0.5───@^0.75───PhXZ(a=0.25,x=0,z=0.25)────M───
4.管理噪聲
在真正的量子設(shè)備上運(yùn)行電路時,意味著我們同時需要處理這些設(shè)備引入計算后的噪聲,以此來提高在硬件上運(yùn)行時電路的可靠性伶椿。Cirq 可通過將噪聲可視化的方式來進(jìn)行更好的校準(zhǔn)工作。
Cirq 繪制的噪聲熱圖分為單量子位熱圖和雙量子位熱圖兩種偎痛,使用時我們可以從網(wǎng)格量子位元組到相應(yīng)浮點值的自定義數(shù)據(jù)映射直接創(chuàng)建熱圖,操作代碼如下:
single_qubit_heatmap = cirq.Heatmap({
(cirq.GridQubit(0, 0),): 0.1,
(cirq.GridQubit(0, 1),): 0.2,
(cirq.GridQubit(0, 2),): 0.3,
(cirq.GridQubit(1, 0),): 0.4,
})
_, ax = plt.subplots(figsize=(8, 8))
_ = single_qubit_heatmap.plot(ax);
最后的輸出結(jié)果如下:
當(dāng)然我們也可以利用類似的方式創(chuàng)建雙量子位如圖:
two_qubit_interaction_heatmap = cirq.TwoQubitInteractionHeatmap({
(cirq.GridQubit(0, 0), cirq.GridQubit(0, 1)): 0.1,
(cirq.GridQubit(0, 1), cirq.GridQubit(0, 2)): 0.2,
(cirq.GridQubit(1, 0), cirq.GridQubit(0, 0)): 0.3,
(cirq.GridQubit(3, 3), cirq.GridQubit(3, 2)): 0.9,
}, annotation_format="0.2f", title = 'Example Two-Qubit Heatmap')
_, ax = plt.subplots(figsize=(8, 8))
_ = two_qubit_interaction_heatmap.plot(ax)
輸出結(jié)果如下:
除了能夠輸出這兩種基礎(chǔ)的量子位熱圖外反粥,我們還可以對輸出的圖像進(jìn)行多種多樣的編輯操作,滿足更多形式展示需求娜膘,比如顏色欄屬性、色彩映射表屬性演怎、批注文本屬性等等。依據(jù)可視化后的校準(zhǔn)指標(biāo)歹叮,接下來讓我們介紹一下如何校準(zhǔn)電路中存在的噪聲問題德谅。
通常在 Cirq 中使用的校準(zhǔn)方式主要分為兩種:Floquet 和 XEB 校準(zhǔn)。兩種校準(zhǔn)主要集中在減少相干誤差的兩個來源影響:校準(zhǔn)漂移和串?dāng)_誤差。這些誤差在整個芯片上并不均勻庸汗,并且在量子位和器件校準(zhǔn)之間的幅度上有所不同改化,在實現(xiàn)最佳性能比在期間上使用額外時間進(jìn)行表征更重要的情況下揍鸟,應(yīng)使用電路特定的校準(zhǔn)。
如果要運(yùn)行校準(zhǔn),需要定義一個或多個電路蛔外,這里我們利用一個使用了單 門的簡單電路進(jìn)行示例:
"""Define your circuit(s) here."""
qubits = cg.line_on_device(device_sampler.device, length=2)
circuit = cirq.Circuit(cirq.ISWAP.on(*qubits) ** 0.5)
print("Example circuit:", circuit, sep="\n\n")
此電路的輸出結(jié)果為:
Example circuit:
(0, 5): ───iSwap───────
│
(0, 6): ───iSwap^0.5───
Floquet 校準(zhǔn)
Floquet 校準(zhǔn)的第一步是定義要表征的角度,它可以快速矛纹、準(zhǔn)確地估計 cirq.PhasedFSimGate 的每個角度:
# Define calibration options.
floquet_options = cg.FloquetPhasedFSimCalibrationOptions(
characterize_theta=True,
characterize_zeta=True,
characterize_chi=False,
characterize_gamma=True,
characterize_phi=True,
)
接下來使用這些選項來獲取表征請求,然后表征它們:
# Get characterization requests.
floquet_characterization_requests = cg.prepare_characterization_for_operations(
circuit, options=floquet_options
)
# Characterize the requests on the engine.
floquet_characterizations = cg.run_calibrations(
floquet_characterization_requests, device_sampler.sampler
)
最后一步瞎访,是使用函數(shù)補(bǔ)償偏移:
# Compensate your circuit based on the characterizations.
floquet_calibrated_circuit = cg.make_zeta_chi_gamma_compensation_for_moments(
circuit, floquet_characterizations
).circuit
print("Floquet calibrated circuit:", floquet_calibrated_circuit, sep="\n\n")
結(jié)果為:
Floquet calibrated circuit:
(0, 5): ───Rz(-0.459π)───FSim(0.25π, 0)───Rz(0.541π)────
│
(0, 6): ───Rz(0.512π)────FSim(0.25π, 0)───Rz(-0.488π)───
XEB 校準(zhǔn)
XEB 校準(zhǔn)的工作原理是在無噪聲仿真器和噪聲處理器上執(zhí)行隨機(jī)電路庫冀瓦,然后比較結(jié)果拾徙。原則上,它可以表征任何雙量子位門崖瞭,當(dāng)然實際使用時也會產(chǎn)生一些限制。
與 Flouet 校準(zhǔn)一樣,使用 XEB 校準(zhǔn)的第一步是定義選項驯杜。與 Flouet 校準(zhǔn)不同的是,XEB 校準(zhǔn)需要大量經(jīng)典處理來表征角度再悼,除了要表征的角度之外,我們還需要定義隨機(jī)電路丑孩。
# Define calibration options.
cycle_depths=(5, 25, 50, 100)
xeb_options = cg.LocalXEBPhasedFSimCalibrationOptions(
cycle_depths=cycle_depths,
n_processes=1,
# Note that all angles below are set to True by default.
fsim_options=cirq.experiments.XEBPhasedFSimCharacterizationOptions(
characterize_theta=False,
characterize_zeta=True,
characterize_chi=True,
characterize_gamma=True,
characterize_phi=False,
),
)
其余步驟與 Flouet 校準(zhǔn)相同:首先獲得表征請求,然后在引擎上表征它們:
# Get characterization requests.
xeb_characterization_requests = cg.prepare_characterization_for_operations(
circuit, options=xeb_options
)
# Characterize the requests on the engine.
xeb_characterizations = cg.run_calibrations(
xeb_characterization_requests, device_sampler.sampler
)
進(jìn)行補(bǔ)償也與 Floquet 校準(zhǔn)示例相同:
xeb_calibrated_circuit = cg.make_zeta_chi_gamma_compensation_for_moments(
circuit, xeb_characterizations,
).circuit
print("XEB calibrated circuit:", xeb_calibrated_circuit, sep="\n\n")
XEB calibrated circuit:
(0, 5): ───Rz(-0.453π)───FSim(0.25π, 0)───Rz(0.538π)────
│
(0, 6): ───Rz(0.507π)────FSim(0.25π, 0)───Rz(-0.484π)───
(四)總結(jié)
目前量子技術(shù)處于高速發(fā)展的時代,Cirq 框架能夠很好的適應(yīng)過渡期,為 NISQ 新時代帶來許多有參考意義的發(fā)展方向檩电,以及對量子生態(tài)建設(shè)做出貢獻(xiàn)。憑借行業(yè)內(nèi)各公司的不斷努力鹅搪,相信在不久的將來恢准,也會有越來越多成熟的產(chǎn)品出現(xiàn)在量子領(lǐng)域涂召,讓我們拭目以待吧。