Skip to content

Commit

Permalink
WIP: Add three band HTSC instance and fix t3 terms (#38)
Browse files Browse the repository at this point in the history
* Add three band HTSC instance and fix t3 terms

* Updated pylint badge

* Add three band script; Fix one and two band scripts

* Add value and repetition fields to HTSC scripts

* made sure to use phase_offset in gsee function call

* Updated pylint badge

* typo fixes to HSTC notebook

* fixed test suite for fermihubbard

---------

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Jonhas Colina <jonhas@lanl.gov>
  • Loading branch information
3 people authored May 27, 2024
1 parent 608c04a commit b91b39c
Show file tree
Hide file tree
Showing 9 changed files with 1,164 additions and 273 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
![pylint](https://img.shields.io/badge/PyLint-9.52-yellow?logo=python&logoColor=white)
![pylint](https://img.shields.io/badge/PyLint-9.45-yellow?logo=python&logoColor=white)
# Quantum Computing Application Specifications

Documentation of Applications for Quantum Computers
Expand Down
704 changes: 612 additions & 92 deletions notebooks/HighTemperatureSuperConductorExample.ipynb

Large diffs are not rendered by default.

Binary file modified notebooks/pdfs/HighTemperatureSuperConductorExample.pdf
Binary file not shown.
38 changes: 15 additions & 23 deletions scripts/HTSC-one-band-RE.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/usr/bin/env python

import os
import argparse
import time
Expand All @@ -7,6 +8,7 @@
import math
from pyLIQTR.PhaseEstimation.pe import PhaseEstimation
from networkx import get_node_attributes, draw, draw_networkx_edge_labels
from qca.utils.algo_utils import gsee_resource_estimation
from qca.utils.utils import circuit_estimate, EstimateMetaData
from qca.utils.hamiltonian_utils import generate_two_orbital_nx, nx_to_two_orbital_hamiltonian

Expand Down Expand Up @@ -38,7 +40,7 @@ def main(args):
t = 2*np.pi/omega
phase_offset = E_max*t

args = {
gsee_args = {
'trotterize' : True,
'mol_ham' : ham,
'ev_time' : t,
Expand All @@ -56,33 +58,23 @@ def main(args):
category='scientific',
size=f'{lattice_size}x{lattice_size}',
task='Ground State Energy Estimation',
value_per_circuit=value,
repetitions_per_application=repetitions,
implementations=f'GSEE, evolution_time={t}, bits_precision={bits_precision}, trotter_order={trotter_order}',
)

t0 = time.perf_counter()
gse_inst = PhaseEstimation(
precision_order=1, #actual precision bits accounted as scaling factors in the resource estimate
init_state=init_state,
phase_offset=phase_offset,
include_classical_bits=False, # Do this so print to openqasm works
kwargs=args)
gse_inst.generate_circuit()
t1 = time.perf_counter()
print(f'One band GSEE time to generate high level Circuit: {t1 - t0}')

gse_circuit = gse_inst.pe_circuit

print('Estimating one_band')
t0 = time.perf_counter()
estimate = circuit_estimate(
circuit=gse_circuit,
metadata = metadata,
outdir=directory,
circuit_name=name,
write_circuits=circuit_write,
bits_precision=bits_precision,
numsteps=trotter_steps
)
estimate = gsee_resource_estimation(
outdir=directory,
numsteps=trotter_steps,
gsee_args=gsee_args,
init_state=init_state,
precision_order=1,
bits_precision=bits_precision,
circuit_name=name,
metadata=metadata,
write_circuits=args.circuit_write)
t1 = time.perf_counter()
print(f'Time to estimate one_band: {t1-t0}')
return estimate
Expand Down
121 changes: 121 additions & 0 deletions scripts/HTSC-three-band-RE.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
#!/usr/bin/env python

import os
import argparse
import time
import openfermion as of
import numpy as np
import math
from pyLIQTR.PhaseEstimation.pe import PhaseEstimation
from networkx import get_node_attributes, draw, draw_networkx_edge_labels
from qca.utils.algo_utils import gsee_resource_estimation
from qca.utils.utils import circuit_estimate, EstimateMetaData
from qca.utils.hamiltonian_utils import generate_three_orbital_nx, nx_to_three_orbital_hamiltonian

## Three band

def main(args):
t1 = args.param_t1
t2 = args.param_t2
t3 = args.param_t3
t4 = args.param_t4
t5 = args.param_t5
t6 = args.param_t6
t7 = args.param_t7
t8 = args.param_t8
mu = args.param_mu
delta = args.param_delta

trotter_steps = args.trotter_steps
trotter_order = args.trotter_order

lattice_size = args.lattice_size

value = args.value
repetitions = args.repetitions
directory = args.directory
name = args.name

bits_precision = estimate_bits_precision(args.error_precision)
g = generate_three_orbital_nx(lattice_size,lattice_size)
n_qubits = len(g)

ham = nx_to_three_orbital_hamiltonian(g,t1,t2,t3,t4,t5,t6,t7,t8,mu,delta)

E_min = -len(ham.terms) * max(abs(t1), abs(t2), abs(t3), abs(t4), abs(mu))
E_max = 0
omega = E_max-E_min
t = 2*np.pi/omega
phase_offset = E_max*t

init_state = [0] * n_qubits

gsee_args = {
'trotterize' : True,
'mol_ham' : ham,
'ev_time' : t,
'trot_ord' : trotter_order,
'trot_num' : 1 #Accounted for in a scaling argument later
}


print('starting')

metadata = EstimateMetaData(
id=time.time_ns(),
name=name,
category='scientific',
size=f'{lattice_size}x{lattice_size}',
task='Ground State Energy Estimation',
value_per_circuit=value,
repetitions_per_application=repetitions,
implementations=f'GSEE, evolution_time={t}, bits_precision={bits_precision}, trotter_order={trotter_order}',
)

print('Estimating Circuit Resources')
t0 = time.perf_counter()
estimate = gsee_resource_estimation(
outdir=directory,
numsteps=trotter_steps,
gsee_args=gsee_args,
init_state=init_state,
precision_order=1,
phase_offset=phase_offset,
bits_precision=bits_precision,
circuit_name=name,
metadata=metadata,
write_circuits=args.circuit_write)
t1 = time.perf_counter()
return estimate

def estimate_bits_precision(epsilon):
return math.ceil(math.log2(1.0/epsilon))

def parse_arguments():
parser = argparse.ArgumentParser(prog='HTSC-three-band-RE')
parser.add_argument('-l', '--lattice-size', type=int, default=10)
parser.add_argument('-e', '--error-precision', type=float, default=1e-5)
parser.add_argument('-t', '--trotter-steps', type=int, default=1)
parser.add_argument('-to', '--trotter-order', type=int, default=2)

parser.add_argument('-t1', '--param-t1', type=float, default=0.02)
parser.add_argument('-t2', '--param-t2', type=float, default=0.06)
parser.add_argument('-t3', '--param-t3', type=float, default=0.03)
parser.add_argument('-t4', '--param-t4', type=float, default=-0.01)
parser.add_argument('-t5', '--param-t5', type=float, default=0.2)
parser.add_argument('-t6', '--param-t6', type=float, default=0.3)
parser.add_argument('-t7', '--param-t7', type=float, default=-0.2)
parser.add_argument('-t8', '--param-t8', type=float, default=0.1)
parser.add_argument('-mu', '--param-mu', type=float, default=1)
parser.add_argument('-delta', '--param-delta', type=float, default=0.4)

parser.add_argument('-n', '--name', type=str, default=f'FermiHubbard-ThreeBand', help='name of this circuit instance, becomes prefix for output file')
parser.add_argument('-d', '--directory', type=str, default='./', help='output file directory')
parser.add_argument('-v', '--value', type=float, default=0, help='value of the total application')
parser.add_argument('-r', '--repetitions', type=int, default=1, help='repetitions needed to achieve value of computatation (not runs of this script)')
parser.add_argument('-c', '--circuit_write', default=False, action='store_true')
return parser

if __name__ == "__main__":
parser = parse_arguments()
main(parser.parse_args())
40 changes: 17 additions & 23 deletions scripts/HTSC-two-band-RE.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import math
from pyLIQTR.PhaseEstimation.pe import PhaseEstimation
from networkx import get_node_attributes, draw, draw_networkx_edge_labels
from qca.utils.algo_utils import gsee_resource_estimation
from qca.utils.utils import circuit_estimate, EstimateMetaData
from qca.utils.hamiltonian_utils import generate_two_orbital_nx, nx_to_two_orbital_hamiltonian

Expand Down Expand Up @@ -44,7 +45,7 @@ def main(args):

init_state = [0] * n_qubits

pe_args = {
gsee_args = {
'trotterize' : True,
'mol_ham' : ham,
'ev_time' : t,
Expand All @@ -61,32 +62,23 @@ def main(args):
category='scientific',
size=f'{lattice_size}x{lattice_size}',
task='Ground State Energy Estimation',
value_per_circuit=value,
repetitions_per_application=repetitions,
implementations=f'GSEE, evolution_time={t}, bits_precision={bits_precision}, trotter_order={trotter_order}',
)

t0 = time.perf_counter()
gse_inst = PhaseEstimation(
precision_order=1,
init_state=init_state,
phase_offset=phase_offset,
include_classical_bits=False, # Do this so print to openqasm works
kwargs=pe_args)
gse_inst.generate_circuit()
t1 = time.perf_counter()
print(f'time to generate high level: {t1 - t0}')

gse_circuit = gse_inst.pe_circuit

print('Estimating Circuit Resources')
t0 = time.perf_counter()
estimate = circuit_estimate(
circuit=gse_circuit,
metadata = metadata,
outdir=directory,
circuit_name=name,
write_circuits=args.circuit_write,
bits_precision=bits_precision,
numsteps=trotter_steps)
estimate = gsee_resource_estimation(
outdir=directory,
numsteps=trotter_steps,
gsee_args=gsee_args,
init_state=init_state,
precision_order=1,
bits_precision=bits_precision,
circuit_name=name,
metadata=metadata,
write_circuits=args.circuit_write)
t1 = time.perf_counter()
return estimate

Expand All @@ -96,14 +88,16 @@ def estimate_bits_precision(epsilon):
def parse_arguments():
parser = argparse.ArgumentParser(prog='HTSC-two-band-RE')
parser.add_argument('-l', '--lattice-size', type=int, default=10)
parser.add_argument('-e', '--error-precision', type=float, default=1e-3)
parser.add_argument('-e', '--error-precision', type=float, default=1e-5)
parser.add_argument('-t', '--trotter-steps', type=int, default=1)
parser.add_argument('-to', '--trotter-order', type=int, default=2)

parser.add_argument('-t1', '--param-t1', type=float, default=-1)
parser.add_argument('-t2', '--param-t2', type=float, default=1.3)
parser.add_argument('-t3', '--param-t3', type=float, default=0.85)
parser.add_argument('-t4', '--param-t4', type=float, default=0.85)
parser.add_argument('-mu', '--param-mu', type=float, default=1)

parser.add_argument('-n', '--name', type=str, default=f'FermiHubbard-TwoBand', help='name of this circuit instance, becomes prefix for output file')
parser.add_argument('-d', '--directory', type=str, default='./', help='output file directory')
parser.add_argument('-v', '--value', type=float, default=0, help='value of the total application')
Expand Down
2 changes: 2 additions & 0 deletions src/qca/utils/algo_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,7 @@ def gsee_resource_estimation(
init_state:list,
precision_order:int,
bits_precision:int,
phase_offset:float,
circuit_name:str='Hamiltonian',
metadata:EstimateMetaData=None,
include_classical_bits:bool=False,
Expand All @@ -183,6 +184,7 @@ def gsee_resource_estimation(
precision_order=precision_order,
init_state=init_state,
include_classical_bits=include_classical_bits,
phase_offset=phase_offset,
kwargs=gsee_args
)
t1 = time.perf_counter()
Expand Down
Loading

0 comments on commit b91b39c

Please sign in to comment.