Quickstart: Een circuit met Cirq verzenden naar Azure Quantum

Meer informatie over het gebruik van het pakket voor het verzenden van Cirq-kwantumcircuits naar een azure-quantum Python IonQ- of Quantum-kwantumcomputingdoel via de Azure Quantum service. Zie Kwantumcircuits voor meer informatie.

Vereisten

  • Als u in Azure Quantum wilt werken, hebt u een Azure-abonnement nodig. Als u nog geen abonnement op Azure hebt, maakt u een gratis account aan.
  • Maak een Azure Quantum werkruimte en schakel uw voorkeursprovider, Provider of IonQ (of beide), in voor dit scenario. Zie Een werkruimte Azure Quantum maken voor meer informatie.

Het Python-pakket voor azure-quantum installeren

Het Python-pakket bevat de benodigde functionaliteit voor het maken van verbinding met een Azure Quantum-werkruimte en het verzenden van kwantumcircuits naar de kwantumcomputingdoelen zoals azure-quantum IonQ en Python.

  1. Installeer Python 3.6 of hoger als u dat nog niet hebt gedaan.

  2. Installeer PIP en zorg ervoor dat u versie 19.2 of hoger hebt.

    Als u Miniconda of Anacondagebruikt, maakt u desgewenst een nieuwe omgeving door het bestand environment.yml te downloaden en het volgende uit te gaan:

    conda env create -f environment.yml
    

    Hiermee maakt u een nieuwe Conda-omgeving die u met het volgende kunt activeren:

    conda activate azurequantum
    
  3. Installeer het azure-quantum pakket met behulp van pip. Gebruik de --upgrade vlag om ervoor te zorgen dat u de nieuwste versie krijgt.

    pip install --upgrade azure-quantum[cirq]
    
  4. Start uw favoriete code-editor of interactief Python-hulpprogramma, zoals VS Code, Jupyter of iPython.

De vereiste importen laden

Voer eerst de volgende cel uit om de vereiste imports te laden:

from azure.quantum.cirq import AzureQuantumService

Verbinding maken naar de Azure Quantum service

Als u verbinding wilt maken met Azure Quantum-service, heeft uw programma de resource-id en de locatie van uw Azure Quantum nodig. Meld u aan bij uw Azure-account, https://portal.azure.com , navigeer naar Azure Quantum werkruimte en kopieer de waarden uit de header.

De resource-id en locatie ophalen uit een Azure Quantum werkruimte

Plak de waarden in de volgende AzureQuantumService constructor om een service object te maken dat verbinding maakt met Azure Quantum werkruimte. U kunt desgewenst een standaarddoel opgeven, in dit geval de IonQ-simulator:

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

Een lijst met alle doelen maken

U kunt nu een lijst maken met alle doelen waar u toegang tot hebt, inclusief de huidige wachtrijtijd en beschikbaarheid.

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>]

Een eenvoudig circuit uitvoeren

Maak vervolgens een eenvoudig Cirq-circuit om uit te voeren. Dit circuit maakt gebruik van de vierkantswortel van X-gate, systeemeigen voor het IonQ-hardwaresysteem.

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────────

U kunt het programma nu uitvoeren via de Azure Quantum service en het resultaat krijgen. De volgende cel verstuurt een taak (naar de standaard IonQ-simulator) waarmee het circuit wordt uitgevoerd met 100 opnamen, wordt gewacht tot de taak is voltooid en de resultaten retourneert.

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

Hiermee wordt een cirq.Result -object retourneert.

print(result)
    b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010

Uitvoeren op IonQ QPU

De vorige taak is op de standaardsimulator, "ionq.simulator" . U kunt deze echter ook uitvoeren op de hardwareprocessor van IonQ (een Quantum Processor Unit (QPU)). Als u wilt uitvoeren op de IonQ QPU, geeft "ionq.qpu" u op als het target argument:

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

Ook hier wordt een cirq.Result -object retourneert.

print(result)
b=0101011011011111100001011101101011011110100010000000011110111000100100110110101100110001001111101111, 0101011011011111100001011101101011011110100010000000011110111000100100110110101100110001001111101111

Asynchroon model met taken

Voor langlopende circuits kan het handig zijn om ze asynchroon uit te voeren. De service.create_job methode retourneert een -object, dat u kunt gebruiken om de resultaten te Job krijgen nadat de taak is uitgevoerd.

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

