classiq 0.53.0__py3-none-any.whl → 0.55.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. classiq/__init__.py +1 -3
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +2 -1
  3. classiq/_internals/__init__.py +0 -20
  4. classiq/_internals/api_wrapper.py +8 -8
  5. classiq/_internals/async_utils.py +1 -3
  6. classiq/_internals/authentication/auth0.py +5 -5
  7. classiq/_internals/authentication/device.py +5 -4
  8. classiq/_internals/authentication/password_manager.py +3 -3
  9. classiq/_internals/authentication/token_manager.py +3 -2
  10. classiq/_internals/client.py +10 -12
  11. classiq/_internals/config.py +2 -2
  12. classiq/_internals/jobs.py +7 -6
  13. classiq/_internals/type_validation.py +9 -9
  14. classiq/analyzer/__init__.py +1 -3
  15. classiq/analyzer/analyzer.py +8 -7
  16. classiq/analyzer/analyzer_utilities.py +8 -8
  17. classiq/analyzer/rb.py +11 -11
  18. classiq/applications/__init__.py +1 -3
  19. classiq/applications/chemistry/__init__.py +1 -3
  20. classiq/applications/chemistry/ansatz_parameters.py +4 -4
  21. classiq/applications/chemistry/chemistry_model_constructor.py +10 -9
  22. classiq/applications/combinatorial_helpers/combinatorial_problem_utils.py +26 -9
  23. classiq/applications/combinatorial_helpers/encoding_mapping.py +10 -10
  24. classiq/applications/combinatorial_helpers/encoding_utils.py +4 -4
  25. classiq/applications/combinatorial_helpers/memory.py +5 -7
  26. classiq/applications/combinatorial_helpers/optimization_model.py +43 -24
  27. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +4 -6
  28. classiq/applications/combinatorial_helpers/pyomo_utils.py +95 -24
  29. classiq/applications/combinatorial_helpers/sympy_utils.py +2 -2
  30. classiq/applications/combinatorial_helpers/transformations/encoding.py +8 -8
  31. classiq/applications/combinatorial_helpers/transformations/fixed_variables.py +5 -5
  32. classiq/applications/combinatorial_helpers/transformations/ising_converter.py +7 -9
  33. classiq/applications/combinatorial_helpers/transformations/penalty.py +1 -2
  34. classiq/applications/combinatorial_helpers/transformations/sign_seperation.py +1 -2
  35. classiq/applications/combinatorial_helpers/transformations/slack_variables.py +1 -2
  36. classiq/applications/combinatorial_optimization/__init__.py +1 -3
  37. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
  38. classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
  39. classiq/applications/finance/__init__.py +1 -3
  40. classiq/applications/grover/__init__.py +1 -3
  41. classiq/applications/grover/grover_model_constructor.py +7 -9
  42. classiq/applications/hamiltonian/pauli_decomposition.py +6 -6
  43. classiq/applications/qnn/__init__.py +1 -3
  44. classiq/applications/qnn/circuit_utils.py +5 -5
  45. classiq/applications/qnn/datasets/__init__.py +1 -3
  46. classiq/applications/qnn/datasets/dataset_base_classes.py +5 -4
  47. classiq/applications/qnn/datasets/dataset_parity.py +2 -2
  48. classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
  49. classiq/applications/qnn/qlayer.py +3 -3
  50. classiq/applications/qnn/torch_utils.py +2 -2
  51. classiq/applications/qnn/types.py +5 -5
  52. classiq/applications/qsvm/qsvm.py +1 -3
  53. classiq/applications/qsvm/qsvm_data_generation.py +3 -3
  54. classiq/applications/qsvm/qsvm_model_constructor.py +5 -5
  55. classiq/execution/__init__.py +1 -3
  56. classiq/execution/all_hardware_devices.py +1 -3
  57. classiq/execution/execution_session.py +16 -16
  58. classiq/execution/jobs.py +4 -4
  59. classiq/execution/qaoa.py +3 -3
  60. classiq/execution/qnn.py +3 -3
  61. classiq/executor.py +3 -3
  62. classiq/interface/_version.py +1 -1
  63. classiq/interface/analyzer/analysis_params.py +9 -10
  64. classiq/interface/analyzer/cytoscape_graph.py +5 -5
  65. classiq/interface/analyzer/result.py +17 -17
  66. classiq/interface/applications/qsvm.py +6 -10
  67. classiq/interface/backend/backend_preferences.py +4 -3
  68. classiq/interface/backend/ionq/ionq_quantum_program.py +4 -5
  69. classiq/interface/backend/pydantic_backend.py +1 -2
  70. classiq/interface/chemistry/fermionic_operator.py +5 -5
  71. classiq/interface/chemistry/ground_state_problem.py +7 -8
  72. classiq/interface/chemistry/molecule.py +4 -4
  73. classiq/interface/chemistry/operator.py +11 -13
  74. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +1 -3
  75. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  76. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  77. classiq/interface/combinatorial_optimization/examples/mht.py +2 -3
  78. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  79. classiq/interface/combinatorial_optimization/examples/set_cover.py +1 -2
  80. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +5 -7
  81. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  82. classiq/interface/combinatorial_optimization/result.py +1 -3
  83. classiq/interface/debug_info/debug_info.py +8 -7
  84. classiq/interface/exceptions.py +8 -6
  85. classiq/interface/execution/jobs.py +2 -2
  86. classiq/interface/execution/primitives.py +3 -3
  87. classiq/interface/executor/aws_execution_cost.py +4 -4
  88. classiq/interface/executor/execution_request.py +2 -3
  89. classiq/interface/executor/execution_result.py +3 -3
  90. classiq/interface/executor/iqae_result.py +3 -5
  91. classiq/interface/executor/optimizer_preferences.py +2 -2
  92. classiq/interface/executor/quantum_code.py +6 -6
  93. classiq/interface/executor/register_initialization.py +2 -4
  94. classiq/interface/executor/result.py +23 -27
  95. classiq/interface/executor/vqe_result.py +8 -8
  96. classiq/interface/finance/function_input.py +2 -2
  97. classiq/interface/finance/gaussian_model_input.py +5 -5
  98. classiq/interface/finance/log_normal_model_input.py +2 -2
  99. classiq/interface/finance/model_input.py +1 -2
  100. classiq/interface/generator/adjacency.py +1 -3
  101. classiq/interface/generator/ansatz_library.py +4 -4
  102. classiq/interface/generator/application_apis/finance_declarations.py +1 -1
  103. classiq/interface/generator/arith/argument_utils.py +3 -3
  104. classiq/interface/generator/arith/arithmetic.py +7 -7
  105. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +5 -5
  106. classiq/interface/generator/arith/arithmetic_expression_abc.py +11 -11
  107. classiq/interface/generator/arith/arithmetic_expression_parser.py +8 -7
  108. classiq/interface/generator/arith/arithmetic_expression_validator.py +8 -8
  109. classiq/interface/generator/arith/arithmetic_operations.py +4 -3
  110. classiq/interface/generator/arith/arithmetic_param_getters.py +6 -6
  111. classiq/interface/generator/arith/arithmetic_result_builder.py +9 -9
  112. classiq/interface/generator/arith/ast_node_rewrite.py +2 -1
  113. classiq/interface/generator/arith/binary_ops.py +10 -13
  114. classiq/interface/generator/arith/extremum_operations.py +3 -2
  115. classiq/interface/generator/arith/logical_ops.py +7 -6
  116. classiq/interface/generator/arith/number_utils.py +4 -4
  117. classiq/interface/generator/arith/register_user_input.py +4 -4
  118. classiq/interface/generator/arith/unary_ops.py +2 -1
  119. classiq/interface/generator/builtin_api_builder.py +2 -1
  120. classiq/interface/generator/circuit_code/circuit_code.py +4 -4
  121. classiq/interface/generator/circuit_code/types_and_constants.py +3 -5
  122. classiq/interface/generator/complex_type.py +1 -2
  123. classiq/interface/generator/control_state.py +2 -2
  124. classiq/interface/generator/custom_ansatz.py +1 -3
  125. classiq/interface/generator/distance.py +3 -5
  126. classiq/interface/generator/excitations.py +3 -2
  127. classiq/interface/generator/expressions/enums/finance_functions.py +1 -3
  128. classiq/interface/generator/expressions/evaluated_expression.py +4 -3
  129. classiq/interface/generator/expressions/expression.py +4 -5
  130. classiq/interface/generator/expressions/expression_constants.py +4 -4
  131. classiq/interface/generator/expressions/qmod_qarray_proxy.py +2 -1
  132. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +2 -1
  133. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +2 -1
  134. classiq/interface/generator/expressions/qmod_sized_proxy.py +2 -1
  135. classiq/interface/generator/expressions/qmod_struct_instance.py +2 -1
  136. classiq/interface/generator/expressions/sympy_supported_expressions.py +11 -13
  137. classiq/interface/generator/finance.py +2 -2
  138. classiq/interface/generator/function_param_library.py +6 -6
  139. classiq/interface/generator/function_params.py +13 -19
  140. classiq/interface/generator/functions/builtins/internal_operators.py +9 -1
  141. classiq/interface/generator/functions/classical_function_declaration.py +4 -3
  142. classiq/interface/generator/functions/classical_type.py +13 -13
  143. classiq/interface/generator/functions/concrete_types.py +1 -2
  144. classiq/interface/generator/functions/function_declaration.py +1 -1
  145. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  146. classiq/interface/generator/functions/type_name.py +3 -2
  147. classiq/interface/generator/generated_circuit_data.py +33 -22
  148. classiq/interface/generator/grover_diffuser.py +7 -7
  149. classiq/interface/generator/grover_operator.py +2 -2
  150. classiq/interface/generator/hardware/hardware_data.py +7 -6
  151. classiq/interface/generator/hardware_efficient_ansatz.py +8 -8
  152. classiq/interface/generator/identity.py +5 -6
  153. classiq/interface/generator/linear_pauli_rotations.py +6 -6
  154. classiq/interface/generator/mcu.py +2 -2
  155. classiq/interface/generator/mcx.py +6 -6
  156. classiq/interface/generator/model/__init__.py +1 -3
  157. classiq/interface/generator/model/constraints.py +2 -2
  158. classiq/interface/generator/model/model.py +5 -6
  159. classiq/interface/generator/model/preferences/preferences.py +11 -6
  160. classiq/interface/generator/model/quantum_register.py +6 -11
  161. classiq/interface/generator/oracles/arithmetic_oracle.py +1 -2
  162. classiq/interface/generator/oracles/custom_oracle.py +2 -2
  163. classiq/interface/generator/oracles/oracle_abc.py +6 -5
  164. classiq/interface/generator/partitioned_register.py +6 -5
  165. classiq/interface/generator/piecewise_linear_amplitude_loading.py +8 -7
  166. classiq/interface/generator/qpe.py +4 -4
  167. classiq/interface/generator/qsvm.py +3 -3
  168. classiq/interface/generator/quantum_function_call.py +24 -29
  169. classiq/interface/generator/quantum_program.py +9 -9
  170. classiq/interface/generator/register_role.py +2 -4
  171. classiq/interface/generator/slice_parsing_utils.py +4 -3
  172. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  173. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  174. classiq/interface/generator/state_preparation/distributions.py +6 -5
  175. classiq/interface/generator/state_preparation/metrics.py +2 -4
  176. classiq/interface/generator/state_preparation/state_preparation.py +4 -4
  177. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +3 -3
  178. classiq/interface/generator/transpiler_basis_gates.py +2 -2
  179. classiq/interface/generator/types/compilation_metadata.py +5 -0
  180. classiq/interface/generator/types/enum_declaration.py +2 -3
  181. classiq/interface/generator/types/qstruct_declaration.py +2 -1
  182. classiq/interface/generator/types/struct_declaration.py +3 -2
  183. classiq/interface/generator/ucc.py +2 -1
  184. classiq/interface/generator/unitary_gate.py +2 -2
  185. classiq/interface/generator/user_defined_function_params.py +1 -1
  186. classiq/interface/generator/validations/flow_graph.py +6 -5
  187. classiq/interface/generator/validations/validator_functions.py +3 -2
  188. classiq/interface/generator/visitor.py +9 -14
  189. classiq/interface/hardware.py +5 -6
  190. classiq/interface/helpers/custom_encoders.py +2 -2
  191. classiq/interface/helpers/custom_pydantic_types.py +8 -9
  192. classiq/interface/helpers/hashable_mixin.py +3 -2
  193. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  194. classiq/interface/helpers/pydantic_model_helpers.py +4 -3
  195. classiq/interface/helpers/validation_helpers.py +2 -2
  196. classiq/interface/ide/ide_data.py +11 -15
  197. classiq/interface/ide/visual_model.py +22 -22
  198. classiq/interface/jobs.py +2 -2
  199. classiq/interface/model/bind_operation.py +5 -4
  200. classiq/interface/model/classical_parameter_declaration.py +2 -2
  201. classiq/interface/model/control.py +22 -1
  202. classiq/interface/model/handle_binding.py +3 -2
  203. classiq/interface/model/inplace_binary_operation.py +2 -1
  204. classiq/interface/model/model.py +16 -11
  205. classiq/interface/model/native_function_definition.py +1 -1
  206. classiq/interface/model/port_declaration.py +2 -2
  207. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +3 -2
  208. classiq/interface/model/quantum_expressions/arithmetic_operation.py +4 -27
  209. classiq/interface/model/quantum_expressions/quantum_expression.py +8 -7
  210. classiq/interface/model/quantum_function_call.py +9 -14
  211. classiq/interface/model/quantum_function_declaration.py +10 -12
  212. classiq/interface/model/quantum_lambda_function.py +3 -16
  213. classiq/interface/model/quantum_statement.py +7 -3
  214. classiq/interface/model/quantum_type.py +5 -5
  215. classiq/interface/model/statement_block.py +2 -3
  216. classiq/interface/model/validation_handle.py +5 -4
  217. classiq/interface/server/global_versions.py +3 -3
  218. classiq/model_expansions/atomic_expression_functions_defs.py +3 -2
  219. classiq/model_expansions/capturing/captured_var_manager.py +4 -6
  220. classiq/model_expansions/capturing/propagated_var_stack.py +7 -7
  221. classiq/model_expansions/closure.py +83 -12
  222. classiq/model_expansions/evaluators/arg_type_match.py +3 -2
  223. classiq/model_expansions/evaluators/argument_types.py +3 -3
  224. classiq/model_expansions/evaluators/control.py +3 -3
  225. classiq/model_expansions/evaluators/parameter_types.py +7 -7
  226. classiq/model_expansions/evaluators/quantum_type_utils.py +2 -1
  227. classiq/model_expansions/evaluators/type_type_match.py +1 -1
  228. classiq/model_expansions/expression_evaluator.py +10 -9
  229. classiq/model_expansions/expression_renamer.py +6 -6
  230. classiq/model_expansions/function_builder.py +13 -12
  231. classiq/model_expansions/generative_functions.py +5 -4
  232. classiq/model_expansions/interpreter.py +20 -11
  233. classiq/model_expansions/model_tables.py +14 -14
  234. classiq/model_expansions/quantum_operations/bind.py +2 -4
  235. classiq/model_expansions/quantum_operations/classicalif.py +1 -1
  236. classiq/model_expansions/quantum_operations/control.py +81 -24
  237. classiq/model_expansions/quantum_operations/emitter.py +33 -20
  238. classiq/model_expansions/quantum_operations/expression_operation.py +47 -16
  239. classiq/model_expansions/quantum_operations/inplace_binary_operation.py +160 -35
  240. classiq/model_expansions/quantum_operations/phase.py +6 -6
  241. classiq/model_expansions/quantum_operations/quantum_assignment_operation.py +28 -31
  242. classiq/model_expansions/quantum_operations/quantum_function_call.py +9 -0
  243. classiq/model_expansions/quantum_operations/repeat.py +1 -3
  244. classiq/model_expansions/quantum_operations/within_apply.py +0 -16
  245. classiq/model_expansions/scope.py +11 -10
  246. classiq/model_expansions/scope_initialization.py +5 -5
  247. classiq/model_expansions/sympy_conversion/expression_to_sympy.py +6 -6
  248. classiq/model_expansions/sympy_conversion/sympy_to_python.py +2 -2
  249. classiq/model_expansions/visitors/variable_references.py +5 -4
  250. classiq/qmod/builtins/classical_execution_primitives.py +9 -9
  251. classiq/qmod/builtins/functions/__init__.py +72 -55
  252. classiq/qmod/builtins/functions/amplitude_estimation.py +4 -1
  253. classiq/qmod/builtins/functions/arithmetic.py +14 -1
  254. classiq/qmod/builtins/functions/discrete_sine_cosine_transform.py +86 -6
  255. classiq/qmod/builtins/functions/grover.py +41 -45
  256. classiq/qmod/builtins/functions/hea.py +60 -4
  257. classiq/qmod/builtins/functions/linear_pauli_rotation.py +26 -4
  258. classiq/qmod/builtins/functions/modular_exponentiation.py +90 -29
  259. classiq/qmod/builtins/functions/operators.py +1 -1
  260. classiq/qmod/builtins/functions/qaoa_penalty.py +14 -5
  261. classiq/qmod/builtins/functions/qft_functions.py +57 -0
  262. classiq/qmod/builtins/functions/qpe.py +20 -4
  263. classiq/qmod/builtins/functions/qsvt.py +49 -4
  264. classiq/qmod/builtins/functions/standard_gates.py +4 -4
  265. classiq/qmod/builtins/functions/state_preparation.py +92 -10
  266. classiq/qmod/builtins/functions/swap_test.py +7 -1
  267. classiq/qmod/builtins/functions/utility_functions.py +43 -0
  268. classiq/qmod/builtins/functions/variational.py +18 -2
  269. classiq/qmod/builtins/operations.py +117 -22
  270. classiq/qmod/cfunc.py +2 -2
  271. classiq/qmod/classical_function.py +3 -7
  272. classiq/qmod/create_model_function.py +16 -17
  273. classiq/qmod/declaration_inferrer.py +7 -10
  274. classiq/qmod/expression_query.py +3 -3
  275. classiq/qmod/generative.py +2 -1
  276. classiq/qmod/model_state_container.py +10 -8
  277. classiq/qmod/native/__init__.py +1 -3
  278. classiq/qmod/native/expression_to_qmod.py +9 -8
  279. classiq/qmod/native/pretty_printer.py +12 -6
  280. classiq/qmod/pretty_print/__init__.py +1 -3
  281. classiq/qmod/pretty_print/expression_to_python.py +13 -12
  282. classiq/qmod/pretty_print/pretty_printer.py +38 -23
  283. classiq/qmod/python_classical_type.py +8 -4
  284. classiq/qmod/qfunc.py +4 -4
  285. classiq/qmod/qmod_variable.py +11 -10
  286. classiq/qmod/quantum_expandable.py +12 -15
  287. classiq/qmod/quantum_function.py +35 -22
  288. classiq/qmod/semantics/annotation.py +1 -1
  289. classiq/qmod/semantics/error_manager.py +8 -7
  290. classiq/qmod/semantics/static_semantics_visitor.py +19 -24
  291. classiq/qmod/semantics/validation/constants_validation.py +1 -1
  292. classiq/qmod/semantics/validation/func_call_validation.py +2 -2
  293. classiq/qmod/semantics/validation/main_validation.py +33 -0
  294. classiq/qmod/semantics/validation/types_validation.py +2 -1
  295. classiq/qmod/symbolic.py +5 -8
  296. classiq/qmod/symbolic_type.py +2 -2
  297. classiq/qmod/synthesize_separately.py +1 -2
  298. {classiq-0.53.0.dist-info → classiq-0.55.0.dist-info}/METADATA +1 -1
  299. {classiq-0.53.0.dist-info → classiq-0.55.0.dist-info}/RECORD +300 -297
  300. classiq/qmod/builtins/functions/qft.py +0 -23
  301. {classiq-0.53.0.dist-info → classiq-0.55.0.dist-info}/WHEEL +0 -0
