Notes de publication de Qiskit 0.14
0.14.0
Terra 0.11.0
Prélude
La version 0.11.0 comprend plusieurs nouvelles fonctionnalités et corrections de bogues. Le plus grand changement de cette version est l'ajout du planificateur d'impulsions. Cela permet aux utilisateurs de définir leur programme quantique sous la forme d'un site QuantumCircuit , puis de le faire correspondre aux instructions d'impulsion sous-jacentes qui contrôleront le matériel quantique pour mettre en œuvre le circuit.
Nouvelles fonctions
-
Ajout de 5 nouvelles commandes pour récupérer facilement des données spécifiques à l'utilisateur à partir de
BackendProperties:gate_property,gate_error,gate_length,qubit_property,t1,t2,readout_erroretfrequency. Ils renvoient les valeurs spécifiques des propriétés du backend. Par exemple :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) -
Ajout de la méthode
Instruction.is_parameterized()pour vérifier si un objet instruction est paramétré. Cette méthode renvoieTruesi et seulement si l'instruction a un objetParameterExpressionouParameterpour l'un de ses paramètres. -
Ajout d'une nouvelle passe d'analyse
Layout2qDistance. Cette passe permet de "noter" une sélection de mise en page, une fois queproperty_set['layout']est défini. Le score sera la somme des distances pour chaque porte à deux qubits dans le circuit, lorsqu'elles ne sont pas directement connectées. Cette notation ne tient pas compte de la direction de la carte de couplage. Plus le chiffre est bas, meilleure est la sélection de la mise en page.Par exemple, considérons une carte de couplage linéaire
[0]--[2]--[1]et le circuit suivant :qr = QuantumRegister(2, 'qr') circuit = QuantumCircuit(qr) circuit.cx(qr[0], qr[1])Si la présentation est
{qr[0]:0, qr[1]:1},Layout2qDistancedéfiniraproperty_set['layout_score'] = 1. Si la disposition est{qr[0]:0, qr[1]:2}, le résultat estproperty_set['layout_score'] = 0. Plus le score est bas, mieux c'est. -
Ajout de
qiskit.QuantumCircuit.cnotcomme alias de la méthodecxdeQuantumCircuit. Les nomscnotetcxsont souvent utilisés de manière interchangeable. La méthode cx peut être appelée avec l'un ou l'autre de ces noms. -
Ajout de
qiskit.QuantumCircuit.toffolicomme alias de la méthodeccxdeQuantumCircuit. Les nomstoffolietccxsont souvent utilisés de manière interchangeable. La méthode ccx peut être appelée avec l'un ou l'autre de ces noms. -
Ajout de
qiskit.QuantumCircuit.fredkincomme alias de la méthodecswapdeQuantumCircuit. Les nomsfredkinetcswapsont souvent utilisés de manière interchangeable. La méthode cswap peut être appelée avec l'un ou l'autre nom. -
Le mode de sortie
latexpourqiskit.visualization.circuit_drawer()et la méthodeqiskit.circuit.QuantumCircuit.draw()disposent désormais d'un mode permettant de transmettre le latex brut des étiquettes et des paramètres des portes. La syntaxe pour ce faire reflète la syntaxe du mode mathtext de matplotlib. Toute partie d'une chaîne d'étiquettes comprise entre une paire de caractères '$' sera traitée comme du latex brut et transmise directement au latex de sortie généré. Il peut être utilisé pour ajouter un formatage plus avancé aux schémas de circuit générés avec le tiroir latex.Avant cette version, toutes les étiquettes de porte passaient par une conversion utf8 -> latex pour s'assurer que le latex de sortie compilerait la chaîne comme prévu. C'est toujours ce qui se produit pour toutes les parties d'une étiquette en dehors de la paire "$". De même, si vous souhaitez utiliser un signe de dollar dans votre étiquette, assurez-vous de l'échapper dans la chaîne de l'étiquette (c'est-à-dire
'\$').Vous pouvez combiner ce passage avec la conversion utf8 -> latex pour créer l'étiquette exacte que vous souhaitez, par exemple :
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')rendra maintenant l'étiquette de la première porte personnalisée comme
α_gate, la deuxième seraα_gateavec un indice 2, et l'étiquette de la dernière porte personnalisée sera$α$_gate. -
Ajouter la classe
ControlledGatepour représenter les portes contrôlées. Les instances de portails contrôlés sont créées avec la méthodecontrol(n)des objetsGateoùnreprésente le nombre de contrôles. Les qubits de contrôle sont placés avant les qubits contrôlés dans la nouvelle porte. Par exemple :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)génère :
q_0: |0>──■── │ q_1: |0>──■── │ q_2: |0>──■── ┌─┴─┐ q_3: |0>┤ H ├ └───┘ -
Les valeurs autorisées des paramètres et champs de
meas_levelpeuvent désormais être des membres de la classe IntEnumqiskit.qobj.utils.MeasLevel. Ceci peut être utilisé lors de l'appel àexecute(ou à tout autre endroit oùmeas_levelest spécifié) avec une expérience d'impulsion. Par exemple :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)Dans l'exemple ci-dessus,
meas_level=MeasLevel.CLASSIFIEDetmeas_level=2peuvent être utilisés indifféremment. -
Un nouveau sélecteur d'agencement basé sur la résolution de contraintes est inclus. CSPLayout modélise le problème de la recherche d'une disposition comme un problème de contraintes et utilise le backtracking récursif pour le résoudre.
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) })Le paramètre
CSPLayout(...,strict_direction=True)est plus restrictif mais il garantit qu'il n'est pas nécessaire d'exécuterCXDirectionpar la suite.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) })Si le système de contraintes n'est pas résoluble, la propriété "layout" n'est pas définie.
circuit.cx(qr[0], qr[4]) pm = PassManager(CSPLayout(cmap16)) circuit_after = pm.run(circuit) print(pm.property_set['layout'])None -
PulseBackendConfiguration (accessible normalement sous le nom de backend.configuration ()) a été complété par des méthodes utiles pour explorer ses données et la fonctionnalité qui existe dans PulseChannelSpec. PulseChannelSpec sera obsolète à l'avenir. Par exemple :
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(accessible normalement sous le nom debackend.defaults()) a un attribut,circuit_instruction_map, qui a les méthodes de CmdDef. Le nouveau circuit_instruction_map est un objet deInstructionScheduleMapavec trois nouvelles fonctions en plus de celles de CmdDef :- qubit_instructions(qubits) renvoie les opérations définies pour les qubits
- assert_has(instruction, qubits) lève une erreur si l'option n'est pas définie
- remove(instruction, qubits) comme pop, mais sans paramètres
Il y a quelques différences par rapport à la CmdDef:
__init__ne prend aucun argumentcmdsetcmd_qubitssont obsolètes et remplacés parinstructionsetqubits_with_instruction
Exemple :
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)) -
Un nouveau paramètre kwarg,
show_framechange_channels, a été ajouté à la fonctionqiskit.visualization.pulse_drawer()et à la méthodeqiskit.pulse.Schedule.draw()pour désactiver éventuellement l'affichage des canaux contenant uniquement des instructions de changement de trame dans les visualisations d'impulsions. Lorsque ce nouveau kwarg est réglé surFalse, la visualisation du calendrier des impulsions de sortie ne comprendra pas les canaux qui ne comprennent que des changements de trame.Par exemple :
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) -
Une nouvelle fonction d'utilité
qiskit.result.marginal_counts()est ajoutée, qui permet de marginaliser les comptages sur certains indices d'intérêt. Cela est utile lorsque le nombre de qubits mesurés est plus élevé que nécessaire et que l'on souhaite obtenir le nombre d'observations pour un sous-ensemble d'entre eux seulement. -
Lorsque
passmanager.run(...)est invoqué avec plus d'un circuit, la transpilation de ces circuits s'effectue en parallèle. -
PassManagers peut maintenant être découpé en tranches pour créer un nouveau site PassManager contenant un sous-ensemble de passes à l'aide de l'opérateur de crochets. Cela permet d'exécuter ou de dessiner une partie du site PassManager pour faciliter les tests et la visualisation. Par exemple, essayons de dessiner les 3 premières passes d'un PassManager pm, ou de ne faire que la deuxième passe sur notre circuit :
pm[0:4].draw() circuit2 = pm[1].run(circuit)Désormais, PassManagers peut également être créé en ajoutant deux PassManagers ou en ajoutant directement un laissez-passer/une liste de laissez-passer à PassManager.
pm = pm1[0] + pm2[1:3] pm += [setLayout, unroller] -
Un module de base
schedulera été ajouté à Qiskit. L'ordonnanceur planifie une entrée transpiléeQuantumCircuiten une impulsionSchedule. Le programmateur accepte en entrée unScheduleet soit une impulsionBackend, soit unCmdDefqui relie les objets du circuitInstructionsur des qubits spécifiques à des impulsions programmées et unmeas_mapqui détermine les mesures qui doivent se produire ensemble.Exemple de programmation :
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)Le programmateur prend actuellement en charge deux politiques de programmation, as_late_as_possible (
alap) et as_soon_as_possible (asap), qui programment respectivement les instructions d'impulsion pour qu'elles se produisent le plus tard possible ou le plus tôt possible à travers les qubits d'un circuit. La politique d'ordonnancement peut être sélectionnée à l'aide de l'argument d'entréemethod, par exemple :schedule(qc_transpiled, backend, method='alap')Il est facile d'utiliser une impulsion
Scheduleà l'intérieur d'uneQuantumCircuiten l'associant à une instruction de circuit personnalisée telle qu'une porte qui peut être utilisée dans uneQuantumCircuit. Pour ce faire, il faut d'abord définir la porte personnalisée, puis ajouter une entrée dans le siteCmdDefpour la porte, pour chaque qubit auquel la porte sera appliquée. La porte peut ensuite être utilisée sur le siteQuantumCircuit. Au moment de la programmation, la porte sera mise en correspondance avec le programme d'impulsions sous-jacent. L'utilisation de cette technique permet une intégration facile avec les modules qiskit préexistants tels qu'Ignis.Par exemple :
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]])
Problèmes connus
- La fonction de transpiling en parallèle lorsque
passmanager.run(...)est invoqué avec plus d'un circuit n'est pas prise en charge sous Windows. Voir #2988 pour plus de détails.
Mise à niveau
- La classe
qiskit.pulse.channels.SystemTopologya été utilisée comme classe d'aide pourPulseChannelSpec. Elle a été supprimée depuis la dépréciation dePulseChannelSpecet les changements apportés àBackendConfigurationla rendent inutile. - La représentation des qubits et des bits classiques sous forme de tuple, qui avait été supprimée dans la version 0.9, a été supprimée. L'utilisation des objets
QubitetClbitest la nouvelle façon de représenter les qubits et les bits classiques. - La représentation de l'ensemble de base sous forme de chaîne de caractères a été supprimée. Une liste de chaînes de caractères est la nouvelle méthode préférée.
- La méthode
BaseModel.as_dict, qui était obsolète dans la version 0.9, a été supprimée au profit de la méthodeBaseModel.to_dict. - Dans PulseDefaults (accessible normalement comme backend.defaults ()),
qubit_freq_estetmeas_freq_estsont maintenant retournés en Hz plutôt qu'en GHz. Cela signifie que les nouvelles valeurs de retour sont 1e9 * leur valeur précédente. - l' aneth a été ajouté à titre obligatoire. Ceci est nécessaire pour permettre à
passmanager.run()de fonctionner en parallèle pour plus d'un circuit. - La porte
UBase, qui était obsolète dans la version 0.9, a été supprimée. Le portailU3Gatedoit être utilisé à la place. - La porte
CXBase, qui était obsolète dans la version 0.9, a été supprimée. Le portailCnotGatedoit être utilisé à la place. - L'instruction
snapshotutilisée pour convertir implicitement le paramètrelabelen chaîne de caractères. Cette conversion a été supprimée et une erreur est levée si une chaîne n'est pas fournie. - La porte
U0Gate, qui était obsolète dans la version 0.9, a été supprimée. La porteIdGatedoit être utilisée à la place pour insérer des retards.
Remarques concernant la dépréciation
-
La classe
qiskit.pulse.CmdDefest obsolète. Au lieu de cela, vous devez utiliser le siteqiskit.pulse.InstructionScheduleMap. L'objetInstructionScheduleMappour un système à impulsions est accessible à l'adressebackend.defaults().instruction_schedules. -
PulseChannelSpecest obsolète. Utilisez plutôtBackendConfiguration. L'accès à la configuration du backend se fait normalement à l'adressebackend.configuration(). Le config a été étendu avec la plupart des fonctionnalités de PulseChannelSpec, avec quelques modifications comme suit, où 0 est un indice de qubit exemplaire :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)Désormais, en cas de tentative d'obtention d'un canal pour un qubit qui n'existe pas pour l'appareil, un message
BackendConfigurationErrorsera envoyé avec une explication utile.Les méthodes
memoryslotsetregisterslotsdu site PulseChannelSpec n'ont pas été migrées vers la configuration backend. Ces ressources classiques ne sont pas limitées par la configuration physique d'un système dorsal. Veuillez les instancier directement :pulse_spec.memoryslots[0] -> MemorySlot(0) pulse_spec.registerslots[0] -> RegisterSlot(0)La méthode
qubitsn'est pas migrée vers la configuration du backend. Le résultat dequbitspeut être construit comme suit :[q for q in range(backend.configuration().n_qubits)] -
Qubità l'intérieur depulse.channelsa été supprimée. Ils ne doivent pas être utilisés. Il est possible d'obtenir le mappage des qubits du canal <=> par le biais de BackendConfiguration (ou backend.configuration ()). -
La fonction
qiskit.visualization.circuit_drawer.qx_color_scheme()est obsolète. Cette fonction n'est plus utilisée en interne et ne reflète pas le style actuel de IBM QX. Si vous avez utilisé cette fonction pour générer un dict de style localement, vous devez enregistrer la sortie de cette fonction et utiliser ce dictionnaire directement. -
L'exception
TranspilerAccessErrora été supprimée. Une fonction alternativeTranspilerErrorpeut être utilisée à la place pour fournir la même fonctionnalité. Cette fonction alternative offre exactement la même fonctionnalité, mais avec une plus grande généralité. -
Les tampons dans Pulse sont obsolètes. Si un tampon non nul est fourni, un avertissement sera émis avec un rappel d'utiliser un délai à la place. D'autres options consisteraient à ajouter des échantillons à une instruction d'impulsion qui sont ( 0.+0.j ) ou à régler l'heure de début de l'impulsion suivante sur
schedule.duration + buffer. -
La transmission des types
sympy.Basic,sympy.Expretsympy.Matrixen tant que paramètres d'instruction est obsolète et sera supprimée dans une prochaine version. Vous devrez convertir l'entrée en l'un des types pris en charge, qui sont les suivants :intfloatcomplexstrnp.ndarray
Corrections des erreurs
- Les passes Collect2qBlocks et CommutationAnalysis du transpileur ne pouvaient pas traiter les circuits contenant des portes paramétrées, ce qui empêchait les circuits paramétrés d'être transposés au niveau d'optimisation 2 ou supérieur. Ces passes ont été corrigées pour traiter les portes paramétrées comme des portes opaques.
- La fonction align_measures présentait un problème où les impulsions du stimulus Measure n'étaient pas correctement alignées avec les impulsions Acquire, ce qui entraînait une erreur. Ce point a été corrigé.
- L'utilisation de
numpy.random.seeda été supprimée afin que les appels aux fonctions qiskit n'affectent pas les résultats des futurs appels ànumpy.random - Correction d'un problème de concurrence survenant dans le moniteur de tâches lorsque
job.queue_position()renvoieNone.Noneest un retour valide dejob.queue_position(). - Le support du backend pour
memory=Trueest maintenant vérifié lorsque ce kwarg est passé.QiskitErrors'il n'est pas pris en charge. - Lors de la transposition sans carte de couplage, le nombre de qubits du circuit à transposer n'a pas été vérifié. Le processus de transposition vérifie maintenant que le backend dispose de suffisamment de qubits pour allouer le circuit.
Autres remarques
- La fonction
qiskit.result.marginal_counts()remplace une fonction utilitaire similaire dans qiskit-ignisqiskit.ignis.verification.tomography.marginal_counts(), qui sera obsolète dans une prochaine version de qiskit-ignis. - Tous les types de sortie des paramètres sympy ont été supprimés (ou dépréciés comme indiqué) de qiskit-terra. Cela inclut les paramètres de type sympy dans les objets
QuantumCircuit, les nœuds qasm ast ou les objetsQobj.
Aer 0.3
Aucun changement
Ignis 0.2
Aucun changement
Aqua 0.6
Aucun changement
IBM 0.4 du fournisseur Q
Prélude
La version 0.4.0 est la première version qui utilise toutes les fonctionnalités de la nouvelle API Q de IBM. En particulier, la classe IBMQJob a été remaniée afin de pouvoir extraire davantage d'informations de IBM Q, et une classe Job Manager a été ajoutée pour permettre une utilisation plus transparente et de plus haut niveau des travaux complexes ou de grande envergure. Si vous n'avez pas encore mis à jour l'ancienne version de IBM Q Experience ou QConsole, veuillez consulter les notes de mise à jour de IBM Q Provider 0.3 (Qiskit 0.11 ) pour plus de détails sur la manière d'effectuer la transition. Les anciens comptes ne seront plus pris en charge à partir de cette version.
Nouvelles fonctions
Modifications du poste
La classe IBMQJob a été révisée et reproduit désormais plus fidèlement le contenu d'un travail à distance, avec de nouvelles fonctionnalités :
- Vous pouvez désormais attribuer un nom à un travail en spécifiant
IBMQBackend.run(..., job_name='...')lorsque vous soumettez un travail. Ce nom peut être récupéré viaIBMQJob.name()et peut être utilisé pour le filtrage. - Les travaux peuvent désormais être partagés avec d'autres utilisateurs à différents niveaux (global, par hub, groupe ou projet) via un paramètre optionnel
job_share_levellors de la soumission du travail. IBMQJobont désormais plus d'attributs, reflétant le contenu des travaux Q sur le site IBM. Cela signifie que les nouveaux attributs introduits par l'API IBM Q seront automatiquement et immédiatement utilisables (par exemple,job.new_api_attribute). Les nouveaux attributs seront promus au rang de méthodes lorsqu'ils seront considérés comme stables (par exemple,job.name())..error_message()renvoie plus d'informations sur la raison de l'échec d'un travail..queue_position()accepte un paramètrerefreshpour forcer une mise à jour..result()accepte un paramètre facultatifpartial, pour renvoyer les résultats partiels, le cas échéant, des travaux qui ont échoué. Sachez que les méthodesResult, telles queget_counts(), soulèveront une exception si elles sont appliquées à des expériences qui ont échoué.
Veuillez noter que les changements comprennent des modifications de bas niveau de la classe. Si vous avez créé les instances manuellement, notez-le :
- la signature du constructeur a été modifiée pour tenir compte des nouvelles fonctionnalités.
- la méthode
.submit()ne peut plus être appelée directement, et les travaux doivent être soumis soit via la méthode synchroneIBMQBackend.run(), soit via le gestionnaire de travaux.
Gestionnaire de travaux
Un nouveau gestionnaire de tâches (IBMQJobManager) a été introduit, en tant que mécanisme de niveau supérieur pour gérer les tâches composées de circuits multiples ou de programmes d'impulsions. Le gestionnaire de tâches vise à fournir une interface transparente, en divisant intelligemment les données d'entrée en unités de travail efficaces et en tirant pleinement parti des différents composants. Il sera développé dans les prochaines versions et deviendra le point d'entrée recommandé pour la soumission d'un emploi.
Sa méthode .run() reçoit une liste de circuits ou de programmes d'impulsions et renvoie un ManagedJobSet instance, qui peut ensuite être utilisé pour suivre les statuts et les résultats de ces travaux. Par exemple :
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 modifications
Le membre provider.backends , qui était auparavant une fonction renvoyant une liste de backends, a été promu au rang de service. Cela signifie qu'il peut être utilisé à la fois de la manière précédente, en tant que méthode .backends() , et en tant qu'attribut .backends avec des capacités étendues :
-
il contient les backends existants de ce fournisseur en tant qu'attributs, qui peuvent être utilisés pour l'autocomplétion. Par exemple :
my_backend = provider.get_backend('ibmq_qasm_simulator')est équivalent à :
my_backend = provider.backends.ibmq_qasm_simulator -
les méthodes
provider.backends.jobs()etprovider.backends.retrieve_job()peuvent être utilisées pour récupérer des travaux pour l'ensemble du fournisseur.
Autres changements
- La fonction
backend.properties()accepte désormais un paramètre optionneldatetime. Si elle est spécifiée, la fonction renvoie les propriétés du backend les plus proches, mais plus anciennes que le filtre de date spécifié. - Certains messages
warningsont été atténués pour devenir des messageslogger.warning.