classiq 0.52.0__py3-none-any.whl → 0.54.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 (303) 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 +23 -17
  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 +11 -13
  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 +25 -6
  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 +3 -3
  56. classiq/execution/all_hardware_devices.py +1 -3
  57. classiq/execution/execution_session.py +57 -16
  58. classiq/execution/iqcc.py +1 -1
  59. classiq/execution/jobs.py +4 -4
  60. classiq/execution/qaoa.py +84 -0
  61. classiq/execution/qnn.py +3 -3
  62. classiq/executor.py +4 -4
  63. classiq/interface/_version.py +1 -1
  64. classiq/interface/analyzer/analysis_params.py +9 -10
  65. classiq/interface/analyzer/cytoscape_graph.py +5 -5
  66. classiq/interface/analyzer/result.py +17 -17
  67. classiq/interface/applications/qsvm.py +6 -10
  68. classiq/interface/backend/backend_preferences.py +4 -3
  69. classiq/interface/backend/ionq/ionq_quantum_program.py +4 -5
  70. classiq/interface/backend/pydantic_backend.py +1 -2
  71. classiq/interface/chemistry/fermionic_operator.py +5 -5
  72. classiq/interface/chemistry/ground_state_problem.py +7 -8
  73. classiq/interface/chemistry/molecule.py +4 -4
  74. classiq/interface/chemistry/operator.py +11 -13
  75. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +1 -3
  76. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  77. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  78. classiq/interface/combinatorial_optimization/examples/mht.py +2 -3
  79. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  80. classiq/interface/combinatorial_optimization/examples/set_cover.py +1 -2
  81. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +5 -7
  82. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  83. classiq/interface/combinatorial_optimization/result.py +1 -3
  84. classiq/interface/debug_info/debug_info.py +8 -7
  85. classiq/interface/exceptions.py +11 -7
  86. classiq/interface/execution/iqcc.py +1 -3
  87. classiq/interface/execution/jobs.py +2 -2
  88. classiq/interface/execution/primitives.py +3 -3
  89. classiq/interface/executor/aws_execution_cost.py +4 -4
  90. classiq/interface/executor/execution_request.py +2 -3
  91. classiq/interface/executor/execution_result.py +3 -3
  92. classiq/interface/executor/iqae_result.py +3 -5
  93. classiq/interface/executor/optimizer_preferences.py +2 -2
  94. classiq/interface/executor/quantum_code.py +6 -6
  95. classiq/interface/executor/register_initialization.py +2 -4
  96. classiq/interface/executor/result.py +35 -28
  97. classiq/interface/executor/vqe_result.py +8 -8
  98. classiq/interface/finance/function_input.py +2 -2
  99. classiq/interface/finance/gaussian_model_input.py +5 -5
  100. classiq/interface/finance/log_normal_model_input.py +2 -2
  101. classiq/interface/finance/model_input.py +1 -2
  102. classiq/interface/generator/adjacency.py +1 -3
  103. classiq/interface/generator/ansatz_library.py +4 -4
  104. classiq/interface/generator/application_apis/finance_declarations.py +1 -1
  105. classiq/interface/generator/arith/argument_utils.py +3 -3
  106. classiq/interface/generator/arith/arithmetic.py +7 -7
  107. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +5 -5
  108. classiq/interface/generator/arith/arithmetic_expression_abc.py +11 -11
  109. classiq/interface/generator/arith/arithmetic_expression_parser.py +8 -7
  110. classiq/interface/generator/arith/arithmetic_expression_validator.py +8 -8
  111. classiq/interface/generator/arith/arithmetic_operations.py +4 -3
  112. classiq/interface/generator/arith/arithmetic_param_getters.py +6 -6
  113. classiq/interface/generator/arith/arithmetic_result_builder.py +9 -9
  114. classiq/interface/generator/arith/ast_node_rewrite.py +2 -1
  115. classiq/interface/generator/arith/binary_ops.py +10 -13
  116. classiq/interface/generator/arith/extremum_operations.py +3 -2
  117. classiq/interface/generator/arith/logical_ops.py +7 -6
  118. classiq/interface/generator/arith/number_utils.py +4 -4
  119. classiq/interface/generator/arith/register_user_input.py +4 -4
  120. classiq/interface/generator/arith/unary_ops.py +2 -1
  121. classiq/interface/generator/builtin_api_builder.py +2 -1
  122. classiq/interface/generator/circuit_code/circuit_code.py +4 -4
  123. classiq/interface/generator/circuit_code/types_and_constants.py +3 -5
  124. classiq/interface/generator/complex_type.py +1 -2
  125. classiq/interface/generator/control_state.py +2 -2
  126. classiq/interface/generator/custom_ansatz.py +1 -3
  127. classiq/interface/generator/distance.py +3 -5
  128. classiq/interface/generator/excitations.py +3 -2
  129. classiq/interface/generator/expressions/enums/finance_functions.py +1 -3
  130. classiq/interface/generator/expressions/evaluated_expression.py +4 -3
  131. classiq/interface/generator/expressions/expression.py +4 -5
  132. classiq/interface/generator/expressions/expression_constants.py +4 -4
  133. classiq/interface/generator/expressions/qmod_qarray_proxy.py +2 -1
  134. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +2 -1
  135. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +2 -1
  136. classiq/interface/generator/expressions/qmod_sized_proxy.py +2 -1
  137. classiq/interface/generator/expressions/qmod_struct_instance.py +2 -1
  138. classiq/interface/generator/expressions/sympy_supported_expressions.py +11 -13
  139. classiq/interface/generator/finance.py +2 -2
  140. classiq/interface/generator/function_param_library.py +6 -6
  141. classiq/interface/generator/function_params.py +13 -19
  142. classiq/interface/generator/functions/classical_function_declaration.py +4 -3
  143. classiq/interface/generator/functions/classical_type.py +13 -13
  144. classiq/interface/generator/functions/concrete_types.py +1 -2
  145. classiq/interface/generator/functions/function_declaration.py +1 -1
  146. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  147. classiq/interface/generator/functions/type_name.py +3 -2
  148. classiq/interface/generator/generated_circuit_data.py +34 -22
  149. classiq/interface/generator/grover_diffuser.py +7 -7
  150. classiq/interface/generator/grover_operator.py +2 -2
  151. classiq/interface/generator/hardware/hardware_data.py +7 -6
  152. classiq/interface/generator/hardware_efficient_ansatz.py +8 -8
  153. classiq/interface/generator/identity.py +5 -6
  154. classiq/interface/generator/linear_pauli_rotations.py +6 -6
  155. classiq/interface/generator/mcu.py +2 -2
  156. classiq/interface/generator/mcx.py +6 -6
  157. classiq/interface/generator/model/__init__.py +1 -3
  158. classiq/interface/generator/model/constraints.py +2 -2
  159. classiq/interface/generator/model/model.py +5 -6
  160. classiq/interface/generator/model/preferences/preferences.py +7 -6
  161. classiq/interface/generator/model/quantum_register.py +6 -11
  162. classiq/interface/generator/oracles/arithmetic_oracle.py +1 -2
  163. classiq/interface/generator/oracles/custom_oracle.py +2 -2
  164. classiq/interface/generator/oracles/oracle_abc.py +6 -5
  165. classiq/interface/generator/partitioned_register.py +6 -5
  166. classiq/interface/generator/piecewise_linear_amplitude_loading.py +8 -7
  167. classiq/interface/generator/qpe.py +4 -4
  168. classiq/interface/generator/qsvm.py +3 -3
  169. classiq/interface/generator/quantum_function_call.py +24 -29
  170. classiq/interface/generator/quantum_program.py +9 -9
  171. classiq/interface/generator/register_role.py +2 -4
  172. classiq/interface/generator/slice_parsing_utils.py +4 -3
  173. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  174. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  175. classiq/interface/generator/state_preparation/distributions.py +6 -5
  176. classiq/interface/generator/state_preparation/metrics.py +2 -4
  177. classiq/interface/generator/state_preparation/state_preparation.py +4 -4
  178. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +3 -3
  179. classiq/interface/generator/transpiler_basis_gates.py +2 -2
  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/dotdict.py +18 -0
  193. classiq/interface/helpers/hashable_mixin.py +3 -2
  194. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  195. classiq/interface/helpers/pydantic_model_helpers.py +4 -3
  196. classiq/interface/helpers/validation_helpers.py +2 -2
  197. classiq/interface/ide/ide_data.py +11 -15
  198. classiq/interface/ide/visual_model.py +33 -22
  199. classiq/interface/jobs.py +2 -2
  200. classiq/interface/model/bind_operation.py +5 -4
  201. classiq/interface/model/classical_parameter_declaration.py +2 -2
  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 +12 -11
  205. classiq/interface/model/native_function_definition.py +10 -0
  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 +3 -2
  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 +4 -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/call_to_model_converter.py +190 -0
  220. classiq/model_expansions/capturing/captured_var_manager.py +4 -6
  221. classiq/model_expansions/capturing/propagated_var_stack.py +7 -7
  222. classiq/model_expansions/closure.py +17 -9
  223. classiq/model_expansions/evaluators/arg_type_match.py +3 -2
  224. classiq/model_expansions/evaluators/argument_types.py +3 -3
  225. classiq/model_expansions/evaluators/control.py +3 -3
  226. classiq/model_expansions/evaluators/parameter_types.py +7 -7
  227. classiq/model_expansions/evaluators/quantum_type_utils.py +2 -1
  228. classiq/model_expansions/evaluators/type_type_match.py +1 -1
  229. classiq/model_expansions/expression_evaluator.py +10 -9
  230. classiq/model_expansions/expression_renamer.py +6 -6
  231. classiq/model_expansions/function_builder.py +19 -12
  232. classiq/model_expansions/generative_functions.py +3 -2
  233. classiq/model_expansions/interpreter.py +31 -19
  234. classiq/model_expansions/model_tables.py +14 -14
  235. classiq/model_expansions/quantum_operations/bind.py +2 -4
  236. classiq/model_expansions/quantum_operations/classicalif.py +1 -1
  237. classiq/model_expansions/quantum_operations/control.py +2 -4
  238. classiq/model_expansions/quantum_operations/emitter.py +10 -13
  239. classiq/model_expansions/quantum_operations/expression_operation.py +23 -16
  240. classiq/model_expansions/quantum_operations/inplace_binary_operation.py +164 -38
  241. classiq/model_expansions/quantum_operations/phase.py +6 -6
  242. classiq/model_expansions/quantum_operations/quantum_assignment_operation.py +25 -5
  243. classiq/model_expansions/quantum_operations/quantum_function_call.py +41 -2
  244. classiq/model_expansions/quantum_operations/repeat.py +1 -3
  245. classiq/model_expansions/scope.py +11 -10
  246. classiq/model_expansions/scope_initialization.py +6 -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/__init__.py +2 -0
  251. classiq/qmod/builtins/classical_execution_primitives.py +9 -9
  252. classiq/qmod/builtins/functions/__init__.py +75 -53
  253. classiq/qmod/builtins/functions/amplitude_estimation.py +4 -1
  254. classiq/qmod/builtins/functions/arithmetic.py +14 -1
  255. classiq/qmod/builtins/functions/discrete_sine_cosine_transform.py +86 -6
  256. classiq/qmod/builtins/functions/grover.py +41 -45
  257. classiq/qmod/builtins/functions/hea.py +60 -4
  258. classiq/qmod/builtins/functions/linear_pauli_rotation.py +26 -4
  259. classiq/qmod/builtins/functions/modular_exponentiation.py +90 -29
  260. classiq/qmod/builtins/functions/operators.py +1 -1
  261. classiq/qmod/builtins/functions/qaoa_penalty.py +14 -5
  262. classiq/qmod/builtins/functions/qft_functions.py +57 -0
  263. classiq/qmod/builtins/functions/qpe.py +20 -4
  264. classiq/qmod/builtins/functions/qsvt.py +49 -4
  265. classiq/qmod/builtins/functions/standard_gates.py +18 -18
  266. classiq/qmod/builtins/functions/state_preparation.py +92 -10
  267. classiq/qmod/builtins/functions/swap_test.py +7 -1
  268. classiq/qmod/builtins/functions/utility_functions.py +43 -0
  269. classiq/qmod/builtins/functions/variational.py +53 -0
  270. classiq/qmod/builtins/operations.py +4 -5
  271. classiq/qmod/cfunc.py +2 -2
  272. classiq/qmod/classical_function.py +3 -7
  273. classiq/qmod/create_model_function.py +19 -8
  274. classiq/qmod/declaration_inferrer.py +7 -10
  275. classiq/qmod/expression_query.py +3 -3
  276. classiq/qmod/generative.py +2 -1
  277. classiq/qmod/model_state_container.py +5 -7
  278. classiq/qmod/native/__init__.py +1 -3
  279. classiq/qmod/native/expression_to_qmod.py +9 -8
  280. classiq/qmod/native/pretty_printer.py +6 -5
  281. classiq/qmod/pretty_print/__init__.py +1 -3
  282. classiq/qmod/pretty_print/expression_to_python.py +13 -12
  283. classiq/qmod/pretty_print/pretty_printer.py +13 -12
  284. classiq/qmod/python_classical_type.py +8 -4
  285. classiq/qmod/qfunc.py +4 -4
  286. classiq/qmod/qmod_parameter.py +3 -1
  287. classiq/qmod/qmod_variable.py +11 -10
  288. classiq/qmod/quantum_expandable.py +32 -15
  289. classiq/qmod/quantum_function.py +34 -5
  290. classiq/qmod/semantics/annotation.py +1 -1
  291. classiq/qmod/semantics/error_manager.py +8 -7
  292. classiq/qmod/semantics/static_semantics_visitor.py +19 -24
  293. classiq/qmod/semantics/validation/constants_validation.py +1 -1
  294. classiq/qmod/semantics/validation/func_call_validation.py +2 -2
  295. classiq/qmod/semantics/validation/main_validation.py +33 -0
  296. classiq/qmod/semantics/validation/types_validation.py +2 -1
  297. classiq/qmod/symbolic.py +5 -8
  298. classiq/qmod/symbolic_type.py +2 -2
  299. classiq/qmod/synthesize_separately.py +16 -0
  300. {classiq-0.52.0.dist-info → classiq-0.54.0.dist-info}/METADATA +1 -1
  301. {classiq-0.52.0.dist-info → classiq-0.54.0.dist-info}/RECORD +302 -295
  302. classiq/qmod/builtins/functions/qft.py +0 -23
  303. {classiq-0.52.0.dist-info → classiq-0.54.0.dist-info}/WHEEL +0 -0