@@ -1,4 +1,4 @@
1
- from typing import TYPE_CHECKING, Callable, Dict, List, Optional, Union, cast
1
+ from typing import TYPE_CHECKING, Callable, Optional, Union
2
2
 
3
3
  import pydantic
4
4
 
@@ -17,12 +17,7 @@ class QuantumLambdaFunction(ASTNode):
17
17
  The definition of an anonymous function passed as operand to higher-level functions
18
18
  """
19
19
 
20
- rename_params: Dict[str, str] = pydantic.Field(
21
- default_factory=dict,
22
- exclude=True,
23
- )
24
-
25
- pos_rename_params: List[str] = pydantic.Field(
20
+ pos_rename_params: list[str] = pydantic.Field(
26
21
  default_factory=list,
27
22
  description="Mapping of the declared param to the actual variable name used",
28
23
  )
@@ -56,14 +51,6 @@ class QuantumLambdaFunction(ASTNode):
56
51
  def set_op_decl(self, fd: AnonQuantumOperandDeclaration) -> None:
57
52
  self._func_decl = fd
58
53
 
59
- def get_rename_params(self) -> List[str]:
60
- if self.pos_rename_params:
61
- return self.pos_rename_params
62
- return [
63
- self.rename_params.get(cast(str, param.name), cast(str, param.name))
64
- for param in self.func_decl.positional_arg_declarations
65
- ]
66
-
67
54
 
68
55
  QuantumCallable = Union[str, QuantumLambdaFunction]
69
- QuantumOperand = Union[QuantumCallable, List[QuantumCallable]]
56
+ QuantumOperand = Union[QuantumCallable, list[QuantumCallable]]
@@ -1,5 +1,6 @@
1
+ from collections.abc import Mapping, Sequence
1
2
  from dataclasses import dataclass
2
- from typing import Any, Callable, Dict, Mapping, Optional, Sequence
3
+ from typing import Any, Callable, Optional
3
4
  from uuid import UUID, uuid4
4
5
 
5
6
  import pydantic
@@ -19,7 +20,7 @@ class QuantumStatement(ASTNode):
19
20
 
20
21
  @pydantic.model_validator(mode="before")
21
22
  @classmethod
22
- def _set_kind(cls, values: Any) -> Dict[str, Any]:
23
+ def _set_kind(cls, values: Any) -> dict[str, Any]:
23
24
  return values_with_discriminator(values, "kind", cls.__name__)
24
25
 
25
26
 
@@ -33,7 +34,7 @@ class QuantumOperation(QuantumStatement):
33
34
  uuid: UUID = pydantic.Field(
34
35
  description="A unique identifier for this operation", default_factory=uuid4
35
36
  )
36
- _generative_blocks: Dict[str, Callable] = pydantic.PrivateAttr(default_factory=dict)
37
+ _generative_blocks: dict[str, Callable] = pydantic.PrivateAttr(default_factory=dict)
37
38
 
38
39
  @property
39
40
  def wiring_inputs(self) -> Mapping[str, HandleBinding]:
@@ -74,6 +75,9 @@ class QuantumOperation(QuantumStatement):
74
75
  def set_generative_block(self, block_name: str, py_callable: Callable) -> None:
75
76
  self._generative_blocks[block_name] = py_callable
76
77
 
78
+ def remove_generative_block(self, block_name: str) -> None:
79
+ self._generative_blocks.pop(block_name)
80
+
77
81
  def get_generative_block(self, block_name: str) -> Callable:
78
82
  return self._generative_blocks[block_name]
79
83
 
@@ -1,4 +1,4 @@
1
- from typing import TYPE_CHECKING, Any, Dict, Literal, Optional
1
+ from typing import TYPE_CHECKING, Any, Literal, Optional
2
2
 
3
3
  import pydantic
4
4
  from pydantic import BaseModel, ConfigDict, Field
@@ -74,7 +74,7 @@ class QuantumBit(QuantumScalar):
74
74
 
75
75
  @pydantic.model_validator(mode="before")
76
76
  @classmethod
77
- def _set_kind(cls, values: Any) -> Dict[str, Any]:
77
+ def _set_kind(cls, values: Any) -> dict[str, Any]:
78
78
  return values_with_discriminator(values, "kind", "qbit")
79
79
 
80
80
  @property
@@ -98,7 +98,7 @@ class QuantumBitvector(QuantumType):
98
98
 
99
99
  @pydantic.model_validator(mode="before")
100
100
  @classmethod
101
- def _set_kind(cls, values: Any) -> Dict[str, Any]:
101
+ def _set_kind(cls, values: Any) -> dict[str, Any]:
102
102
  return values_with_discriminator(values, "kind", "qvec")
103
103
 
104
104
  def _update_size_in_bits_from_declaration(self) -> None:
@@ -152,7 +152,7 @@ class QuantumNumeric(QuantumScalar):
152
152
 
153
153
  @pydantic.model_validator(mode="before")
154
154
  @classmethod
155
- def _set_kind(cls, values: Any) -> Dict[str, Any]:
155
+ def _set_kind(cls, values: Any) -> dict[str, Any]:
156
156
  return values_with_discriminator(values, "kind", "qnum")
157
157
 
158
158
  @pydantic.model_validator(mode="after")
@@ -222,7 +222,7 @@ class RegisterQuantumType(BaseModel):
222
222
  return "default"
223
223
 
224
224
 
225
- RegisterQuantumTypeDict = Dict[str, RegisterQuantumType]
225
+ RegisterQuantumTypeDict = dict[str, RegisterQuantumType]
226
226
 
227
227
 
228
228
  def register_info_to_quantum_type(reg_info: RegisterArithmeticInfo) -> QuantumNumeric:
@@ -1,7 +1,6 @@
1
- from typing import List, Union
1
+ from typing import Annotated, Union
2
2
 
3
3
  from pydantic import Field
4
- from typing_extensions import Annotated
5
4
 
6
5
  from classiq.interface.model.bind_operation import BindOperation
7
6
  from classiq.interface.model.classical_if import ClassicalIf
@@ -44,7 +43,7 @@ ConcreteQuantumStatement = Annotated[
44
43
  Field(..., discriminator="kind"),
45
44
  ]
46
45
 
47
- StatementBlock = List[ConcreteQuantumStatement]
46
+ StatementBlock = list[ConcreteQuantumStatement]
48
47
 
49
48
  Control.model_rebuild()
50
49
  QuantumLambdaFunction.model_rebuild()
@@ -1,6 +1,7 @@
1
1
  import dataclasses
2
+ from collections.abc import Mapping
2
3
  from enum import Enum
3
- from typing import List, Mapping, Optional, Set
4
+ from typing import Optional
4
5
 
5
6
  from classiq.interface.exceptions import ClassiqError
6
7
  from classiq.interface.model.handle_binding import HandleBinding
@@ -22,12 +23,12 @@ class HandleState(Enum):
22
23
  @dataclasses.dataclass
23
24
  class ValidationHandle:
24
25
  _state: HandleState
25
- errors: List[str] = dataclasses.field(default_factory=list)
26
+ errors: list[str] = dataclasses.field(default_factory=list)
26
27
 
27
28
  def __init__(
28
29
  self,
29
30
  initial_state: Optional[HandleState] = None,
30
- errors: Optional[List[str]] = None,
31
+ errors: Optional[list[str]] = None,
31
32
  ) -> None:
32
33
  if initial_state is None and not errors:
33
34
  raise ClassiqError("Missing initial state for ValidationHandle")
@@ -50,5 +51,5 @@ class ValidationHandle:
50
51
  self._state = HandleState.UNINITIALIZED
51
52
 
52
53
 
53
- def get_unique_handle_names(io_dict: Mapping[str, HandleBinding]) -> Set[str]:
54
+ def get_unique_handle_names(io_dict: Mapping[str, HandleBinding]) -> set[str]:
54
55
  return {handle_binding.name for handle_binding in io_dict.values()}
@@ -1,5 +1,5 @@
1
1
  from datetime import date
2
- from typing import Any, Dict
2
+ from typing import Any
3
3
 
4
4
  from pydantic import BaseModel
5
5
 
@@ -10,5 +10,5 @@ class DeprecationInfo(BaseModel):
10
10
 
11
11
 
12
12
  class GlobalVersions(BaseModel):
13
- deprecated: Dict[str, DeprecationInfo]
14
- deployed: Dict[str, Any]
13
+ deprecated: dict[str, DeprecationInfo]
14
+ deployed: dict[str, Any]
@@ -1,5 +1,6 @@
1
+ from collections.abc import Mapping
1
2
  from enum import Enum
2
- from typing import Any, Callable, List, Mapping, Union
3
+ from typing import Any, Callable, Union
3
4
 
4
5
  from sympy import Eq, Expr, Number, Piecewise, Symbol
5
6
 
@@ -229,7 +230,7 @@ def do_slice(value: Any, lower: Any, upper: Any) -> Any:
229
230
  return do_subscript(value, slice(lower, upper))
230
231
 
231
232
 
232
- CORE_LIB_FUNCTIONS_LIST: List[Callable] = [
233
+ CORE_LIB_FUNCTIONS_LIST: list[Callable] = [
233
234
  print,
234
235
  sum,
235
236
  struct_literal,
@@ -1,21 +1,19 @@
1
- from typing import Dict, List
2
-
3
1
  from classiq.interface.generator.functions.port_declaration import (
4
2
  PortDeclarationDirection,
5
3
  )
6
4
  from classiq.interface.model.port_declaration import PortDeclaration
7
5
 
8
6
 
9
- def update_captured_vars(captured_vars: List[PortDeclaration]) -> List[PortDeclaration]:
7
+ def update_captured_vars(captured_vars: list[PortDeclaration]) -> list[PortDeclaration]:
10
8
  if not captured_vars:
11
9
  return []
12
10
  return _update_declarations(captured_vars)
13
11
 
14
12
 
15
13
  def _update_declarations(
16
- captured_vars: List[PortDeclaration],
17
- ) -> List[PortDeclaration]:
18
- updated_vars: Dict[str, PortDeclaration] = {
14
+ captured_vars: list[PortDeclaration],
15
+ ) -> list[PortDeclaration]:
16
+ updated_vars: dict[str, PortDeclaration] = {
19
17
  var.name: PortDeclaration(
20
18
  name=var.name,
21
19
  quantum_type=var.quantum_type,
@@ -1,6 +1,6 @@
1
+ from collections.abc import Iterable, Iterator, Sequence
1
2
  from contextlib import contextmanager
2
3
  from dataclasses import dataclass
3
- from typing import Dict, Iterable, Iterator, List, Sequence
4
4
 
5
5
  from classiq.interface.exceptions import (
6
6
  ClassiqExpansionError,
@@ -34,10 +34,10 @@ class PropagatedVariable:
34
34
  class PropagatedVarStack:
35
35
  def __init__(self, scope: Scope, builder: OperationBuilder) -> None:
36
36
  # We use dictionary instead of set to maintain the order of insertion
37
- self._stack: List[Dict[PropagatedVariable, None]] = [dict()]
37
+ self._stack: list[dict[PropagatedVariable, None]] = [dict()]
38
38
  self._current_scope = scope
39
39
  self._builder = builder
40
- self._to_mangle: Dict[PropagatedVariable, str] = dict()
40
+ self._to_mangle: dict[PropagatedVariable, str] = dict()
41
41
 
42
42
  def set_scope(self, scope: Scope) -> None:
43
43
  self._current_scope = scope
@@ -71,7 +71,7 @@ class PropagatedVarStack:
71
71
 
72
72
  def _get_captured_vars(
73
73
  self, qop: QuantumOperation
74
- ) -> Dict[PropagatedVariable, None]:
74
+ ) -> dict[PropagatedVariable, None]:
75
75
  input_captured = self._get_captured_vars_with_direction(
76
76
  qop.inputs,
77
77
  (
@@ -97,7 +97,7 @@ class PropagatedVarStack:
97
97
  self,
98
98
  variables: Iterable[HandleBinding],
99
99
  direction: PortDeclarationDirection,
100
- ) -> Dict[PropagatedVariable, None]:
100
+ ) -> dict[PropagatedVariable, None]:
101
101
  return {
102
102
  self._get_captured_var_with_direction(var.name, direction): None
103
103
  for var in variables
@@ -133,8 +133,8 @@ class PropagatedVarStack:
133
133
  for var in self._stack[-1]
134
134
  )
135
135
 
136
- def get_propagated_variables(self) -> List[HandleBinding]:
137
- propagated_var_names: List[str] = [
136
+ def get_propagated_variables(self) -> list[HandleBinding]:
137
+ propagated_var_names: list[str] = [
138
138
  self._get_propagated_var_name(var) for var in self._stack[-1]
139
139
  ]
140
140
  return [
@@ -1,11 +1,20 @@
1
+ import json
2
+ import uuid
1
3
  from collections import defaultdict
4
+ from collections.abc import Collection, Sequence
2
5
  from dataclasses import dataclass, field
3
- from functools import cached_property
4
- from typing import Any, Dict, List, Optional, Sequence, Set, Union
6
+ from functools import cached_property, singledispatch
7
+ from symtable import Symbol
8
+ from typing import Any, Optional, Union
5
9
 
6
10
  from typing_extensions import Self
7
11
 
8
- from classiq.interface.exceptions import ClassiqInternalExpansionError
12
+ from classiq.interface.exceptions import (
13
+ ClassiqInternalExpansionError,
14
+ )
15
+ from classiq.interface.generator.functions.builtins.internal_operators import (
16
+ All_BUILTINS_OPERATORS,
17
+ )
9
18
  from classiq.interface.generator.visitor import Visitor
10
19
  from classiq.interface.model.port_declaration import PortDeclaration
11
20
  from classiq.interface.model.quantum_function_call import QuantumFunctionCall
@@ -18,8 +27,14 @@ from classiq.interface.model.variable_declaration_statement import (
18
27
  VariableDeclarationStatement,
19
28
  )
20
29
 
30
+ from classiq import ClassicalParameterDeclaration
21
31
  from classiq.model_expansions.expression_renamer import ExpressionRenamer
22
- from classiq.model_expansions.scope import Scope
32
+ from classiq.model_expansions.scope import (
33
+ Evaluated,
34
+ QuantumSymbol,
35
+ Scope,
36
+ evaluated_to_str as evaluated_classical_param_to_str,
37
+ )
23
38
  from classiq.qmod.builtins.functions import permute
24
39
  from classiq.qmod.quantum_function import GenerativeQFunc
25
40
 
@@ -27,12 +42,12 @@ from classiq.qmod.quantum_function import GenerativeQFunc
27
42
  @dataclass(frozen=True)
28
43
  class Closure:
29
44
  name: str
30
- blocks: Dict[str, Sequence[QuantumStatement]]
45
+ blocks: dict[str, Sequence[QuantumStatement]]
31
46
  scope: Scope
32
47
  positional_arg_declarations: Sequence[PositionalArg] = tuple()
33
48
 
34
- @cached_property
35
- def port_declarations(self) -> Dict[str, PortDeclaration]:
49
+ @property
50
+ def port_declarations(self) -> dict[str, PortDeclaration]:
36
51
  return {
37
52
  param.name: param
38
53
  for param in self.positional_arg_declarations
@@ -42,7 +57,7 @@ class Closure:
42
57
 
43
58
  @dataclass(frozen=True)
44
59
  class GenerativeClosure(Closure):
45
- generative_blocks: Dict[str, GenerativeQFunc] = None # type:ignore[assignment]
60
+ generative_blocks: dict[str, GenerativeQFunc] = None # type:ignore[assignment]
46
61
 
47
62
 
48
63
  @dataclass(frozen=True)
@@ -51,6 +66,21 @@ class FunctionClosure(Closure):
51
66
  is_atomic: bool = False
52
67
  signature_scope: Scope = field(default_factory=Scope)
53
68
 
69
+ # creates a unique id for the function closure based on the arguments values.
70
+ # The closure is changing across the interpreter flow so it's closure_id may change
71
+ @property
72
+ def closure_id(self) -> str:
73
+ # builtins operators have side effects, so generate a unique id for than
74
+ # may create a bugs. Therefore, with each call to closure_id a new id is
75
+ # created
76
+ if self.is_lambda or self.name in All_BUILTINS_OPERATORS:
77
+ signature = str(uuid.uuid4())
78
+ else:
79
+ signature = _generate_closure_id(
80
+ self.positional_arg_declarations, self.scope.data.values()
81
+ )
82
+ return f"{self.name}__{signature}"
83
+
54
84
  @property
55
85
  def body(self) -> Sequence[QuantumStatement]:
56
86
  if self.name == permute.func_decl.name:
@@ -59,7 +89,7 @@ class FunctionClosure(Closure):
59
89
  return self.blocks["body"]
60
90
 
61
91
  @cached_property
62
- def colliding_variables(self) -> Set[str]:
92
+ def colliding_variables(self) -> set[str]:
63
93
  # Note that this has to be accessed after adding the parameters from the signature and not during
64
94
  # initialization
65
95
  return VariableCollector(self.scope).get_colliding_variables(self.body)
@@ -110,19 +140,19 @@ class GenerativeFunctionClosure(GenerativeClosure, FunctionClosure):
110
140
  pass
111
141
 
112
142
 
113
- NestedFunctionClosureT = Union[FunctionClosure, List["NestedFunctionClosureT"]]
143
+ NestedFunctionClosureT = Union[FunctionClosure, list["NestedFunctionClosureT"]]
114
144
 
115
145
 
116
146
  class VariableCollector(Visitor):
117
147
  def __init__(self, function_scope: Scope) -> None:
118
148
  self._function_scope = function_scope
119
- self._variables: defaultdict[str, Set[Optional[str]]] = defaultdict(set)
149
+ self._variables: defaultdict[str, set[Optional[str]]] = defaultdict(set)
120
150
  for var in self._function_scope.data:
121
151
  defining_function = self._function_scope[var].defining_function
122
152
  if defining_function is not None:
123
153
  self._variables[var].add(defining_function.name)
124
154
 
125
- def get_colliding_variables(self, body: Sequence[QuantumStatement]) -> Set[str]:
155
+ def get_colliding_variables(self, body: Sequence[QuantumStatement]) -> set[str]:
126
156
  self.visit(body)
127
157
  return {
128
158
  var
@@ -163,3 +193,44 @@ class VariableCollector(Visitor):
163
193
  defining_function = lambda_environment[var].defining_function
164
194
  if defining_function is not None:
165
195
  self._variables[var].add(defining_function.name)
196
+
197
+
198
+ def _generate_closure_id(
199
+ args_declaration: Sequence[PositionalArg], evaluated_args: Collection[Evaluated]
200
+ ) -> str:
201
+ args_signature: dict = {}
202
+ for arg_declara, eval_arg in zip(args_declaration, evaluated_args):
203
+ args_signature |= _generate_arg_id(arg_declara, eval_arg)
204
+ return json.dumps(args_signature)
205
+
206
+
207
+ def _generate_arg_id(
208
+ arg_declaration: PositionalArg, evaluated_arg: Evaluated
209
+ ) -> dict[str, str]:
210
+ arg_value = evaluated_arg.value
211
+ arg_name = arg_declaration.name
212
+ if isinstance(arg_declaration, ClassicalParameterDeclaration):
213
+ return {arg_name: evaluated_classical_param_to_str(arg_value)}
214
+ return {arg_name: _evaluated_arg_to_str(arg_value)}
215
+
216
+
217
+ @singledispatch
218
+ def _evaluated_arg_to_str(arg: Any) -> str:
219
+ if isinstance(arg, str):
220
+ return arg
221
+ return str(uuid.uuid4())
222
+
223
+
224
+ @_evaluated_arg_to_str.register
225
+ def _evaluated_quantum_symbol_to_str(port: QuantumSymbol) -> str:
226
+ return port.quantum_type.model_dump_json(exclude_none=True, exclude={"name"})
227
+
228
+
229
+ @_evaluated_arg_to_str.register
230
+ def _evaluated_symbol_to_str(port: Symbol) -> str:
231
+ return repr(port)
232
+
233
+
234
+ @_evaluated_arg_to_str.register
235
+ def _evaluated_operand_to_str(operand: FunctionClosure) -> str:
236
+ return operand.closure_id
@@ -1,5 +1,6 @@
1
+ from collections.abc import Sequence
1
2
  from enum import Enum
2
- from typing import Any, List, Sequence
3
+ from typing import Any
3
4
 
4
5
  from classiq.interface.exceptions import ClassiqExpansionError
5
6
  from classiq.interface.generator.expressions.qmod_sized_proxy import QmodSizedProxy
@@ -31,7 +32,7 @@ from classiq.qmod.qmod_parameter import CInt, get_qmod_type
31
32
 
32
33
  def check_type_match(
33
34
  parameters: Sequence[AnonPositionalArg],
34
- arguments: List[Evaluated],
35
+ arguments: list[Evaluated],
35
36
  function_name: str,
36
37
  ) -> None:
37
38
  if len(parameters) != len(arguments):
@@ -1,4 +1,4 @@
1
- from typing import List, Sequence
1
+ from collections.abc import Sequence
2
2
 
3
3
  from classiq.interface.generator.functions.port_declaration import (
4
4
  PortDeclarationDirection,
@@ -12,8 +12,8 @@ from classiq.model_expansions.scope import Evaluated, QuantumSymbol
12
12
 
13
13
  def add_information_from_output_arguments(
14
14
  parameters: Sequence[AnonPositionalArg],
15
- args: List[Evaluated],
16
- ) -> List[Evaluated]:
15
+ args: list[Evaluated],
16
+ ) -> list[Evaluated]:
17
17
  """
