classiq 0.38.0__py3-none-any.whl → 0.65.3__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 (499) hide show
  1. classiq/__init__.py +47 -32
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +2 -1
  3. classiq/_internals/api_wrapper.py +235 -97
  4. classiq/_internals/async_utils.py +1 -3
  5. classiq/_internals/authentication/auth0.py +26 -10
  6. classiq/_internals/authentication/authentication.py +11 -0
  7. classiq/_internals/authentication/device.py +10 -5
  8. classiq/_internals/authentication/password_manager.py +18 -6
  9. classiq/_internals/authentication/token_manager.py +10 -5
  10. classiq/_internals/client.py +94 -33
  11. classiq/_internals/config.py +3 -4
  12. classiq/_internals/host_checker.py +38 -15
  13. classiq/_internals/jobs.py +60 -57
  14. classiq/_internals/type_validation.py +9 -9
  15. classiq/analyzer/__init__.py +1 -3
  16. classiq/analyzer/analyzer.py +24 -19
  17. classiq/analyzer/analyzer_utilities.py +10 -10
  18. classiq/analyzer/rb.py +15 -15
  19. classiq/analyzer/show_interactive_hack.py +27 -4
  20. classiq/analyzer/url_utils.py +2 -3
  21. classiq/applications/__init__.py +3 -12
  22. classiq/applications/chemistry/__init__.py +14 -10
  23. classiq/applications/chemistry/ansatz_parameters.py +4 -4
  24. classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +165 -158
  25. classiq/applications/chemistry/ground_state_problem.py +1 -1
  26. classiq/{applications_model_constructors → applications}/combinatorial_helpers/allowed_constraints.py +4 -1
  27. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/arithmetic_expression.py +1 -1
  28. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/isolation.py +1 -1
  29. classiq/{applications_model_constructors → applications}/combinatorial_helpers/combinatorial_problem_utils.py +51 -15
  30. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_mapping.py +12 -12
  31. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_utils.py +8 -6
  32. classiq/{applications_model_constructors → applications}/combinatorial_helpers/memory.py +7 -11
  33. classiq/{applications_model_constructors → applications}/combinatorial_helpers/optimization_model.py +67 -40
  34. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
  35. classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
  36. classiq/{applications_model_constructors → applications}/combinatorial_helpers/sympy_utils.py +2 -2
  37. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/encoding.py +15 -20
  38. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/fixed_variables.py +14 -15
  39. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/ising_converter.py +11 -15
  40. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty.py +1 -2
  41. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty_support.py +3 -7
  42. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/sign_seperation.py +2 -3
  43. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/slack_variables.py +5 -8
  44. classiq/applications/combinatorial_optimization/__init__.py +20 -6
  45. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
  46. classiq/{applications_model_constructors → applications/combinatorial_optimization}/combinatorial_optimization_model_constructor.py +35 -33
  47. classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
  48. classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
  49. classiq/applications/finance/__init__.py +4 -5
  50. classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +48 -42
  51. classiq/applications/grover/__init__.py +9 -0
  52. classiq/{applications_model_constructors → applications/grover}/grover_model_constructor.py +52 -51
  53. classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
  54. classiq/applications/libraries/qmci_library.py +22 -0
  55. classiq/applications/qnn/__init__.py +2 -4
  56. classiq/applications/qnn/circuit_utils.py +6 -6
  57. classiq/applications/qnn/datasets/__init__.py +9 -11
  58. classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
  59. classiq/applications/qnn/datasets/dataset_not.py +2 -1
  60. classiq/applications/qnn/datasets/dataset_parity.py +2 -2
  61. classiq/applications/qnn/gradients/quantum_gradient.py +1 -1
  62. classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
  63. classiq/applications/qnn/qlayer.py +30 -10
  64. classiq/applications/qnn/torch_utils.py +4 -3
  65. classiq/applications/qnn/types.py +5 -5
  66. classiq/applications/qsvm/__init__.py +6 -4
  67. classiq/applications/qsvm/qsvm.py +3 -6
  68. classiq/applications/qsvm/qsvm_data_generation.py +3 -3
  69. classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
  70. classiq/execution/__init__.py +8 -3
  71. classiq/execution/all_hardware_devices.py +11 -0
  72. classiq/execution/execution_session.py +400 -0
  73. classiq/execution/iqcc.py +63 -0
  74. classiq/execution/jobs.py +197 -25
  75. classiq/execution/qnn.py +79 -0
  76. classiq/executor.py +20 -115
  77. classiq/interface/_version.py +1 -1
  78. classiq/interface/analyzer/analysis_params.py +43 -13
  79. classiq/interface/analyzer/cytoscape_graph.py +15 -9
  80. classiq/interface/analyzer/result.py +28 -32
  81. classiq/interface/applications/qsvm.py +20 -29
  82. classiq/interface/ast_node.py +16 -0
  83. classiq/interface/backend/backend_preferences.py +390 -121
  84. classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
  85. classiq/interface/backend/pydantic_backend.py +25 -22
  86. classiq/interface/backend/quantum_backend_providers.py +69 -16
  87. classiq/interface/chemistry/fermionic_operator.py +30 -21
  88. classiq/interface/chemistry/ground_state_problem.py +28 -25
  89. classiq/interface/chemistry/molecule.py +14 -10
  90. classiq/interface/chemistry/operator.py +64 -231
  91. classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
  92. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +1 -3
  93. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  94. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  95. classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
  96. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  97. classiq/interface/combinatorial_optimization/examples/set_cover.py +1 -2
  98. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +8 -9
  99. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  100. classiq/interface/combinatorial_optimization/result.py +1 -3
  101. classiq/interface/combinatorial_optimization/solver_types.py +1 -1
  102. classiq/interface/debug_info/debug_info.py +86 -0
  103. classiq/{exceptions.py → interface/exceptions.py} +37 -9
  104. classiq/interface/execution/iqcc.py +19 -0
  105. classiq/interface/execution/jobs.py +15 -12
  106. classiq/interface/execution/primitives.py +18 -0
  107. classiq/interface/executor/constants.py +1 -0
  108. classiq/interface/executor/execution_preferences.py +26 -114
  109. classiq/interface/executor/execution_request.py +24 -46
  110. classiq/interface/executor/execution_result.py +30 -8
  111. classiq/interface/executor/iqae_result.py +4 -6
  112. classiq/interface/executor/optimizer_preferences.py +17 -14
  113. classiq/interface/executor/quantum_code.py +28 -24
  114. classiq/interface/executor/quantum_instruction_set.py +2 -2
  115. classiq/interface/executor/register_initialization.py +11 -14
  116. classiq/interface/executor/result.py +83 -56
  117. classiq/interface/executor/vqe_result.py +10 -10
  118. classiq/interface/finance/function_input.py +35 -25
  119. classiq/interface/finance/gaussian_model_input.py +5 -5
  120. classiq/interface/finance/log_normal_model_input.py +4 -4
  121. classiq/interface/finance/model_input.py +4 -4
  122. classiq/interface/generator/adjacency.py +1 -3
  123. classiq/interface/generator/amplitude_loading.py +22 -12
  124. classiq/interface/generator/ansatz_library.py +5 -5
  125. classiq/interface/generator/application_apis/arithmetic_declarations.py +8 -5
  126. classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
  127. classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
  128. classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
  129. classiq/interface/generator/application_apis/finance_declarations.py +48 -69
  130. classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
  131. classiq/interface/generator/arith/argument_utils.py +46 -5
  132. classiq/interface/generator/arith/arithmetic.py +35 -16
  133. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +6 -7
  134. classiq/interface/generator/arith/arithmetic_expression_abc.py +66 -25
  135. classiq/interface/generator/arith/arithmetic_expression_parser.py +11 -11
  136. classiq/interface/generator/arith/arithmetic_expression_validator.py +47 -43
  137. classiq/interface/generator/arith/arithmetic_operations.py +14 -6
  138. classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
  139. classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
  140. classiq/interface/generator/arith/ast_node_rewrite.py +3 -2
  141. classiq/interface/generator/arith/binary_ops.py +218 -130
  142. classiq/interface/generator/arith/endianness.py +1 -1
  143. classiq/interface/generator/arith/extremum_operations.py +96 -25
  144. classiq/interface/generator/arith/logical_ops.py +14 -12
  145. classiq/interface/generator/arith/number_utils.py +12 -6
  146. classiq/interface/generator/arith/register_user_input.py +60 -37
  147. classiq/interface/generator/arith/unary_ops.py +49 -29
  148. classiq/interface/generator/arith/uncomputation_methods.py +1 -1
  149. classiq/interface/generator/builtin_api_builder.py +2 -9
  150. classiq/interface/generator/chemistry_function_params.py +3 -3
  151. classiq/interface/generator/circuit_code/circuit_code.py +7 -7
  152. classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
  153. classiq/interface/generator/commuting_pauli_exponentiation.py +7 -7
  154. classiq/interface/generator/compiler_keywords.py +5 -1
  155. classiq/interface/generator/complex_type.py +13 -18
  156. classiq/interface/generator/constant.py +3 -4
  157. classiq/interface/generator/control_state.py +34 -29
  158. classiq/interface/generator/copy.py +47 -0
  159. classiq/interface/generator/custom_ansatz.py +2 -5
  160. classiq/interface/generator/distance.py +3 -5
  161. classiq/interface/generator/excitations.py +3 -2
  162. classiq/interface/generator/expressions/atomic_expression_functions.py +21 -5
  163. classiq/interface/generator/expressions/enums/__init__.py +0 -10
  164. classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
  165. classiq/interface/generator/expressions/evaluated_expression.py +5 -5
  166. classiq/interface/generator/expressions/expression.py +26 -14
  167. classiq/interface/generator/expressions/expression_constants.py +9 -3
  168. classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
  169. classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
  170. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +34 -8
  171. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
  172. classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
  173. classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
  174. classiq/interface/generator/expressions/sympy_supported_expressions.py +19 -11
  175. classiq/interface/generator/finance.py +2 -2
  176. classiq/interface/generator/function_param_library.py +6 -6
  177. classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
  178. classiq/interface/generator/function_params.py +36 -64
  179. classiq/interface/generator/functions/__init__.py +0 -22
  180. classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
  181. classiq/interface/generator/functions/classical_function_declaration.py +18 -9
  182. classiq/interface/generator/functions/classical_type.py +47 -166
  183. classiq/interface/generator/functions/concrete_types.py +55 -0
  184. classiq/interface/generator/functions/function_declaration.py +13 -14
  185. classiq/interface/generator/functions/port_declaration.py +1 -13
  186. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  187. classiq/interface/generator/functions/type_name.py +90 -0
  188. classiq/interface/generator/generated_circuit_data.py +153 -20
  189. classiq/interface/generator/grover_diffuser.py +32 -25
  190. classiq/interface/generator/grover_operator.py +34 -25
  191. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
  192. classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
  193. classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +9 -9
  194. classiq/interface/generator/hardware/hardware_data.py +72 -34
  195. classiq/interface/generator/hardware_efficient_ansatz.py +20 -16
  196. classiq/interface/generator/hartree_fock.py +13 -5
  197. classiq/interface/generator/identity.py +10 -6
  198. classiq/interface/generator/linear_pauli_rotations.py +32 -20
  199. classiq/interface/generator/mcmt_method.py +1 -1
  200. classiq/interface/generator/mcu.py +17 -15
  201. classiq/interface/generator/mcx.py +24 -17
  202. classiq/interface/generator/model/__init__.py +2 -5
  203. classiq/interface/generator/model/constraints.py +26 -8
  204. classiq/interface/generator/model/model.py +27 -190
  205. classiq/interface/generator/model/preferences/preferences.py +115 -41
  206. classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +14 -17
  207. classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
  208. classiq/interface/generator/oracles/custom_oracle.py +15 -13
  209. classiq/interface/generator/oracles/oracle_abc.py +7 -7
  210. classiq/interface/generator/partitioned_register.py +7 -7
  211. classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
  212. classiq/interface/generator/preferences/optimization.py +1 -2
  213. classiq/interface/generator/qpe.py +41 -30
  214. classiq/interface/generator/qsvm.py +9 -10
  215. classiq/interface/generator/quantum_function_call.py +88 -73
  216. classiq/interface/generator/quantum_program.py +41 -24
  217. classiq/interface/generator/range_types.py +11 -12
  218. classiq/interface/generator/register_role.py +18 -6
  219. classiq/interface/generator/slice_parsing_utils.py +5 -5
  220. classiq/interface/generator/standard_gates/controlled_standard_gates.py +30 -39
  221. classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
  222. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  223. classiq/interface/generator/standard_gates/u_gate.py +7 -10
  224. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  225. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
  226. classiq/interface/generator/state_preparation/distributions.py +16 -15
  227. classiq/interface/generator/state_preparation/metrics.py +4 -7
  228. classiq/interface/generator/state_preparation/state_preparation.py +25 -20
  229. classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
  230. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
  231. classiq/interface/generator/transpiler_basis_gates.py +7 -3
  232. classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
  233. classiq/interface/generator/types/compilation_metadata.py +6 -0
  234. classiq/interface/generator/types/enum_declaration.py +54 -0
  235. classiq/interface/generator/types/qstruct_declaration.py +18 -0
  236. classiq/interface/generator/types/struct_declaration.py +7 -11
  237. classiq/interface/generator/ucc.py +5 -4
  238. classiq/interface/generator/unitary_gate.py +5 -5
  239. classiq/interface/generator/user_defined_function_params.py +4 -1
  240. classiq/interface/generator/validations/flow_graph.py +7 -7
  241. classiq/interface/generator/validations/validator_functions.py +4 -4
  242. classiq/interface/generator/visitor.py +23 -16
  243. classiq/interface/hardware.py +29 -8
  244. classiq/interface/helpers/classproperty.py +8 -0
  245. classiq/interface/helpers/custom_encoders.py +2 -2
  246. classiq/interface/helpers/custom_pydantic_types.py +40 -50
  247. classiq/interface/helpers/datastructures.py +26 -0
  248. classiq/interface/helpers/hashable_mixin.py +3 -2
  249. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  250. classiq/interface/helpers/pydantic_model_helpers.py +7 -5
  251. classiq/interface/helpers/validation_helpers.py +3 -20
  252. classiq/interface/helpers/versioned_model.py +1 -4
  253. classiq/interface/ide/ide_data.py +16 -20
  254. classiq/interface/ide/visual_model.py +130 -0
  255. classiq/interface/interface_version.py +1 -0
  256. classiq/interface/jobs.py +29 -69
  257. classiq/interface/model/allocate.py +16 -0
  258. classiq/interface/model/bind_operation.py +32 -9
  259. classiq/interface/model/classical_if.py +15 -0
  260. classiq/interface/model/classical_parameter_declaration.py +33 -3
  261. classiq/interface/model/control.py +45 -0
  262. classiq/interface/model/handle_binding.py +298 -20
  263. classiq/interface/model/inplace_binary_operation.py +29 -24
  264. classiq/interface/model/invert.py +12 -0
  265. classiq/interface/model/model.py +69 -61
  266. classiq/interface/model/native_function_definition.py +17 -20
  267. classiq/interface/model/parameter.py +13 -0
  268. classiq/interface/model/phase_operation.py +11 -0
  269. classiq/interface/model/port_declaration.py +27 -9
  270. classiq/interface/model/power.py +14 -0
  271. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +30 -18
  272. classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
  273. classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
  274. classiq/interface/model/quantum_function_call.py +141 -343
  275. classiq/interface/model/quantum_function_declaration.py +190 -157
  276. classiq/interface/model/quantum_lambda_function.py +33 -32
  277. classiq/interface/model/quantum_statement.py +71 -12
  278. classiq/interface/model/quantum_type.py +177 -40
  279. classiq/interface/model/quantum_variable_declaration.py +3 -25
  280. classiq/interface/model/repeat.py +15 -0
  281. classiq/interface/model/statement_block.py +40 -14
  282. classiq/interface/model/validation_handle.py +13 -6
  283. classiq/interface/model/variable_declaration_statement.py +3 -1
  284. classiq/interface/model/within_apply_operation.py +7 -5
  285. classiq/interface/server/global_versions.py +6 -7
  286. classiq/interface/server/routes.py +17 -21
  287. classiq/interface/source_reference.py +59 -0
  288. classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
  289. classiq/model_expansions/capturing/__init__.py +0 -0
  290. classiq/model_expansions/capturing/captured_vars.py +435 -0
  291. classiq/model_expansions/capturing/mangling_utils.py +56 -0
  292. classiq/model_expansions/closure.py +171 -0
  293. classiq/model_expansions/debug_flag.py +3 -0
  294. classiq/model_expansions/evaluators/__init__.py +0 -0
  295. classiq/model_expansions/evaluators/arg_type_match.py +158 -0
  296. classiq/model_expansions/evaluators/argument_types.py +42 -0
  297. classiq/model_expansions/evaluators/classical_expression.py +36 -0
  298. classiq/model_expansions/evaluators/control.py +144 -0
  299. classiq/model_expansions/evaluators/parameter_types.py +226 -0
  300. classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
  301. classiq/model_expansions/evaluators/type_type_match.py +90 -0
  302. classiq/model_expansions/expression_evaluator.py +135 -0
  303. classiq/model_expansions/expression_renamer.py +76 -0
  304. classiq/model_expansions/function_builder.py +247 -0
  305. classiq/model_expansions/generative_functions.py +158 -0
  306. classiq/model_expansions/interpreters/__init__.py +0 -0
  307. classiq/model_expansions/interpreters/base_interpreter.py +263 -0
  308. classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
  309. classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
  310. classiq/model_expansions/model_tables.py +18 -0
  311. classiq/model_expansions/quantum_operations/__init__.py +9 -0
  312. classiq/model_expansions/quantum_operations/bind.py +60 -0
  313. classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
  314. classiq/model_expansions/quantum_operations/classicalif.py +53 -0
  315. classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
  316. classiq/model_expansions/quantum_operations/emitter.py +181 -0
  317. classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
  318. classiq/model_expansions/quantum_operations/repeat.py +56 -0
  319. classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
  320. classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
  321. classiq/model_expansions/scope.py +240 -0
  322. classiq/model_expansions/scope_initialization.py +150 -0
  323. classiq/model_expansions/sympy_conversion/__init__.py +0 -0
  324. classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
  325. classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
  326. classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
  327. classiq/model_expansions/transformers/__init__.py +0 -0
  328. classiq/model_expansions/transformers/ast_renamer.py +26 -0
  329. classiq/model_expansions/transformers/var_splitter.py +299 -0
  330. classiq/model_expansions/utils/__init__.py +0 -0
  331. classiq/model_expansions/utils/counted_name_allocator.py +11 -0
  332. classiq/model_expansions/utils/handles_collector.py +33 -0
  333. classiq/model_expansions/visitors/__init__.py +0 -0
  334. classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
  335. classiq/model_expansions/visitors/variable_references.py +144 -0
  336. classiq/open_library/__init__.py +4 -0
  337. classiq/open_library/functions/__init__.py +130 -0
  338. classiq/open_library/functions/amplitude_estimation.py +30 -0
  339. classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
  340. classiq/open_library/functions/grover.py +157 -0
  341. classiq/open_library/functions/hea.py +115 -0
  342. classiq/open_library/functions/linear_pauli_rotation.py +82 -0
  343. classiq/open_library/functions/modular_exponentiation.py +201 -0
  344. classiq/open_library/functions/qaoa_penalty.py +117 -0
  345. classiq/open_library/functions/qft_functions.py +54 -0
  346. classiq/open_library/functions/qpe.py +46 -0
  347. classiq/open_library/functions/qsvt.py +331 -0
  348. classiq/open_library/functions/state_preparation.py +301 -0
  349. classiq/open_library/functions/swap_test.py +27 -0
  350. classiq/open_library/functions/utility_functions.py +81 -0
  351. classiq/open_library/functions/variational.py +52 -0
  352. classiq/qmod/__init__.py +10 -10
  353. classiq/qmod/builtins/__init__.py +19 -2
  354. classiq/qmod/builtins/classical_execution_primitives.py +36 -14
  355. classiq/qmod/builtins/classical_functions.py +39 -43
  356. classiq/qmod/builtins/constants.py +10 -0
  357. classiq/qmod/builtins/enums.py +208 -0
  358. classiq/qmod/builtins/functions/__init__.py +137 -0
  359. classiq/qmod/builtins/functions/allocation.py +150 -0
  360. classiq/qmod/builtins/functions/arithmetic.py +55 -0
  361. classiq/qmod/builtins/functions/benchmarking.py +8 -0
  362. classiq/qmod/builtins/functions/chemistry.py +91 -0
  363. classiq/qmod/builtins/functions/exponentiation.py +105 -0
  364. classiq/qmod/builtins/functions/finance.py +34 -0
  365. classiq/qmod/builtins/functions/operators.py +16 -0
  366. classiq/qmod/builtins/functions/qsvm.py +24 -0
  367. classiq/qmod/builtins/functions/standard_gates.py +651 -0
  368. classiq/qmod/builtins/operations.py +373 -40
  369. classiq/qmod/builtins/structs.py +103 -80
  370. classiq/qmod/cfunc.py +2 -2
  371. classiq/qmod/classical_function.py +4 -8
  372. classiq/qmod/cparam.py +64 -0
  373. classiq/qmod/create_model_function.py +56 -0
  374. classiq/qmod/declaration_inferrer.py +143 -101
  375. classiq/qmod/expression_query.py +20 -4
  376. classiq/qmod/generative.py +42 -0
  377. classiq/qmod/model_state_container.py +18 -6
  378. classiq/qmod/native/__init__.py +7 -0
  379. classiq/qmod/native/expression_to_qmod.py +16 -11
  380. classiq/qmod/native/pretty_printer.py +187 -97
  381. classiq/qmod/pretty_print/__init__.py +7 -0
  382. classiq/qmod/pretty_print/expression_to_python.py +222 -0
  383. classiq/qmod/pretty_print/pretty_printer.py +572 -0
  384. classiq/qmod/python_classical_type.py +67 -0
  385. classiq/qmod/qfunc.py +60 -8
  386. classiq/qmod/qmod_constant.py +93 -26
  387. classiq/qmod/qmod_parameter.py +68 -59
  388. classiq/qmod/qmod_variable.py +468 -155
  389. classiq/qmod/quantum_callable.py +17 -7
  390. classiq/qmod/quantum_expandable.py +269 -96
  391. classiq/qmod/quantum_function.py +196 -41
  392. classiq/qmod/semantics/__init__.py +0 -0
  393. classiq/qmod/semantics/annotation/__init__.py +0 -0
  394. classiq/qmod/semantics/annotation/call_annotation.py +92 -0
  395. classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
  396. classiq/qmod/semantics/error_manager.py +88 -0
  397. classiq/qmod/semantics/lambdas.py +25 -0
  398. classiq/qmod/semantics/static_semantics_visitor.py +384 -0
  399. classiq/qmod/semantics/validation/__init__.py +0 -0
  400. classiq/qmod/semantics/validation/constants_validation.py +16 -0
  401. classiq/qmod/semantics/validation/func_call_validation.py +99 -0
  402. classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
  403. classiq/qmod/semantics/validation/handle_validation.py +85 -0
  404. classiq/qmod/semantics/validation/main_validation.py +33 -0
  405. classiq/qmod/semantics/validation/types_validation.py +128 -0
  406. classiq/qmod/symbolic.py +147 -123
  407. classiq/qmod/symbolic_expr.py +27 -12
  408. classiq/qmod/symbolic_type.py +2 -5
  409. classiq/qmod/type_attribute_remover.py +32 -0
  410. classiq/qmod/utilities.py +98 -4
  411. classiq/qmod/write_qmod.py +17 -3
  412. classiq/synthesis.py +210 -22
  413. {classiq-0.38.0.dist-info → classiq-0.65.3.dist-info}/METADATA +16 -9
  414. classiq-0.65.3.dist-info/RECORD +521 -0
  415. classiq/_internals/_qfunc_ext.py +0 -6
  416. classiq/applications/benchmarking/__init__.py +0 -9
  417. classiq/applications/benchmarking/mirror_benchmarking.py +0 -70
  418. classiq/applications/numpy_utils.py +0 -37
  419. classiq/applications_model_constructors/__init__.py +0 -25
  420. classiq/applications_model_constructors/combinatorial_helpers/multiple_comp_basis_sp.py +0 -34
  421. classiq/applications_model_constructors/combinatorial_helpers/pauli_helpers/pauli_utils.py +0 -65
  422. classiq/applications_model_constructors/combinatorial_helpers/pyomo_utils.py +0 -243
  423. classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
  424. classiq/applications_model_constructors/libraries/qmci_library.py +0 -107
  425. classiq/builtin_functions/__init__.py +0 -43
  426. classiq/builtin_functions/amplitude_loading.py +0 -3
  427. classiq/builtin_functions/binary_ops.py +0 -1
  428. classiq/builtin_functions/exponentiation.py +0 -5
  429. classiq/builtin_functions/qpe.py +0 -4
  430. classiq/builtin_functions/qsvm.py +0 -7
  431. classiq/builtin_functions/range_types.py +0 -5
  432. classiq/builtin_functions/standard_gates.py +0 -1
  433. classiq/builtin_functions/state_preparation.py +0 -6
  434. classiq/builtin_functions/suzuki_trotter.py +0 -3
  435. classiq/interface/executor/aws_execution_cost.py +0 -73
  436. classiq/interface/executor/error_mitigation.py +0 -6
  437. classiq/interface/generator/credit_risk_example/linear_gci.py +0 -122
  438. classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -69
  439. classiq/interface/generator/expressions/enums/chemistry.py +0 -28
  440. classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
  441. classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
  442. classiq/interface/generator/expressions/enums/optimizers.py +0 -9
  443. classiq/interface/generator/expressions/enums/pauli.py +0 -8
  444. classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
  445. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
  446. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
  447. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
  448. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -1229
  449. classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -95
  450. classiq/interface/generator/functions/foreign_function_definition.py +0 -114
  451. classiq/interface/generator/functions/function_implementation.py +0 -107
  452. classiq/interface/generator/functions/native_function_definition.py +0 -155
  453. classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
  454. classiq/interface/generator/functions/register.py +0 -44
  455. classiq/interface/generator/functions/register_mapping_data.py +0 -106
  456. classiq/interface/generator/inequality_mixer.py +0 -51
  457. classiq/interface/generator/model/classical_main_validator.py +0 -106
  458. classiq/interface/generator/range_mixer.py +0 -56
  459. classiq/interface/generator/state_propagator.py +0 -74
  460. classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -1
  461. classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
  462. classiq/interface/ide/show.py +0 -34
  463. classiq/interface/model/call_synthesis_data.py +0 -68
  464. classiq/interface/model/common_model_types.py +0 -23
  465. classiq/interface/model/quantum_expressions/control_state.py +0 -38
  466. classiq/interface/model/quantum_if_operation.py +0 -94
  467. classiq/interface/model/resolvers/function_call_resolver.py +0 -43
  468. classiq/interface/model/validations/handle_validation_base.py +0 -55
  469. classiq/interface/model/validations/handles_validator.py +0 -156
  470. classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
  471. classiq/model/__init__.py +0 -14
  472. classiq/model/composite_function_generator.py +0 -33
  473. classiq/model/function_handler.py +0 -462
  474. classiq/model/logic_flow.py +0 -149
  475. classiq/model/logic_flow_change_handler.py +0 -71
  476. classiq/model/model.py +0 -229
  477. classiq/qmod/builtins/functions.py +0 -913
  478. classiq/qmod/qmod_struct.py +0 -37
  479. classiq/quantum_functions/__init__.py +0 -17
  480. classiq/quantum_functions/annotation_parser.py +0 -205
  481. classiq/quantum_functions/decorators.py +0 -22
  482. classiq/quantum_functions/function_library.py +0 -181
  483. classiq/quantum_functions/function_parser.py +0 -74
  484. classiq/quantum_functions/quantum_function.py +0 -236
  485. classiq-0.38.0.dist-info/RECORD +0 -454
  486. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/__init__.py +0 -0
  487. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/__init__.py +0 -0
  488. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/__init__.py +0 -0
  489. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +0 -0
  490. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/py.typed +0 -0
  491. /classiq/{applications_model_constructors/combinatorial_helpers/transformations → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
  492. /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
  493. /classiq/{interface/generator/credit_risk_example → applications/hamiltonian}/__init__.py +0 -0
  494. /classiq/{interface/generator/functions/core_lib_declarations → applications/libraries}/__init__.py +0 -0
  495. /classiq/interface/{model/resolvers → debug_info}/__init__.py +0 -0
  496. /classiq/{_internals → interface}/enum_utils.py +0 -0
  497. /classiq/interface/{model/validations → generator/functions/builtins}/__init__.py +0 -0
  498. /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → model_expansions/__init__.py} +0 -0
  499. {classiq-0.38.0.dist-info → classiq-0.65.3.dist-info}/WHEEL +0 -0