@@ -1,5 +1,6 @@
1
1
  import abc
2
- from typing import Dict, List, Mapping, Optional
2
+ from collections.abc import Mapping
3
+ from typing import Optional
3
4
 
4
5
  import pydantic
5
6
 
@@ -15,27 +16,27 @@ from classiq.interface.model.quantum_type import QuantumType
15
16
 
16
17
  class QuantumExpressionOperation(QuantumOperation):
17
18
  expression: Expression = pydantic.Field()
18
- _var_handles: List[HandleBinding] = pydantic.PrivateAttr(
19
+ _var_handles: list[HandleBinding] = pydantic.PrivateAttr(
19
20
  default_factory=list,
20
21
  )
21
- _var_types: Dict[str, QuantumType] = pydantic.PrivateAttr(
22
+ _var_types: dict[str, QuantumType] = pydantic.PrivateAttr(
22
23
  default_factory=dict,
23
24
  )
24
25
 
25
26
  @property
26
- def var_handles(self) -> List[HandleBinding]:
27
+ def var_handles(self) -> list[HandleBinding]:
27
28
  return self._var_handles
28
29
 
29
- def set_var_handles(self, var_handles: List[HandleBinding]) -> None:
30
+ def set_var_handles(self, var_handles: list[HandleBinding]) -> None:
30
31
  self._var_handles = var_handles
31
32
 
32
33
  @property
33
- def var_types(self) -> Dict[str, QuantumType]:
34
+ def var_types(self) -> dict[str, QuantumType]:
34
35
  return self._var_types
35
36
 
36
37
  def initialize_var_types(
37
38
  self,
38
- var_types: Dict[str, QuantumType],
39
+ var_types: dict[str, QuantumType],
39
40
  machine_precision: int,
40
41
  ) -> None:
41
42
  assert len(var_types) == len(self.var_handles) or len(self.var_handles) == 0
@@ -1,12 +1,7 @@
1
+ from collections.abc import Iterable, Mapping, Sequence
1
2
  from typing import (
2
- Dict,
3
- Iterable,
4
- List,
5
3
  Literal,
6
- Mapping,
7
4
  Optional,
8
- Sequence,
9
- Tuple,
10
5
  Union,
11
6
  )
12
7
 
@@ -47,7 +42,7 @@ class QuantumFunctionCall(QuantumOperation):
47
42
  function: Union[str, OperandIdentifier] = pydantic.Field(
48
43
  description="The function that is called"
49
44
  )
50
- positional_args: List[ArgValue] = pydantic.Field(default_factory=list)
45
+ positional_args: list[ArgValue] = pydantic.Field(default_factory=list)
51
46
 
52
47
  _func_decl: Optional[QuantumFunctionDeclaration] = pydantic.PrivateAttr(
53
48
  default=None
@@ -151,17 +146,17 @@ class QuantumFunctionCall(QuantumOperation):
151
146
  ]
152
147
 
153
148
  @property
154
- def params(self) -> List[Expression]:
149
+ def params(self) -> list[Expression]:
155
150
  return [
156
151
  param for param in self.positional_args if isinstance(param, Expression)
157
152
  ]
158
153
 
159
154
  @property
160
- def params_dict(self) -> Dict[str, Expression]:
155
+ def params_dict(self) -> dict[str, Expression]:
161
156
  return dict(zip(self.func_decl.param_names, self.params))
162
157
 
163
158
  @property
164
- def operands(self) -> List["QuantumOperand"]:
159
+ def operands(self) -> list["QuantumOperand"]:
165
160
  return [
166
161
  param
167
162
  for param in self.positional_args
@@ -169,14 +164,14 @@ class QuantumFunctionCall(QuantumOperation):
169
164
  ]
170
165
 
171
166
  @property
172
- def ports(self) -> List[HandleBinding]:
167
+ def ports(self) -> list[HandleBinding]:
173
168
  return [
174
169
  param for param in self.positional_args if isinstance(param, HandleBinding)
175
170
  ]
176
171
 
177
172
  def _get_handles_by_direction(
178
173
  self, direction: PortDeclarationDirection
179
- ) -> List[Tuple[int, AnonPortDeclaration, HandleBinding]]:
174
+ ) -> list[tuple[int, AnonPortDeclaration, HandleBinding]]:
180
175
  return [
181
176
  (idx, port_decl, handle)
182
177
  for idx, port_decl, handle in self._get_handles_with_declarations()
@@ -185,7 +180,7 @@ class QuantumFunctionCall(QuantumOperation):
185
180
 
186
181
  def _get_pos_port_args_by_direction(
187
182
  self, direction: PortDeclarationDirection
188
- ) -> Dict[str, HandleBinding]:
183
+ ) -> dict[str, HandleBinding]:
189
184
  # This is a hack for handles to wires reduction tests,
190
185
  # that initialize function definitions or calls not in the scope of a model,
191
186
  # so there is no function resolution annotation.
@@ -199,7 +194,7 @@ class QuantumFunctionCall(QuantumOperation):
199
194
 
200
195
  def _get_handles_with_declarations(
201
196
  self,
202
- ) -> Iterable[Tuple[int, AnonPortDeclaration, HandleBinding]]:
197
+ ) -> Iterable[tuple[int, AnonPortDeclaration, HandleBinding]]:
203
198
  return [
204
199
  (idx, port, handle)
205
200
  for idx, (port, handle) in enumerate(
@@ -1,16 +1,14 @@
1
+ from collections.abc import Sequence
1
2
  from typing import (
3
+ Annotated,
2
4
  Any,
3
- Dict,
4
5
  Literal,
5
- Sequence,
6
- Set,
7
6
  Union,
8
7
  )
9
8
 
10
9
  import pydantic
11
10
  from pydantic import SerializeAsAny
12
11
  from pydantic_core.core_schema import ValidationInfo
13
- from typing_extensions import Annotated
14
12
 
15
13
  from classiq.interface.exceptions import ClassiqInternalError
16
14
  from classiq.interface.generator.arith.register_user_input import RegisterUserInput
@@ -92,11 +90,11 @@ class AnonQuantumFunctionDeclaration(FunctionDeclaration):
92
90
  return [param.get_name() for param in self.param_decls]
93
91
 
94
92
  @property
95
- def input_set(self) -> Set[str]:
93
+ def input_set(self) -> set[str]:
96
94
  return {inp.name for inp in self.inputs}
97
95
 
98
96
  @property
99
- def output_set(self) -> Set[str]:
97
+ def output_set(self) -> set[str]:
100
98
  return {output.name for output in self.outputs}
101
99
 
102
100
  @property
@@ -126,7 +124,7 @@ class AnonQuantumFunctionDeclaration(FunctionDeclaration):
126
124
 
127
125
  def ports_by_declaration_direction(
128
126
  self, direction: PortDeclarationDirection
129
- ) -> Set[str]:
127
+ ) -> set[str]:
130
128
  return {
131
129
  port.get_name()
132
130
  for port in self.port_declarations
@@ -162,7 +160,7 @@ class AnonQuantumOperandDeclaration(AnonQuantumFunctionDeclaration):
162
160
 
163
161
  @pydantic.model_validator(mode="before")
164
162
  @classmethod
165
- def _set_kind(cls, values: Any) -> Dict[str, Any]:
163
+ def _set_kind(cls, values: Any) -> dict[str, Any]:
166
164
  return values_with_discriminator(values, "kind", "QuantumOperandDeclaration")
167
165
 
168
166
  def rename(self, new_name: str) -> "QuantumOperandDeclaration":
@@ -186,7 +184,7 @@ class QuantumOperandDeclaration(
186
184
  ):
187
185
  @pydantic.model_validator(mode="before")
188
186
  @classmethod
189
- def _set_none(cls, values: Any, info: ValidationInfo) -> Dict[str, Any]:
187
+ def _set_none(cls, values: Any, info: ValidationInfo) -> dict[str, Any]:
190
188
  return values
191
189
 
192
190
 
@@ -209,15 +207,15 @@ class NamedParamsQuantumFunctionDeclaration(QuantumFunctionDeclaration):
209
207
  )
210
208
 
211
209
  @property
212
- def port_declarations_dict(self) -> Dict[str, PortDeclaration]:
210
+ def port_declarations_dict(self) -> dict[str, PortDeclaration]:
213
211
  return {port.name: port for port in self.port_declarations}
214
212
 
215
213
  @property
216
- def operand_declarations_dict(self) -> Dict[str, QuantumOperandDeclaration]:
214
+ def operand_declarations_dict(self) -> dict[str, QuantumOperandDeclaration]:
217
215
  return {op.name: op for op in self.operand_declarations}
218
216
 
219
217
  @property
220
- def param_decls_dict(self) -> Dict[str, ClassicalParameterDeclaration]:
218
+ def param_decls_dict(self) -> dict[str, ClassicalParameterDeclaration]:
221
219
  return {param.name: param for param in self.param_decls}
222
220
 
223
221
  @property
@@ -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]:
@@ -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,
@@ -0,0 +1,190 @@
1
+ import dataclasses
2
+ import json
3
+ from collections.abc import Iterator, Sequence
4
+ from functools import cached_property
5
+ from typing import Any, Union
6
+
7
+ from typing_extensions import Self
8
+
9
+ from classiq.interface.exceptions import ClassiqExpansionError
10
+ from classiq.interface.generator.expressions.expression import Expression
11
+ from classiq.interface.generator.functions.port_declaration import (
12
+ PortDeclarationDirection,
13
+ )
14
+ from classiq.interface.model.handle_binding import HandleBinding
15
+ from classiq.interface.model.model import MAIN_FUNCTION_NAME, Model
16
+ from classiq.interface.model.native_function_definition import NativeFunctionDefinition
17
+ from classiq.interface.model.port_declaration import PortDeclaration
18
+ from classiq.interface.model.quantum_function_call import ArgValue, QuantumFunctionCall
19
+ from classiq.interface.model.quantum_function_declaration import (
20
+ PositionalArg,
21
+ QuantumOperandDeclaration,
22
+ )
23
+ from classiq.interface.model.quantum_type import QuantumType
24
+
25
+ from classiq import ClassicalParameterDeclaration
26
+ from classiq.model_expansions.scope import Evaluated, QuantumSymbol, evaluated_to_str
27
+
28
+
29
+ @dataclasses.dataclass(frozen=False)
30
+ class BlockFunctionInfo:
31
+ block_id: str
32
+ model: Model
33
+ inputs: set[str]
34
+ outputs: set[str]
35
+ inouts: set[str]
36
+ calls: set[str] = dataclasses.field(default_factory=set)
37
+
38
+ @classmethod
39
+ def from_call_converter(cls, call_converter: "CallToModelConverter") -> Self:
40
+ return cls(
41
+ block_id=call_converter.block_id,
42
+ model=call_converter.convert(),
43
+ inputs=set(call_converter.call.wiring_inputs),
44
+ outputs=set(call_converter.call.wiring_outputs),
45
+ inouts=set(call_converter.call.wiring_inouts),
46
+ )
47
+
48
+
49
+ class CallToModelConverter:
50
+
51
+ def __init__(
52
+ self,
53
+ call: QuantumFunctionCall,
54
+ positional_arg_declarations: Sequence[PositionalArg],
55
+ evaluated_arg: dict[str, Evaluated],
56
+ model: Model,
57
+ ) -> None:
58
+ self.call = call
59
+ self._positional_arg_declarations = positional_arg_declarations
60
+ self._evaluated_arg = evaluated_arg
61
+
62
+ self._model = model
63
+
64
+ @cached_property
65
+ def block_id(self) -> str:
66
+ args_signature: dict = {}
67
+ for arg_declaration, evaluated_arg in zip(
68
+ self._positional_arg_declarations,
69
+ self._evaluated_arg.values(),
70
+ ):
71
+ args_signature |= _get_arg_signature(arg_declaration, evaluated_arg)
72
+ return f"{self.call.func_name}__{json.dumps(args_signature)}"
73
+
74
+ def convert(self) -> Model:
75
+ return self._model.model_copy(
76
+ update={"functions": self._update_model_functions()}
77
+ )
78
+
79
+ def _update_model_functions(self) -> list[NativeFunctionDefinition]:
80
+ return [
81
+ (
82
+ self._create_new_main_function()
83
+ if function.name == MAIN_FUNCTION_NAME
84
+ else (
85
+ function.model_copy(update={"synthesis_data": None})
86
+ if function.name == self.call.function
87
+ else function
88
+ )
89
+ )
90
+ for function in self._model.functions
91
+ ]
92
+
93
+ def _create_new_main_function(self) -> NativeFunctionDefinition:
94
+ return NativeFunctionDefinition(
95
+ name=MAIN_FUNCTION_NAME,
96
+ positional_arg_declarations=self._make_all_ports_outputs(),
97
+ body=[*self._allocate_ports(), self._update_call()],
98
+ )
99
+
100
+ def _make_all_ports_outputs(self) -> list[PortDeclaration]:
101
+ return [
102
+ _convert_port_to_output(port_declaration)
103
+ for port_declaration in self._positional_arg_declarations
104
+ if isinstance(port_declaration, PortDeclaration)
105
+ ]
106
+
107
+ def _allocate_ports(self) -> Iterator[QuantumFunctionCall]:
108
+ return (
109
+ QuantumFunctionCall(
110
+ function="allocate",
111
+ positional_args=[
112
+ self._get_allocation_size(port_declaration.name),
113
+ HandleBinding(name=port_declaration.name),
114
+ ],
115
+ )
116
+ for port_declaration in self._positional_arg_declarations
117
+ if isinstance(port_declaration, PortDeclaration)
118
+ and port_declaration.direction != PortDeclarationDirection.Output
119
+ )
120
+
121
+ def _get_allocation_size(self, port_declara_name: str) -> Expression:
122
+ port_value = self._evaluated_arg[port_declara_name].value
123
+ return Expression(expr=_get_reg_size(port_value, port_declara_name))
124
+
125
+ def _update_call(self) -> QuantumFunctionCall:
126
+ return self.call.model_copy(
127
+ update={"positional_args": self._evaluate_positional_args()}
128
+ )
129
+
130
+ def _evaluate_positional_args(self) -> list[ArgValue]:
131
+ return [
132
+ _get_positional_arg(arg, evaluated_arg)
133
+ for arg, evaluated_arg in zip(
134
+ self._positional_arg_declarations,
135
+ self._evaluated_arg.values(),
136
+ )
137
+ ]
138
+
139
+
140
+ def _validate_quantum_type(port: Any, port_declara_name: str) -> QuantumType:
141
+ if not isinstance(port, QuantumSymbol):
142
+ raise ClassiqExpansionError(f"Port {port_declara_name!r} has incorrect type")
143
+ return port.quantum_type
144
+
145
+
146
+ def _get_reg_size(port: Any, port_declara_name: str) -> str:
147
+ quantum_type = _validate_quantum_type(port, port_declara_name)
148
+ return str(quantum_type.size_in_bits)
149
+
150
+
151
+ def _get_arg_signature(
152
+ arg_declaration: PositionalArg, evaluated_arg: Evaluated
153
+ ) -> dict[str, str]:
154
+ arg_value = evaluated_arg.value
155
+ arg_name = arg_declaration.name
156
+ if isinstance(arg_declaration, ClassicalParameterDeclaration):
157
+ return {arg_name: evaluated_to_str(arg_value)}
158
+ if isinstance(arg_declaration, PortDeclaration):
159
+ quantum_type = _validate_quantum_type(arg_value, arg_name)
160
+ return {
161
+ arg_name: quantum_type.model_dump_json(exclude_none=True, exclude={"name"})
162
+ }
163
+ if isinstance(arg_declaration, QuantumOperandDeclaration):
164
+ raise NotImplementedError(
165
+ f"Synthesize separately does not support input operand: {arg_declaration.name!r}"
166
+ )
167
+
168
+
169
+ def _get_positional_arg(
170
+ arg_declaration: PositionalArg, evaluated_arg: Evaluated
171
+ ) -> Union[Expression, HandleBinding]:
172
+ if isinstance(arg_declaration, ClassicalParameterDeclaration):
173
+ return Expression(expr=evaluated_to_str(evaluated_arg.value))
174
+ if isinstance(arg_declaration, PortDeclaration):
175
+ return HandleBinding(name=arg_declaration.name)
176
+ if isinstance(arg_declaration, QuantumOperandDeclaration):
177
+ raise NotImplementedError(
178
+ f"Synthesize separately does not support input operand: {arg_declaration.name!r}"
179
+ )
180
+
181
+
182
+ def _convert_port_to_output(port: PortDeclaration) -> PortDeclaration:
183
+ if port.direction == PortDeclarationDirection.Output:
184
+ return port
185
+ elif port.direction == PortDeclarationDirection.Inout:
186
+ return port.model_copy(update={"direction": PortDeclarationDirection.Output})
187
+ else:
188
+ raise NotImplementedError(
189
+ f"Synthesize separately does not support input ports: {port.name!r}"
190
+ )
@@ -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 [