18
18
  This function propagates the quantum type information from the output arguments
19
19
  to the arguments that were passed to it.
@@ -1,4 +1,4 @@
1
- from typing import Any, Tuple
1
+ from typing import Any
2
2
 
3
3
  from sympy import Equality
4
4
  from sympy.core.numbers import Number
@@ -19,7 +19,7 @@ def type_name(obj: Any) -> str:
19
19
  return type(obj).__name__
20
20
 
21
21
 
22
- def resolve_num_condition(condition: Equality) -> Tuple[QmodSizedProxy, str]:
22
+ def resolve_num_condition(condition: Equality) -> tuple[QmodSizedProxy, str]:
23
23
  ctrl, ctrl_val = condition.args
24
24
  if isinstance(ctrl, Number) and isinstance(ctrl_val, QmodQScalarProxy):
25
25
  ctrl, ctrl_val = ctrl_val, ctrl
@@ -41,7 +41,7 @@ def _calculate_ctrl_state(ctrl: QmodSizedProxy, ctrl_val: float) -> str:
41
41
  return _to_twos_complement(integer_ctrl_val, ctrl.size)
42
42
 
43
43
 
44
- def _get_numeric_attributes(ctrl: QmodSizedProxy) -> Tuple[bool, int]:
44
+ def _get_numeric_attributes(ctrl: QmodSizedProxy) -> tuple[bool, int]:
45
45
  return (
46
46
  (ctrl.is_signed, ctrl.fraction_digits)
47
47
  if isinstance(ctrl, QmodQNumProxy)
@@ -1,4 +1,4 @@
1
- from typing import List, Set, Union
1
+ from typing import Union
2
2
 
3
3
  from classiq.interface.exceptions import (
4
4
  ClassiqExpansionError,
@@ -41,8 +41,8 @@ from classiq.model_expansions.scope import Evaluated, QuantumSymbol, Scope
41
41
 
42
42
 
43
43
  def evaluate_parameter_types_from_args(
44
- closure: FunctionClosure, signature_scope: Scope, arguments: List[Evaluated]
45
- ) -> List[PositionalArg]:
44
+ closure: FunctionClosure, signature_scope: Scope, arguments: list[Evaluated]
45
+ ) -> list[PositionalArg]:
46
46
  parameters = closure.positional_arg_declarations
47
47
  function_name = closure.name
48
48
  check_type_match(parameters, arguments, function_name)
@@ -90,12 +90,12 @@ def _update_scope(
90
90
  )
91
91
 
92
92
 
93
- NestedFunctionClosureT = Union[FunctionClosure, List["NestedFunctionClosureT"]]
93
+ NestedFunctionClosureT = Union[FunctionClosure, list["NestedFunctionClosureT"]]
94
94
 
95
95
 
96
96
  def _update_operand_signature_environment(
97
97
  operand_val: NestedFunctionClosureT,
98
- parameter_names: Set[str],
98
+ parameter_names: set[str],
99
99
  closure: FunctionClosure,
100
100
  ) -> None:
101
101
  # We update the environment (parent) of the operand by adding closure.scope.data,
@@ -203,8 +203,8 @@ def _evaluate_qstruct_in_quantum_symbol(
203
203
 
204
204
 
205
205
  def evaluate_types_in_quantum_symbols(
206
- symbols: List[QuantumSymbol], scope: Scope
207
- ) -> List[QuantumSymbol]:
206
+ symbols: list[QuantumSymbol], scope: Scope
207
+ ) -> list[QuantumSymbol]:
208
208
  return [
209
209
  QuantumSymbol(
210
210
  handle=symbol.handle,
@@ -1,4 +1,5 @@
1
- from typing import Mapping, Optional
1
+ from collections.abc import Mapping
2
+ from typing import Optional
2
3
 
3
4
  from classiq.interface.exceptions import (
4
5
  ClassiqExpansionError,
@@ -1,4 +1,4 @@
1
- from typing import Sequence
1
+ from collections.abc import Sequence
2
2
 
3
3
  from classiq.interface.exceptions import (
4
4
  ClassiqExpansionError,
@@ -1,6 +1,7 @@
1
1
  import ast
2
+ from collections.abc import Mapping
2
3
  from enum import EnumMeta
3
- from typing import Any, Dict, List, Mapping, Optional, Set
4
+ from typing import Any, Optional
4
5
 
5
6
  from sympy import sympify
6
7
 
@@ -30,14 +31,14 @@ from classiq.model_expansions.sympy_conversion.sympy_to_python import sympy_to_p
30
31
  from classiq.qmod import symbolic
31
32
 
32
33
 
33
- def evaluate_constants(constants: List[Constant]) -> Dict[str, EvaluatedExpression]:
34
- result: Dict[str, EvaluatedExpression] = {}
34
+ def evaluate_constants(constants: list[Constant]) -> dict[str, EvaluatedExpression]:
35
+ result: dict[str, EvaluatedExpression] = {}
35
36
  for constant in constants:
36
37
  result[constant.name] = evaluate(constant.value, result)
37
38
  return result
38
39
 
39
40
 
40
- def evaluate_constants_as_python(constants: List[Constant]) -> Dict[str, Any]:
41
+ def evaluate_constants_as_python(constants: list[Constant]) -> dict[str, Any]:
41
42
  evaluated = evaluate_constants(constants)
42
43
  return {
43
44
  constant.name: qmod_val_to_python(
@@ -50,9 +51,9 @@ def evaluate_constants_as_python(constants: List[Constant]) -> Dict[str, Any]:
50
51
  def evaluate(
51
52
  expr: Expression,
52
53
  locals_dict: Mapping[str, EvaluatedExpression],
53
- uninitialized_locals: Optional[Set[str]] = None,
54
+ uninitialized_locals: Optional[set[str]] = None,
54
55
  ) -> EvaluatedExpression:
55
- model_locals: Dict[str, ExpressionValue] = {}
56
+ model_locals: dict[str, ExpressionValue] = {}
56
57
  model_locals.update(ATOMIC_EXPRESSION_FUNCTIONS)
57
58
  model_locals.update(SymbolTable.enum_table.enums)
58
59
  # locals override builtin-functions
@@ -81,8 +82,8 @@ def evaluate(
81
82
 
82
83
  def _validate_undefined_vars(
83
84
  expr: str,
84
- model_locals: Dict[str, ExpressionValue],
85
- uninitialized_locals: Optional[Set[str]],
85
+ model_locals: dict[str, ExpressionValue],
86
+ uninitialized_locals: Optional[set[str]],
86
87
  ) -> None:
87
88
  uninitialized_locals = uninitialized_locals or set()
88
89
  id_visitor = _VarsCollector()
@@ -110,7 +111,7 @@ def _validate_undefined_vars(
110
111
 
111
112
  class _VarsCollector(ast.NodeTransformer):
112
113
  def __init__(self) -> None:
113
- self.vars: Set[str] = set()
114
+ self.vars: set[str] = set()
114
115
 
115
116
  def visit_Name(self, node: ast.Name) -> None:
116
117
  self.vars.add(node.id)
@@ -1,5 +1,5 @@
1
1
  import ast
2
- from typing import Dict, Sequence
2
+ from collections.abc import Sequence
3
3
 
4
4
  from classiq.interface.generator.expressions.expression import Expression
5
5
  from classiq.interface.generator.expressions.expression_constants import (
@@ -17,11 +17,11 @@ from classiq.model_expansions.visitors.variable_references import VarRefTransfor
17
17
 
18
18
  class ExpressionRenamer(Transformer):
19
19
 
20
- def __init__(self, var_mapping: Dict[str, str]) -> None:
20
+ def __init__(self, var_mapping: dict[str, str]) -> None:
21
21
  self.var_ref_transformer = VarRefTransformer(var_mapping)
22
22
 
23
23
  @property
24
- def var_mapping(self) -> Dict[str, str]:
24
+ def var_mapping(self) -> dict[str, str]:
25
25
  return self.var_ref_transformer.var_mapping
26
26
 
27
27
  def visit_QuantumFunctionCall(
@@ -41,8 +41,8 @@ class ExpressionRenamer(Transformer):
41
41
  return self.var_mapping.get(name, name)
42
42
 
43
43
  def rename_expression_dict(
44
- self, expr_dict: Dict[str, Expression]
45
- ) -> Dict[str, Expression]:
44
+ self, expr_dict: dict[str, Expression]
45
+ ) -> dict[str, Expression]:
46
46
  return {
47
47
  self.rename_string(key): self.visit(val) for key, val in expr_dict.items()
48
48
  }
@@ -51,7 +51,7 @@ class ExpressionRenamer(Transformer):
51
51
  def from_positional_arg_declarations(
52
52
  cls, positional_arg_declarations: Sequence[PositionalArg], suffix: str
53
53
  ) -> "ExpressionRenamer":
54
- var_mapping: Dict[str, str] = dict()
54
+ var_mapping: dict[str, str] = dict()
55
55
  for arg in positional_arg_declarations:
56
56
  if not isinstance(arg, ClassicalParameterDeclaration):
57
57
  continue