Snabbstart: Skicka en krets med Cirq för att Azure Quantum

Lär dig hur du använder -paketet för att skicka Cirq-kvantkretsar till ett azure-quantum Python IonQ- eller Honeywell-kvantberäkningsmål via Azure Quantum tjänsten. Mer information finns i Quantum circuits ( Kvantkretsar).

Förutsättningar

  • För att arbeta i Azure Quantum behöver du en Azure-prenumeration. Om du inte har någon Azure-prenumeration kan du skapa ett kostnadsfritt konto.
  • Skapa en Azure Quantum och aktivera önskad provider, Honeywell eller IonQ (eller båda), för det här scenariot. Mer information finns i Skapa en Azure Quantum arbetsyta.

Installera Python-paketet azure-quantum

Python-paketet innehåller de funktioner som krävs för att ansluta till en Azure Quantum-arbetsyta och skicka kvantkretsar till kvantberäkningsmål som azure-quantum IonQ och Honeywell.

  1. Installera Python 3.6 eller senare om du inte redan har gjort det.

  2. Installera PIP och kontrollera att du har version 19.2 eller senare.

    Om du använder Miniconda eller Anacondakan du också skapa en ny miljö genom att ladda ned filen environment.yml och köra följande:

    conda env create -f environment.yml
    

    Detta skapar en ny Conda-miljö som du kan aktivera med följande:

    conda activate azurequantum
    
  3. Installera paketet azure-quantum med pip. Använd flaggan --upgrade för att se till att få den senaste versionen.

    pip install --upgrade azure-quantum[cirq]
    
  4. Starta din favoritkodredigerare eller interaktiva Python-verktyg, till exempel VS Code, Jupyter eller iPython.

Läsa in nödvändiga importer

Kör först följande cell för att läsa in nödvändiga importer:

from azure.quantum.cirq import AzureQuantumService

Anslut till Azure Quantum tjänsten

För att ansluta till Azure Quantum-tjänsten behöver programmet resurs-ID:t och platsen för din Azure Quantum arbetsyta. Logga in på ditt https://portal.azure.com Azure-konto, , gå Azure Quantum arbetsytan och kopiera värdena från rubriken.

Så här hämtar du resurs-ID:t och platsen från en Azure Quantum arbetsyta

Klistra in värdena i följande AzureQuantumService konstruktor för att skapa ett service -objekt som ansluter till Azure Quantum arbetsyta. Du kan också ange ett standardmål, i det här fallet IonQ-simulatorn:

service = AzureQuantumService(
    resource_id="",
    location="",
    default_target="ionq.simulator"
)

Lista alla mål

Nu kan du lista alla mål som du har åtkomst till, inklusive aktuell kötid och tillgänglighet.

print(service.targets())
[<Target name="ionq.qpu", avg. queue time=345 s, Available>,
<Target name="ionq.simulator", avg. queue time=4 s, Available>,
<Target name="honeywell.hqs-lt-s1", avg. queue time=0 s, Available>,
<Target name="honeywell.hqs-lt-s1-apival", avg. queue time=0 s, Available>,
<Target name="honeywell.hqs-lt-s2", avg. queue time=313169 s, Available>,
<Target name="honeywell.hqs-lt-s2-apival", avg. queue time=0 s, Available>,
<Target name="honeywell.hqs-lt-s1-sim", avg. queue time=1062 s, Available>]

Köra en enkel krets

Skapa sedan en enkel Cirq-krets som ska köras. Den här kretsen använder kvadratroten av X-grinden, som är inbyggd i IonQ-maskinvarusystemet.

import cirq

q0, q1 = cirq.LineQubit.range(2)
circuit = cirq.Circuit(
    cirq.X(q0)**0.5,             # Square root of X
    cirq.CX(q0, q1),              # CNOT
    cirq.measure(q0, q1, key='b') # Measure both qubits
)
print(circuit)
0: ───X^0.5───@───M────────
              │   │
1: ───────────X───M────────

Nu kan du köra programmet via Azure Quantum-tjänsten och få resultatet. Följande cell skickar ett jobb (till IonQ-standardsimulatorn) som kör kretsen med 100 bilder, väntar tills jobbet har slutförts och returnerar resultatet.

result = service.run(program=circuit, repetitions=100)

Detta returnerar ett cirq.Result -objekt.

print(result)
    b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010

Köra på IonQ QPU

Föregående jobb kördes på standardsimulatorn, "ionq.simulator" . Du kan dock även köra den på IonQ:s maskinvaruprocessor (en kvantprocessorenhet (QPU)). Om du vill köra på IonQ QPU anger "ionq.qpu" du som target argument:

result = service.run(
    program=circuit,
    repetitions=100,
    target="ionq.qpu",
    timeout_seconds=500 # Set timeout to accommodate queue time on QPU
)

Detta returnerar återigen ett cirq.Result -objekt.

print(result)
b=0101011011011111100001011101101011011110100010000000011110111000100100110110101100110001001111101111, 0101011011011111100001011101101011011110100010000000011110111000100100110110101100110001001111101111

Asynkron modell med jobb

För långvariga kretsar kan det vara användbart att köra dem asynkront. Metoden service.create_job returnerar ett Job -objekt som du kan använda för att hämta resultatet när jobbet har körts.

