Skip to content

Commit d65b7a2

Browse files
committed
pass on address analysis interpreter info instead of sifting through lattice elements
1 parent d14fa56 commit d65b7a2

File tree

2 files changed

+10
-31
lines changed

2 files changed

+10
-31
lines changed

src/bloqade/gemini/analysis/measurement_validation/analysis.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
class _GeminiTerminalMeasurementValidationAnalysis(Forward[EmptyLattice]):
1414
keys = ("gemini.validate.terminal_measurement",)
1515

16-
address_analysis_results: ForwardFrame
1716
measurement_analysis_results: ForwardFrame
17+
unique_qubits_allocated: int = 0
1818
terminal_measurement_encountered: bool = False
1919
lattice = EmptyLattice
2020

@@ -35,28 +35,30 @@ def name(self) -> str:
3535
return "Gemini Terminal Measurement Validation"
3636

3737
def get_required_analyses(self) -> list[type]:
38-
return [measure_id.MeasurementIDAnalysis, address.AddressAnalysis]
38+
return [measure_id.MeasurementIDAnalysis]
3939

4040
def set_analysis_cache(self, cache: dict[type, Any]) -> None:
4141
self.analysis_cache.update(cache)
4242

4343
def run(self, method: ir.Method) -> tuple[Any, list[ir.ValidationError]]:
4444

4545
# get the data out of the cache and forward it to the underlying analysis
46-
address_analysis_results = self.analysis_cache.get(address.AddressAnalysis)
4746
measurement_analysis_results = self.analysis_cache.get(
4847
measure_id.MeasurementIDAnalysis
4948
)
5049

51-
assert (
52-
address_analysis_results is not None
53-
), "Address analysis results not found in cache"
50+
address_analysis = address.AddressAnalysis(dialects=method.dialects)
51+
address_analysis.run(method)
52+
unique_qubits_allocated = address_analysis.qubit_count
53+
5454
assert (
5555
measurement_analysis_results is not None
5656
), "Measurement ID analysis results not found in cache"
5757

5858
analysis = _GeminiTerminalMeasurementValidationAnalysis(
59-
method.dialects, address_analysis_results, measurement_analysis_results
59+
method.dialects,
60+
measurement_analysis_results,
61+
unique_qubits_allocated=unique_qubits_allocated,
6062
)
6163

6264
frame, _ = analysis.run(method)

src/bloqade/gemini/analysis/measurement_validation/impls.py

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
from bloqade import qubit, gemini
66
from bloqade.analysis.address.impls import Func as AddressFuncMethodTable
7-
from bloqade.analysis.address.lattice import AddressReg, AddressQubit
87
from bloqade.analysis.measure_id.lattice import MeasureIdTuple
98

109
from .analysis import _GeminiTerminalMeasurementValidationAnalysis
@@ -60,30 +59,8 @@ def terminal_measure(
6059
)
6160
return (interp.lattice.bottom(),)
6261

63-
# If we confirm there isn't a duplicate terminal measurement,
64-
# now we need to check that for all the qubits that were spawned,
65-
# they are all consumed by this measurement
66-
address_analysis_results = interp.address_analysis_results
6762
measurement_analysis_results = interp.measurement_analysis_results
68-
69-
# Figure out the total number of qubits spawned, keeping in mind that if a user
70-
# "shuffles" the qubits (puts them in a new container, splits one off from a container type, etc.)
71-
# it should be accounted for. This would be much cleaner if there was a way to propagate the
72-
# final qubit count saved in the actual interpreter for address analysis...
73-
witnessed_qubits = set()
74-
total_qubits_allocated = 0
75-
for address_lattice_elem in address_analysis_results.entries.values():
76-
77-
match address_lattice_elem:
78-
case AddressReg(data=data):
79-
for data_elem in data:
80-
if data_elem not in witnessed_qubits:
81-
witnessed_qubits.add(data_elem)
82-
total_qubits_allocated += 1
83-
case AddressQubit(data=data):
84-
if data not in witnessed_qubits:
85-
witnessed_qubits.add(data)
86-
total_qubits_allocated += 1
63+
total_qubits_allocated = interp.unique_qubits_allocated
8764

8865
# could make these proper exceptions but would be tricky to communicate to user
8966
# without revealing under-the-hood details

0 commit comments

Comments
 (0)