Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions qre/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,11 +119,11 @@ Calling more than one of these functions will generate an error.
A variety of circuits can be generated and analyzed based on the time-evolution unitary operator.
However, this section is still under development and currently has very limited options:

- Textbook Phase Estimation: Setting `circuit.method` to "qualtran textbook" will embed the unitary
encoding of the Hamiltonian into a phase estimation circuit that uses the classic
- Textbook Phase Estimation: Setting `circuit.method` to "QPE: qualtran textbook" will embed the
unitary encoding of the Hamiltonian into a phase estimation circuit that uses the classic
"textbook" method (see, for example, Nielson and Chuang's "Quantum Computation and Quantum
Information").
- Qubitized Phase Estimation: Setting `circuit.method` to "pyliqtr qubitized" will embed the
- Qubitized Phase Estimation: Setting `circuit.method` to "QPE: pyliqtr qubitized" will embed the
unitary encoding of the Hamiltonian into a phase estimation circuit that uses pyLIQTR's qubitized
phase estimation. This uses only a single ancilla qubit for the phase, with multiple
measurements to extract the necessary number of bits of information. This method only works with
Expand Down
4 changes: 2 additions & 2 deletions qre/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,11 @@
# phase estimation circuit

if my_method == "Trotter":
circuit.method = "qualtran textbook"
circuit.method = "QPE: qualtran textbook"
circuit.energy_error = 0.5 * energy_error
circuit.probability_of_failure = 0.01
elif my_method == "double-factorization":
circuit.method = "pyLIQTR qubitized"
circuit.method = "QPE: pyLIQTR qubitized"
circuit.num_phase_qubits = 12
else:
raise ValueError(f"Invalid value for `my_method`: \"{my_method}\"")
Expand Down
15 changes: 10 additions & 5 deletions qre/qre_analysis.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from qre_types import GeneralConfiguration, AnalysisConfiguration

from pyLIQTR.utils.resource_analysis import estimate_resources as estimate_pyliqtr
from qualtran.resource_counting import get_cost_value, QubitCount

# -------------------------------------------------------------------------------------------------

Expand Down Expand Up @@ -28,11 +29,15 @@ def resource_estimation_pyliqtr(
# -- argument profile = False: estimate rotations as Clifford+T
resources = estimate_pyliqtr(qpe_circuit)

return {
"Clifford_count" : resources["Clifford"],
"T_count" : resources["T"],
"qubit_count" : resources["LogicalQubits"]
}
resource_dict = {
"Clifford_count" : resources["Clifford"],
"T_count" : resources["T"],
}
if "LogicalQubits" in resources:
resource_dict["qubit_count"] = resources["LogicalQubits"]
else:
get_cost_value(qpe_circuit, QubitCount())
return resource_dict

# -------------------------------------------------------------------------------------------------

Expand Down
32 changes: 29 additions & 3 deletions qre/qre_circuit.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,28 @@ def build_qpe_pyliqtr_qubitized(

# -------------------------------------------------------------------------------------------------

def build_time_evolution(
config_general: GeneralConfiguration,
config_qpe: QPEConfiguration,
unitary):

config_general.log_verbose("Build a time evolution circuit.")

return unitary

# -------------------------------------------------------------------------------------------------

def build_controlled_time_evolution(
config_general: GeneralConfiguration,
config_qpe: QPEConfiguration,
unitary):

config_general.log_verbose("Build a singly-controlled time evolution circuit.")

return unitary.controlled()

# -------------------------------------------------------------------------------------------------

def build_qpe_circuit(
config_general: GeneralConfiguration,
config_qpe: QPEConfiguration,
Expand All @@ -127,13 +149,17 @@ def build_qpe_circuit(

config_general.log("Beginning to construct quantum phase estimation circuit.")

if config_qpe.method.lower() in ("qualtran textbook",):
if config_qpe.method.lower() in ("qpe: qualtran textbook",):
return build_qpe_qualtran_textbook(config_general, config_qpe, unitary, P0)
elif config_qpe.method.lower() in ("qualtran qubitization",):
elif config_qpe.method.lower() in ("qpe: qualtran qubitization",):
# TODO: This may be more specialized (for LCU only?), but I'm not yet sure of the details.
raise NotImplementedError()
elif config_qpe.method.lower() in ("pyliqtr qubitized",):
elif config_qpe.method.lower() in ("qpe: pyliqtr qubitized",):
return build_qpe_pyliqtr_qubitized(config_general, config_qpe, unitary)
elif config_qpe.method.lower() in ("time evolution",):
return build_time_evolution(config_general, config_qpe, unitary)
elif config_qpe.method.lower() in ("controlled time evolution",):
return build_controlled_time_evolution(config_general, config_qpe, unitary)
else:
raise ValueError(f"Invalid QPE circuit method \"{config_qpe.method}\".")

Expand Down