天天看點

量子計算(十九):量子軟體開發環境

作者:Lansonli

量子軟體開發環境

量子計算(十九):量子軟體開發環境

一、QPanda

QPanda (Quantum Programming Architecture for NISQ Device Applications)是一個高效、便捷的量子計算開發工具庫,為了讓使用者更容易的使用QPanda,更便捷的進行量子程式設計,它屏蔽了複雜的C++文法結構,甚至使用者不需要了解所謂的面向對象,隻需要學會如何把量子程式設計中用到的接口調用一遍就可以進行量子計算。

例:如何構造一個量子程式,并在量子虛拟機中運作它。

首先假設有一台量子計算機,它有2個量子比特:Q1、Q2,接着對其中一個量子比特(Q1)進行H門操作,構造了一個量子疊加态;并對Q1和Q2做CNOT門操作,Q1為控制量子比特,Q2為目标量子比特,最後對所有的量子比特進行測量操作。此時,将有50%的機率得到00或者11的測量結果。代碼示例如下:

#include "QPanda.h"
#include <stdio.h>
using namespace QPanda;
int main()
{
  init(QMachineType:CPU);/*初始化一個基于CPU計算的量子虛拟機*/
    QProg prog;/*構造一個量子程式*
    auto q = qAllocMany(2);/*申請兩個量子比特*/
    auto c = cAllocMany(2);/*申請兩個經典比特*/
    prog << H(q[0]) /*向量子程式中插入H門、CNOT門和Measure*/
         << CNOT(q[0],q[1])
         << MeasureAlll(q,c);
    auto results = runWithConfiguration(prog,c,1000);/*讓量子程式在量子虛拟機中跑1000次*/
    for (auto result: results){  /*循環輸出結果*/
      printf(s:dn”,result.first.c_stO,result.second)
    }
    finalize();
}           

這是個簡單卻能展現出量子計算特點的例子,它即展現了量子态疊加,又展現量子比持糾纏。從上例可以看到,使用者實質上隻需要關注如何使用OPanda建構量子程式其他的細節操作完全不需要使用者操心。

再例如,在很多量子算法如QAOA算法中,都需要構造一組量子比特的疊加态,那麼完全可以把這種操作抽象成一種生成量子線路的函數,輸入是一組量子比特,輸出是個量子線路。代碼示例如下:

#include "QPanda.h"
#include <stdio.h>
using namespace QPanda;

QCircuit HadamardCircuit(QVec & qvec)
{
  QCircuit qcircuit;  /*構造一個量子線路*/
  for (auto aiter: qvec) /*對傳入的量子比特做H門操作*/
  {
    qcircuit<<H(aiter); /*把H門插入的量子線路中*/
  }
  return qcircuit; /*傳回量子線路*/
}
int main()
{
  init(QMachincTypc:CPU); /*初始化一個基于CPU計算的量子虛拟機*/
  QProg prog; /*構造一個量子程式*/
  auto q = qAllocMany(2) /*申請兩個量子比特*/
  auto c = cAllocMany(2) /*申請兩個經典比特*/
  prog << HandmadeCircuit(q) /*調用HadamardCireuit函數,并把生成的量子線路插入到量子程式中*/
  auto results = runWithConfiguration(prog,c,1000):/*讓量子程式在量子虛拟機中跑1000次*/
  for (auto result: results) { /*循環輸出結果*/
  printf("%s:%d\n",result.first.c_str(),result.second);
}
  finalize();
}           

從上述兩例可以知道,使用者隻需要關注量子程式的建構,其他的部分,如量子虛拟機的建構、申請量子比特、執行量子程式和擷取結果,都是一個固定的流程,隻需要調用函數接口即可。

深入了解QPanda的使用,就必須要了解一下QPanda中與量子計算相關的資料類型:QGate(量子邏輯門),Measure(測量)、ClassicalProg(經典程式)、QCircuit(量子線路)、Qif(量子條件判斷程式)、Qwhile(量子循環程式)、QProg(量子程式)。

QGate:量子邏輯門是量子計算的基本機關,任何一個量子程式都是由QGate組合而成,如果說量子程式或量子算法是一套拳法,那麼QGate就是一個個被拆解出來的動作,幾個QGate的固定組合就是一個招式,它們的最終目的就是把這套拳法打出來。