@@ -0,0 +1,178 @@
1
+ # This file was generated automatically - do not edit manually
2
+
3
+
4
+ from enum import IntEnum
5
+
6
+
7
+ class Element(IntEnum):
8
+ H = 0
9
+ He = 1
10
+ Li = 2
11
+ Be = 3
12
+ B = 4
13
+ C = 5
14
+ N = 6
15
+ O = 7 # noqa: E741
16
+ F = 8
17
+ Ne = 9
18
+ Na = 10
19
+ Mg = 11
20
+ Al = 12
21
+ Si = 13
22
+ P = 14
23
+ S = 15
24
+ Cl = 16
25
+ Ar = 17
26
+ K = 18
27
+ Ca = 19
28
+ Sc = 20
29
+ Ti = 21
30
+ V = 22
31
+ Cr = 23
32
+ Mn = 24
33
+ Fe = 25
34
+ Co = 26
35
+ Ni = 27
36
+ Cu = 28
37
+ Zn = 29
38
+ Ga = 30
39
+ Ge = 31
40
+ As = 32
41
+ Se = 33
42
+ Br = 34
43
+ Kr = 35
44
+ Rb = 36
45
+ Sr = 37
46
+ Y = 38
47
+ Zr = 39
48
+ Nb = 40
49
+ Mo = 41
50
+ Tc = 42
51
+ Ru = 43
52
+ Rh = 44
53
+ Pd = 45
54
+ Ag = 46
55
+ Cd = 47
56
+ In = 48
57
+ Sn = 49
58
+ Sb = 50
59
+ Te = 51
60
+ I = 52 # noqa: E741
61
+ Xe = 53
62
+ Cs = 54
63
+ Ba = 55
64
+ La = 56
65
+ Ce = 57
66
+ Pr = 58
67
+ Nd = 59
68
+ Pm = 60
69
+ Sm = 61
70
+ Eu = 62
71
+ Gd = 63
72
+ Tb = 64
73
+ Dy = 65
74
+ Ho = 66
75
+ Er = 67
76
+ Tm = 68
77
+ Yb = 69
78
+ Lu = 70
79
+ Hf = 71
80
+ Ta = 72
81
+ W = 73
82
+ Re = 74
83
+ Os = 75
84
+ Ir = 76
85
+ Pt = 77
86
+ Au = 78
87
+ Hg = 79
88
+ Tl = 80
89
+ Pb = 81
90
+ Bi = 82
91
+ Po = 83
92
+ At = 84
93
+ Rn = 85
94
+ Fr = 86
95
+ Ra = 87
96
+ Ac = 88
97
+ Th = 89
98
+ Pa = 90
99
+ U = 91
100
+ Np = 92
101
+ Pu = 93
102
+ Am = 94
103
+ Cm = 95
104
+ Bk = 96
105
+ Cf = 97
106
+ Es = 98
107
+ Fm = 99
108
+ Md = 100
109
+ No = 101
110
+ Lr = 102
111
+ Rf = 103
112
+ Db = 104
113
+ Sg = 105
114
+ Bh = 106
115
+ Hs = 107
116
+ Mt = 108
117
+ Ds = 109
118
+ Rg = 110
119
+ Cn = 111
120
+ Nh = 112
121
+ Fl = 113
122
+ Mc = 114
123
+ Lv = 115
124
+ Ts = 116
125
+ Og = 117
126
+
127
+
128
+ class FermionMapping(IntEnum):
129
+ JORDAN_WIGNER = 0
130
+ PARITY = 1
131
+ BRAVYI_KITAEV = 2
132
+ FAST_BRAVYI_KITAEV = 3
133
+
134
+
135
+ class FinanceFunctionType(IntEnum):
136
+ VAR = 0
137
+ SHORTFALL = 1
138
+ X_SQUARE = 2
139
+ EUROPEAN_CALL_OPTION = 3
140
+
141
+
142
+ class LadderOperator(IntEnum):
143
+ PLUS = 0
144
+ MINUS = 1
145
+
146
+
147
+ class Optimizer(IntEnum):
148
+ COBYLA = 1
149
+ SPSA = 2
150
+ L_BFGS_B = 3
151
+ NELDER_MEAD = 4
152
+ ADAM = 5
153
+
154
+
155
+ class Pauli(IntEnum):
156
+ I = 0 # noqa: E741
157
+ X = 1
158
+ Y = 2
159
+ Z = 3
160
+
161
+
162
+ class QSVMFeatureMapEntanglement(IntEnum):
163
+ FULL = 0
164
+ LINEAR = 1
165
+ CIRCULAR = 2
166
+ SCA = 3
167
+ PAIRWISE = 4
168
+
169
+
170
+ __all__ = [
171
+ "Element",
172
+ "FermionMapping",
173
+ "FinanceFunctionType",
174
+ "LadderOperator",
175
+ "Optimizer",
176
+ "Pauli",
177
+ "QSVMFeatureMapEntanglement",
178
+ ]
@@ -0,0 +1,6 @@
1
+ from pydantic import BaseModel, Field, NonNegativeInt
2
+
3
+
4
+ class CompilationMetadata(BaseModel):
5
+ should_synthesize_separately: bool = Field(default=False)
6
+ occurrences_number: NonNegativeInt = Field(default=1)
@@ -0,0 +1,54 @@
1
+ from collections import Counter
2
+ from enum import Enum, EnumMeta, IntEnum
3
+
4
+ import pydantic
5
+
6
+ from classiq.interface.ast_node import HashableASTNode
7
+ from classiq.interface.exceptions import ClassiqValueError
8
+
9
+
10
+ class EnumDeclaration(HashableASTNode):
11
+ name: str
12
+
13
+ members: dict[str, int] = pydantic.Field(
14
+ default_factory=dict,
15
+ description="Dictionary of member names and their values",
16
+ )
17
+
18
+ @pydantic.field_validator("members")
19
+ @classmethod
20
+ def _validate_members(cls, members: dict[str, int]) -> dict[str, int]:
21
+ underscore_members = [
22
+ member for member in members.keys() if member.startswith("_")
23
+ ]
24
+ if len(underscore_members) > 0:
25
+ raise ClassiqValueError(
26
+ f"Enum member names must not start with an underscore. The offending "
27
+ f"members: {underscore_members}"
28
+ )
29
+
30
+ counter = Counter(members.values())
31
+ repeating_members = [
32
+ member for member, value in members.items() if counter[value] > 1
33
+ ]
34
+ if len(repeating_members) > 0:
35
+ raise ClassiqValueError(
36
+ f"Cannot assign the same value to more than one enum member. The "
37
+ f"offending members: {repeating_members}"
38
+ )
39
+
40
+ return members
41
+
42
+ def create_enum(self) -> IntEnum:
43
+ return IntEnum(self.name, self.members)
44
+
45
+
46
+ def declaration_from_enum(enum_type: EnumMeta) -> EnumDeclaration:
47
+ members: list[Enum] = list(enum_type)
48
+ return EnumDeclaration(
49
+ name=enum_type.__name__,
50
+ members={
51
+ member.name: member.value
52
+ for member in sorted(members, key=lambda member: member.value)
53
+ },
54
+ )
@@ -0,0 +1,18 @@
1
+ from collections.abc import Mapping
2
+ from typing import TYPE_CHECKING
3
+
4
+ import pydantic
5
+
6
+ from classiq.interface.ast_node import HashableASTNode
7
+
8
+ if TYPE_CHECKING:
9
+ from classiq.interface.generator.functions.concrete_types import ConcreteQuantumType
10
+
11
+
12
+ class QStructDeclaration(HashableASTNode):
13
+ name: str
14
+
15
+ fields: Mapping[str, "ConcreteQuantumType"] = pydantic.Field(
16
+ default_factory=dict,
17
+ description="Dictionary of field names and their quantum types",
18
+ )
@@ -1,25 +1,21 @@
1
- from typing import Any, ClassVar, Dict, Mapping
1
+ from collections.abc import Mapping
2
+ from typing import Any
2
3
 
