From c3efb9b9fb407e44d54851c25ecb573d72e592b9 Mon Sep 17 00:00:00 2001 From: Phillip Weinberg Date: Mon, 1 May 2023 11:40:17 -0400 Subject: [PATCH] Release 0.4.1 (#44) * fix issue with None for local detuning field. * fixing bug in calculating probabilities from task. * bump patch version * Alias global field name fix (#43) --- .gitignore | 2 +- pyproject.toml | 2 +- src/quera_ahs_utils/ir.py | 10 ++--- src/quera_ahs_utils/quera_ir/capabilities.py | 1 + src/quera_ahs_utils/quera_ir/task_results.py | 21 +++++----- .../quera_ir/task_specification.py | 38 ++++++++++++------- 6 files changed, 42 insertions(+), 32 deletions(-) diff --git a/.gitignore b/.gitignore index 5216460..c61611c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ .DS_Store .vscode - +.python_env/ # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] diff --git a/pyproject.toml b/pyproject.toml index 4a9296b..29db484 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "quera-ahs-utils" -version = "0.4.0" +version = "0.4.1" authors = [ { name="Phillip Weinberg", email="pweinberg@quera.com" }, { name="John Long", email="jlong@quera.com" } diff --git a/src/quera_ahs_utils/ir.py b/src/quera_ahs_utils/ir.py index bd64bb3..db17bdd 100644 --- a/src/quera_ahs_utils/ir.py +++ b/src/quera_ahs_utils/ir.py @@ -162,25 +162,25 @@ def get_local_field(field: braket_ir.PhysicalField) -> LocalField: def get_rabi_frequency_amplitude(driving: braket_ir.DrivingField): field = braket_to_quera.get_global_field(driving.amplitude) return RabiFrequencyAmplitude( - **{"global":braket_to_quera.get_global_field(driving.amplitude)} + global_=braket_to_quera.get_global_field(driving.amplitude) ) @staticmethod def get_rabi_frequency_phase(driving: braket_ir.DrivingField): return RabiFrequencyPhase( - **{"global":braket_to_quera.get_global_field(driving.phase)} + global_=braket_to_quera.get_global_field(driving.phase) ) @staticmethod def get_detuning(driving: braket_ir.DrivingField, shifting: Optional[braket_ir.ShiftingField]): if shifting == None: return Detuning( - **{"global":braket_to_quera.get_global_field(driving.detuning)} + global_=braket_to_quera.get_global_field(driving.detuning) ) else: return Detuning( - **{"global":braket_to_quera.get_global_field(driving.detuning), - "local":braket_to_quera.get_local_field(shifting.magnitude)} + global_=braket_to_quera.get_global_field(driving.detuning), + local=braket_to_quera.get_local_field(shifting.magnitude) ) @staticmethod diff --git a/src/quera_ahs_utils/quera_ir/capabilities.py b/src/quera_ahs_utils/quera_ir/capabilities.py index f50bbf5..e86a55f 100644 --- a/src/quera_ahs_utils/quera_ir/capabilities.py +++ b/src/quera_ahs_utils/quera_ir/capabilities.py @@ -37,6 +37,7 @@ class RydbergCapabilities(BaseModel): local: RydbergLocalCapabilities class Config: + allow_population_by_field_name = True fields = { 'global_': 'global' } diff --git a/src/quera_ahs_utils/quera_ir/task_results.py b/src/quera_ahs_utils/quera_ir/task_results.py index 5090bc2..d8138b2 100644 --- a/src/quera_ahs_utils/quera_ir/task_results.py +++ b/src/quera_ahs_utils/quera_ir/task_results.py @@ -62,17 +62,15 @@ class QuEraTaskResults(BaseModel): task_status: QuEraTaskStatusCode = QuEraTaskStatusCode.Failed shot_outputs: conlist(QuEraShotResult, min_items=0) = [] - def export_as_probabilties(self, post_process=False) -> TaskProbabilities: + def export_as_probabilities(self) -> TaskProbabilities: """converts from shot results to probabilities Returns: TaskProbabilities: The task results as probabilties """ - probabilities = dict() - n = 0 + counts = dict() + nshots = len(self.shot_outputs) for shot_result in self.shot_outputs: - if any(bit==0 for bit in shot_result.pre_sequence): - continue pre_sequence_str = "".join( str(bit) for bit in shot_result.pre_sequence @@ -82,14 +80,13 @@ def export_as_probabilties(self, post_process=False) -> TaskProbabilities: str(bit) for bit in shot_result.post_sequence ) - configuration = (pre_sequence_str,post_sequence_str) + configuration = (pre_sequence_str, post_sequence_str) # iterative average - probabilities[configuration] = \ - ((n + 1.0) * probabilities.get(configuration, 0) + 1.0)/n - - n += 1 - - return TaskProbabilities(list(probabilities.items())) + current_count = counts.get(configuration, 0) + counts[configuration] = current_count + 1 + + probabilities = [(config,count/nshots) for config,count in counts.items()] + return TaskProbabilities(probabilities=probabilities) def post_process(self, keep_shot_result: Optional[Callable] = None, args = ()) -> 'QuEraTaskResults': diff --git a/src/quera_ahs_utils/quera_ir/task_specification.py b/src/quera_ahs_utils/quera_ir/task_specification.py index f0e8a83..e9a1bfe 100644 --- a/src/quera_ahs_utils/quera_ir/task_specification.py +++ b/src/quera_ahs_utils/quera_ir/task_specification.py @@ -36,6 +36,7 @@ class RabiFrequencyAmplitude(BaseModel): global_: GlobalField class Config: + allow_population_by_field_name = True fields = { 'global_': 'global' } @@ -47,15 +48,18 @@ def discretize(self, task_capabilities: QuEraCapabilities): global_time_resolution = task_capabilities.capabilities.rydberg.global_.time_resolution global_value_resolution = task_capabilities.capabilities.rydberg.global_.rabi_frequency_resolution - return RabiFrequencyAmplitude(**{"global":GlobalField( + return RabiFrequencyAmplitude( + global_ = GlobalField( times = discretize_list(self.global_.times, global_time_resolution), - values = discretize_list(self.global_.values, global_value_resolution))} - ) + values = discretize_list(self.global_.values, global_value_resolution) + ) + ) class RabiFrequencyPhase(BaseModel): global_: GlobalField class Config: + allow_population_by_field_name = True fields = { 'global_': 'global' } @@ -67,9 +71,10 @@ def discretize(self, task_capabilities: QuEraCapabilities): global_time_resolution = task_capabilities.capabilities.rydberg.global_.time_resolution global_value_resolution = task_capabilities.capabilities.rydberg.global_.phase_resolution - return RabiFrequencyPhase(**{"global":GlobalField( - times = discretize_list(self.global_.times, global_time_resolution), - values = discretize_list(self.global_.values, global_value_resolution))} + return RabiFrequencyPhase(global_=GlobalField( + times = discretize_list(self.global_.times, global_time_resolution), + values = discretize_list(self.global_.values, global_value_resolution) + ) ) class Detuning(BaseModel): @@ -77,6 +82,7 @@ class Detuning(BaseModel): local: Optional[LocalField] class Config: + allow_population_by_field_name = True fields = { 'global_': 'global' } @@ -89,15 +95,21 @@ def discretize(self, task_capabilities: QuEraCapabilities): global_value_resolution = task_capabilities.capabilities.rydberg.global_.detuning_resolution local_time_resolution = task_capabilities.capabilities.rydberg.local.time_resolution - return Detuning(**{"global":GlobalField( - times = discretize_list(self.global_.times, global_time_resolution), - values = discretize_list(self.global_.values, global_value_resolution) - ),"local": LocalField( - times = discretize_list(self.local.times, local_time_resolution), values = self.local.values, + if self.local != None: + self.local = LocalField( + times = discretize_list(self.local.times, local_time_resolution), + values = self.local.values, lattice_site_coefficients=self.local.lattice_site_coefficients ) - } - ) + + + return Detuning( + global_ = GlobalField( + times = discretize_list(self.global_.times, global_time_resolution), + values = discretize_list(self.global_.values, global_value_resolution) + ), + local = self.local + ) class RydbergHamiltonian(BaseModel): rabi_frequency_amplitude: RabiFrequencyAmplitude