read_general
Outline
This function is an improved version of the read_jw function.
It is capable of reading both the coefficients and Pauli operator information from transformation results obtained via OpenFermion, including not only Jordan–Wigner but also Bravyi–Kitaev transformations.
For greater generality, the use of this function is recommended going forward.
Index List
argument name |
type |
role |
|---|---|---|
jw_inf |
list(elements:str) |
Result of Jordan-Wigner or Bravyi-Kitaev Transformation by Openfermion |
Return
num_list(list):
A list containing coefficient-related information among the input arguments.
Each element in the list is of type complex.
ope_list(list):
A list containing information on the production of Pauli matrices products among the input arguments.
Each element in the list is of type str.
Python code
def read_general(jw_inf):
"""
This function reads out the coefficients and Pauli matrix product information from the results of the Jordan–Wigner and Bravyi–Kitaev transformations performed using OpenFermion.
Parameters:
jw_inf: the results of the Jordan–Wigner and Bravyi–Kitaev transformations performed using OpenFermion
Returns:
(list, list): The coefficients information and Pauli matrix product information.
"""
# Local Values
num_list = [] # A list to store the results of the reading process for coefficients
ope_list = [] # A list to store the results of the reading process for Pauli matrix product
sub_num_list = "" # A temporary list to store the results of the reading process for coefficients
sub_ope_list = "" # A temporary list to store the results of the reading process for Pauli matrix product
convert_list = [] # A temporary list to store the results of the reading process for coefficients before transform the type of coeffcient information from str into complex
ope_con_list = [] # A temporary list to store the results of the reading process for Pauli matrix product before deleting space between Pauli matrix product
read_counter = 1 # A switch to initiate reading
preserve_switch = 0 # A switch to store the contents of sum_num_list into convert_list
# Check each contents (excluding the first) to determine whether to interpret it as a coefficient, as part of a Pauli matrix product, or to ignore it.
for i in range(len(jw_inf)-1):
# Determine whether to interpret each item as a coefficient, a Pauli matrix product, or to ignore it.
# 1: coefficient, 2: Pauli matrix product, 3, 4: ignore
if jw_inf[i+1] == "[":
read_counter = 2
elif jw_inf[i+1] == "]":
read_counter = 3
# Read the coefficient as type str (ex: (0.2450065090650131+0j))
if read_counter == 1:
sub_num_list += jw_inf[i]
preserve_switch = 1
# Read the Pauli matrix product as type str (ex: 'X0 X1 Y2 Y3')
if read_counter == 2:
# Store the result of reading for the coefficient
if preserve_switch == 1:
convert_list.append(sub_num_list)
sub_num_list = ""
preserve_switch = 0
sub_ope_list += jw_inf[i+1]
# Store the result of reading for Pauli stirng
if read_counter == 3:
ope_con_list.append(sub_ope_list)
sub_ope_list = ""
read_counter = 4
countdown = 4
# Ready for reading the coefficient
if read_counter == 4:
if countdown == 0:
read_counter = 1
else:
countdown -= 1
# Convert type of the coefficient reading result into complex
for i in range(len(convert_list)):
if convert_list[i][0] != '(':
num_list.append(complex(convert_list[i]))
else:
convert_list[i] = convert_list[i][1:-1]
num_list.append(complex(convert_list[i]))
# Remove unnecessary spaces from the Pauli matrix reading result
for i in range(len(ope_con_list)):
ope_con_list[i] = ope_con_list[i][1:]
if 0 < len(ope_con_list[i]):
ope_con_list[i] = ope_con_list[i].replace(" ", "")
ope_list.append(ope_con_list[i])
return num_list, ope_list
Sample Run
[ ]:
from openfermion.transforms import get_fermion_operator, jordan_wigner, bravyi_kitaev
from openfermion.chem import MolecularData
from openfermionpyscf import run_pyscf
from pyscf import fci, gto, dft, tddft, scf, tools, mcscf
import pitbe
[ ]:
basis = "sto-3g"
multiplicity = 1
charge = 0
geometry = [["H", [0,0,0]],["H", [0,0,0.865]]]
description = "tmp"
molecule = MolecularData(geometry, basis, multiplicity, charge, description)
molecule = run_pyscf(molecule,run_scf=1,run_cisd=1,run_ccsd=1,run_fci=1)
fermionic_hamiltonian = get_fermion_operator(molecule.get_molecular_hamiltonian())
jw_hamiltonian = jordan_wigner(fermionic_hamiltonian)
bk_hamiltonian = bravyi_kitaev(fermionic_hamiltonian)
[ ]:
print('---Jordan-Wigner Transformation---')
print(jw_hamiltonian)
print('---Reading Result---')
print('Coefficient')
print(pitbe.read_general(str(jw_hamiltonian))[0])
print('Pauli matrix product')
print(pitbe.read_general(str(jw_hamiltonian))[1])
---Jordan-Wigner Transformation---
(-0.2300259962688794+0j) [] +
(-0.04711430043380896+0j) [X0 X1 Y2 Y3] +
(0.04711430043380896+0j) [X0 Y1 Y2 X3] +
(0.04711430043380896+0j) [Y0 X1 X2 Y3] +
(-0.04711430043380896+0j) [Y0 Y1 X2 X3] +
(0.153592312841566+0j) [Z0] +
(0.16276753098254843+0j) [Z0 Z1] +
(0.1135597567900135+0j) [Z0 Z2] +
(0.16067405722382247+0j) [Z0 Z3] +
(0.153592312841566+0j) [Z1] +
(0.16067405722382247+0j) [Z1 Z2] +
(0.1135597567900135+0j) [Z1 Z3] +
(-0.17274355195698893+0j) [Z2] +
(0.16885887724673027+0j) [Z2 Z3] +
(-0.17274355195698887+0j) [Z3]
---Reading Result---
Coefficient
[(-0.2300259962688794+0j), (-0.04711430043380896+0j), (0.04711430043380896+0j), (0.04711430043380896+0j), (-0.04711430043380896+0j), (0.153592312841566+0j), (0.16276753098254843+0j), (0.1135597567900135+0j), (0.16067405722382247+0j), (0.153592312841566+0j), (0.16067405722382247+0j), (0.1135597567900135+0j), (-0.17274355195698893+0j), (0.16885887724673027+0j), (-0.17274355195698887+0j)]
Pauli matrix product
['', 'X0X1Y2Y3', 'X0Y1Y2X3', 'Y0X1X2Y3', 'Y0Y1X2X3', 'Z0', 'Z0Z1', 'Z0Z2', 'Z0Z3', 'Z1', 'Z1Z2', 'Z1Z3', 'Z2', 'Z2Z3', 'Z3']
[ ]:
print('---Bravyi-Kitaev Transformation---')
print(bk_hamiltonian)
print('---Reading Result---')
print('Coefficient')
print(pitbe.read_general(str(bk_hamiltonian))[0])
print('Pauli matrix product')
print(pitbe.read_general(str(bk_hamiltonian))[1])
---Bravyi-Kitaev Transformation---
(-0.2300259962688794+0j) [] +
(0.04711430043380896+0j) [X0 Z1 X2] +
(0.04711430043380896+0j) [X0 Z1 X2 Z3] +
(0.04711430043380896+0j) [Y0 Z1 Y2] +
(0.04711430043380896+0j) [Y0 Z1 Y2 Z3] +
(0.153592312841566+0j) [Z0] +
(0.153592312841566+0j) [Z0 Z1] +
(0.16067405722382247+0j) [Z0 Z1 Z2] +
(0.16067405722382247+0j) [Z0 Z1 Z2 Z3] +
(0.1135597567900135+0j) [Z0 Z2] +
(0.1135597567900135+0j) [Z0 Z2 Z3] +
(0.16276753098254843+0j) [Z1] +
(-0.17274355195698887+0j) [Z1 Z2 Z3] +
(0.16885887724673027+0j) [Z1 Z3] +
(-0.17274355195698893+0j) [Z2]
---Reading Result---
Coefficient
[(-0.2300259962688794+0j), (0.04711430043380896+0j), (0.04711430043380896+0j), (0.04711430043380896+0j), (0.04711430043380896+0j), (0.153592312841566+0j), (0.153592312841566+0j), (0.16067405722382247+0j), (0.16067405722382247+0j), (0.1135597567900135+0j), (0.1135597567900135+0j), (0.16276753098254843+0j), (-0.17274355195698887+0j), (0.16885887724673027+0j), (-0.17274355195698893+0j)]
Pauli matrix product
['', 'X0Z1X2', 'X0Z1X2Z3', 'Y0Z1Y2', 'Y0Z1Y2Z3', 'Z0', 'Z0Z1', 'Z0Z1Z2', 'Z0Z1Z2Z3', 'Z0Z2', 'Z0Z2Z3', 'Z1', 'Z1Z2Z3', 'Z1Z3', 'Z2']