classiq 0.93.0__py3-none-any.whl → 0.99.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 (315) hide show
  1. classiq/__init__.py +11 -19
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +7 -7
  3. classiq/_analyzer_extras/interactive_hardware.py +19 -12
  4. classiq/_internals/api_wrapper.py +31 -142
  5. classiq/_internals/async_utils.py +4 -7
  6. classiq/_internals/authentication/auth0.py +41 -15
  7. classiq/_internals/authentication/authorization_code.py +9 -0
  8. classiq/_internals/authentication/authorization_flow.py +41 -0
  9. classiq/_internals/authentication/device.py +33 -52
  10. classiq/_internals/authentication/hybrid_flow.py +19 -0
  11. classiq/_internals/authentication/password_manager.py +13 -13
  12. classiq/_internals/authentication/token_manager.py +9 -9
  13. classiq/_internals/client.py +17 -44
  14. classiq/_internals/config.py +19 -5
  15. classiq/_internals/help.py +1 -2
  16. classiq/_internals/host_checker.py +3 -3
  17. classiq/_internals/jobs.py +14 -14
  18. classiq/_internals/type_validation.py +3 -3
  19. classiq/analyzer/analyzer.py +18 -18
  20. classiq/analyzer/rb.py +17 -8
  21. classiq/analyzer/show_interactive_hack.py +1 -1
  22. classiq/applications/__init__.py +2 -2
  23. classiq/applications/chemistry/__init__.py +0 -30
  24. classiq/applications/chemistry/op_utils.py +4 -4
  25. classiq/applications/chemistry/problems.py +3 -3
  26. classiq/applications/chemistry/ucc.py +1 -2
  27. classiq/applications/chemistry/z2_symmetries.py +4 -4
  28. classiq/applications/combinatorial_helpers/allowed_constraints.py +1 -3
  29. classiq/applications/combinatorial_helpers/arithmetic/arithmetic_expression.py +2 -1
  30. classiq/applications/combinatorial_helpers/combinatorial_problem_utils.py +2 -2
  31. classiq/applications/combinatorial_helpers/encoding_mapping.py +2 -3
  32. classiq/applications/combinatorial_helpers/encoding_utils.py +2 -2
  33. classiq/applications/combinatorial_helpers/optimization_model.py +3 -4
  34. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +2 -2
  35. classiq/applications/combinatorial_helpers/pyomo_utils.py +8 -8
  36. classiq/applications/combinatorial_helpers/sympy_utils.py +1 -3
  37. classiq/applications/combinatorial_helpers/transformations/encoding.py +3 -3
  38. classiq/applications/combinatorial_helpers/transformations/fixed_variables.py +1 -2
  39. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -3
  40. classiq/applications/combinatorial_optimization/combinatorial_optimization_model_constructor.py +4 -6
  41. classiq/applications/combinatorial_optimization/combinatorial_problem.py +15 -10
  42. classiq/applications/hamiltonian/pauli_decomposition.py +6 -4
  43. classiq/applications/iqae/iqae.py +14 -11
  44. classiq/applications/qnn/datasets/dataset_base_classes.py +6 -6
  45. classiq/applications/qnn/datasets/dataset_parity.py +6 -6
  46. classiq/applications/qnn/gradients/simple_quantum_gradient.py +1 -1
  47. classiq/applications/qnn/qlayer.py +9 -8
  48. classiq/applications/qnn/torch_utils.py +5 -6
  49. classiq/applications/qnn/types.py +2 -1
  50. classiq/applications/qsp/__init__.py +20 -2
  51. classiq/applications/qsp/qsp.py +238 -10
  52. classiq/applications/qsvm/qsvm_data_generation.py +1 -2
  53. classiq/evaluators/classical_expression.py +0 -4
  54. classiq/evaluators/parameter_types.py +10 -8
  55. classiq/evaluators/qmod_annotated_expression.py +31 -26
  56. classiq/evaluators/qmod_expression_visitors/qmod_expression_evaluator.py +14 -14
  57. classiq/evaluators/qmod_expression_visitors/qmod_expression_simplifier.py +2 -1
  58. classiq/evaluators/qmod_expression_visitors/sympy_wrappers.py +8 -8
  59. classiq/evaluators/qmod_node_evaluators/binary_op_evaluation.py +4 -4
  60. classiq/evaluators/qmod_node_evaluators/classical_function_evaluation.py +14 -4
  61. classiq/evaluators/qmod_node_evaluators/list_evaluation.py +2 -2
  62. classiq/evaluators/qmod_node_evaluators/numeric_attrs_utils.py +3 -3
  63. classiq/evaluators/qmod_node_evaluators/subscript_evaluation.py +9 -9
  64. classiq/evaluators/qmod_node_evaluators/utils.py +6 -6
  65. classiq/evaluators/qmod_type_inference/classical_type_inference.py +9 -10
  66. classiq/evaluators/qmod_type_inference/quantum_type_inference.py +5 -5
  67. classiq/execution/__init__.py +0 -3
  68. classiq/execution/execution_session.py +28 -21
  69. classiq/execution/jobs.py +26 -26
  70. classiq/execution/qnn.py +1 -2
  71. classiq/execution/user_budgets.py +71 -37
  72. classiq/executor.py +1 -3
  73. classiq/interface/_version.py +1 -1
  74. classiq/interface/analyzer/analysis_params.py +4 -4
  75. classiq/interface/analyzer/cytoscape_graph.py +3 -3
  76. classiq/interface/analyzer/result.py +4 -4
  77. classiq/interface/ast_node.py +3 -3
  78. classiq/interface/backend/backend_preferences.py +26 -50
  79. classiq/interface/backend/ionq/ionq_quantum_program.py +5 -5
  80. classiq/interface/backend/provider_config/__init__.py +0 -0
  81. classiq/interface/backend/provider_config/provider_config.py +8 -0
  82. classiq/interface/backend/provider_config/providers/__init__.py +0 -0
  83. classiq/interface/backend/provider_config/providers/alice_bob.py +47 -0
  84. classiq/interface/backend/provider_config/providers/aqt.py +16 -0
  85. classiq/interface/backend/provider_config/providers/azure.py +37 -0
  86. classiq/interface/backend/provider_config/providers/braket.py +39 -0
  87. classiq/interface/backend/provider_config/providers/ibm.py +26 -0
  88. classiq/interface/backend/provider_config/providers/ionq.py +22 -0
  89. classiq/interface/backend/quantum_backend_providers.py +20 -2
  90. classiq/interface/chemistry/ansatz_library.py +3 -5
  91. classiq/interface/chemistry/operator.py +3 -3
  92. classiq/interface/combinatorial_optimization/examples/knapsack.py +2 -4
  93. classiq/interface/combinatorial_optimization/examples/tsp_digraph.py +1 -2
  94. classiq/interface/compression_utils.py +2 -3
  95. classiq/interface/debug_info/debug_info.py +8 -7
  96. classiq/interface/exceptions.py +6 -7
  97. classiq/interface/execution/primitives.py +6 -6
  98. classiq/interface/executor/estimate_cost.py +1 -1
  99. classiq/interface/executor/execution_preferences.py +3 -5
  100. classiq/interface/executor/execution_request.py +10 -10
  101. classiq/interface/executor/execution_result.py +1 -2
  102. classiq/interface/executor/quantum_code.py +8 -8
  103. classiq/interface/executor/result.py +28 -18
  104. classiq/interface/executor/user_budget.py +25 -17
  105. classiq/interface/executor/vqe_result.py +5 -6
  106. classiq/interface/generator/ansatz_library.py +6 -8
  107. classiq/interface/generator/application_apis/__init__.py +0 -3
  108. classiq/interface/generator/arith/arithmetic.py +2 -2
  109. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +2 -3
  110. classiq/interface/generator/arith/arithmetic_expression_abc.py +4 -5
  111. classiq/interface/generator/arith/arithmetic_expression_parser.py +11 -4
  112. classiq/interface/generator/arith/arithmetic_expression_validator.py +12 -15
  113. classiq/interface/generator/arith/arithmetic_operations.py +4 -6
  114. classiq/interface/generator/arith/arithmetic_param_getters.py +70 -107
  115. classiq/interface/generator/arith/arithmetic_result_builder.py +4 -4
  116. classiq/interface/generator/arith/ast_node_rewrite.py +8 -4
  117. classiq/interface/generator/arith/binary_ops.py +15 -40
  118. classiq/interface/generator/arith/logical_ops.py +2 -3
  119. classiq/interface/generator/arith/number_utils.py +2 -2
  120. classiq/interface/generator/arith/register_user_input.py +3 -3
  121. classiq/interface/generator/arith/unary_ops.py +2 -2
  122. classiq/interface/generator/circuit_code/circuit_code.py +8 -10
  123. classiq/interface/generator/circuit_code/types_and_constants.py +1 -1
  124. classiq/interface/generator/complex_type.py +2 -2
  125. classiq/interface/generator/copy.py +1 -3
  126. classiq/interface/generator/expressions/atomic_expression_functions.py +0 -5
  127. classiq/interface/generator/expressions/evaluated_expression.py +2 -3
  128. classiq/interface/generator/expressions/expression.py +2 -2
  129. classiq/interface/generator/expressions/proxies/classical/classical_array_proxy.py +4 -7
  130. classiq/interface/generator/function_param_list.py +0 -40
  131. classiq/interface/generator/function_params.py +5 -6
  132. classiq/interface/generator/functions/classical_function_declaration.py +2 -2
  133. classiq/interface/generator/functions/classical_type.py +3 -3
  134. classiq/interface/generator/functions/type_modifier.py +0 -15
  135. classiq/interface/generator/functions/type_name.py +2 -2
  136. classiq/interface/generator/generated_circuit_data.py +14 -18
  137. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +2 -4
  138. classiq/interface/generator/hardware/hardware_data.py +8 -8
  139. classiq/interface/generator/hardware_efficient_ansatz.py +9 -9
  140. classiq/interface/generator/mcu.py +3 -3
  141. classiq/interface/generator/mcx.py +3 -3
  142. classiq/interface/generator/model/constraints.py +34 -5
  143. classiq/interface/generator/model/preferences/preferences.py +15 -21
  144. classiq/interface/generator/model/quantum_register.py +7 -10
  145. classiq/interface/generator/noise_properties.py +3 -7
  146. classiq/interface/generator/parameters.py +1 -1
  147. classiq/interface/generator/partitioned_register.py +1 -2
  148. classiq/interface/generator/preferences/qasm_to_qmod_params.py +11 -0
  149. classiq/interface/generator/quantum_function_call.py +9 -12
  150. classiq/interface/generator/quantum_program.py +10 -23
  151. classiq/interface/generator/range_types.py +3 -3
  152. classiq/interface/generator/slice_parsing_utils.py +4 -5
  153. classiq/interface/generator/standard_gates/standard_gates.py +2 -4
  154. classiq/interface/generator/synthesis_execution_parameter.py +1 -3
  155. classiq/interface/generator/synthesis_metadata/synthesis_duration.py +9 -0
  156. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +2 -3
  157. classiq/interface/generator/transpiler_basis_gates.py +12 -4
  158. classiq/interface/generator/types/builtin_enum_declarations.py +0 -145
  159. classiq/interface/generator/types/compilation_metadata.py +12 -1
  160. classiq/interface/generator/types/enum_declaration.py +2 -1
  161. classiq/interface/generator/validations/flow_graph.py +3 -3
  162. classiq/interface/generator/visitor.py +10 -12
  163. classiq/interface/hardware.py +2 -3
  164. classiq/interface/helpers/classproperty.py +2 -2
  165. classiq/interface/helpers/custom_encoders.py +2 -1
  166. classiq/interface/helpers/custom_pydantic_types.py +1 -1
  167. classiq/interface/helpers/text_utils.py +1 -4
  168. classiq/interface/ide/visual_model.py +6 -5
  169. classiq/interface/interface_version.py +1 -1
  170. classiq/interface/jobs.py +3 -3
  171. classiq/interface/model/allocate.py +4 -4
  172. classiq/interface/model/block.py +6 -2
  173. classiq/interface/model/bounds.py +3 -3
  174. classiq/interface/model/classical_if.py +4 -0
  175. classiq/interface/model/control.py +8 -1
  176. classiq/interface/model/inplace_binary_operation.py +2 -2
  177. classiq/interface/model/invert.py +4 -0
  178. classiq/interface/model/model.py +4 -4
  179. classiq/interface/model/model_visitor.py +40 -1
  180. classiq/interface/model/parameter.py +1 -3
  181. classiq/interface/model/port_declaration.py +1 -1
  182. classiq/interface/model/power.py +4 -0
  183. classiq/interface/model/quantum_expressions/quantum_expression.py +1 -2
  184. classiq/interface/model/quantum_function_call.py +3 -6
  185. classiq/interface/model/quantum_function_declaration.py +1 -0
  186. classiq/interface/model/quantum_lambda_function.py +4 -4
  187. classiq/interface/model/quantum_statement.py +11 -4
  188. classiq/interface/model/quantum_type.py +14 -14
  189. classiq/interface/model/repeat.py +4 -0
  190. classiq/interface/model/skip_control.py +4 -0
  191. classiq/interface/model/validation_handle.py +2 -3
  192. classiq/interface/model/variable_declaration_statement.py +2 -2
  193. classiq/interface/model/within_apply_operation.py +4 -0
  194. classiq/interface/pretty_print/expression_to_qmod.py +3 -4
  195. classiq/interface/server/routes.py +0 -16
  196. classiq/interface/source_reference.py +3 -4
  197. classiq/model_expansions/arithmetic.py +11 -7
  198. classiq/model_expansions/arithmetic_compute_result_attrs.py +30 -27
  199. classiq/model_expansions/capturing/captured_vars.py +3 -3
  200. classiq/model_expansions/capturing/mangling_utils.py +1 -2
  201. classiq/model_expansions/closure.py +12 -11
  202. classiq/model_expansions/function_builder.py +14 -6
  203. classiq/model_expansions/generative_functions.py +7 -12
  204. classiq/model_expansions/interpreters/base_interpreter.py +3 -7
  205. classiq/model_expansions/interpreters/frontend_generative_interpreter.py +2 -1
  206. classiq/model_expansions/interpreters/generative_interpreter.py +5 -3
  207. classiq/model_expansions/quantum_operations/allocate.py +4 -4
  208. classiq/model_expansions/quantum_operations/assignment_result_processor.py +2 -4
  209. classiq/model_expansions/quantum_operations/call_emitter.py +31 -37
  210. classiq/model_expansions/quantum_operations/declarative_call_emitter.py +2 -2
  211. classiq/model_expansions/quantum_operations/emitter.py +3 -5
  212. classiq/model_expansions/quantum_operations/expression_evaluator.py +3 -3
  213. classiq/model_expansions/quantum_operations/skip_control_verifier.py +1 -2
  214. classiq/model_expansions/quantum_operations/variable_decleration.py +2 -2
  215. classiq/model_expansions/scope.py +7 -7
  216. classiq/model_expansions/scope_initialization.py +4 -0
  217. classiq/model_expansions/visitors/symbolic_param_inference.py +6 -6
  218. classiq/model_expansions/visitors/uncomputation_signature_inference.py +328 -0
  219. classiq/model_expansions/visitors/variable_references.py +15 -14
  220. classiq/open_library/functions/__init__.py +28 -11
  221. classiq/open_library/functions/amplitude_loading.py +81 -0
  222. classiq/open_library/functions/discrete_sine_cosine_transform.py +5 -5
  223. classiq/open_library/functions/grover.py +8 -10
  224. classiq/open_library/functions/lcu.py +47 -18
  225. classiq/open_library/functions/modular_exponentiation.py +93 -8
  226. classiq/open_library/functions/qsvt.py +66 -79
  227. classiq/open_library/functions/qsvt_temp.py +536 -0
  228. classiq/open_library/functions/state_preparation.py +130 -27
  229. classiq/qmod/__init__.py +6 -4
  230. classiq/qmod/builtins/classical_execution_primitives.py +4 -23
  231. classiq/qmod/builtins/classical_functions.py +1 -42
  232. classiq/qmod/builtins/enums.py +15 -153
  233. classiq/qmod/builtins/functions/__init__.py +9 -18
  234. classiq/qmod/builtins/functions/allocation.py +25 -4
  235. classiq/qmod/builtins/functions/arithmetic.py +22 -27
  236. classiq/qmod/builtins/functions/exponentiation.py +51 -2
  237. classiq/qmod/builtins/functions/mcx_func.py +7 -0
  238. classiq/qmod/builtins/functions/standard_gates.py +46 -27
  239. classiq/qmod/builtins/operations.py +165 -79
  240. classiq/qmod/builtins/structs.py +24 -91
  241. classiq/qmod/cfunc.py +3 -2
  242. classiq/qmod/classical_function.py +2 -1
  243. classiq/qmod/cparam.py +2 -8
  244. classiq/qmod/create_model_function.py +7 -7
  245. classiq/qmod/declaration_inferrer.py +33 -30
  246. classiq/qmod/expression_query.py +7 -4
  247. classiq/qmod/model_state_container.py +2 -2
  248. classiq/qmod/native/pretty_printer.py +25 -14
  249. classiq/qmod/pretty_print/expression_to_python.py +5 -3
  250. classiq/qmod/pretty_print/pretty_printer.py +39 -17
  251. classiq/qmod/python_classical_type.py +40 -13
  252. classiq/qmod/qfunc.py +124 -19
  253. classiq/qmod/qmod_constant.py +2 -2
  254. classiq/qmod/qmod_parameter.py +5 -2
  255. classiq/qmod/qmod_variable.py +47 -46
  256. classiq/qmod/quantum_callable.py +18 -13
  257. classiq/qmod/quantum_expandable.py +31 -26
  258. classiq/qmod/quantum_function.py +84 -36
  259. classiq/qmod/semantics/annotation/call_annotation.py +5 -5
  260. classiq/qmod/semantics/error_manager.py +12 -14
  261. classiq/qmod/semantics/lambdas.py +1 -2
  262. classiq/qmod/semantics/validation/types_validation.py +1 -2
  263. classiq/qmod/symbolic.py +2 -4
  264. classiq/qmod/utilities.py +13 -20
  265. classiq/qmod/write_qmod.py +3 -4
  266. classiq/quantum_program.py +1 -3
  267. classiq/synthesis.py +11 -7
  268. {classiq-0.93.0.dist-info → classiq-0.99.0.dist-info}/METADATA +2 -3
  269. {classiq-0.93.0.dist-info → classiq-0.99.0.dist-info}/RECORD +271 -299
  270. {classiq-0.93.0.dist-info → classiq-0.99.0.dist-info}/WHEEL +1 -1
  271. classiq/applications/chemistry/ansatz_parameters.py +0 -29
  272. classiq/applications/chemistry/chemistry_execution_parameters.py +0 -16
  273. classiq/applications/chemistry/chemistry_model_constructor.py +0 -532
  274. classiq/applications/chemistry/ground_state_problem.py +0 -42
  275. classiq/applications/qsvm/__init__.py +0 -8
  276. classiq/applications/qsvm/qsvm.py +0 -11
  277. classiq/evaluators/qmod_expression_visitors/qmod_expression_bwc.py +0 -129
  278. classiq/execution/iqcc.py +0 -128
  279. classiq/interface/applications/qsvm.py +0 -117
  280. classiq/interface/chemistry/elements.py +0 -120
  281. classiq/interface/chemistry/fermionic_operator.py +0 -208
  282. classiq/interface/chemistry/ground_state_problem.py +0 -132
  283. classiq/interface/chemistry/ground_state_result.py +0 -8
  284. classiq/interface/chemistry/molecule.py +0 -71
  285. classiq/interface/execution/iqcc.py +0 -44
  286. classiq/interface/generator/application_apis/chemistry_declarations.py +0 -69
  287. classiq/interface/generator/application_apis/entangler_declarations.py +0 -29
  288. classiq/interface/generator/application_apis/qsvm_declarations.py +0 -6
  289. classiq/interface/generator/chemistry_function_params.py +0 -50
  290. classiq/interface/generator/entangler_params.py +0 -72
  291. classiq/interface/generator/entanglers.py +0 -14
  292. classiq/interface/generator/hamiltonian_evolution/qdrift.py +0 -27
  293. classiq/interface/generator/hartree_fock.py +0 -26
  294. classiq/interface/generator/hva.py +0 -22
  295. classiq/interface/generator/linear_pauli_rotations.py +0 -92
  296. classiq/interface/generator/qft.py +0 -37
  297. classiq/interface/generator/qsvm.py +0 -96
  298. classiq/interface/generator/state_preparation/__init__.py +0 -14
  299. classiq/interface/generator/state_preparation/bell_state_preparation.py +0 -27
  300. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +0 -28
  301. classiq/interface/generator/state_preparation/distributions.py +0 -53
  302. classiq/interface/generator/state_preparation/exponential_state_preparation.py +0 -14
  303. classiq/interface/generator/state_preparation/ghz_state_preparation.py +0 -14
  304. classiq/interface/generator/state_preparation/metrics.py +0 -41
  305. classiq/interface/generator/state_preparation/state_preparation.py +0 -113
  306. classiq/interface/generator/state_preparation/state_preparation_abc.py +0 -24
  307. classiq/interface/generator/state_preparation/uniform_distibution_state_preparation.py +0 -13
  308. classiq/interface/generator/state_preparation/w_state_preparation.py +0 -13
  309. classiq/interface/generator/ucc.py +0 -74
  310. classiq/interface/helpers/backward_compatibility.py +0 -9
  311. classiq/model_expansions/transformers/type_modifier_inference.py +0 -392
  312. classiq/open_library/functions/lookup_table.py +0 -58
  313. classiq/qmod/builtins/functions/chemistry.py +0 -123
  314. classiq/qmod/builtins/functions/qsvm.py +0 -24
  315. {classiq-0.93.0.dist-info → classiq-0.99.0.dist-info}/licenses/LICENSE.txt +0 -0
