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
classiq/__init__.py CHANGED
@@ -1,8 +1,5 @@
1
1
  """Classiq SDK."""
2
2
 
3
- import sys
4
- from typing import List
5
-
6
3
  from classiq.interface._version import VERSION as _VERSION
7
4
  from classiq.interface.generator.application_apis import * # noqa: F403
8
5
  from classiq.interface.generator.arith.register_user_input import (
@@ -10,21 +7,13 @@ from classiq.interface.generator.arith.register_user_input import (
10
7
  RegisterUserInput,
11
8
  )
12
9
  from classiq.interface.generator.control_state import ControlState
13
- from classiq.interface.generator.expressions.enums.pauli import Pauli
14
10
  from classiq.interface.generator.functions import * # noqa: F403
15
- from classiq.interface.generator.functions import __all__ as _ifunc_all
11
+ from classiq.interface.generator.model import * # noqa: F403
12
+ from classiq.interface.generator.model import __all__ as _md_all
16
13
  from classiq.interface.generator.quantum_program import QuantumProgram
17
- from classiq.interface.ide.show import show
18
14
 
19
- from classiq import (
20
- applications,
21
- builtin_functions,
22
- exceptions,
23
- execution,
24
- model,
25
- synthesis,
26
- )
27
- from classiq._internals import _qfunc_ext, logger
15
+ from classiq import applications, execution, synthesis
16
+ from classiq._internals import logger
28
17
  from classiq._internals.async_utils import (
29
18
  enable_jupyter_notebook,
30
19
  is_notebook as _is_notebook,
@@ -34,31 +23,56 @@ from classiq._internals.client import configure
34
23
  from classiq._internals.config import Configuration
35
24
  from classiq._internals.help import open_help
36
25
  from classiq.analyzer import Analyzer
37
- from classiq.applications_model_constructors import * # noqa: F403
38
- from classiq.applications_model_constructors import (
39
- __all__ as _application_constructors_all,
26
+ from classiq.applications.chemistry import (
27
+ construct_chemistry_model,
28
+ molecule_problem_to_qmod,
29
+ )
30
+ from classiq.applications.combinatorial_optimization import (
31
+ CombinatorialProblem,
32
+ compute_qaoa_initial_point,
33
+ construct_combinatorial_optimization_model,
34
+ execute_qaoa,
35
+ pyo_model_to_hamiltonian,
40
36
  )
37
+ from classiq.applications.finance import construct_finance_model
38
+ from classiq.applications.grover import construct_grover_model
39
+ from classiq.applications.hamiltonian.pauli_decomposition import (
40
+ hamiltonian_to_matrix,
41
+ matrix_to_hamiltonian,
42
+ )
43
+ from classiq.applications.qsvm import construct_qsvm_model
41
44
  from classiq.executor import (
42
45
  execute,
43
46
  execute_async,
44
47
  set_quantum_program_execution_preferences,
45
48
  )
46
- from classiq.model import * # noqa: F403
47
- from classiq.model import __all__ as _md_all
49
+ from classiq.open_library import * # noqa: F403
50
+ from classiq.open_library import __all__ as _open_library_all
48
51
  from classiq.qmod import * # noqa: F403
49
52
  from classiq.qmod import __all__ as _qmod_all
50
- from classiq.quantum_functions import * # noqa: F403
51
- from classiq.quantum_functions import __all__ as _qfuncs_all
52
- from classiq.quantum_register import * # noqa: F403
53
- from classiq.quantum_register import __all__ as _qregs_all
54
53
  from classiq.synthesis import (
54
+ quantum_program_from_qasm,
55
+ quantum_program_from_qasm_async,
55
56
  set_constraints,
56
57
  set_execution_preferences,
57
58
  set_preferences,
59
+ show,
58
60
  synthesize,
59
61
  synthesize_async,
62
+ update_constraints,
63
+ update_execution_preferences,
64
+ update_preferences,
60
65
  )
61
66
 
67
+ _application_constructors_all = [
68
+ "construct_qsvm_model",
69
+ "construct_combinatorial_optimization_model",
70
+ "construct_chemistry_model",
71
+ "construct_finance_model",
72
+ "construct_grover_model",
73
+ "molecule_problem_to_qmod",
74
+ ]
75
+
62
76
  __version__ = _VERSION
63
77
 
64
78
  if _is_notebook():
@@ -67,10 +81,7 @@ if _is_notebook():
67
81
  _sub_modules = [
68
82
  "analyzer",
69
83
  "applications",
70
- "builtin_functions",
71
- "exceptions",
72
84
  "execution",
73
- "model",
74
85
  "open_help",
75
86
  "qmod",
76
87
  "synthesis",
@@ -91,19 +102,23 @@ __all__ = (
91
102
  "set_preferences",
92
103
  "set_constraints",
93
104
  "set_execution_preferences",
105
+ "update_preferences",
106
+ "update_constraints",
107
+ "update_execution_preferences",
94
108
  "set_quantum_program_execution_preferences",
95
109
  "show",
96
- "Pauli",
110
+ "hamiltonian_to_matrix",
111
+ "matrix_to_hamiltonian",
112
+ "quantum_program_from_qasm",
113
+ "quantum_program_from_qasm_async",
97
114
  ]
98
- + _qregs_all
99
- + _qfuncs_all
100
115
  + _md_all
101
- + _ifunc_all
102
116
  + _sub_modules
103
117
  + _application_constructors_all
104
118
  + _qmod_all
119
+ + _open_library_all
105
120
  )
106
121
 
107
122
 
108
- def __dir__() -> List[str]:
123
+ def __dir__() -> list[str]:
109
124
  return __all__
@@ -1,6 +1,7 @@
1
1
  import asyncio
2
+ from collections.abc import Awaitable
2
3
  from functools import wraps
3
- from typing import TYPE_CHECKING, Awaitable, Callable
4
+ from typing import TYPE_CHECKING, Callable
4
5
 
5
6
  from ipywidgets import widgets # type: ignore[import]
6
7
 
@@ -1,39 +1,39 @@
1
1
  import json
2
- from typing import Dict, Optional, Protocol, Type, TypeVar
2
+ from typing import Any, Optional, Protocol, TypeVar
3
3
 
4
+ import httpx
4
5
  import pydantic
5
6
 
6
7
  import classiq.interface.executor.execution_result
7
8
  import classiq.interface.pyomo_extension
8
9
  from classiq.interface.analyzer import analysis_params, result as analysis_result
9
10
  from classiq.interface.analyzer.analysis_params import AnalysisRBParams
11
+ from classiq.interface.analyzer.result import GraphStatus
10
12
  from classiq.interface.chemistry import ground_state_problem, operator
13
+ from classiq.interface.enum_utils import StrEnum
14
+ from classiq.interface.exceptions import ClassiqAPIError, ClassiqValueError
15
+ from classiq.interface.execution.iqcc import (
16
+ IQCCInitAuthData,
17
+ IQCCInitAuthResponse,
18
+ IQCCProbeAuthData,
19
+ IQCCProbeAuthResponse,
20
+ )
11
21
  from classiq.interface.execution.jobs import (
12
22
  ExecutionJobDetailsV1,
13
23
  ExecutionJobsQueryResultsV1,
14
24
  )
15
- from classiq.interface.executor import execution_request, result as execute_result
25
+ from classiq.interface.execution.primitives import PrimitivesInput
26
+ from classiq.interface.executor import execution_request
16
27
  from classiq.interface.generator import quantum_program as generator_result
17
- from classiq.interface.jobs import (
18
- JobDescriptionBase,
19
- JobDescriptionFailure,
20
- JobDescriptionSuccess,
21
- JobID,
22
- JSONObject,
23
- )
24
- from classiq.interface.model.common_model_types import ModelInput
28
+ from classiq.interface.hardware import HardwareInformation, Provider
29
+ from classiq.interface.jobs import JobDescription, JobID, JSONObject
30
+ from classiq.interface.model.model import Model
25
31
  from classiq.interface.server import routes
26
32
 
27
33
  from classiq._internals.client import client
28
- from classiq._internals.enum_utils import StrEnum
29
34
  from classiq._internals.jobs import JobPoller
30
- from classiq.exceptions import ClassiqAPIError, ClassiqValueError
31
35
 
32
36
  ResultType = TypeVar("ResultType", bound=pydantic.BaseModel)
33
- CLASSIQ_ACCEPT_HEADER = "X-Classiq-Accept-Version"
34
-
35
- _ACCEPT_HEADER = "X-Classiq-Accept-Version"
36
- _CONTENT_TYPE_HEADER = "X-Classiq-Content-Type-Version"
37
37
 
38
38
 
39
39
  class HTTPMethod(StrEnum):
@@ -41,6 +41,7 @@ class HTTPMethod(StrEnum):
41
41
  GET = "GET"
42
42
  POST = "POST"
43
43
  PATCH = "PATCH"
44
+ PUT = "PUT"
44
45
 
45
46
 
46
47
  class StatusType(Protocol):
@@ -48,13 +49,13 @@ class StatusType(Protocol):
48
49
 
49
50
 
50
51
  def _parse_job_response(
51
- job_result: JobDescriptionBase[JSONObject],
52
- output_type: Type[ResultType],
52
+ job_result: JobDescription[JSONObject],
53
+ output_type: type[ResultType],
53
54
  ) -> ResultType:
54
- if isinstance(job_result, JobDescriptionSuccess):
55
- return output_type.parse_obj(job_result.description)
56
- if isinstance(job_result, JobDescriptionFailure):
57
- raise ClassiqAPIError(job_result.description.details)
55
+ if job_result.result is not None:
56
+ return output_type.model_validate(job_result.result)
57
+ if job_result.failure_details:
58
+ raise ClassiqAPIError(job_result.failure_details)
58
59
 
59
60
  raise ClassiqAPIError("Unexpected response from server")
60
61
 
@@ -67,13 +68,18 @@ class ApiWrapper:
67
68
  url: str,
68
69
  model: pydantic.BaseModel,
69
70
  use_versioned_url: bool = True,
71
+ http_client: Optional[httpx.AsyncClient] = None,
70
72
  ) -> dict:
71
73
  # TODO: we can't use model.dict() - it doesn't serialize complex class.
72
74
  # This was added because JSON serializer doesn't serialize complex type, and pydantic does.
73
75
  # We should add support for smarter json serialization.
74
- body = json.loads(model.json())
76
+ body = json.loads(model.model_dump_json())
75
77
  return await cls._call_task(
76
- http_method, url, body, use_versioned_url=use_versioned_url
78
+ http_method,
79
+ url,
80
+ body,
81
+ use_versioned_url=use_versioned_url,
82
+ http_client=http_client,
77
83
  )
78
84
 
79
85
  @classmethod
@@ -81,80 +87,121 @@ class ApiWrapper:
81
87
  cls,
82
88
  http_method: str,
83
89
  url: str,
84
- body: Optional[Dict] = None,
85
- params: Optional[Dict] = None,
90
+ body: Optional[dict] = None,
91
+ params: Optional[dict] = None,
86
92
  use_versioned_url: bool = True,
87
- headers: Optional[Dict[str, str]] = None,
93
+ headers: Optional[dict[str, str]] = None,
94
+ allow_none: bool = False,
95
+ http_client: Optional[httpx.AsyncClient] = None,
88
96
  ) -> dict:
89
- res = await client().call_api(
97
+ res: Any = await client().call_api(
90
98
  http_method=http_method,
91
99
  url=url,
92
100
  body=body,
93
101
  headers=headers,
94
102
  params=params,
95
103
  use_versioned_url=use_versioned_url,
104
+ http_client=http_client,
96
105
  )
106
+ if allow_none and res is None:
107
+ return {}
97
108
  if not isinstance(res, dict):
98
109
  raise ClassiqValueError(f"Unexpected returned value: {res}")
99
110
  return res
100
111
 
101
112
  @classmethod
102
113
  async def call_generation_task(
103
- cls, model: ModelInput
114
+ cls,
115
+ model: Model,
116
+ http_client: Optional[httpx.AsyncClient] = None,
104
117
  ) -> generator_result.QuantumProgram:
105
118
  poller = JobPoller(base_url=routes.TASKS_GENERATE_FULL_PATH)
106
- result = await poller.run_pydantic(model, timeout_sec=None)
119
+ result = await poller.run_pydantic(
120
+ model, timeout_sec=None, http_client=http_client
121
+ )
107
122
  return _parse_job_response(result, generator_result.QuantumProgram)
108
123
 
109
124
  @classmethod
110
- async def call_execute_generated_circuit(
111
- cls, circuit: generator_result.QuantumProgram
125
+ async def call_create_execution_session(
126
+ cls,
127
+ circuit: generator_result.QuantumProgram,
128
+ http_client: Optional[httpx.AsyncClient] = None,
129
+ ) -> str:
130
+ raw_result = await cls._call_task_pydantic(
131
+ http_method=HTTPMethod.POST,
132
+ url=routes.EXECUTION_SESSIONS_PREFIX,
133
+ model=circuit,
134
+ http_client=http_client,
135
+ )
136
+ return raw_result["id"]
137
+
138
+ @classmethod
139
+ async def call_create_session_job(
140
+ cls,
141
+ session_id: str,
142
+ primitives_input: PrimitivesInput,
143
+ http_client: Optional[httpx.AsyncClient] = None,
112
144
  ) -> execution_request.ExecutionJobDetails:
113
- execution_input = await cls._call_task_pydantic(
145
+ data = await cls._call_task_pydantic(
146
+ http_method=HTTPMethod.POST,
147
+ url=routes.EXECUTION_SESSIONS_PREFIX + f"/{session_id}",
148
+ model=primitives_input,
149
+ http_client=http_client,
150
+ )
151
+ return execution_request.ExecutionJobDetails.model_validate(data)
152
+
153
+ @classmethod
154
+ async def call_convert_quantum_program(
155
+ cls,
156
+ circuit: generator_result.QuantumProgram,
157
+ http_client: Optional[httpx.AsyncClient] = None,
158
+ ) -> dict:
159
+ return await cls._call_task_pydantic(
114
160
  http_method=HTTPMethod.POST,
115
161
  url=routes.CONVERSION_GENERATED_CIRCUIT_TO_EXECUTION_INPUT_FULL,
116
162
  model=circuit,
163
+ http_client=http_client,
117
164
  )
118
- headers = {
119
- _ACCEPT_HEADER: "v1",
120
- _CONTENT_TYPE_HEADER: execution_input["version"],
121
- }
165
+
166
+ @classmethod
167
+ async def call_execute_execution_input(
168
+ cls,
169
+ execution_input: dict,
170
+ http_client: Optional[httpx.AsyncClient] = None,
171
+ ) -> execution_request.ExecutionJobDetails:
122
172
  data = await cls._call_task(
123
173
  http_method=HTTPMethod.POST,
124
- headers=headers,
125
- url=routes.EXECUTION_JOBS_NON_VERSIONED_FULL_PATH,
174
+ url=routes.EXECUTION_JOBS_FULL_PATH,
126
175
  body=execution_input,
127
- use_versioned_url=False,
176
+ http_client=http_client,
128
177
  )
129
- return execution_request.ExecutionJobDetails.parse_obj(data)
178
+ return execution_request.ExecutionJobDetails.model_validate(data)
130
179
 
131
180
  @classmethod
132
181
  async def call_get_execution_job_details(
133
182
  cls,
134
183
  job_id: JobID,
184
+ http_client: Optional[httpx.AsyncClient] = None,
135
185
  ) -> execution_request.ExecutionJobDetails:
136
- headers = {_ACCEPT_HEADER: "v1"}
137
186
  data = await cls._call_task(
138
187
  http_method=HTTPMethod.GET,
139
- headers=headers,
140
- url=f"{routes.EXECUTION_JOBS_NON_VERSIONED_FULL_PATH}/{job_id.job_id}",
141
- use_versioned_url=False,
188
+ url=f"{routes.EXECUTION_JOBS_FULL_PATH}/{job_id.job_id}",
189
+ http_client=http_client,
142
190
  )
143
- return execution_request.ExecutionJobDetails.parse_obj(data)
191
+ return execution_request.ExecutionJobDetails.model_validate(data)
144
192
 
145
193
  @classmethod
146
194
  async def call_get_execution_job_result(
147
195
  cls,
148
196
  job_id: JobID,
149
- version: str,
197
+ http_client: Optional[httpx.AsyncClient] = None,
150
198
  ) -> classiq.interface.executor.execution_result.ExecuteGeneratedCircuitResults:
151
199
  data = await cls._call_task(
152
200
  http_method=HTTPMethod.GET,
153
- url=f"{routes.EXECUTION_JOBS_NON_VERSIONED_FULL_PATH}/{job_id.job_id}/result",
154
- use_versioned_url=False,
155
- headers={CLASSIQ_ACCEPT_HEADER: version},
201
+ url=f"{routes.EXECUTION_JOBS_FULL_PATH}/{job_id.job_id}/result",
202
+ http_client=http_client,
156
203
  )
157
- return classiq.interface.executor.execution_result.ExecuteGeneratedCircuitResults.parse_obj(
204
+ return classiq.interface.executor.execution_result.ExecuteGeneratedCircuitResults.model_validate(
158
205
  data
159
206
  )
160
207
 
@@ -163,147 +210,238 @@ class ApiWrapper:
163
210
  cls,
164
211
  job_id: JobID,
165
212
  name: str,
213
+ http_client: Optional[httpx.AsyncClient] = None,
166
214
  ) -> ExecutionJobDetailsV1:
167
215
  data = await cls._call_task(
168
216
  http_method=HTTPMethod.PATCH,
169
- url=f"{routes.EXECUTION_JOBS_NON_VERSIONED_FULL_PATH}/{job_id.job_id}",
217
+ url=f"{routes.EXECUTION_JOBS_FULL_PATH}/{job_id.job_id}",
170
218
  params={
171
219
  "name": name,
172
220
  },
173
- use_versioned_url=False,
221
+ http_client=http_client,
222
+ )
223
+ return ExecutionJobDetailsV1.model_validate(data)
224
+
225
+ @classmethod
226
+ async def call_cancel_execution_job(
227
+ cls,
228
+ job_id: JobID,
229
+ http_client: Optional[httpx.AsyncClient] = None,
230
+ ) -> None:
231
+ await cls._call_task(
232
+ http_method=HTTPMethod.PUT,
233
+ url=f"{routes.EXECUTION_JOBS_FULL_PATH}/{job_id.job_id}/cancel",
234
+ allow_none=True,
235
+ http_client=http_client,
174
236
  )
175
- return ExecutionJobDetailsV1.parse_obj(data)
176
237
 
177
238
  @classmethod
178
239
  async def call_query_execution_jobs(
179
240
  cls,
180
241
  offset: int,
181
242
  limit: int,
243
+ http_client: Optional[httpx.AsyncClient] = None,
182
244
  ) -> ExecutionJobsQueryResultsV1:
183
245
  data = await cls._call_task(
184
246
  http_method=HTTPMethod.GET,
185
- url=f"{routes.EXECUTION_JOBS_NON_VERSIONED_FULL_PATH}",
247
+ url=f"{routes.EXECUTION_JOBS_FULL_PATH}",
186
248
  params={
187
249
  "offset": offset,
188
250
  "limit": limit,
189
251
  },
190
- use_versioned_url=False,
252
+ http_client=http_client,
191
253
  )
192
- return ExecutionJobsQueryResultsV1.parse_obj(data)
193
-
194
- @classmethod
195
- async def call_execute_estimate(
196
- cls, request: execution_request.ExecutionRequest
197
- ) -> execute_result.EstimationResults:
198
- poller = JobPoller(base_url=routes.EXECUTE_ESTIMATE_FULL_PATH)
199
- result = await poller.run_pydantic(request, timeout_sec=None)
200
- return _parse_job_response(result, execute_result.EstimationResults)
201
-
202
- @classmethod
203
- async def call_execute_quantum_program(
204
- cls, request: execution_request.ExecutionRequest
205
- ) -> execute_result.MultipleExecutionDetails:
206
- poller = JobPoller(
207
- base_url=routes.EXECUTE_QUANTUM_PROGRAM_FULL_PATH,
208
- )
209
- result = await poller.run_pydantic(request, timeout_sec=None)
210
- return _parse_job_response(result, execute_result.MultipleExecutionDetails)
254
+ return ExecutionJobsQueryResultsV1.model_validate(data)
211
255
 
212
256
  @classmethod
213
257
  async def call_analysis_task(
214
- cls, params: analysis_params.AnalysisParams
258
+ cls,
259
+ params: analysis_params.AnalysisParams,
260
+ http_client: Optional[httpx.AsyncClient] = None,
215
261
  ) -> analysis_result.Analysis:
216
262
  data = await cls._call_task_pydantic(
217
263
  http_method=HTTPMethod.POST,
218
264
  url=routes.ANALYZER_FULL_PATH,
219
265
  model=params,
266
+ http_client=http_client,
220
267
  )
221
268
 
222
- return analysis_result.Analysis.parse_obj(data)
269
+ return analysis_result.Analysis.model_validate(data)
223
270
 
224
271
  @classmethod
225
272
  async def call_analyzer_app(
226
- cls, params: generator_result.QuantumProgram
273
+ cls,
274
+ params: generator_result.QuantumProgram,
275
+ http_client: Optional[httpx.AsyncClient] = None,
227
276
  ) -> analysis_result.DataID:
228
277
  data = await cls._call_task_pydantic(
229
278
  http_method=HTTPMethod.POST,
230
279
  url=routes.ANALYZER_DATA_FULL_PATH,
231
280
  model=params,
281
+ http_client=http_client,
232
282
  )
233
- return analysis_result.DataID.parse_obj(data)
283
+ return analysis_result.DataID.model_validate(data)
234
284
 
235
285
  @classmethod
236
286
  async def get_generated_circuit_from_qasm(
237
- cls, params: analysis_result.QasmCode
287
+ cls,
288
+ params: analysis_result.QasmCode,
289
+ http_client: Optional[httpx.AsyncClient] = None,
238
290
  ) -> generator_result.QuantumProgram:
239
291
  data = await cls._call_task_pydantic(
240
292
  http_method=HTTPMethod.POST,
241
293
  url=routes.IDE_QASM_FULL_PATH,
242
294
  model=params,
295
+ http_client=http_client,
243
296
  )
244
- return generator_result.QuantumProgram.parse_obj(data)
297
+ return generator_result.QuantumProgram.model_validate(data)
245
298
 
246
299
  @classmethod
247
300
  async def get_analyzer_app_data(
248
- cls, params: analysis_result.DataID
301
+ cls,
302
+ params: analysis_result.DataID,
303
+ http_client: Optional[httpx.AsyncClient] = None,
249
304
  ) -> generator_result.QuantumProgram:
250
305
  data = await cls._call_task(
251
306
  http_method=HTTPMethod.GET,
252
307
  url=f"{routes.ANALYZER_DATA_FULL_PATH}/{params.id}",
308
+ http_client=http_client,
253
309
  )
254
- return generator_result.QuantumProgram.parse_obj(data)
310
+ return generator_result.QuantumProgram.model_validate(data)
255
311
 
256
312
  @classmethod
257
313
  async def call_rb_analysis_task(
258
- cls, params: AnalysisRBParams
314
+ cls,
315
+ params: AnalysisRBParams,
316
+ http_client: Optional[httpx.AsyncClient] = None,
259
317
  ) -> analysis_result.RbResults:
260
318
  data = await cls._call_task(
261
319
  http_method=HTTPMethod.POST,
262
320
  url=routes.ANALYZER_RB_FULL_PATH,
263
- body=params.dict(),
321
+ body=params.model_dump(),
322
+ http_client=http_client,
264
323
  )
265
324
 
266
- return analysis_result.RbResults.parse_obj(data)
325
+ return analysis_result.RbResults.model_validate(data)
267
326
 
268
327
  @classmethod
269
328
  async def call_hardware_connectivity_task(
270
- cls, params: analysis_params.AnalysisHardwareParams
329
+ cls,
330
+ params: analysis_params.AnalysisHardwareParams,
331
+ http_client: Optional[httpx.AsyncClient] = None,
271
332
  ) -> analysis_result.GraphResult:
272
333
  data = await cls._call_task_pydantic(
273
334
  http_method=HTTPMethod.POST,
274
335
  url=routes.ANALYZER_HC_GRAPH_FULL_PATH,
275
336
  model=params,
337
+ http_client=http_client,
276
338
  )
277
- return analysis_result.GraphResult.parse_obj(data)
339
+ return analysis_result.GraphResult.model_validate(data)
278
340
 
279
341
  @classmethod
280
342
  async def call_table_graphs_task(
281
343
  cls,
282
344
  params: analysis_params.AnalysisHardwareListParams,
345
+ http_client: Optional[httpx.AsyncClient] = None,
283
346
  ) -> analysis_result.GraphResult:
284
347
  poller = JobPoller(base_url=routes.ANALYZER_HC_TABLE_GRAPH_FULL_PATH)
285
- result = await poller.run_pydantic(params, timeout_sec=None)
348
+ result = await poller.run_pydantic(
349
+ params, timeout_sec=None, http_client=http_client
350
+ )
286
351
  return _parse_job_response(result, analysis_result.GraphResult)
287
352
 
288
353
  @classmethod
289
354
  async def call_available_devices_task(
290
355
  cls,
291
356
  params: analysis_params.AnalysisOptionalDevicesParams,
357
+ http_client: Optional[httpx.AsyncClient] = None,
292
358
  ) -> analysis_result.DevicesResult:
293
- data = await cls._call_task(
294
- http_method=HTTPMethod.POST,
295
- url=routes.ANALYZER_OPTIONAL_DEVICES_FULL_PATH,
296
- body=params.dict(),
359
+ hardware_info = await cls.call_get_all_hardware_devices(http_client=http_client)
360
+ return cls._get_devices_from_hardware_info(hardware_info, params)
361
+
362
+ @staticmethod
363
+ def _get_devices_from_hardware_info(
364
+ hardware_info: list[HardwareInformation],
365
+ params: analysis_params.AnalysisOptionalDevicesParams,
366
+ ) -> analysis_result.DevicesResult:
367
+ available_hardware: dict[Provider, dict[str, bool]] = {
368
+ Provider.IBM_QUANTUM: {},
369
+ Provider.AMAZON_BRAKET: {},
370
+ Provider.AZURE_QUANTUM: {},
371
+ }
372
+ for info in hardware_info:
373
+ if info.provider not in available_hardware:
374
+ continue
375
+ is_available = info.number_of_qubits >= params.qubit_count
376
+ available_hardware[info.provider][info.display_name] = is_available
377
+ return analysis_result.DevicesResult(
378
+ devices=analysis_result.AvailableHardware(
379
+ ibm_quantum=available_hardware[Provider.IBM_QUANTUM],
380
+ azure_quantum=available_hardware[Provider.AZURE_QUANTUM],
381
+ amazon_braket=available_hardware[Provider.AMAZON_BRAKET],
382
+ ),
383
+ status=GraphStatus.SUCCESS,
297
384
  )
298
- return analysis_result.DevicesResult.parse_obj(data)
385
+
386
+ @classmethod
387
+ async def call_get_all_hardware_devices(
388
+ cls,
389
+ http_client: Optional[httpx.AsyncClient] = None,
390
+ ) -> list[HardwareInformation]:
391
+ data = await client().call_api(
392
+ http_method=HTTPMethod.GET,
393
+ url="/hardware-catalog/v1/hardwares",
394
+ use_versioned_url=False,
395
+ http_client=http_client,
396
+ )
397
+ if not isinstance(data, list):
398
+ raise ClassiqAPIError(f"Unexpected value: {data}")
399
+ return [HardwareInformation.model_validate(info) for info in data]
299
400
 
300
401
  @classmethod
301
402
  async def call_generate_hamiltonian_task(
302
- cls, problem: ground_state_problem.CHEMISTRY_PROBLEMS_TYPE
403
+ cls,
404
+ problem: ground_state_problem.CHEMISTRY_PROBLEMS_TYPE,
405
+ http_client: Optional[httpx.AsyncClient] = None,
303
406
  ) -> operator.PauliOperator:
304
407
  poller = JobPoller(
305
408
  base_url=routes.GENERATE_HAMILTONIAN_FULL_PATH,
306
- use_versioned_url=False,
307
409
  )
308
- result = await poller.run_pydantic(problem, timeout_sec=None)
410
+ result = await poller.run_pydantic(
411
+ problem, timeout_sec=None, http_client=http_client
412
+ )
309
413
  return _parse_job_response(result, operator.PauliOperator)
414
+
415
+ @classmethod
416
+ async def call_iqcc_init_auth(
417
+ cls,
418
+ data: IQCCInitAuthData,
419
+ http_client: Optional[httpx.AsyncClient] = None,
420
+ ) -> IQCCInitAuthResponse:
421
+ response = await cls._call_task_pydantic(
422
+ http_method=HTTPMethod.PUT,
423
+ url=f"{routes.IQCC_INIT_AUTH_FULL_PATH}",
424
+ model=data,
425
+ http_client=http_client,
426
+ )
427
+ return IQCCInitAuthResponse.model_validate(response)
428
+
429
+ @classmethod
430
+ async def call_iqcc_probe_auth(
431
+ cls,
432
+ data: IQCCProbeAuthData,
433
+ http_client: Optional[httpx.AsyncClient] = None,
434
+ ) -> Optional[IQCCProbeAuthResponse]:
435
+ try:
436
+ response = await cls._call_task_pydantic(
437
+ http_method=HTTPMethod.PUT,
438
+ url=f"{routes.IQCC_PROBE_AUTH_FULL_PATH}",
439
+ model=data,
440
+ http_client=http_client,
441
+ )
442
+ except ClassiqAPIError as ex:
443
+ if ex.status_code == 418:
444
+ return None
445
+ raise
446
+
447
+ return IQCCProbeAuthResponse.model_validate(response)