job = service.create_job(
    program=circuit,
    repetitions=100,
    target="ionq.simulator"
)

Om du vill kontrollera jobbstatusen använder du job.status() :

print(job.status())
'completed'

Om du vill vänta tills jobbet har slutförts och sedan få resultatet använder du blockerings-anropet job.results() :

result = job.results()
print(result)
00: 0.5
11: 0.5

Observera att detta inte returnerar ett cirq.Result -objekt. I stället returneras ett resultatobjekt som är specifikt för IonQ-simulatorn och som använder tillståndssannabilities i stället för bilddata.

type(result)
cirq_ionq.results.SimulatorResult

Om du vill konvertera detta till cirq.Result ett -objekt använder du result.to_cirq_result() :

print(result.to_cirq_result())
b=1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100, 1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100

Installera Python-paketet azure-quantum

Python-paketet innehåller de funktioner som krävs för att ansluta till en Azure Quantum-arbetsyta och skicka kvantkretsar till kvantberäkningsmål som azure-quantum IonQ och Honeywell.

  1. Installera Python 3.6 eller senare om du inte redan har gjort det.

  2. Installera PIP och kontrollera att du har version 19.2 eller senare.

    Om du använder Miniconda eller Anacondakan du också skapa en ny miljö genom att ladda ned filen environment.yml och köra följande:

    conda env create -f environment.yml
    

    Detta skapar en ny Conda-miljö som du kan aktivera med följande:

    conda activate azurequantum
    
  3. Installera paketet azure-quantum med pip. Använd flaggan --upgrade för att se till att få den senaste versionen.

    pip install --upgrade azure-quantum[cirq]
    
  4. Starta din favoritkodredigerare eller interaktiva Python-verktyg, till exempel VS Code, Jupyter eller iPython.

Läsa in nödvändiga importer

Kör först följande cell för att läsa in nödvändiga importer:

from azure.quantum.cirq import AzureQuantumService

Anslut till Azure Quantum tjänsten

För att ansluta till Azure Quantum-tjänsten behöver programmet resurs-ID:t och platsen för din Azure Quantum arbetsyta. Logga in på ditt https://portal.azure.com Azure-konto, , gå Azure Quantum arbetsytan och kopiera värdena från rubriken.

Så här hämtar du resurs-ID:t och platsen från en Azure Quantum arbetsyta

Klistra in värdena i följande AzureQuantumService konstruktor för att skapa ett service -objekt som ansluter till Azure Quantum arbetsyta. Du kan också ange ett standardmål:

from azure.quantum.cirq import AzureQuantumService
service = AzureQuantumService(
    resource_id="",
    location="",
    default_target="honeywell.hqs-lt-s1-apival"
)

Lista alla mål

Nu kan du lista alla mål som du har åtkomst till, inklusive aktuell kötid och tillgänglighet.

print(service.targets())
[<Target name="ionq.qpu", avg. queue time=345 s, Available>,
<Target name="ionq.simulator", avg. queue time=4 s, Available>,
<Target name="honeywell.hqs-lt-s1", avg. queue time=0 s, Available>,
<Target name="honeywell.hqs-lt-s1-apival", avg. queue time=0 s, Available>,
<Target name="honeywell.hqs-lt-s2", avg. queue time=313169 s, Available>,
<Target name="honeywell.hqs-lt-s2-apival", avg. queue time=0 s, Available>,
<Target name="honeywell.hqs-lt-s1-sim", avg. queue time=1062 s, Available>]

Köra en enkel krets på API-valideraren

Anteckning

Honeywell API-valideringsmålet returnerar alltid 0 vid mätning.

Skapa sedan en enkel Cirq-krets som ska köras.

import cirq

q0, q1 = cirq.LineQubit.range(2)
circuit = cirq.Circuit(
    cirq.H(q0), # Hadamard
    cirq.CNOT(q0, q1), # CNOT
    cirq.measure(q0, q1, key='b') # Measure both qubits
)
print(circuit)
0: ───H───@───M────────
          │   │
1: ───────X───M────────

Nu kan du köra programmet via Azure Quantum-tjänsten och få resultatet. Följande cell skickar ett jobb som kör kretsen med 100 bilder, väntar tills jobbet har slutförts och returnerar resultatet.

result = service.run(program=circuit, repetitions=100)

Detta returnerar ett cirq.Result -objekt.

print(result)
    b=0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Du kan rita resultatet i ett histogram:

pl.hist(result.data)
pl.ylabel("Counts")
pl.xlabel("Result")

Asynkront arbetsflöde med jobb

För långvariga kretsar kan det vara användbart att köra dem asynkront. Metoden service.create_job returnerar ett Job -objekt som du kan använda för att hämta resultatet när jobbet har körts.

job = service.create_job(
    program=circuit,
    repetitions=100
)

Om du vill kontrollera jobbstatusen använder du job.status() :

print(job.status())
'Waiting'

Om du vill vänta tills jobbet har slutförts och sedan få resultatet använder du blockerings-anropet job.results() :

result = job.results()
print(result)
    {'m_b': ['00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00']}

Observera att detta inte returnerar ett cirq.Result -objekt. I stället returneras en ordlista med bitstringsmåttresultat som indexerats av måttnyckeln.