@@ -1,4 +1,4 @@
1
- from typing import Any, Optional, cast
1
+ from typing import Any, cast
2
2
 
3
3
  import pydantic
4
4
 
@@ -44,10 +44,10 @@ class Mcu(FunctionParams):
44
44
  default=0, description="gam radian angle."
45
45
  )
46
46
 
47
- num_ctrl_qubits: Optional[pydantic.PositiveInt] = pydantic.Field(
47
+ num_ctrl_qubits: pydantic.PositiveInt | None = pydantic.Field(
48
48
  default=None, description="The number of control qubits."
49
49
  )
50
- ctrl_state: Optional[str] = pydantic.Field(
50
+ ctrl_state: str | None = pydantic.Field(
51
51
  default=None, description="string of the control state"
52
52
  )
53
53
 
@@ -1,4 +1,4 @@
1
- from typing import Any, Optional
1
+ from typing import Any
2
2
 
3
3
  import pydantic
4
4
  from pydantic_core.core_schema import ValidationInfo
@@ -20,7 +20,7 @@ class Mcx(FunctionParams):
20
20
  arguments: list[RegisterUserInput] = pydantic.Field(
21
21
  default_factory=list, description="registers describing the state (ordered)"
22
22
  )
23
- num_ctrl_qubits: Optional[pydantic.PositiveInt] = pydantic.Field(
23
+ num_ctrl_qubits: pydantic.PositiveInt | None = pydantic.Field(
24
24
  description="number of control qubits",
25
25
  default=None,
26
26
  )
@@ -33,7 +33,7 @@ class Mcx(FunctionParams):
33
33
  def _validate_argument_names(
34
34
  cls, arguments: list[RegisterUserInput]
35
35
  ) -> list[RegisterUserInput]:
36
- register_name_list: list[Optional[str]] = [arg.name for arg in arguments]
36
+ register_name_list: list[str | None] = [arg.name for arg in arguments]
37
37
  if None in register_name_list:
38
38
  raise ClassiqValueError("All registers must be named")
39
39
  if len(set(register_name_list)) != len(register_name_list):
@@ -1,11 +1,12 @@
1
+ import warnings
1
2
  from collections import defaultdict
2
- from typing import Optional, Union
3
+ from typing import TypeVar, Union
3
4
 
4
5
  import pydantic
5
6
  from pydantic import BaseModel, ConfigDict
6
7
 
7
8
  from classiq.interface.enum_utils import StrEnum
8
- from classiq.interface.exceptions import ClassiqValueError
9
+ from classiq.interface.exceptions import ClassiqDeprecationWarning, ClassiqValueError
9
10
  from classiq.interface.generator.transpiler_basis_gates import TranspilerBasisGates
10
11
 
11
12
  UNCONSTRAINED = -1
@@ -19,6 +20,8 @@ class OptimizationParameter(StrEnum):
19
20
 
20
21
  OptimizationParameterType = Union[OptimizationParameter, TranspilerBasisGates]
21
22
 
23
+ T = TypeVar("T")
24
+
22
25
 
23
26
  def optimization_parameter_type_from_string(param: str) -> OptimizationParameterType:
24
27
  for enum_ in (OptimizationParameter, TranspilerBasisGates):
@@ -53,14 +56,18 @@ class Constraints(BaseModel):
53
56
 
54
57
  model_config = ConfigDict(extra="forbid")
55
58
 
56
- max_width: Optional[pydantic.PositiveInt] = pydantic.Field(
59
+ max_width: pydantic.PositiveInt | None = pydantic.Field(
57
60
  default=None,
58
61
  description="Maximum number of qubits in generated quantum circuit",
59
62
  )
60
- max_depth: Optional[pydantic.PositiveInt] = None
63
+ max_depth: pydantic.PositiveInt | None = pydantic.Field(
64
+ default=None,
65
+ )
61
66
 
62
67
  max_gate_count: dict[TranspilerBasisGates, pydantic.NonNegativeInt] = (
63
- pydantic.Field(default_factory=lambda: defaultdict(int))
68
+ pydantic.Field(
69
+ default_factory=lambda: defaultdict(int),
70
+ )
64
71
  )
65
72
 
66
73
  optimization_parameter: OptimizationParameterType = pydantic.Field(
@@ -68,3 +75,25 @@ class Constraints(BaseModel):
68
75
  description="If set, the synthesis engine optimizes the solution"
69
76
  " according to that chosen parameter",
70
77
  )
78
+
79
+ @pydantic.field_validator("max_depth", mode="before")
80
+ @classmethod
81
+ def deprecate_max_depth(cls, value: T) -> T:
82
+ if value is not None:
83
+ warnings.warn(
84
+ "max_depth is deprecated and will no longer be supported starting on 2025-10-27 at the earliest.",
85
+ ClassiqDeprecationWarning,
86
+ stacklevel=1,
87
+ )
88
+ return value
89
+
90
+ @pydantic.field_validator("max_gate_count", mode="before")
91
+ @classmethod
92
+ def deprecate_max_gate_count(cls, value: T) -> T:
93
+ if value:
94
+ warnings.warn(
95
+ "max_gate_count is deprecated and will no longer be supported starting on 2025-10-27 at the earliest.",
96
+ ClassiqDeprecationWarning,
97
+ stacklevel=1,
98
+ )
99
+ return value
@@ -1,11 +1,11 @@
1
1
  from collections.abc import Sequence
2
2
  from enum import IntEnum
3
- from typing import TYPE_CHECKING, Annotated, Any, Optional, Union
3
+ from typing import TYPE_CHECKING, Annotated, Any, Optional, TypeAlias
4
4
 
5
5
  import pydantic
6
6
  from pydantic import Field
7
7
  from pydantic_core.core_schema import ValidationInfo
8
- from typing_extensions import Self, TypeAlias
8
+ from typing_extensions import Self
9
9
 
10
10
  from classiq.interface.backend.backend_preferences import (
11
11
  BackendPreferences,
@@ -135,21 +135,15 @@ class Preferences(pydantic.BaseModel, extra="forbid"):
135
135
  - If `backend_service_provider` is not valid.
136
136
  """
137
137
 
138
- _backend_preferences: Optional[BackendPreferences] = pydantic.PrivateAttr(
139
- default=None
140
- )
138
+ _backend_preferences: BackendPreferences | None = pydantic.PrivateAttr(default=None)
141
139
  machine_precision: PydanticMachinePrecision = DEFAULT_MACHINE_PRECISION
142
140
 
143
- backend_service_provider: Optional[Union[Provider, ProviderVendor, str]] = (
144
- pydantic.Field(
145
- default=None,
146
- description="Provider company or cloud for the requested backend.",
147
- )
141
+ backend_service_provider: Provider | ProviderVendor | str | None = pydantic.Field(
142
+ default=None,
143
+ description="Provider company or cloud for the requested backend.",
148
144
  )
149
- backend_name: Optional[Union[PydanticBackendName, AllBackendsNameByVendor]] = (
150
- pydantic.Field(
151
- default=None, description="Name of the requested backend or target."
152
- )
145
+ backend_name: PydanticBackendName | AllBackendsNameByVendor | None = pydantic.Field(
146
+ default=None, description="Name of the requested backend or target."
153
147
  )
154
148
  custom_hardware_settings: CustomHardwareSettings = pydantic.Field(
155
149
  default_factory=CustomHardwareSettings,
@@ -182,7 +176,7 @@ class Preferences(pydantic.BaseModel, extra="forbid"):
182
176
  "declarations).",
183
177
  )
184
178
 
185
- qasm3: Optional[bool] = pydantic.Field(
179
+ qasm3: bool | None = pydantic.Field(
186
180
  None,
187
181
  description="Output OpenQASM 3.0 instead of OpenQASM 2.0. Relevant only for "
188
182
  "the `qasm` and `transpiled_circuit.qasm` attributes of `GeneratedCircuit`.",
@@ -194,7 +188,7 @@ class Preferences(pydantic.BaseModel, extra="forbid"):
194
188
  "transpiled circuit and its depth",
195
189
  )
196
190
 
197
- solovay_kitaev_max_iterations: Optional[pydantic.PositiveInt] = pydantic.Field(
191
+ solovay_kitaev_max_iterations: pydantic.PositiveInt | None = pydantic.Field(
198
192
  None,
199
193
  description="Maximum iterations for the Solovay-Kitaev algorithm (if applied).",
200
194
  )
@@ -203,7 +197,7 @@ class Preferences(pydantic.BaseModel, extra="forbid"):
203
197
  default=300, description="Generation timeout in seconds"
204
198
  )
205
199
 
206
- optimization_timeout_seconds: Optional[pydantic.PositiveInt] = pydantic.Field(
200
+ optimization_timeout_seconds: pydantic.PositiveInt | None = pydantic.Field(
207
201
  default=None,
208
202
  description="Optimization timeout in seconds, or None for no "
209
203
  "optimization timeout (will still timeout when the generation timeout is over)",
@@ -217,9 +211,9 @@ class Preferences(pydantic.BaseModel, extra="forbid"):
217
211
  @classmethod
218
212
  def optimization_timeout_less_than_generation_timeout(
219
213
  cls,
220
- optimization_timeout_seconds: Optional[pydantic.PositiveInt],
214
+ optimization_timeout_seconds: pydantic.PositiveInt | None,
221
215
  info: ValidationInfo,
222
- ) -> Optional[pydantic.PositiveInt]:
216
+ ) -> pydantic.PositiveInt | None:
223
217
  generation_timeout_seconds = info.data.get("timeout_seconds")
224
218
  if generation_timeout_seconds is None or optimization_timeout_seconds is None:
225
219
  return optimization_timeout_seconds
@@ -256,7 +250,7 @@ class Preferences(pydantic.BaseModel, extra="forbid"):
256
250
 
257
251
  @pydantic.field_validator("backend_name")
258
252
  @classmethod
259
- def validate_backend_name(cls, backend_name: Optional[str]) -> Optional[str]:
253
+ def validate_backend_name(cls, backend_name: str | None) -> str | None:
260
254
  if backend_name is None:
261
255
  return backend_name
262
256
  return backend_name.rstrip()
@@ -270,7 +264,7 @@ class Preferences(pydantic.BaseModel, extra="forbid"):
270
264
  return self
271
265
 
272
266
  @property
273
- def backend_preferences(self) -> Optional[BackendPreferences]:
267
+ def backend_preferences(self) -> BackendPreferences | None:
274
268
  """
275
269
  Returns the backend preferences. If the backend preferences are not provided, the function sets the backend preferences according to backend name and provider.
276
270
 
@@ -1,11 +1,8 @@
1
1
  import itertools
2
- import sys
3
2
  from collections.abc import Iterator
4
3
  from types import GenericAlias as TypesGenericAlias
5
4
  from typing import ( # type: ignore[attr-defined]
6
5
  Any,
7
- Optional,
8
- Union,
9
6
  _GenericAlias,
10
7
  )
11
8
 
@@ -31,7 +28,7 @@ class QRegGenericAlias(_GenericAlias, _root=True): # type: ignore[call-arg]
31
28
  return super().__call__(*args, **kwargs, **arith_info)
32
29
 
33
30
  def __eq__(self, other: Any) -> bool:
34
- if sys.version_info >= (3, 9) and isinstance(other, TypesGenericAlias):
31
+ if isinstance(other, TypesGenericAlias):
35
32
  return (
36
33
  self.__origin__ == other.__origin__ and self.__args__ == other.__args__
37
34
  )
@@ -39,23 +36,23 @@ class QRegGenericAlias(_GenericAlias, _root=True): # type: ignore[call-arg]
39
36
  return super().__eq__(other)
40
37
 
41
38
  @property
42
- def role(self) -> Optional[RegisterRole]:
39
+ def role(self) -> RegisterRole | None:
43
40
  return getattr(self.__origin__, "role", None)
44
41
 
45
42
  @property
46
- def size(self) -> Optional[int]:
43
+ def size(self) -> int | None:
47
44
  if self.integer_places is not None:
48
45
  return self.integer_places + (self.fraction_places or 0)
49
46
  return None
50
47
 
51
48
  @property
52
- def integer_places(self) -> Optional[int]:
49
+ def integer_places(self) -> int | None:
53
50
  if len(self.__args__) in (1, 2) and isinstance(self.__args__[0], int):
54
51
  return self.__args__[0]
55
52
  return None
56
53
 
57
54
  @property
58
- def fraction_places(self) -> Optional[int]:
55
+ def fraction_places(self) -> int | None:
59
56
  if len(self.__args__) == 2 and isinstance(self.__args__[1], int):
60
57
  return self.__args__[1]
61
58
  return None
@@ -96,11 +93,11 @@ class QReg:
96
93
  qreg._qubits = qubits
97
94
  return qreg
98
95
 
99
- def __getitem__(self, key: Union[int, slice]) -> "QReg":
96
+ def __getitem__(self, key: int | slice) -> "QReg":
100
97
  state = self._qubits[key]
101
98
  return QReg._from_qubits(state if isinstance(state, list) else [state])
102
99
 
103
- def __setitem__(self, key: Union[int, slice], value: "QReg") -> None:
100
+ def __setitem__(self, key: int | slice, value: "QReg") -> None:
104
101
  if isinstance(key, int) and len(value) != 1:
105
102
  raise ClassiqQRegError(
106
103
  f"Size mismatch: value size {len(value)}, expected size 1"
@@ -1,5 +1,3 @@
1
- from typing import Optional
2
-
3
1
  import pydantic
4
2
  from pydantic import BaseModel
5
3
 
@@ -7,9 +5,7 @@ from classiq.interface.helpers.custom_pydantic_types import PydanticProbabilityF
7
5
 
8
6
 
9
7
  class NoiseProperties(BaseModel):
10
- measurement_bit_flip_probability: Optional[PydanticProbabilityFloat] = (
11
- pydantic.Field(
12
- default=None,
13
- description="Probability of measuring the wrong value for each qubit.",
14
- )
8
+ measurement_bit_flip_probability: PydanticProbabilityFloat | None = pydantic.Field(
9
+ default=None,
10
+ description="Probability of measuring the wrong value for each qubit.",
15
11
  )
@@ -3,7 +3,7 @@ from typing import TYPE_CHECKING, Any, Union
3
3
  from classiq.interface.generator.complex_type import Complex
4
4
 
5
5
  if TYPE_CHECKING:
6
- from typing_extensions import TypeAlias
6
+ from typing import TypeAlias
7
7
  else:
8
8
  TypeAlias = Any
9
9
 
@@ -1,7 +1,6 @@
1
1
  import itertools
2
2
  from collections.abc import Iterator
3
3
  from dataclasses import dataclass
4
- from typing import Optional
5
4
 
6
5
  from classiq.interface.exceptions import ClassiqValueError
7
6
  from classiq.interface.generator.slice_parsing_utils import parse_io_slicing
@@ -72,7 +71,7 @@ class RegisterPartition:
72
71
  partitioned_register: PartitionedRegister
73
72
 
74
73
  # index == None means this is the partition containing the leftover qubits.
75
- _index: Optional[int]
74
+ _index: int | None
76
75
 
77
76
  def __post_init__(self) -> None:
78
77
  num_partitions = len(self.partitioned_register.partitions)
@@ -5,8 +5,19 @@ from classiq.interface.enum_utils import StrEnum
5
5
 
6
6
 
7
7
  class QmodFormat(StrEnum):
8
+ """
9
+ Qmod code format.
10
+ """
11
+
8
12
  NATIVE = "native"
13
+ """
14
+ Native Qmod (`.qmod`).
15
+ """
16
+
9
17
  PYTHON = "python"
18
+ """
19
+ Python Qmod (`.py`).
20
+ """
10
21
 
11
22
 
12
23
  class QasmToQmodParams(BaseModel):
@@ -10,7 +10,6 @@ from collections.abc import Iterable, Mapping, Sequence
10
10
  from re import Match
11
11
  from typing import (
12
12
  Any,
13
- Optional,
14
13
  Union,
15
14
  )
16
15
  from uuid import UUID, uuid4
@@ -145,19 +144,17 @@ class SynthesisQuantumFunctionCall(BaseModel):
145
144
  power: PydanticPowerType = pydantic.Field(
146
145
  default=1, description="Number of successive calls to the operation"
147
146
  )
148
- name: PydanticNonEmptyString = pydantic.Field( # type: ignore[assignment]
147
+ name: PydanticNonEmptyString = pydantic.Field(
149
148
  default=None,
150
149
  validate_default=True,
151
150
  description="The name of the function instance. "
152
151
  "If not set, determined automatically.",
153
152
  )
154
- caller_parameters: Optional[list[str]] = pydantic.Field(default=None)
155
- parameter_assignments: Optional[dict[str, ClassicalArg]] = pydantic.Field(
156
- default=None
157
- )
158
- source_id: Optional[UUID] = pydantic.Field(default=None)
159
- arithmetic_id: Optional[str] = pydantic.Field(default=None)
160
- inverse_op_id: Optional[UUID] = pydantic.Field(default=None)
153
+ caller_parameters: list[str] | None = pydantic.Field(default=None)
154
+ parameter_assignments: dict[str, ClassicalArg] | None = pydantic.Field(default=None)
155
+ source_id: UUID | None = pydantic.Field(default=None)
156
+ arithmetic_id: str | None = pydantic.Field(default=None)
157
+ inverse_op_id: UUID | None = pydantic.Field(default=None)
161
158
 
162
159
  uuid: UUID = pydantic.Field(default_factory=uuid4)
163
160
 
@@ -222,7 +219,7 @@ class SynthesisQuantumFunctionCall(BaseModel):
222
219
 
223
220
  @pydantic.field_validator("name", mode="before")
224
221
  @classmethod
225
- def _create_name(cls, name: Optional[str], info: ValidationInfo) -> str:
222
+ def _create_name(cls, name: str | None, info: ValidationInfo) -> str:
226
223
  """
227
224
  generates a name to a user defined-functions as follows:
228
225
  <function_name>_<SUFFIX_MARKER>_<random_suffix>
@@ -400,7 +397,7 @@ class SynthesisQuantumFunctionCall(BaseModel):
400
397
  @pydantic.field_validator("inputs", mode="before")
401
398
  @classmethod
402
399
  def _validate_inputs(cls, inputs: IOType, info: ValidationInfo) -> WireDict:
403
- params: Optional[FunctionParams] = info.data.get("function_params")
400
+ params: FunctionParams | None = info.data.get("function_params")
404
401
  is_inverse: bool = info.data.get("is_inverse", False)
405
402
  strict_zero_ios: bool = info.data.get("strict_zero_ios", True)
406
403
  control_states: list[ControlState] = info.data.get("control_states", list())
@@ -556,7 +553,7 @@ class SynthesisQuantumFunctionCall(BaseModel):
556
553
  control_states: list[ControlState],
557
554
  strict_zero_ios: bool,
558
555
  ) -> tuple[list[str], list[str], list[str]]:
559
- expression_matches: Iterable[Optional[Match]] = map(
556
+ expression_matches: Iterable[Match | None] = map(
560
557
  functools.partial(re.fullmatch, IO_REGEX), expressions
561
558
  )
562
559
 
@@ -2,10 +2,9 @@ import uuid
2
2
  import warnings
3
3
  from datetime import datetime, timezone
4
4
  from pathlib import Path
5
- from typing import Optional, Union
5
+ from typing import TypeAlias
6
6
 
7
7
  import pydantic
8
- from typing_extensions import TypeAlias
9
8
 
10
9
  from classiq.interface.compression_utils import decompress
11
10
  from classiq.interface.exceptions import (
@@ -28,9 +27,6 @@ from classiq.interface.generator.generated_circuit_data import (
28
27
  )
29
28
  from classiq.interface.generator.hardware.hardware_data import SynthesisHardwareData
30
29
  from classiq.interface.generator.model.model import ExecutionModel
31
- from classiq.interface.generator.synthesis_metadata.synthesis_duration import (
32
- SynthesisStepDurations,
33
- )
34
30
  from classiq.interface.helpers.versioned_model import VersionedModel
35
31
  from classiq.interface.ide.visual_model import CircuitMetrics
36
32
 
@@ -60,22 +56,16 @@ def _get_formatted_utc_current_time() -> str:
60
56
 
61
57
  class QuantumProgram(VersionedModel, CircuitCodeInterface):
62
58
  hardware_data: SynthesisHardwareData
63
- initial_values: Optional[InitialConditions] = pydantic.Field(default=None)
59
+ initial_values: InitialConditions | None = pydantic.Field(default=None)
64
60
  data: GeneratedCircuitData
65
61
  model: ExecutionModel
66
- transpiled_circuit: Optional[TranspiledCircuitData] = pydantic.Field(default=None)
62
+ transpiled_circuit: TranspiledCircuitData | None = pydantic.Field(default=None)
67
63
  creation_time: str = pydantic.Field(default_factory=_get_formatted_utc_current_time)
68
- synthesis_duration: Optional[SynthesisStepDurations] = pydantic.Field(default=None)
69
- debug_info: Optional[list[FunctionDebugInfoInterface]] = pydantic.Field(
70
- default=None
71
- )
72
- compressed_debug_info: Optional[bytes] = pydantic.Field(default=None)
64
+ compressed_debug_info: bytes | None = pydantic.Field(default=None)
73
65
  program_id: str = pydantic.Field(default_factory=get_uuid_as_str)
74
- execution_primitives_input: Optional[PrimitivesInput] = pydantic.Field(default=None)
75
- synthesis_warnings: Optional[list[str]] = pydantic.Field(default=None)
66
+ execution_primitives_input: PrimitivesInput | None = pydantic.Field(default=None)
67
+ synthesis_warnings: list[str] | None = pydantic.Field(default=None)
76
68
  should_warn: bool = pydantic.Field(default=False)
77
- # Unique identifier for the circuit (since the program_id might change when running show). Used for the circuit store.
78
- circuit_id: str = pydantic.Field(default_factory=get_uuid_as_str)
79
69
 
80
70
  def __str__(self) -> str:
81
71
  return self.model_dump_json(indent=2)
@@ -95,8 +85,8 @@ class QuantumProgram(VersionedModel, CircuitCodeInterface):
95
85
 
96
86
  def to_program(
97
87
  self,
98
- initial_values: Optional[InitialConditions] = None,
99
- instruction_set: Optional[QuantumInstructionSet] = None,
88
+ initial_values: InitialConditions | None = None,
89
+ instruction_set: QuantumInstructionSet | None = None,
100
90
  ) -> quantum_code.QuantumCode:
101
91
  initial_values = initial_values or self.initial_values
102
92
  if instruction_set is not None:
@@ -141,7 +131,7 @@ class QuantumProgram(VersionedModel, CircuitCodeInterface):
141
131
  for name, init_value in initial_values.items()
142
132
  }
143
133
 
144
- def save_results(self, filename: Optional[Union[str, Path]] = None) -> None:
134
+ def save_results(self, filename: str | Path | None = None) -> None:
145
135
  """
146
136
  Saves quantum program results as json into a file.
147
137
  Parameters:
@@ -171,10 +161,7 @@ class QuantumProgram(VersionedModel, CircuitCodeInterface):
171
161
  else self
172
162
  )
173
163
 
174
- def get_debug_info(self) -> Optional[list[FunctionDebugInfoInterface]]:
175
- # Support legacy uncompressed debug info
176
- if self.debug_info is not None:
177
- return self.debug_info
164
+ def get_debug_info(self) -> list[FunctionDebugInfoInterface] | None:
178
165
  if self.compressed_debug_info is None:
179
166
  return None
180
167
  decompressed_debug_info_dict_list = decompress(self.compressed_debug_info)
@@ -1,5 +1,5 @@
1
1
  import math
2
- from typing import Generic, Optional, TypeVar
2
+ from typing import Generic, TypeVar
3
3
 
4
4
  import pydantic
5
5
  from pydantic import BaseModel, ConfigDict
@@ -17,8 +17,8 @@ DEF_RTOL: float = 1e-05
17
17
 
18
18
 
19
19
  class Range(BaseModel, Generic[RangeType]):
20
- lower_bound: Optional[RangeType] = None
21
- upper_bound: Optional[RangeType] = None
20
+ lower_bound: RangeType | None = None
21
+ upper_bound: RangeType | None = None
22
22
  model_config = ConfigDict(frozen=True)
23
23
 
24
24
  @pydantic.model_validator(mode="after")
@@ -1,6 +1,5 @@
1
1
  import re
2
2
  from re import Match
3
- from typing import Optional
4
3
 
5
4
  from classiq.interface.exceptions import ClassiqValueError
6
5
  from classiq.interface.generator.function_params import NAME_REGEX
@@ -17,8 +16,8 @@ def parse_io_slicing(io_str: str) -> tuple[str, slice]:
17
16
  return name, get_slice(slicing)
18
17
 
19
18
 
20
- def separate_name_and_slice(io_str: str) -> tuple[str, Optional[str]]:
21
- match: Optional[Match] = re.fullmatch(IO_REGEX, io_str)
19
+ def separate_name_and_slice(io_str: str) -> tuple[str, str | None]:
20
+ match: Match | None = re.fullmatch(IO_REGEX, io_str)
22
21
  if match is None:
23
22
  raise AssertionError("Input/output name validation error")
24
23
  name, slicing = (match.groupdict().get(x) for x in [NAME, SLICING])
@@ -27,7 +26,7 @@ def separate_name_and_slice(io_str: str) -> tuple[str, Optional[str]]:
27
26
  return name, slicing
28
27
 
29
28
 
30
- def get_slice(slicing: Optional[str]) -> slice:
29
+ def get_slice(slicing: str | None) -> slice:
31
30
  if slicing is None:
32
31
  return slice(None)
33
32
 
@@ -61,5 +60,5 @@ def get_slice(slicing: Optional[str]) -> slice:
61
60
  raise AssertionError("Input/output slicing validation error")
62
61
 
63
62
 
64
- def _int_or_none(v: str) -> Optional[int]:
63
+ def _int_or_none(v: str) -> int | None:
65
64
  return int(v) if v else None
@@ -1,4 +1,4 @@
1
- from typing import Any, Literal, Optional
1
+ from typing import Any, Literal
2
2
 
3
3
  import pydantic
4
4
 
@@ -38,9 +38,7 @@ class _StandardGate(FunctionParams, metaclass=MyMetaAngledClassModel): # type:
38
38
  def num_target_qubits(self) -> int:
39
39
  return self._num_target_qubits
40
40
 
41
- def __init_subclass__(
42
- cls, angles: Optional[list[str]] = None, **kwargs: Any
43
- ) -> None:
41
+ def __init_subclass__(cls, angles: list[str] | None = None, **kwargs: Any) -> None:
44
42
  super().__init_subclass__(**kwargs)
45
43
 
46
44
 
@@ -1,6 +1,4 @@
1
- from typing import Union
2
-
3
- from typing_extensions import TypeAlias
1
+ from typing import TypeAlias, Union
4
2
 
5
3
  from classiq.interface.backend.pydantic_backend import PydanticExecutionParameter
6
4
 
@@ -17,3 +17,12 @@ class SynthesisStepDurations(pydantic.BaseModel):
17
17
  self.postprocessing,
18
18
  )
19
19
  )
20
+
21
+ def __repr__(self) -> str:
22
+ return (
23
+ f"Preprocessing: {self.preprocessing:.2f}s, "
24
+ f"Solving: {self.solving:.2f}s, "
25
+ f"Conversion to Circuit: {self.conversion_to_circuit:.2f}s, "
26
+ f"Postprocessing: {self.postprocessing:.2f}s, "
27
+ f"Total: {self.total_time():.2f}s"
28
+ )
@@ -1,5 +1,4 @@
1
1
  from itertools import chain
2
- from typing import Optional
3
2
 
4
3
  import pydantic
5
4
  import sympy
@@ -10,10 +9,10 @@ from classiq.interface.generator.parameters import ParameterType
10
9
 
11
10
 
12
11
  class FunctionExecutionData(pydantic.BaseModel):
13
- power_parameter: Optional[ParameterType] = pydantic.Field(default=None)
12
+ power_parameter: ParameterType | None = pydantic.Field(default=None)
14
13
 
15
14
  @property
16
- def power_vars(self) -> Optional[list[str]]:
15
+ def power_vars(self) -> list[str] | None:
17
16
  if self.power_parameter is None:
18
17
  return None
19
18
  return list(map(str, sympy.sympify(self.power_parameter).free_symbols))
@@ -1,11 +1,16 @@
1
- from typing import TYPE_CHECKING, Optional
2
-
3
- from typing_extensions import TypeAlias
1
+ from typing import TYPE_CHECKING, TypeAlias
4
2
 
5
3
  from classiq.interface.enum_utils import StrEnum
6
4
 
7
5
  BasisGates: TypeAlias = frozenset[str]
8
6
 
7
+ NATIVE_GATES_TO_CLASSIQ_GATES_MAP: dict[str, str] = {
8
+ "cnot": "cx",
9
+ "toffoli": "ccx",
10
+ "p": "rz",
11
+ "i": "id",
12
+ }
13
+
9
14
  SINGLE_QUBIT_GATES: BasisGates = frozenset(
10
15
  (
11
16
  "u1",
@@ -66,6 +71,9 @@ DEFAULT_BASIS_GATES: BasisGates = SINGLE_QUBIT_GATES | BASIC_TWO_QUBIT_GATES
66
71
  ALL_GATES: BasisGates = (
67
72
  SINGLE_QUBIT_GATES | TWO_QUBIT_GATES | THREE_QUBIT_GATES | NON_UNITARY_GATES
68
73
  )
74
+ ALL_NON_3_QBIT_GATES: BasisGates = (
75
+ SINGLE_QUBIT_GATES | TWO_QUBIT_GATES | NON_UNITARY_GATES
76
+ )
69
77
 
70
78
  ROUTING_TWO_QUBIT_BASIS_GATES: BasisGates = frozenset(
71
79
  ("cx", "ecr", "rzx", "ryy", "rxx", "rzz", "cy", "cz", "cp", "swap")
@@ -80,7 +88,7 @@ ALL_GATES_DICT = {gate.upper(): gate.lower() for gate in sorted(ALL_GATES)}
80
88
 
81
89
  class LowerValsEnum(StrEnum):
82
90
  @classmethod
83
- def _missing_(cls, value: Optional[str]) -> Optional[str]: # type: ignore[override]
91
+ def _missing_(cls, value: str | None) -> str | None: # type: ignore[override]
84
92
  if not isinstance(value, str):
85
93
  return None
86
94
  lower = value.lower()