Als u de taakstatus wilt controleren, gebruikt job.status() u :

print(job.status())
'completed'

Als u wilt wachten tot de taak is voltooid en vervolgens de resultaten krijgt, gebruikt u de blokkerende aanroep job.results() :

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

Houd er rekening mee dat hiermee geen -object wordt cirq.Result retourneren. In plaats daarvan wordt een resultaatobject retourneert dat specifiek is voor de IonQ-simulator en dat gebruikmaakt van toestandskansen in plaats van opgenomen gegevens.

type(result)
cirq_ionq.results.SimulatorResult

Als u dit wilt converteren naar cirq.Result een -object, gebruikt result.to_cirq_result() u :

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

Het Python-pakket voor azure-quantum installeren

Het Python-pakket bevat de benodigde functionaliteit voor het maken van verbinding met een Azure Quantum-werkruimte en het verzenden van kwantumcircuits naar de kwantumcomputingdoelen zoals azure-quantum IonQ en Python.

  1. Installeer Python 3.6 of hoger als u dat nog niet hebt gedaan.

  2. Installeer PIP en zorg ervoor dat u versie 19.2 of hoger hebt.

    Als u Miniconda of Anacondagebruikt, maakt u desgewenst een nieuwe omgeving door het bestand environment.yml te downloaden en het volgende uit te gaan:

    conda env create -f environment.yml
    

    Hiermee maakt u een nieuwe Conda-omgeving die u met het volgende kunt activeren:

    conda activate azurequantum
    
  3. Installeer het azure-quantum pakket met behulp van pip. Gebruik de --upgrade vlag om ervoor te zorgen dat u de nieuwste versie krijgt.

    pip install --upgrade azure-quantum[cirq]
    
  4. Start uw favoriete code-editor of interactief Python-hulpprogramma, zoals VS Code, Jupyter of iPython.

De vereiste importen laden

Voer eerst de volgende cel uit om de vereiste imports te laden:

from azure.quantum.cirq import AzureQuantumService

Verbinding maken aan de Azure Quantum service

Als u verbinding wilt maken met Azure Quantum-service, heeft uw programma de resource-id en de locatie van uw Azure Quantum nodig. Meld u aan bij uw Azure-account, https://portal.azure.com , navigeer naar Azure Quantum werkruimte en kopieer de waarden uit de header.

De resource-id en locatie ophalen uit een Azure Quantum werkruimte

Plak de waarden in de volgende AzureQuantumService constructor om een service object te maken dat verbinding maakt met Azure Quantum werkruimte. Geef desgewenst een standaarddoel op:

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

Een lijst met alle doelen maken

U kunt nu een lijst maken met alle doelen waar u toegang tot hebt, met inbegrip van de huidige wachtrijtijd en beschikbaarheid.

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>]

Een eenvoudig circuit uitvoeren op de API-validatie

Notitie

Het validatiedoel van de Api voor Den Controleren retourneren altijd 0 bij meting.

Maak vervolgens een eenvoudig Cirq-circuit om uit te voeren.

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────────

U kunt het programma nu uitvoeren via de Azure Quantum service en het resultaat krijgen. De volgende cel verstuurt een taak die het circuit met 100 opnamen wordt uitgevoerd, wacht totdat de taak is voltooid en retourneert de resultaten.

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

Hiermee wordt een cirq.Result -object retourneert.

print(result)
    b=0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

U kunt de resultaten in een histogram plotten:

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

Asynchrone werkstroom met taken

Voor langlopende circuits kan het handig zijn om ze asynchroon uit te voeren. De service.create_job methode retourneert een -object, dat u kunt gebruiken om de resultaten te Job krijgen nadat de taak is uitgevoerd.

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

Als u de taakstatus wilt controleren, gebruikt job.status() u :

print(job.status())
'Waiting'

Als u wilt wachten tot de taak is voltooid en vervolgens de resultaten krijgt, gebruikt u de blokkerende aanroep 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']}

Houd er rekening mee dat hiermee geen -object wordt cirq.Result retourneren. In plaats daarvan wordt een woordenlijst met bitstringmetingresultaten die zijn geïndexeerd door de metingssleutel.