OPanda2把所有的量子邏輯門封裝為API向使用者提供使用,并可獲得OGate類型的傳回值。例如,如果想使用Hadamard門,就可以通過如下方式獲得:

QGate h= Hqubit);           

再例如,想要使用RX門,可以通過如下方式獲得:

QGate rx =RX(qubit,PI);           

如上所示,RX門接收兩個參數,第一個是目标量子比特,第二個偏轉角度,也可以通過相同的方式使用RY,RZ門。

兩比特量子邏輯門的使用和單比特量子邏輯門的用法相似,隻不過是輸入的參數不同,舉個使用CNOT的例子:

QGate cnot = CNOT(control_qubit,target_qubit);           

CNOT門接收兩個參數,第一個是控制比特,第二個是目标比特。

Measure:它的的作用是對量子比特進行測量操作。

在量子程式中需要對某個量子比特做測量操作,并把測量結果存儲到經典寄存器上可以通過下面的方式獲得一個測量對象:

auto measure = Measure(qubit,cbit);           

可以看到Measure接兩個參數,第一個是測量比特,第二個是經典寄存器。如果想測量所有的量子比特并将其存儲到對應的經典寄存器上,可以如下操作:

auto measure_all = MeasureAll(qubits,cbits);
#MeasureAll的傳回值類型是QProg           

其中qubits的類型是QVec,cbits的類型是vector<ClassicalCondition>。

在得到含有量子測量的程式後,可以調用directlyRun或runWithConfiguration來得到量子程式的測量結果。

directlyRun的功能是運作量子程式并傳回運作的結果,使用方法如下:

QProg prog;
prog << H(qubits[0])
     << CNOT(qubits[0], qubits[1])
     << CNOT(qubits[l], qubits[2])
     << CNOT(qubits[2], qubits[3])
     << Measure(qubits[0], cbits[0]);
auto result = directlyRun(prog);           

runWithConfiguration的功能是末态目标量子比特序列在量子程式多次運作結果中出現的次數,使用方法如下:

QProg prog;
prog << H(qubits[0])
     << H(qubits[1])
     << H(qubits[2])
     << H(qubits[3])
     << MeasureAll(qubits, cbits); // 測量所有的量子比特
auto result = runWithConfiguration(prog, cbits, 1000);           

其中第一個參數是量子程式,第二個參數是經典寄存器,第三個參數是運作的次數

執行個體:

#include <OPanda.h>
USING_OPANDA
int main(void)
{
    auto qvm = initQuantumMachine();
    auto qubits = qvm->allocateQubits(4);
    auto cbits = qvm->allocateCBits(4);
    QProg progs
    prog << H(qubits[0])
         << H(qubits[1])
         << H(qubits[2])
         << H(qubits[3])
         << MeasureAll(qubits, cbits)
    auto result = quickMeasure(progy, 1000)
    for (auto &val: result)
    {
        std::cout << val.first << "," << val.second << std::endl;
    }
    qvm->finalize();
    delete qvm;
    return 0;
}           

運作結果

0000,47

0001,59

0010,74

0011,66

0100,48

0101,62

0110,71

0111,61

1000,70

1001,57

1010,68

1011,63

1100,65

1101,73

1110,55

1111,61

ClassicalProg:經典程式也可以被插入到量子程式中,它使得量子程式也可以進行邏輯判斷和簡單的經典計算,使得量子程式更靈活。打個比方,就像是向一套拳法中加入了步法,使得這套拳法可以輾轉騰挪。

QCircuit:量子線路是由多個量子邏輯門組成的,或者說量子線路是一個大型的量子邏輯門,也就是說QCircuit中可以插入QGate和ClassicalProg。如果映射到功夫中,QCircuit就是拳法中拆解出來的套路。

Qif:量子條件判斷程式,顧名思義,它可以讓量子程式進行邏輯判斷,即針對不同的對手拳法的套路也是可變的。

QWhile:量子循環判斷程式,即根據循環判斷條件把一個量子程式或量子線路多次運作。

QProg:它是一個容器,可以容納所有量子計算相關的資料類型,在構造量子程式時,使用者可以把QGate、QCircuit、Qif、QWhile、QProg、ClassicalProg類型插入到QProg中。

