Skip to main content
IBM Quantum Platform

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_error et frequency. 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 renvoie True si et seulement si l'instruction a un objet ParameterExpression ou Parameter pour 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 que property_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}, Layout2qDistance définira property_set['layout_score'] = 1. Si la disposition est {qr[0]:0, qr[1]:2}, le résultat est property_set['layout_score'] = 0. Plus le score est bas, mieux c'est.

  • Ajout de qiskit.QuantumCircuit.cnot comme alias de la méthode cx de QuantumCircuit. Les noms cnot et cx sont 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.toffoli comme alias de la méthode ccx de QuantumCircuit. Les noms toffoli et ccx sont 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.fredkin comme alias de la méthode cswap de QuantumCircuit. Les noms fredkin et cswap sont 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 latex pour qiskit.visualization.circuit_drawer() et la méthode qiskit.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 α_gate avec un indice 2, et l'étiquette de la dernière porte personnalisée sera $α$_gate.

  • Ajouter la classe ControlledGate pour représenter les portes contrôlées. Les instances de portails contrôlés sont créées avec la méthode control(n) des objets Gaten repré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_level peuvent désormais être des membres de la classe IntEnum qiskit.qobj.utils.MeasLevel. Ceci peut être utilisé lors de l'appel à execute (ou à tout autre endroit où meas_level est 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.CLASSIFIED et meas_level=2 peuvent ê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écuter CXDirection par 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 de backend.defaults()) a un attribut, circuit_instruction_map , qui a les méthodes de CmdDef. Le nouveau circuit_instruction_map est un objet de InstructionScheduleMap avec 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 argument
    • cmds et cmd_qubits sont obsolètes et remplacés par instructions et qubits_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 fonction qiskit.visualization.pulse_drawer() et à la méthode qiskit.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é sur False , 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 scheduler a été ajouté à Qiskit. L'ordonnanceur planifie une entrée transpilée QuantumCircuit en une impulsion Schedule. Le programmateur accepte en entrée un Schedule et soit une impulsion Backend, soit un CmdDef qui relie les objets du circuit Instruction sur des qubits spécifiques à des impulsions programmées et un meas_map qui 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ée method, par exemple :

    schedule(qc_transpiled, backend, method='alap')

    Il est facile d'utiliser une impulsion Schedule à l'intérieur d'une QuantumCircuit en l'associant à une instruction de circuit personnalisée telle qu'une porte qui peut être utilisée dans une QuantumCircuit. Pour ce faire, il faut d'abord définir la porte personnalisée, puis ajouter une entrée dans le site CmdDef pour la porte, pour chaque qubit auquel la porte sera appliquée. La porte peut ensuite être utilisée sur le site QuantumCircuit. 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.SystemTopology a été utilisée comme classe d'aide pour PulseChannelSpec. Elle a été supprimée depuis la dépréciation de PulseChannelSpec et les changements apportés à BackendConfiguration la 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 Qubit et Clbit est 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éthode BaseModel.to_dict.
  • Dans PulseDefaults (accessible normalement comme backend.defaults ()), qubit_freq_est et meas_freq_est sont 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 portail U3Gate doit être utilisé à la place.
  • La porte CXBase, qui était obsolète dans la version 0.9, a été supprimée. Le portail CnotGate doit être utilisé à la place.
  • L'instruction snapshot utilisée pour convertir implicitement le paramètre label en 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 porte IdGate doit être utilisée à la place pour insérer des retards.

Remarques concernant la dépréciation

  • La classe qiskit.pulse.CmdDef est obsolète. Au lieu de cela, vous devez utiliser le site qiskit.pulse.InstructionScheduleMap. L'objet InstructionScheduleMap pour un système à impulsions est accessible à l'adresse backend.defaults().instruction_schedules.

  • PulseChannelSpec est obsolète. Utilisez plutôt BackendConfiguration . L'accès à la configuration du backend se fait normalement à l'adresse backend.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 BackendConfigurationError sera envoyé avec une explication utile.

    Les méthodes memoryslots et registerslots du 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 qubits n'est pas migrée vers la configuration du backend. Le résultat de qubits peut être construit comme suit :

    [q for q in range(backend.configuration().n_qubits)]
  • Qubit à l'intérieur de pulse.channels a é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 TranspilerAccessError a été supprimée. Une fonction alternative TranspilerError peut ê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.Expr et sympy.Matrix en 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 :

    • int
    • float
    • complex
    • str
    • np.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.seed a é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() renvoie None. None est un retour valide de job.queue_position().
  • Le support du backend pour memory=True est maintenant vérifié lorsque ce kwarg est passé. QiskitError s'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-ignis qiskit.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 objets Qobj .

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é via IBMQJob.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_level lors de la soumission du travail.
  • IBMQJob ont 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ètre refresh pour forcer une mise à jour.
  • .result() accepte un paramètre facultatif partial , pour renvoyer les résultats partiels, le cas échéant, des travaux qui ont échoué. Sachez que les méthodes Result , telles que get_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 synchrone IBMQBackend.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 5
provider.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() et provider.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 optionnel datetime . 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 warnings ont été atténués pour devenir des messages logger.warning .
Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.