# Using External Libraries¶

It is straightforward to make use of external libraries written in other language. For example, the following codes import modules from the OpenFermion and construct a qubit Hamiltonian for molecules as quantum blocks in Yao.

In [ ]:
using Yao
using LinearAlgebra
using PyCall


Install OpenFermion and PySCF if you don't have them

In [ ]:
pip = pyimport("pip._internal.main")
pip.main(["install", "pyscf", "openfermion", "openfermionpyscf"])


First we import hamiltonians from OpenFermion and PySCF

In [ ]:
of_hamil = pyimport("openfermion.hamiltonians")
of_trsfm = pyimport("openfermion.transforms")
of_pyscf = pyimport("openfermionpyscf")


following the OpenFermion and PySCF tutorial, we define molecules from data.

In [ ]:
diatomic_bond_length = 1.0
geometry = [("H", (0., 0., 0.)), ("H", (0., 0., diatomic_bond_length))]
basis = "sto-3g"
multiplicity = 1
charge = 0
description = string(diatomic_bond_length)

molecule = of_hamil.MolecularData(geometry, basis, multiplicity, charge, description)
molecule = of_pyscf.run_pyscf(molecule,run_scf=1,run_fci=1)


Then obtain its Hamiltonian

In [ ]:
m_h = molecule.get_molecular_hamiltonian()
nbits = m_h.n_qubits

jw_h = of_trsfm.jordan_wigner(of_trsfm.get_fermion_operator(m_h))


now, let's construct the corresponding Hamiltonian in Yao

In [ ]:
function yao_hamiltonian(nbits, jw_h)
gates = Dict("X"=>X, "Y"=>Y, "Z"=>Z)
for (k, v) in jw_h.terms
op = v*put(nbits, 1=>I2)
for t in k
site, opname = t
op = op*put(nbits, site+1=>gates[opname])
end
push!(h, op)
end
h
end


Yah!

In [ ]:
yao_h = yao_hamiltonian(nbits, jw_h)


now let's try to calculate its eigen values

In [ ]:
w, v = eigen(Matrix(yao_h))


This notebook was generated using Literate.jl.