I-transpile ang mga fermionic circuit
Ang mga konsepto sa gabay na ito ay kasalukuyang magagamit lang sa Python API. Magiging available ang katumbas na functionality sa C API sa isang susunod na release.
Ipinapaliwanag ng gabay na ito kung paano i-transpile ang isang FermionicCircuit sa karaniwang QuantumCircuit. Ipinagpapatuloy nito ang parehong halimbawa ng time evolution mula sa gabay sa fermionic circuit.
Mga stage ng transpilation
Gaya ng ipinaliwanag sa qiskit_fermions.transpiler, hinahati ng mga preset pass manager sa proyektong ito ang transpilation sa mga sumusunod na stage:
Pasok
Kino-convert ang input circuit sa isang directed acyclic graph (DAG) na data structure.
Pag-optimize
Pinananatili ang circuit sa fermionic space. Ginagamit ng mga pass na ito ang fermionic structure at mga commutation relation habang ganap pang magagamit ang kaalamang may kinalaman sa problema. Ang F2FSynthesis ang pass na nagte-Trotterize ng isang Evolution gate dito, gamit ang product formula o ang FermionicQDrift, at ang QDriftTrotterization ang occupation-aware na variant nito; tingnan ang Optimization Passes para sa buong set at ang Mag-synthesize ng Evolution gate sa fermionic space para sa kung paano pinipili ang product formula.
Pagkakaayos
Minamapa ang mga fermionic mode register sa mga quantum register. Para sa mga occupation-basis mapping tulad ng Jordan-Wigner, ang bawat fermionic mode ay minamapa sa iisang qubit. Sinusuportahan din ng stage na ito ang mas pangkalahatang mapping kung saan iba ang bilang ng mga qubit sa bilang ng mga fermionic mode.
Sintesis
Kino-convert ang mga fermionic gate sa mga qubit operation gamit ang napiling fermion-to-qubit mapping. Ang mga instance ng FermionicGate ay ginagawang mga sequence ng karaniwang quantum gate. Ang isang barrier ay dinadala sa bawat qubit ng bawat register na hinawakan nito, kaya patuloy nitong pinaghihiwalay ang mga gate sa magkabilang panig nito sa qubit stage.
Qubit
Tina-transpile ang resultang qubit circuit gamit ang mga karaniwang paraan ng Qiskit, kasama ang optimization, layout, at routing para sa target mong hardware.
Resulta
Kino-convert ang internal na DAG data structure sa nais na output format.
Isang praktikal na halimbawa: transpilation gamit ang Jordan-Wigner
Gamitin ang preset pass manager para i-transpile ang iyong fermionic circuit gamit ang Jordan-Wigner fermion-to-qubit mapping:
- Python
- C
>>> from qiskit_fermions.circuit import FermionicCircuit
>>> from qiskit_fermions.circuit.library import Evolution
>>> from qiskit_fermions.operators import FermionOperator, cre, ann
>>> from qiskit_fermions.transpiler.presets import generate_preset_jw_pass_manager
>>>
>>> # Create the same fermionic circuit from the previous guide
>>> circuit = FermionicCircuit(4)
>>> hamiltonian = FermionOperator.from_terms([
... ([cre(0), ann(2)], 0.5),
... ([cre(2), ann(0)], 0.5),
... ([cre(1), ann(3)], 0.5),
... ([cre(3), ann(1)], 0.5),
... ])
>>> hamiltonian.groups = [0, 0, 1, 1]
>>> evolution = Evolution(4, hamiltonian, time=1.0)
>>> circuit.append(evolution, circuit.register)
>>>
>>> # Generate the Jordan-Wigner transpilation pipeline
>>> pm = generate_preset_jw_pass_manager()
>>>
>>> # Transpile the fermionic circuit to a qubit circuit
>>> qubit_circuit = pm.run(circuit)
>>>
>>> # The result is a standard QuantumCircuit
>>> print(type(qubit_circuit))
<class 'qiskit.circuit.quantumcircuit.QuantumCircuit'>
// The C API for transpilation will be made available in a future release.
Ihambing sa tradisyonal na workflow
Inilalarawan ng gabay sa fermionic circuit kung paano ginagawa ng tradisyonal na workflow ang fermion-to-qubit encoding bago buuin ang QuantumCircuit. Ihambing ang dalawang diskarte:
>>> from qiskit_fermions.mappers.library import jordan_wigner
>>> from qiskit.circuit import QuantumCircuit
>>> from qiskit.circuit.library import PauliEvolutionGate
>>>
>>> # Map the fermionic Hamiltonian to a qubit operator
>>> qubit_hamiltonian = jordan_wigner(hamiltonian, 4).simplify()
>>>
>>> # Build the QuantumCircuit directly
>>> quantum_circuit = QuantumCircuit(4)
>>> pauli_evolution = PauliEvolutionGate(qubit_hamiltonian, time=1.0)
>>> quantum_circuit.append(pauli_evolution, quantum_circuit.qubits)
<qiskit.circuit.instructionset.InstructionSet object at ...>
Parehong gumagawa ng magkaparehong circuit ang dalawang workflow. Gayunman, kailangan mong ipatupad nang mano-mano ang mga optimization step sa tradisyonal na workflow, samantalang sa fermionic-first na diskarte ay maisasama mo ang mga optimization na may kamalayan sa problema sa proseso ng transpilation.
Mga advanced na workflow
Ang preset pass manager ay nagbibigay ng maginhawang panimulang punto. Para sa mas advanced na gamit, maaari mong gawin ang sumusunod:
-
I-customize ang mga transpiler pass na tumatakbo sa bawat stage.
-
Piliin ang product formula na nagte-Trotterize ng isang
Evolutiongate sa fermionic space, kada gate man o para sa buong pipeline gamit angF2FSynthesis(tingnan ang Mag-synthesize ng Evolution gate sa fermionic space). -
Magpatupad ng mga custom na fermion-to-qubit mapping sa pamamagitan ng paggawa ng mga synthesis plugin (tingnan ang
F2QSynthesisPlugin). -
Bumuo ng mga custom na transpiler pass.