QPanda的特點不僅僅展現着它的易用性,還包括它的高效,如下圖,在同等硬體配置下,QPanda的量子虛拟機運作量子程式的速度,相對其他工具有着巨大優勢。

量子計算(十九):量子軟體開發環境

除此之外,QPanda還內建了量子程式優化器、量子程式調試工具,量子程式編譯器。

  1. 量子程式優化器:QPanda的優化器通過特有的算法對量子程式的優化,可最大限度的減少計算時間。
  2. 量子程式調試工具:QPanda的調試工具解決的量子算法工程師長期以來的困擾重程碑的實作類量子程式的調試功能
  3. 量子程式編譯器:不僅把量子程式轉換為多種量子彙編語言,更可以生成量子程式可執行檔案。

二、ORunes

QRunes是一種面向過程、指令式的量子程式設計語言Imperativelanguage(目前主流的一種程式設計範式),它的出現是為了實作量子算法。QRunes根據量子計算的經典與量子混合(Quamtum-ClassicalHybrid)特性,在程式編譯之後可以操縱經典計算機與量子晶片來實作量子計算。

QRunes通過提供進階語言的形式(類似C語言的程式設計風格)來表示量子算法的實作和程式邏輯控制,其豐富的類型系統(QuantumType,AuxiliaryType,ClassicalType)可以實作量子計算中資料對象的綁定和行為控制,可以滿足各類量子算法開發人員的算法實作需求。

QRunes構成:Settings,QCodes和Script。其中Settings部分定義了關于QRunes編譯的全局資訊;QCodes部分是具體的對于量子比特操作和行為的控制;Script部分是宿主程式的實作,它的實作依賴于經典程式設計語言(C++,Python等)和相關聯的量子程式開發工具包(比如:QPanda/pyQPanda)。

三、本源量子雲平台

本源量子雲平台是國内首家基于模拟器研發且能在傳統計算機上模拟32位量子晶片進行量子計算和量子算法程式設計的系統,目前該系統主要服務于各大科研院所、高校及相關企業,冒在為專業人員提供基于量子模拟器的開發平台。

本源量子雲平台提供了兩種虛拟機供使用者選擇,其中32位量子虛拟機免費使用、64位需付費申請,虛拟機采用可視化程式設計模式圖例+量子語言,使用者可輕松拖動、放置圖例進行量子算法模拟,并可将設計的運算轉化為量子語言模式深入學習。量子雲平台是連接配接使用者和量子計算裝置之間的橋梁,目前量子系統運作結構通常是經典計算向量子系統發起計算任務請求,待量子系統完成計算任務後再以經典資訊的方式傳回給使用者,整個過程都需要量子雲平台在中間協調。

本源量子計算雲平台的工作結構可以劃分為四個部分:後端系統、控制指令、量子雲端、以及使用者端;其中後端系統包括了量子虛拟機,以及不同組織機構開發的量子晶片;控制指令則是通過其他程式設計語言或底層語言建構的能被量子系統識别的指令;量子雲即是可視化程式設計、資料中轉、使用者資料存儲交流等雲服務;使用者端,包括問題的設計、算法規則構造、可視化結果等。

目前,本源量子計算系統包括了三種構造控制指令的方法,如下圖所示,分别為可視化線路的設計、量子語言和量子軟體開發套件QPanda,其中可視化程式設計和量子語言衣托在量子雲平台上,使用者在進行量子程式設計的時候可以互相轉化:對于功能完整的QPanda,則使用c++為宿主語言開發的SDK,使用者可以使用c++直接開發量子程式。當然QPanda也開發了支援Python的庫,也就是說可以使用Python來開發量子程式。使用QPadna編寫的量子程式,可以很友善地轉化為量子語言或者可視化的量子線路,在量子雲平台上可以可視化的進行基礎的算法設計、雲平台的操作,通過拖動量子邏輯門來建構控制序列,添加測量指令,即可運作得出結果。

通常使用者會通過雲平台建構簡單的量子算法,之後待量子線路圖轉化為虛拟機或量子系統識别的指令,并将資料送入虛拟機或者量子系統,完成計算之後,回傳結果,此時使用者就能收到最終的計算結果。

量子計算(十九):量子軟體開發環境
量子計算(十九):量子軟體開發環境

繼續閱讀