3
4
  import pydantic
4
5
 
5
- from classiq.interface.generator.functions.classical_type import ConcreteClassicalType
6
- from classiq.interface.helpers.hashable_pydantic_base_model import (
7
- HashablePydanticBaseModel,
8
- )
6
+ from classiq.interface.ast_node import HashableASTNode
7
+ from classiq.interface.exceptions import ClassiqValueError
8
+ from classiq.interface.generator.functions.concrete_types import ConcreteClassicalType
9
9
 
10
- from classiq.exceptions import ClassiqValueError
11
10
 
12
-
13
- class StructDeclaration(HashablePydanticBaseModel):
11
+ class StructDeclaration(HashableASTNode):
14
12
  name: str
15
13
 
16
- variables: Dict[str, ConcreteClassicalType] = pydantic.Field(
14
+ variables: dict[str, ConcreteClassicalType] = pydantic.Field(
17
15
  default_factory=dict,
18
16
  description="Dictionary of variable names and their classical types",
19
17
  )
20
18
 
21
- BUILTIN_STRUCT_DECLARATIONS: ClassVar[Dict[str, "StructDeclaration"]] = {}
22
-
23
19
  def validate_fields(self, fields: Mapping[str, Any]) -> None:
24
20
  expected_field_names = list(self.variables.keys())
25
21
  received_field_names = list(fields.keys())
@@ -1,7 +1,9 @@
1
- from typing import Iterable, Optional
1
+ from collections.abc import Iterable
2
+ from typing import Optional
2
3
 
3
4
  import pydantic
4
5
 
6
+ from classiq.interface.exceptions import ClassiqValueError
5
7
  from classiq.interface.generator.chemistry_function_params import (
6
8
  ChemistryFunctionParams,
7
9
  )
@@ -10,8 +12,6 @@ from classiq.interface.generator.excitations import (
10
12
  EXCITATIONS_TYPE_EXACT,
11
13
  )
12
14
 
13
- from classiq.exceptions import ClassiqValueError
14
-
15
15
  _EXCITATIONS_DICT = {"s": 1, "d": 2, "t": 3, "q": 4}
16
16
 
17
17
  DEFAULT_EXCITATIONS = [1, 2]
@@ -42,7 +42,8 @@ class UCC(ChemistryFunctionParams):
42
42
  description="Prefix for the generated parameters",
43
43
  )
