map_transfer_vertex_generators
map_transfer_vertex_generators(operator, map_action, identity, compose=None)
Ordne a einem anderen Operatortyp zu TransferVertexOperator .
Dies ist eine generische Funktion, die bei der Implementierung neuer Mapper für Instanzen TransferVertexOperator helfen soll. Im Kern durchläuft es einfach die Terme des Operators und wendet auf TransferAction jeden gefundenen Term die vom Benutzer bereitgestellte Funktion map_action an. In Kombination mit dem vom Benutzer bereitgestellten Generator identity ermöglicht dies die Zuordnung zu beliebigen Ausgabetypen.
Der Ausgabetyp T muss die Multiplikation mit einem Skalar über unterstützen __mul__. Wenn es compose=None zudem die Zusammensetzung zweier Instanzen über unterstützen muss __and__. SparseObservable ist dies nicht der Fall, weshalb im folgenden Beispiel explizit compose() angegeben wird; ein Typ mit einem __and__ (wie z. B. SparsePauliOp) kann sich auf den Standardwert verlassen.
Die unten aufgeführte Abbildung ist eine bewusst minimalistische Darstellung dieser Funktion und kein Ersatz für transfer_vertex_jordan_wigner(): Sie berücksichtigt lediglich Wechselwirkungen mit den nächsten Nachbarn und ist weder parallelisiert noch speichergebunden. Verwenden Sie lieber die Bibliotheksfunktion, anstatt diese hier zu kopieren.
>>> from qiskit_fermions.mappers import map_transfer_vertex_generators
>>> from qiskit_fermions.operators import TransferAction, TransferVertexOperator
>>> from qiskit.quantum_info import SparseObservable
>>>
>>> def jordan_wigner_nearest_neighbor(mode: TransferAction) -> SparseObservable:
... left, right = mode
... if left == right:
... return SparseObservable.from_sparse_list(
... [("Z", [left], 1.0)], num_qubits=num_qubits
... )
... if abs(left - right) != 1:
... raise NotImplementedError(
... "This mapping only handles nearest neighbor interactions"
... )
... # `T_lr` and `T_rl` differ, so the orientation must be compared rather than
... # differenced. The coefficient is -1/2 either way; the Pauli letters swap instead.
... lo, hi = min(left, right), max(left, right)
... pauli = "XX" if left < right else "YY"
... return SparseObservable.from_sparse_list(
... [(pauli, [lo, hi], -0.5)], num_qubits=num_qubits
... )
>>>
>>> num_qubits = 4
>>> def identity() -> SparseObservable:
... return SparseObservable.identity(num_qubits)
>>>
>>> op = TransferVertexOperator.from_dict({
... ((0, 0),): 2.0,
... ((0, 1),): 0.5,
... ((1, 1), (1, 2)): 1.0,
... })
>>> qop = map_transfer_vertex_generators(
... op, jordan_wigner_nearest_neighbor, identity, compose=SparseObservable.compose
... )
>>> print(sorted(qop.simplify().to_sparse_list()))
[('XX', [0, 1], (-0.25+0j)), ('YX', [1, 2], -0.5j), ('Z', [0], (2+0j))]
Parameter
- operator (TransferVertexOperator) – der zuzuordnende Operator.
- map_action (Callable[[tuple[int, int]], T]) – die Funktion, die einen einzelnen Wert auf
TransferActionden gewünschten Ausgabetyp abbildet. - identity (Callable[[], T]) – die Funktion zur Erzeugung der multiplikativen Identität vom Ausgabetyp.
- compose (Callable[[T, T], T] | None) – eine optionale Funktion zur Implementierung der Kompositionslogik zweier Instanzen des Ausgabetyps. Wird dies nicht angegeben, wird standardmäßig verwendet
operator.and_().
Rückgabe
Der abgebildete Operator.
Rückgabetyp
T