44
44
 
45
- @pydantic.validator("excitations")
45
+ @pydantic.field_validator("excitations")
46
+ @classmethod
46
47
  def _validate_excitations(cls, excitations: EXCITATIONS_TYPE) -> EXCITATIONS_TYPE:
47
48
  if isinstance(excitations, int):
48
49
  if excitations not in _EXCITATIONS_DICT.values():
@@ -1,15 +1,14 @@
1
- from typing import List, Union
1
+ from typing import Union
2
2
 
3
3
  import numpy as np
4
4
  import pydantic
5
5
 
6
+ from classiq.interface.exceptions import ClassiqValueError
6
7
  from classiq.interface.generator import complex_type, function_params
7
8
  from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
8
9
 
9
- from classiq.exceptions import ClassiqValueError
10
-
11
10
  DataNumber = Union[complex_type.Complex, float, int]
12
- DataArray = List[List[DataNumber]]
11
+ DataArray = list[list[DataNumber]]
13
12
 
14
13
  UNITARY_GATE_INPUT: str = "TARGET"
15
14
  UNITARY_GATE_OUTPUT: str = "TARGET"
@@ -26,7 +25,8 @@ class UnitaryGate(function_params.FunctionParams):
26
25
  )
27
26
 
28
27
  # TODO - decide if to include assertion on the unitarity of the matrix. It is already done in Qiskit and could be computationally expensive
29
- @pydantic.validator("data")
28
+ @pydantic.field_validator("data")
29
+ @classmethod
30
30
  def validate_data(cls, data: DataArray) -> DataArray:
31
31
  data_np = np.array(data, dtype=object)
32
32
  if data_np.ndim != 2:
@@ -1,6 +1,7 @@
1
- from typing import Mapping
1
+ from collections.abc import Mapping
2
2
 
3
3
  import pydantic
4
+ from pydantic import ConfigDict
4
5
 
5
6
  from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
6
7
  from classiq.interface.generator.function_params import ArithmeticIODict, FunctionParams
@@ -11,6 +12,8 @@ class CustomFunction(FunctionParams):
11
12
  A user-defined custom function parameters object.
12
13
  """
13
14
 
15
+ model_config = ConfigDict(frozen=True, extra="forbid")
16
+
14
17
  _name: str = pydantic.PrivateAttr(default="")
15
18
 
16
19
  input_decls: ArithmeticIODict = pydantic.Field(
@@ -1,18 +1,18 @@
1
1
  from collections import Counter, defaultdict
2
+ from collections.abc import Collection, Iterable, Mapping
2
3
  from dataclasses import dataclass
3
4
  from itertools import chain
4
- from typing import Collection, Iterable, List, Mapping, Optional, TypeVar
5
+ from typing import Optional, TypeVar
5
6
 
6
7
  import networkx as nx
7
8
 
9
+ from classiq.interface.exceptions import ClassiqValueError
8
10
  from classiq.interface.generator.quantum_function_call import (
9
11
  SynthesisQuantumFunctionCall,
10
12
  WireName,
11
13
  )
12
14
  from classiq.interface.helpers.custom_pydantic_types import PydanticNonEmptyString
13
15
 
14
- from classiq.exceptions import ClassiqValueError
15
-
16
16
  IO_MULTI_USE_ERROR_MSG = "Input and output names can only be used once"
17
17
  UNCONNECTED_WIRES_ERROR_MSG = "Wires connected only on one end"
18
18
  UNCONNECTED_FLOW_IO_ERROR_MSG = "Flow IOs not connected to inner calls"
@@ -153,7 +153,7 @@ def validate_legal_wiring(
153
153
  raise ClassiqValueError(_join_errors(error_messages))
154
154
 
155
155
 
156
- def _join_errors(error_messages: List[str]) -> str:
156
+ def _join_errors(error_messages: list[str]) -> str:
157
157
  if not error_messages:
158
158
  error_messages.append(f"{UNKNOWN_ERROR_MSG}")
159
159
 
@@ -163,7 +163,7 @@ def _join_errors(error_messages: List[str]) -> str:
163
163
  T = TypeVar("T")
164
164
 
165
165
 
166
- def _recurring_names(name_list: List[T]) -> Iterable[T]:
166
+ def _recurring_names(name_list: list[T]) -> Iterable[T]:
167
167
  name_counter = Counter(name_list)
168
168
  return (name for name, appearances in name_counter.items() if appearances > 1)
169
169
 
@@ -188,11 +188,11 @@ def validate_acyclic_logic_flow(
188
188
 
189
189
 
190
190
  def validate_acyclicity_and_topologically_sort_logic_flow(
191
- body: List[SynthesisQuantumFunctionCall],
191
+ body: list[SynthesisQuantumFunctionCall],
192
192
  *,
193
193
  flow_input_names: Collection[str],
194
194
  flow_output_names: Collection[str],
195
- ) -> List[SynthesisQuantumFunctionCall]:
195
+ ) -> list[SynthesisQuantumFunctionCall]:
196
196
  graph = validate_acyclic_logic_flow(
197
197
  body=body,
198
198
  flow_input_names=flow_input_names,
@@ -1,16 +1,16 @@
1
- from typing import Iterable, List, Sequence, Sized, Tuple, TypeVar
1
+ from collections.abc import Iterable, Sequence, Sized
2
+ from typing import TypeVar
2
3
 
3
4
  import numpy as np
4
5
 
6
+ from classiq.interface.exceptions import ClassiqValueError
5
7
  from classiq.interface.helpers.custom_pydantic_types import PydanticProbabilityFloat
6
8
 
7
- from classiq.exceptions import ClassiqValueError
8
-
9
9
  NOT_SUM_TO_ONE_ERROR = "Probabilities do not sum to 1"
10
10
 
11
11
  SUM_TO_ONE_SENSITIVITY = 8
12
12
 
13
- Amplitude = TypeVar("Amplitude", Tuple[float, ...], List[complex])
13
+ Amplitude = TypeVar("Amplitude", tuple[float, ...], list[complex])
14
14
 
15
15
 
16
16
  def _is_power_of_two(vector: Sized) -> bool:
@@ -1,14 +1,10 @@
1
- from collections import abc
1
+ from collections import abc, defaultdict
2
+ from collections.abc import Collection, Mapping, Sequence
2
3
  from typing import (
3
4
  TYPE_CHECKING,
4
5
  Any,
5
- Collection,
6
- Dict,
7
- List,
8
- Mapping,
6
+ Callable,
9
7
  Optional,
10
- Sequence,
11
- Tuple,
12
8
  TypeVar,
13
9
  Union,
14
10
  )
@@ -21,7 +17,7 @@ NodeType = Union[
21
17
  BaseModel,
22
18
  int,
23
19
  bool,
24
- Tuple["NodeType", ...],
20
+ tuple["NodeType", ...],
25
21
  Mapping[Key, "NodeType"],
26
22
  Sequence["NodeType"],
27
23
  ]
@@ -47,19 +43,19 @@ class Visitor:
47
43
 
48
44
  return node
49
45
 
50
- def visit_list(self, node: List[NodeType]) -> Optional[RetType]:
46
+ def visit_list(self, node: list[NodeType]) -> Optional[RetType]:
51
47
  for elem in node:
52
48
  self.visit(elem)
53
49
 
54
50
  return None
55
51
 
56
- def visit_dict(self, node: Dict[Key, NodeType]) -> Optional[RetType]:
52
+ def visit_dict(self, node: dict[Key, NodeType]) -> Optional[RetType]:
57
53
  for value in node.values():
58
54
  self.visit(value)
59
55
 
60
56
  return None
61
57
 
62
- def visit_tuple(self, node: Tuple[NodeType, ...]) -> Optional[Tuple[RetType, ...]]:
58
+ def visit_tuple(self, node: tuple[NodeType, ...]) -> Optional[tuple[RetType, ...]]:
63
59
  for value in node:
64
60
  self.visit(value)
65
61
 
@@ -83,13 +79,24 @@ class Transformer(Visitor):
83
79
 
84
80
  def visit(self, node: NodeType) -> Any: ...
85
81
 
86
- def visit_list(self, node: List[NodeType]) -> List[RetType]:
82
+ def visit_list(self, node: list[NodeType]) -> list[RetType]:
87
83
  return [self.visit(elem) for elem in node]
88
84
 
89
- def visit_dict(self, node: Dict[Key, NodeType]) -> Dict[Key, RetType]:
85
+ def visit_dict(self, node: dict[Key, NodeType]) -> dict[Key, RetType]:
90
86
  return {key: self.visit(value) for key, value in node.items()}
91
87
 
92
- def visit_tuple(self, node: Tuple[NodeType, ...]) -> Tuple[RetType, ...]:
88
+ def visit_defaultdict(
89
+ self, node: defaultdict[Key, NodeType]
90
+ ) -> defaultdict[Key, RetType]:
91
+ new_default_factory: Callable[[], RetType] | None = None
92
+ if (default_factory := node.default_factory) is not None:
93
+
94
+ def new_default_factory() -> RetType:
95
+ return self.visit(default_factory()) # type: ignore[misc]
96
+
97
+ return defaultdict(new_default_factory, self.visit_dict(node))
98
+
99
+ def visit_tuple(self, node: tuple[NodeType, ...]) -> tuple[RetType, ...]:
93
100
  return tuple(self.visit(value) for value in node)
94
101
 
95
102
  def visit_BaseModel(
@@ -97,12 +104,12 @@ class Transformer(Visitor):
97
104
  ) -> RetType:
98
105
  fields_to_skip = fields_to_skip or set()
99
106
 
100
- result: Dict[str, Any] = dict()
107
+ result: dict[str, Any] = dict()
101
108
  for name, value in node:
102
109
  if name not in fields_to_skip:
103
110
  result[name] = self.visit(value)
104
111
 
105
- return node.copy(update=result)
112
+ return node.model_copy(update=result)
106
113
 
107
114
  def visit_int(self, n: int) -> int:
108
115
  return n
@@ -1,12 +1,27 @@
1
1
  import datetime
2
- from typing import TYPE_CHECKING, List, Optional, Tuple
2
+ from typing import TYPE_CHECKING, Annotated, Optional
3
3
 
4
4
  import pydantic
5
5
 
6
- from classiq._internals.enum_utils import StrEnum
6
+ from classiq.interface.enum_utils import StrEnum
7
+
8
+ QueueTime = Annotated[
9
+ Optional[datetime.timedelta],
10
+ pydantic.PlainSerializer(
11
+ lambda _timedelta: (
12
+ _timedelta.total_seconds() if _timedelta is not None else None
13
+ ),
14
+ return_type=Optional[float],
15
+ ),
16
+ ]
7
17
 
8
18
 
9
19
  class Provider(StrEnum):
20
+ """
21
+ This class defines all Providers that Classiq supports.
22
+ This is mainly used in backend_preferences when specifying where do we want to execute the defined model.
23
+ """
24
+
10
25
  IBM_QUANTUM = "IBM Quantum"
11
26
  AZURE_QUANTUM = "Azure Quantum"
12
27
  AMAZON_BRAKET = "Amazon Braket"
@@ -15,6 +30,9 @@ class Provider(StrEnum):
15
30
  GOOGLE = "Google"
16
31
  ALICE_AND_BOB = "Alice & Bob"
17
32
  OQC = "OQC"
33
+ INTEL = "Intel"
34
+ AQT = "AQT"
35
+ IQCC = "IQCC"
18
36
 
19
37
  @property
20
38
  def id(self) -> "ProviderIDEnum":
@@ -48,14 +66,17 @@ class HardwareStatus(pydantic.BaseModel):
48
66
  default_factory=lambda: datetime.datetime.now(tz=datetime.UTC)
49
67
  )
50
68
  availability: AvailabilityStatus
51
- queue_time: Optional[datetime.timedelta]
52
- pending_jobs: Optional[int]
69
+ queue_time: QueueTime = pydantic.Field(
70
+ default=None,
71
+ description="The estimated queue time for the hardware in seconds.",
72
+ )
73
+ pending_jobs: Optional[int] = None
53
74
 
54
75
 
55
76
  if TYPE_CHECKING:
56
- ConnectivityMapEntry = Tuple[int, int]
77
+ ConnectivityMapEntry = tuple[int, int]
57
78
  else:
58
- ConnectivityMapEntry = List[int]
79
+ ConnectivityMapEntry = list[int]
59
80
 
60
81
 
61
82
  class HardwareInformation(pydantic.BaseModel):
@@ -65,8 +86,8 @@ class HardwareInformation(pydantic.BaseModel):
65
86
  display_name: str
66
87
  device_type: DeviceType
67
88
  number_of_qubits: int
68
- connectivity_map: Optional[List[ConnectivityMapEntry]]
69
- basis_gates: List[str]
89
+ connectivity_map: Optional[list[ConnectivityMapEntry]] = None
90
+ basis_gates: list[str]
70
91
  status: HardwareStatus
71
92
 
72
93
  def is_simulator(self) -> bool:
@@ -0,0 +1,8 @@
1
+ from typing import TYPE_CHECKING, Any, Optional
2
+
3
+
4
+ class classproperty(property): # noqa: N801
5
+ def __get__(self, owner_self: Any, owner_cls: Optional[type] = None) -> Any:
6
+ if TYPE_CHECKING:
7
+ assert self.fget is not None
8
+ return self.fget(owner_cls)
@@ -1,3 +1,3 @@
1
- from typing import Any, Callable, Dict
1
+ from typing import Any, Callable
2
2
 
3
- CUSTOM_ENCODERS: Dict[type, Callable[[Any], Any]] = {complex: str}
3
+ CUSTOM_ENCODERS: dict[type, Callable[[Any], Any]] = {complex: str}