classiq 0.37.1__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 (516) hide show
  1. classiq/__init__.py +49 -34
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +3 -2
  3. classiq/_analyzer_extras/interactive_hardware.py +3 -3
  4. classiq/_internals/api_wrapper.py +241 -95
  5. classiq/_internals/async_utils.py +2 -77
  6. classiq/_internals/authentication/auth0.py +26 -10
  7. classiq/_internals/authentication/authentication.py +11 -0
  8. classiq/_internals/authentication/device.py +18 -8
  9. classiq/_internals/authentication/password_manager.py +40 -13
  10. classiq/_internals/authentication/token_manager.py +11 -6
  11. classiq/_internals/client.py +106 -37
  12. classiq/_internals/config.py +3 -4
  13. classiq/_internals/host_checker.py +38 -15
  14. classiq/_internals/jobs.py +56 -50
  15. classiq/_internals/type_validation.py +9 -9
  16. classiq/analyzer/__init__.py +1 -3
  17. classiq/analyzer/analyzer.py +50 -47
  18. classiq/analyzer/analyzer_utilities.py +15 -15
  19. classiq/analyzer/rb.py +19 -20
  20. classiq/analyzer/show_interactive_hack.py +30 -7
  21. classiq/analyzer/url_utils.py +2 -3
  22. classiq/applications/__init__.py +3 -12
  23. classiq/applications/chemistry/__init__.py +14 -10
  24. classiq/applications/chemistry/ansatz_parameters.py +4 -4
  25. classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +170 -170
  26. classiq/applications/chemistry/ground_state_problem.py +1 -1
  27. classiq/applications/combinatorial_helpers/allowed_constraints.py +23 -0
  28. classiq/applications/combinatorial_helpers/arithmetic/arithmetic_expression.py +35 -0
  29. classiq/applications/combinatorial_helpers/arithmetic/isolation.py +42 -0
  30. classiq/applications/combinatorial_helpers/combinatorial_problem_utils.py +166 -0
  31. classiq/applications/combinatorial_helpers/encoding_mapping.py +107 -0
  32. classiq/applications/combinatorial_helpers/encoding_utils.py +124 -0
  33. classiq/applications/combinatorial_helpers/memory.py +75 -0
  34. classiq/applications/combinatorial_helpers/optimization_model.py +193 -0
  35. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +31 -0
  36. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
  37. classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
  38. classiq/applications/combinatorial_helpers/sympy_utils.py +22 -0
  39. classiq/applications/combinatorial_helpers/transformations/encoding.py +189 -0
  40. classiq/applications/combinatorial_helpers/transformations/fixed_variables.py +143 -0
  41. classiq/applications/combinatorial_helpers/transformations/ising_converter.py +120 -0
  42. classiq/applications/combinatorial_helpers/transformations/penalty.py +31 -0
  43. classiq/applications/combinatorial_helpers/transformations/penalty_support.py +37 -0
  44. classiq/applications/combinatorial_helpers/transformations/sign_seperation.py +74 -0
  45. classiq/applications/combinatorial_helpers/transformations/slack_variables.py +87 -0
  46. classiq/applications/combinatorial_optimization/__init__.py +24 -5
  47. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
  48. classiq/applications/combinatorial_optimization/combinatorial_optimization_model_constructor.py +137 -0
  49. classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
  50. classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
  51. classiq/applications/finance/__init__.py +4 -5
  52. classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +50 -57
  53. classiq/applications/grover/__init__.py +9 -0
  54. classiq/applications/grover/grover_model_constructor.py +157 -0
  55. classiq/applications/hamiltonian/__init__.py +0 -0
  56. classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
  57. classiq/applications/libraries/__init__.py +0 -0
  58. classiq/applications/libraries/qmci_library.py +22 -0
  59. classiq/applications/qnn/__init__.py +2 -4
  60. classiq/applications/qnn/circuit_utils.py +8 -8
  61. classiq/applications/qnn/datasets/__init__.py +9 -11
  62. classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
  63. classiq/applications/qnn/datasets/dataset_not.py +2 -1
  64. classiq/applications/qnn/datasets/dataset_parity.py +2 -2
  65. classiq/applications/qnn/gradients/quantum_gradient.py +2 -2
  66. classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
  67. classiq/applications/qnn/qlayer.py +30 -10
  68. classiq/applications/qnn/torch_utils.py +4 -3
  69. classiq/applications/qnn/types.py +7 -7
  70. classiq/applications/qsvm/__init__.py +6 -4
  71. classiq/applications/qsvm/qsvm.py +4 -10
  72. classiq/applications/qsvm/qsvm_data_generation.py +5 -8
  73. classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
  74. classiq/execution/__init__.py +8 -3
  75. classiq/execution/all_hardware_devices.py +11 -0
  76. classiq/execution/execution_session.py +400 -0
  77. classiq/execution/iqcc.py +63 -0
  78. classiq/execution/jobs.py +197 -25
  79. classiq/execution/qnn.py +79 -0
  80. classiq/executor.py +23 -117
  81. classiq/interface/_version.py +1 -1
  82. classiq/interface/analyzer/analysis_params.py +49 -16
  83. classiq/interface/analyzer/cytoscape_graph.py +15 -9
  84. classiq/interface/analyzer/result.py +36 -32
  85. classiq/interface/applications/qsvm.py +28 -25
  86. classiq/interface/ast_node.py +16 -0
  87. classiq/interface/backend/backend_preferences.py +390 -119
  88. classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
  89. classiq/interface/backend/pydantic_backend.py +27 -22
  90. classiq/interface/backend/quantum_backend_providers.py +70 -16
  91. classiq/interface/chemistry/fermionic_operator.py +43 -32
  92. classiq/interface/chemistry/ground_state_problem.py +42 -24
  93. classiq/interface/chemistry/molecule.py +20 -14
  94. classiq/interface/chemistry/operator.py +75 -236
  95. classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
  96. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +2 -4
  97. classiq/interface/combinatorial_optimization/examples/greater_than_ilp.py +1 -1
  98. classiq/interface/combinatorial_optimization/examples/ilp.py +2 -1
  99. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  100. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  101. classiq/interface/combinatorial_optimization/examples/mds.py +2 -1
  102. classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
  103. classiq/interface/combinatorial_optimization/examples/mis.py +4 -1
  104. classiq/interface/combinatorial_optimization/examples/mvc.py +2 -1
  105. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  106. classiq/interface/combinatorial_optimization/examples/set_cover.py +3 -3
  107. classiq/interface/combinatorial_optimization/examples/tsp.py +4 -3
  108. classiq/interface/combinatorial_optimization/examples/tsp_digraph.py +6 -2
  109. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +14 -9
  110. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  111. classiq/interface/combinatorial_optimization/result.py +1 -3
  112. classiq/interface/combinatorial_optimization/solver_types.py +1 -1
  113. classiq/interface/debug_info/__init__.py +0 -0
  114. classiq/interface/debug_info/debug_info.py +86 -0
  115. classiq/interface/exceptions.py +201 -0
  116. classiq/interface/execution/iqcc.py +19 -0
  117. classiq/interface/execution/jobs.py +15 -12
  118. classiq/interface/execution/primitives.py +18 -0
  119. classiq/interface/executor/constants.py +1 -0
  120. classiq/interface/executor/estimation.py +2 -2
  121. classiq/interface/executor/execution_preferences.py +26 -143
  122. classiq/interface/executor/execution_request.py +36 -56
  123. classiq/interface/executor/execution_result.py +30 -8
  124. classiq/interface/executor/iqae_result.py +4 -6
  125. classiq/interface/executor/optimizer_preferences.py +34 -22
  126. classiq/interface/executor/{quantum_program.py → quantum_code.py} +44 -34
  127. classiq/interface/executor/quantum_instruction_set.py +3 -2
  128. classiq/interface/executor/register_initialization.py +12 -17
  129. classiq/interface/executor/result.py +122 -64
  130. classiq/interface/executor/vqe_result.py +11 -11
  131. classiq/interface/finance/function_input.py +42 -19
  132. classiq/interface/finance/gaussian_model_input.py +7 -5
  133. classiq/interface/finance/log_normal_model_input.py +6 -4
  134. classiq/interface/finance/model_input.py +6 -4
  135. classiq/interface/generator/adjacency.py +1 -3
  136. classiq/interface/generator/amplitude_loading.py +27 -14
  137. classiq/interface/generator/ansatz_library.py +5 -5
  138. classiq/interface/generator/application_apis/__init__.py +1 -0
  139. classiq/interface/generator/application_apis/arithmetic_declarations.py +17 -0
  140. classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
  141. classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
  142. classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
  143. classiq/interface/generator/application_apis/finance_declarations.py +48 -69
  144. classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
  145. classiq/interface/generator/arith/argument_utils.py +57 -6
  146. classiq/interface/generator/arith/arithmetic.py +37 -16
  147. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +15 -17
  148. classiq/interface/generator/arith/arithmetic_expression_abc.py +70 -26
  149. classiq/interface/generator/arith/arithmetic_expression_parser.py +18 -12
  150. classiq/interface/generator/arith/arithmetic_expression_validator.py +61 -43
  151. classiq/interface/generator/arith/arithmetic_operations.py +19 -16
  152. classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
  153. classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
  154. classiq/interface/generator/arith/ast_node_rewrite.py +4 -3
  155. classiq/interface/generator/arith/binary_ops.py +375 -139
  156. classiq/interface/generator/arith/endianness.py +1 -1
  157. classiq/interface/generator/arith/extremum_operations.py +96 -23
  158. classiq/interface/generator/arith/logical_ops.py +16 -12
  159. classiq/interface/generator/arith/machine_precision.py +3 -0
  160. classiq/interface/generator/arith/number_utils.py +44 -48
  161. classiq/interface/generator/arith/register_user_input.py +70 -27
  162. classiq/interface/generator/arith/unary_ops.py +57 -46
  163. classiq/interface/generator/arith/uncomputation_methods.py +1 -1
  164. classiq/interface/generator/builtin_api_builder.py +2 -9
  165. classiq/interface/generator/chemistry_function_params.py +5 -5
  166. classiq/interface/generator/circuit_code/circuit_code.py +7 -7
  167. classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
  168. classiq/interface/generator/commuting_pauli_exponentiation.py +8 -6
  169. classiq/interface/generator/compiler_keywords.py +8 -0
  170. classiq/interface/generator/complex_type.py +13 -25
  171. classiq/interface/generator/constant.py +3 -4
  172. classiq/interface/generator/control_state.py +35 -28
  173. classiq/interface/generator/copy.py +47 -0
  174. classiq/interface/generator/custom_ansatz.py +2 -5
  175. classiq/interface/generator/distance.py +3 -5
  176. classiq/interface/generator/excitations.py +3 -2
  177. classiq/interface/generator/expressions/atomic_expression_functions.py +26 -8
  178. classiq/interface/generator/expressions/enums/__init__.py +0 -10
  179. classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
  180. classiq/interface/generator/expressions/evaluated_expression.py +21 -7
  181. classiq/interface/generator/expressions/expression.py +27 -15
  182. classiq/interface/generator/expressions/expression_constants.py +9 -3
  183. classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
  184. classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
  185. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +59 -0
  186. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
  187. classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
  188. classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
  189. classiq/interface/generator/expressions/sympy_supported_expressions.py +20 -11
  190. classiq/interface/generator/finance.py +3 -3
  191. classiq/interface/generator/function_param_library.py +6 -6
  192. classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
  193. classiq/interface/generator/function_params.py +42 -69
  194. classiq/interface/generator/functions/__init__.py +0 -22
  195. classiq/interface/generator/functions/builtins/__init__.py +0 -0
  196. classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
  197. classiq/interface/generator/functions/classical_function_declaration.py +18 -9
  198. classiq/interface/generator/functions/classical_type.py +47 -166
  199. classiq/interface/generator/functions/concrete_types.py +55 -0
  200. classiq/interface/generator/functions/function_declaration.py +13 -14
  201. classiq/interface/generator/functions/port_declaration.py +1 -13
  202. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  203. classiq/interface/generator/functions/type_name.py +90 -0
  204. classiq/interface/generator/generated_circuit_data.py +155 -22
  205. classiq/interface/generator/grover_diffuser.py +32 -25
  206. classiq/interface/generator/grover_operator.py +34 -23
  207. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
  208. classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
  209. classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +12 -8
  210. classiq/interface/generator/hardware/hardware_data.py +76 -36
  211. classiq/interface/generator/hardware_efficient_ansatz.py +38 -17
  212. classiq/interface/generator/hartree_fock.py +14 -4
  213. classiq/interface/generator/identity.py +10 -6
  214. classiq/interface/generator/linear_pauli_rotations.py +33 -19
  215. classiq/interface/generator/mcmt_method.py +1 -1
  216. classiq/interface/generator/mcu.py +20 -16
  217. classiq/interface/generator/mcx.py +29 -20
  218. classiq/interface/generator/model/__init__.py +2 -5
  219. classiq/interface/generator/model/constraints.py +27 -8
  220. classiq/interface/generator/model/model.py +32 -203
  221. classiq/interface/generator/model/preferences/preferences.py +118 -43
  222. classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +27 -22
  223. classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
  224. classiq/interface/generator/oracles/custom_oracle.py +17 -13
  225. classiq/interface/generator/oracles/oracle_abc.py +9 -9
  226. classiq/interface/generator/partitioned_register.py +7 -7
  227. classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
  228. classiq/interface/generator/preferences/optimization.py +1 -2
  229. classiq/interface/generator/qpe.py +47 -34
  230. classiq/interface/generator/qsvm.py +13 -17
  231. classiq/interface/generator/quantum_function_call.py +107 -87
  232. classiq/interface/generator/{generated_circuit.py → quantum_program.py} +50 -37
  233. classiq/interface/generator/range_types.py +13 -12
  234. classiq/interface/generator/register_role.py +18 -6
  235. classiq/interface/generator/slice_parsing_utils.py +11 -6
  236. classiq/interface/generator/standard_gates/controlled_standard_gates.py +32 -39
  237. classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
  238. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  239. classiq/interface/generator/standard_gates/u_gate.py +7 -10
  240. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  241. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
  242. classiq/interface/generator/state_preparation/distributions.py +16 -15
  243. classiq/interface/generator/state_preparation/metrics.py +5 -7
  244. classiq/interface/generator/state_preparation/state_preparation.py +30 -23
  245. classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
  246. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
  247. classiq/interface/generator/transpiler_basis_gates.py +7 -3
  248. classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
  249. classiq/interface/generator/types/compilation_metadata.py +6 -0
  250. classiq/interface/generator/types/enum_declaration.py +54 -0
  251. classiq/interface/generator/types/qstruct_declaration.py +18 -0
  252. classiq/interface/generator/types/struct_declaration.py +15 -14
  253. classiq/interface/generator/ucc.py +9 -6
  254. classiq/interface/generator/unitary_gate.py +10 -6
  255. classiq/interface/generator/user_defined_function_params.py +4 -1
  256. classiq/interface/generator/validations/flow_graph.py +11 -9
  257. classiq/interface/generator/validations/validator_functions.py +8 -6
  258. classiq/interface/generator/visitor.py +23 -16
  259. classiq/interface/hardware.py +31 -10
  260. classiq/interface/helpers/classproperty.py +8 -0
  261. classiq/interface/helpers/custom_encoders.py +3 -0
  262. classiq/interface/helpers/custom_pydantic_types.py +40 -50
  263. classiq/interface/helpers/datastructures.py +26 -0
  264. classiq/interface/helpers/hashable_mixin.py +3 -2
  265. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  266. classiq/interface/helpers/pydantic_model_helpers.py +7 -11
  267. classiq/interface/helpers/validation_helpers.py +4 -21
  268. classiq/interface/helpers/versioned_model.py +1 -1
  269. classiq/interface/ide/ide_data.py +16 -20
  270. classiq/interface/ide/visual_model.py +130 -0
  271. classiq/interface/interface_version.py +1 -0
  272. classiq/interface/jobs.py +35 -6
  273. classiq/interface/model/allocate.py +16 -0
  274. classiq/interface/model/bind_operation.py +44 -14
  275. classiq/interface/model/classical_if.py +15 -0
  276. classiq/interface/model/classical_parameter_declaration.py +33 -3
  277. classiq/interface/model/control.py +45 -0
  278. classiq/interface/model/handle_binding.py +298 -20
  279. classiq/interface/model/inplace_binary_operation.py +31 -26
  280. classiq/interface/model/invert.py +12 -0
  281. classiq/interface/model/model.py +87 -73
  282. classiq/interface/model/native_function_definition.py +16 -21
  283. classiq/interface/model/parameter.py +13 -0
  284. classiq/interface/model/phase_operation.py +11 -0
  285. classiq/interface/model/port_declaration.py +27 -9
  286. classiq/interface/model/power.py +14 -0
  287. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +38 -21
  288. classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
  289. classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
  290. classiq/interface/model/quantum_function_call.py +146 -462
  291. classiq/interface/model/quantum_function_declaration.py +193 -152
  292. classiq/interface/model/quantum_lambda_function.py +65 -0
  293. classiq/interface/model/quantum_statement.py +71 -12
  294. classiq/interface/model/quantum_type.py +205 -67
  295. classiq/interface/model/quantum_variable_declaration.py +4 -26
  296. classiq/interface/model/repeat.py +15 -0
  297. classiq/interface/model/statement_block.py +58 -0
  298. classiq/interface/model/validation_handle.py +13 -6
  299. classiq/interface/model/variable_declaration_statement.py +3 -1
  300. classiq/interface/model/within_apply_operation.py +13 -0
  301. classiq/interface/pyomo_extension/pyomo_sympy_bimap.py +4 -1
  302. classiq/interface/server/global_versions.py +6 -7
  303. classiq/interface/server/routes.py +22 -21
  304. classiq/interface/source_reference.py +59 -0
  305. classiq/model_expansions/__init__.py +0 -0
  306. classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
  307. classiq/model_expansions/capturing/__init__.py +0 -0
  308. classiq/model_expansions/capturing/captured_vars.py +435 -0
  309. classiq/model_expansions/capturing/mangling_utils.py +56 -0
  310. classiq/model_expansions/closure.py +171 -0
  311. classiq/model_expansions/debug_flag.py +3 -0
  312. classiq/model_expansions/evaluators/__init__.py +0 -0
  313. classiq/model_expansions/evaluators/arg_type_match.py +158 -0
  314. classiq/model_expansions/evaluators/argument_types.py +42 -0
  315. classiq/model_expansions/evaluators/classical_expression.py +36 -0
  316. classiq/model_expansions/evaluators/control.py +144 -0
  317. classiq/model_expansions/evaluators/parameter_types.py +226 -0
  318. classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
  319. classiq/model_expansions/evaluators/type_type_match.py +90 -0
  320. classiq/model_expansions/expression_evaluator.py +135 -0
  321. classiq/model_expansions/expression_renamer.py +76 -0
  322. classiq/model_expansions/function_builder.py +247 -0
  323. classiq/model_expansions/generative_functions.py +158 -0
  324. classiq/model_expansions/interpreters/__init__.py +0 -0
  325. classiq/model_expansions/interpreters/base_interpreter.py +263 -0
  326. classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
  327. classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
  328. classiq/model_expansions/model_tables.py +18 -0
  329. classiq/model_expansions/quantum_operations/__init__.py +9 -0
  330. classiq/model_expansions/quantum_operations/bind.py +60 -0
  331. classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
  332. classiq/model_expansions/quantum_operations/classicalif.py +53 -0
  333. classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
  334. classiq/model_expansions/quantum_operations/emitter.py +181 -0
  335. classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
  336. classiq/model_expansions/quantum_operations/repeat.py +56 -0
  337. classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
  338. classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
  339. classiq/model_expansions/scope.py +240 -0
  340. classiq/model_expansions/scope_initialization.py +150 -0
  341. classiq/model_expansions/sympy_conversion/__init__.py +0 -0
  342. classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
  343. classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
  344. classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
  345. classiq/model_expansions/transformers/__init__.py +0 -0
  346. classiq/model_expansions/transformers/ast_renamer.py +26 -0
  347. classiq/model_expansions/transformers/var_splitter.py +299 -0
  348. classiq/model_expansions/utils/__init__.py +0 -0
  349. classiq/model_expansions/utils/counted_name_allocator.py +11 -0
  350. classiq/model_expansions/utils/handles_collector.py +33 -0
  351. classiq/model_expansions/visitors/__init__.py +0 -0
  352. classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
  353. classiq/model_expansions/visitors/variable_references.py +144 -0
  354. classiq/open_library/__init__.py +4 -0
  355. classiq/open_library/functions/__init__.py +130 -0
  356. classiq/open_library/functions/amplitude_estimation.py +30 -0
  357. classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
  358. classiq/open_library/functions/grover.py +157 -0
  359. classiq/open_library/functions/hea.py +115 -0
  360. classiq/open_library/functions/linear_pauli_rotation.py +82 -0
  361. classiq/open_library/functions/modular_exponentiation.py +201 -0
  362. classiq/open_library/functions/qaoa_penalty.py +117 -0
  363. classiq/open_library/functions/qft_functions.py +54 -0
  364. classiq/open_library/functions/qpe.py +46 -0
  365. classiq/open_library/functions/qsvt.py +331 -0
  366. classiq/open_library/functions/state_preparation.py +301 -0
  367. classiq/open_library/functions/swap_test.py +27 -0
  368. classiq/open_library/functions/utility_functions.py +81 -0
  369. classiq/open_library/functions/variational.py +52 -0
  370. classiq/qmod/__init__.py +17 -10
  371. classiq/qmod/builtins/__init__.py +19 -2
  372. classiq/qmod/builtins/classical_execution_primitives.py +60 -47
  373. classiq/qmod/builtins/classical_functions.py +44 -38
  374. classiq/qmod/builtins/constants.py +10 -0
  375. classiq/qmod/builtins/enums.py +208 -0
  376. classiq/qmod/builtins/functions/__init__.py +137 -0
  377. classiq/qmod/builtins/functions/allocation.py +150 -0
  378. classiq/qmod/builtins/functions/arithmetic.py +55 -0
  379. classiq/qmod/builtins/functions/benchmarking.py +8 -0
  380. classiq/qmod/builtins/functions/chemistry.py +91 -0
  381. classiq/qmod/builtins/functions/exponentiation.py +105 -0
  382. classiq/qmod/builtins/functions/finance.py +34 -0
  383. classiq/qmod/builtins/functions/operators.py +16 -0
  384. classiq/qmod/builtins/functions/qsvm.py +24 -0
  385. classiq/qmod/builtins/functions/standard_gates.py +651 -0
  386. classiq/qmod/builtins/operations.py +379 -57
  387. classiq/qmod/builtins/structs.py +103 -80
  388. classiq/qmod/cfunc.py +42 -0
  389. classiq/qmod/classical_function.py +8 -20
  390. classiq/qmod/cparam.py +64 -0
  391. classiq/qmod/create_model_function.py +56 -0
  392. classiq/qmod/declaration_inferrer.py +145 -112
  393. classiq/qmod/expression_query.py +39 -0
  394. classiq/qmod/generative.py +42 -0
  395. classiq/qmod/model_state_container.py +19 -5
  396. classiq/qmod/native/__init__.py +7 -0
  397. classiq/qmod/native/expression_to_qmod.py +194 -0
  398. classiq/qmod/native/pretty_printer.py +401 -0
  399. classiq/qmod/pretty_print/__init__.py +7 -0
  400. classiq/qmod/pretty_print/expression_to_python.py +222 -0
  401. classiq/qmod/pretty_print/pretty_printer.py +572 -0
  402. classiq/qmod/python_classical_type.py +67 -0
  403. classiq/qmod/qfunc.py +79 -0
  404. classiq/qmod/qmod_constant.py +143 -0
  405. classiq/qmod/qmod_parameter.py +84 -53
  406. classiq/qmod/qmod_variable.py +497 -100
  407. classiq/qmod/quantum_callable.py +17 -7
  408. classiq/qmod/quantum_expandable.py +278 -105
  409. classiq/qmod/quantum_function.py +232 -48
  410. classiq/qmod/semantics/__init__.py +0 -0
  411. classiq/qmod/semantics/annotation/__init__.py +0 -0
  412. classiq/qmod/semantics/annotation/call_annotation.py +92 -0
  413. classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
  414. classiq/qmod/semantics/error_manager.py +88 -0
  415. classiq/qmod/semantics/lambdas.py +25 -0
  416. classiq/qmod/semantics/static_semantics_visitor.py +384 -0
  417. classiq/qmod/semantics/validation/__init__.py +0 -0
  418. classiq/qmod/semantics/validation/constants_validation.py +16 -0
  419. classiq/qmod/semantics/validation/func_call_validation.py +99 -0
  420. classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
  421. classiq/qmod/semantics/validation/handle_validation.py +85 -0
  422. classiq/qmod/semantics/validation/main_validation.py +33 -0
  423. classiq/qmod/semantics/validation/types_validation.py +128 -0
  424. classiq/qmod/symbolic.py +178 -111
  425. classiq/qmod/symbolic_expr.py +36 -12
  426. classiq/qmod/symbolic_type.py +2 -5
  427. classiq/qmod/type_attribute_remover.py +32 -0
  428. classiq/qmod/utilities.py +108 -1
  429. classiq/qmod/write_qmod.py +53 -0
  430. classiq/synthesis.py +210 -22
  431. {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/METADATA +16 -8
  432. classiq-0.65.3.dist-info/RECORD +521 -0
  433. {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/WHEEL +1 -1
  434. classiq/_internals/_qfunc_ext.py +0 -6
  435. classiq/applications/benchmarking/__init__.py +0 -9
  436. classiq/applications/benchmarking/mirror_benchmarking.py +0 -67
  437. classiq/applications/numpy_utils.py +0 -37
  438. classiq/applications_model_constructors/__init__.py +0 -17
  439. classiq/applications_model_constructors/combinatorial_optimization_model_constructor.py +0 -178
  440. classiq/applications_model_constructors/grover_model_constructor.py +0 -227
  441. classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
  442. classiq/applications_model_constructors/libraries/qmci_library.py +0 -109
  443. classiq/builtin_functions/__init__.py +0 -43
  444. classiq/builtin_functions/amplitude_loading.py +0 -3
  445. classiq/builtin_functions/binary_ops.py +0 -1
  446. classiq/builtin_functions/exponentiation.py +0 -5
  447. classiq/builtin_functions/qpe.py +0 -4
  448. classiq/builtin_functions/qsvm.py +0 -7
  449. classiq/builtin_functions/range_types.py +0 -5
  450. classiq/builtin_functions/standard_gates.py +0 -1
  451. classiq/builtin_functions/state_preparation.py +0 -6
  452. classiq/builtin_functions/suzuki_trotter.py +0 -3
  453. classiq/exceptions.py +0 -131
  454. classiq/interface/executor/aws_execution_cost.py +0 -72
  455. classiq/interface/executor/error_mitigation.py +0 -6
  456. classiq/interface/generator/credit_risk_example/linear_gci.py +0 -115
  457. classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -59
  458. classiq/interface/generator/expressions/enums/chemistry.py +0 -28
  459. classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
  460. classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
  461. classiq/interface/generator/expressions/enums/optimizers.py +0 -9
  462. classiq/interface/generator/expressions/enums/pauli.py +0 -8
  463. classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
  464. classiq/interface/generator/expressions/qmod_qnum_proxy.py +0 -22
  465. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
  466. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
  467. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
  468. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -862
  469. classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -169
  470. classiq/interface/generator/functions/foreign_function_definition.py +0 -106
  471. classiq/interface/generator/functions/function_implementation.py +0 -103
  472. classiq/interface/generator/functions/native_function_definition.py +0 -153
  473. classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
  474. classiq/interface/generator/functions/register.py +0 -42
  475. classiq/interface/generator/functions/register_mapping_data.py +0 -102
  476. classiq/interface/generator/inequality_mixer.py +0 -51
  477. classiq/interface/generator/model/classical_main_validator.py +0 -106
  478. classiq/interface/generator/range_mixer.py +0 -56
  479. classiq/interface/generator/state_propagator.py +0 -63
  480. classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -2
  481. classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
  482. classiq/interface/generator/types/builtin_struct_declarations/qaoa_declarations.py +0 -23
  483. classiq/interface/generator/types/combinatorial_problem.py +0 -26
  484. classiq/interface/ide/show.py +0 -34
  485. classiq/interface/model/common_model_types.py +0 -23
  486. classiq/interface/model/numeric_reinterpretation.py +0 -25
  487. classiq/interface/model/operator_synthesis_data.py +0 -48
  488. classiq/interface/model/quantum_expressions/control_state.py +0 -38
  489. classiq/interface/model/quantum_if_operation.py +0 -95
  490. classiq/interface/model/resolvers/function_call_resolver.py +0 -43
  491. classiq/interface/model/validations/handle_validation_base.py +0 -55
  492. classiq/interface/model/validations/handles_validator.py +0 -154
  493. classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
  494. classiq/model/__init__.py +0 -14
  495. classiq/model/composite_function_generator.py +0 -33
  496. classiq/model/function_handler.py +0 -466
  497. classiq/model/function_handler.pyi +0 -152
  498. classiq/model/logic_flow.py +0 -149
  499. classiq/model/logic_flow_change_handler.py +0 -71
  500. classiq/model/model.py +0 -246
  501. classiq/qmod/builtins/functions.py +0 -896
  502. classiq/qmod/qmod_struct.py +0 -37
  503. classiq/quantum_functions/__init__.py +0 -17
  504. classiq/quantum_functions/annotation_parser.py +0 -207
  505. classiq/quantum_functions/decorators.py +0 -22
  506. classiq/quantum_functions/function_library.py +0 -181
  507. classiq/quantum_functions/function_parser.py +0 -74
  508. classiq/quantum_functions/quantum_function.py +0 -236
  509. classiq-0.37.1.dist-info/RECORD +0 -418
  510. /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers}/__init__.py +0 -0
  511. /classiq/{interface/generator/credit_risk_example → applications/combinatorial_helpers/arithmetic}/__init__.py +0 -0
  512. /classiq/{interface/generator/functions/core_lib_declarations → applications/combinatorial_helpers/pauli_helpers}/__init__.py +0 -0
  513. /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → applications/combinatorial_helpers/py.typed} +0 -0
  514. /classiq/{interface/model/resolvers → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
  515. /classiq/{interface/model/validations → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
  516. /classiq/{_internals → interface}/enum_utils.py +0 -0
@@ -1,33 +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
16
- from classiq.interface.generator import generated_circuit as generator_result
17
- from classiq.interface.jobs import JobDescription, JobID, JobStatus, JSONObject
18
- from classiq.interface.model.common_model_types import ModelInput
25
+ from classiq.interface.execution.primitives import PrimitivesInput
26
+ from classiq.interface.executor import execution_request
27
+ from classiq.interface.generator import quantum_program as generator_result
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
19
31
  from classiq.interface.server import routes
20
32
 
21
33
  from classiq._internals.client import client
22
- from classiq._internals.enum_utils import StrEnum
23
34
  from classiq._internals.jobs import JobPoller
24
- from classiq.exceptions import ClassiqAPIError, ClassiqValueError
25
35
 
26
36
  ResultType = TypeVar("ResultType", bound=pydantic.BaseModel)
27
- CLASSIQ_ACCEPT_HEADER = "X-Classiq-Accept-Version"
28
-
29
- _ACCEPT_HEADER = "X-Classiq-Accept-Version"
30
- _CONTENT_TYPE_HEADER = "X-Classiq-Content-Type-Version"
31
37
 
32
38
 
33
39
  class HTTPMethod(StrEnum):
@@ -35,6 +41,7 @@ class HTTPMethod(StrEnum):
35
41
  GET = "GET"
36
42
  POST = "POST"
37
43
  PATCH = "PATCH"
44
+ PUT = "PUT"
38
45
 
39
46
 
40
47
  class StatusType(Protocol):
@@ -43,12 +50,14 @@ class StatusType(Protocol):
43
50
 
44
51
  def _parse_job_response(
45
52
  job_result: JobDescription[JSONObject],
46
- output_type: Type[ResultType],
53
+ output_type: type[ResultType],
47
54
  ) -> ResultType:
48
- description = job_result.description
49
- if job_result.status != JobStatus.COMPLETED:
50
- raise ClassiqAPIError(description["details"])
51
- return output_type.parse_obj(description)
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)
59
+
60
+ raise ClassiqAPIError("Unexpected response from server")
52
61
 
53
62
 
54
63
  class ApiWrapper:
@@ -59,13 +68,18 @@ class ApiWrapper:
59
68
  url: str,
60
69
  model: pydantic.BaseModel,
61
70
  use_versioned_url: bool = True,
71
+ http_client: Optional[httpx.AsyncClient] = None,
62
72
  ) -> dict:
63
73
  # TODO: we can't use model.dict() - it doesn't serialize complex class.
64
74
  # This was added because JSON serializer doesn't serialize complex type, and pydantic does.
65
75
  # We should add support for smarter json serialization.
66
- body = json.loads(model.json())
76
+ body = json.loads(model.model_dump_json())
67
77
  return await cls._call_task(
68
- 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,
69
83
  )
70
84
 
71
85
  @classmethod
@@ -73,80 +87,121 @@ class ApiWrapper:
73
87
  cls,
74
88
  http_method: str,
75
89
  url: str,
76
- body: Optional[Dict] = None,
77
- params: Optional[Dict] = None,
90
+ body: Optional[dict] = None,
91
+ params: Optional[dict] = None,
78
92
  use_versioned_url: bool = True,
79
- 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,
80
96
  ) -> dict:
81
- res = await client().call_api(
97
+ res: Any = await client().call_api(
82
98
  http_method=http_method,
83
99
  url=url,
84
100
  body=body,
85
101
  headers=headers,
86
102
  params=params,
87
103
  use_versioned_url=use_versioned_url,
104
+ http_client=http_client,
88
105
  )
106
+ if allow_none and res is None:
107
+ return {}
89
108
  if not isinstance(res, dict):
90
109
  raise ClassiqValueError(f"Unexpected returned value: {res}")
91
110
  return res
92
111
 
93
112
  @classmethod
94
113
  async def call_generation_task(
95
- cls, model: ModelInput
96
- ) -> generator_result.GeneratedCircuit:
114
+ cls,
115
+ model: Model,
116
+ http_client: Optional[httpx.AsyncClient] = None,
117
+ ) -> generator_result.QuantumProgram:
97
118
  poller = JobPoller(base_url=routes.TASKS_GENERATE_FULL_PATH)
98
- result = await poller.run_pydantic(model, timeout_sec=None)
99
- return _parse_job_response(result, generator_result.GeneratedCircuit)
119
+ result = await poller.run_pydantic(
120
+ model, timeout_sec=None, http_client=http_client
121
+ )
122
+ return _parse_job_response(result, generator_result.QuantumProgram)
123
+
124
+ @classmethod
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"]
100
137
 
101
138
  @classmethod
102
- async def call_execute_generated_circuit(
103
- cls, circuit: generator_result.GeneratedCircuit
139
+ async def call_create_session_job(
140
+ cls,
141
+ session_id: str,
142
+ primitives_input: PrimitivesInput,
143
+ http_client: Optional[httpx.AsyncClient] = None,
104
144
  ) -> execution_request.ExecutionJobDetails:
105
- 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(
106
160
  http_method=HTTPMethod.POST,
107
161
  url=routes.CONVERSION_GENERATED_CIRCUIT_TO_EXECUTION_INPUT_FULL,
108
162
  model=circuit,
163
+ http_client=http_client,
109
164
  )
110
- headers = {
111
- _ACCEPT_HEADER: "v1",
112
- _CONTENT_TYPE_HEADER: execution_input["version"],
113
- }
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:
114
172
  data = await cls._call_task(
115
173
  http_method=HTTPMethod.POST,
116
- headers=headers,
117
- url=routes.EXECUTION_JOBS_NON_VERSIONED_FULL_PATH,
174
+ url=routes.EXECUTION_JOBS_FULL_PATH,
118
175
  body=execution_input,
119
- use_versioned_url=False,
176
+ http_client=http_client,
120
177
  )
121
- return execution_request.ExecutionJobDetails.parse_obj(data)
178
+ return execution_request.ExecutionJobDetails.model_validate(data)
122
179
 
123
180
  @classmethod
124
181
  async def call_get_execution_job_details(
125
182
  cls,
126
183
  job_id: JobID,
184
+ http_client: Optional[httpx.AsyncClient] = None,
127
185
  ) -> execution_request.ExecutionJobDetails:
128
- headers = {_CONTENT_TYPE_HEADER: "v1"}
129
186
  data = await cls._call_task(
130
187
  http_method=HTTPMethod.GET,
131
- headers=headers,
132
- url=f"{routes.EXECUTION_JOBS_NON_VERSIONED_FULL_PATH}/{job_id.job_id}",
133
- use_versioned_url=False,
188
+ url=f"{routes.EXECUTION_JOBS_FULL_PATH}/{job_id.job_id}",
189
+ http_client=http_client,
134
190
  )
135
- return execution_request.ExecutionJobDetails.parse_obj(data)
191
+ return execution_request.ExecutionJobDetails.model_validate(data)
136
192
 
137
193
  @classmethod
138
194
  async def call_get_execution_job_result(
139
195
  cls,
140
196
  job_id: JobID,
141
- version: str,
197
+ http_client: Optional[httpx.AsyncClient] = None,
142
198
  ) -> classiq.interface.executor.execution_result.ExecuteGeneratedCircuitResults:
143
199
  data = await cls._call_task(
144
200
  http_method=HTTPMethod.GET,
145
- url=f"{routes.EXECUTION_JOBS_NON_VERSIONED_FULL_PATH}/{job_id.job_id}/result",
146
- use_versioned_url=False,
147
- headers={CLASSIQ_ACCEPT_HEADER: version},
201
+ url=f"{routes.EXECUTION_JOBS_FULL_PATH}/{job_id.job_id}/result",
202
+ http_client=http_client,
148
203
  )
149
- return classiq.interface.executor.execution_result.ExecuteGeneratedCircuitResults.parse_obj(
204
+ return classiq.interface.executor.execution_result.ExecuteGeneratedCircuitResults.model_validate(
150
205
  data
151
206
  )
152
207
 
@@ -155,147 +210,238 @@ class ApiWrapper:
155
210
  cls,
156
211
  job_id: JobID,
157
212
  name: str,
213
+ http_client: Optional[httpx.AsyncClient] = None,
158
214
  ) -> ExecutionJobDetailsV1:
159
215
  data = await cls._call_task(
160
216
  http_method=HTTPMethod.PATCH,
161
- 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}",
162
218
  params={
163
219
  "name": name,
164
220
  },
165
- 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,
166
236
  )
167
- return ExecutionJobDetailsV1.parse_obj(data)
168
237
 
169
238
  @classmethod
170
239
  async def call_query_execution_jobs(
171
240
  cls,
172
241
  offset: int,
173
242
  limit: int,
243
+ http_client: Optional[httpx.AsyncClient] = None,
174
244
  ) -> ExecutionJobsQueryResultsV1:
175
245
  data = await cls._call_task(
176
246
  http_method=HTTPMethod.GET,
177
- url=f"{routes.EXECUTION_JOBS_NON_VERSIONED_FULL_PATH}",
247
+ url=f"{routes.EXECUTION_JOBS_FULL_PATH}",
178
248
  params={
179
249
  "offset": offset,
180
250
  "limit": limit,
181
251
  },
182
- use_versioned_url=False,
252
+ http_client=http_client,
183
253
  )
184
- return ExecutionJobsQueryResultsV1.parse_obj(data)
185
-
186
- @classmethod
187
- async def call_execute_estimate(
188
- cls, request: execution_request.ExecutionRequest
189
- ) -> execute_result.EstimationResults:
190
- poller = JobPoller(base_url=routes.EXECUTE_ESTIMATE_FULL_PATH)
191
- result = await poller.run_pydantic(request, timeout_sec=None)
192
- return _parse_job_response(result, execute_result.EstimationResults)
193
-
194
- @classmethod
195
- async def call_execute_quantum_program(
196
- cls, request: execution_request.ExecutionRequest
197
- ) -> execute_result.MultipleExecutionDetails:
198
- poller = JobPoller(
199
- base_url=routes.EXECUTE_QUANTUM_PROGRAM_FULL_PATH,
200
- )
201
- result = await poller.run_pydantic(request, timeout_sec=None)
202
- return _parse_job_response(result, execute_result.MultipleExecutionDetails)
254
+ return ExecutionJobsQueryResultsV1.model_validate(data)
203
255
 
204
256
  @classmethod
205
257
  async def call_analysis_task(
206
- cls, params: analysis_params.AnalysisParams
258
+ cls,
259
+ params: analysis_params.AnalysisParams,
260
+ http_client: Optional[httpx.AsyncClient] = None,
207
261
  ) -> analysis_result.Analysis:
208
262
  data = await cls._call_task_pydantic(
209
263
  http_method=HTTPMethod.POST,
210
264
  url=routes.ANALYZER_FULL_PATH,
211
265
  model=params,
266
+ http_client=http_client,
212
267
  )
213
268
 
214
- return analysis_result.Analysis.parse_obj(data)
269
+ return analysis_result.Analysis.model_validate(data)
215
270
 
216
271
  @classmethod
217
272
  async def call_analyzer_app(
218
- cls, params: generator_result.GeneratedCircuit
273
+ cls,
274
+ params: generator_result.QuantumProgram,
275
+ http_client: Optional[httpx.AsyncClient] = None,
219
276
  ) -> analysis_result.DataID:
220
277
  data = await cls._call_task_pydantic(
221
278
  http_method=HTTPMethod.POST,
222
279
  url=routes.ANALYZER_DATA_FULL_PATH,
223
280
  model=params,
281
+ http_client=http_client,
224
282
  )
225
- return analysis_result.DataID.parse_obj(data)
283
+ return analysis_result.DataID.model_validate(data)
226
284
 
227
285
  @classmethod
228
286
  async def get_generated_circuit_from_qasm(
229
- cls, params: analysis_result.QasmCode
230
- ) -> generator_result.GeneratedCircuit:
287
+ cls,
288
+ params: analysis_result.QasmCode,
289
+ http_client: Optional[httpx.AsyncClient] = None,
290
+ ) -> generator_result.QuantumProgram:
231
291
  data = await cls._call_task_pydantic(
232
292
  http_method=HTTPMethod.POST,
233
293
  url=routes.IDE_QASM_FULL_PATH,
234
294
  model=params,
295
+ http_client=http_client,
235
296
  )
236
- return generator_result.GeneratedCircuit.parse_obj(data)
297
+ return generator_result.QuantumProgram.model_validate(data)
237
298
 
238
299
  @classmethod
239
300
  async def get_analyzer_app_data(
240
- cls, params: analysis_result.DataID
241
- ) -> generator_result.GeneratedCircuit:
301
+ cls,
302
+ params: analysis_result.DataID,
303
+ http_client: Optional[httpx.AsyncClient] = None,
304
+ ) -> generator_result.QuantumProgram:
242
305
  data = await cls._call_task(
243
306
  http_method=HTTPMethod.GET,
244
307
  url=f"{routes.ANALYZER_DATA_FULL_PATH}/{params.id}",
308
+ http_client=http_client,
245
309
  )
246
- return generator_result.GeneratedCircuit.parse_obj(data)
310
+ return generator_result.QuantumProgram.model_validate(data)
247
311
 
248
312
  @classmethod
249
313
  async def call_rb_analysis_task(
250
- cls, params: AnalysisRBParams
314
+ cls,
315
+ params: AnalysisRBParams,
316
+ http_client: Optional[httpx.AsyncClient] = None,
251
317
  ) -> analysis_result.RbResults:
252
318
  data = await cls._call_task(
253
319
  http_method=HTTPMethod.POST,
254
320
  url=routes.ANALYZER_RB_FULL_PATH,
255
- body=params.dict(),
321
+ body=params.model_dump(),
322
+ http_client=http_client,
256
323
  )
257
324
 
258
- return analysis_result.RbResults.parse_obj(data)
325
+ return analysis_result.RbResults.model_validate(data)
259
326
 
260
327
  @classmethod
261
328
  async def call_hardware_connectivity_task(
262
- cls, params: analysis_params.AnalysisHardwareParams
329
+ cls,
330
+ params: analysis_params.AnalysisHardwareParams,
331
+ http_client: Optional[httpx.AsyncClient] = None,
263
332
  ) -> analysis_result.GraphResult:
264
333
  data = await cls._call_task_pydantic(
265
334
  http_method=HTTPMethod.POST,
266
335
  url=routes.ANALYZER_HC_GRAPH_FULL_PATH,
267
336
  model=params,
337
+ http_client=http_client,
268
338
  )
269
- return analysis_result.GraphResult.parse_obj(data)
339
+ return analysis_result.GraphResult.model_validate(data)
270
340
 
271
341
  @classmethod
272
342
  async def call_table_graphs_task(
273
343
  cls,
274
344
  params: analysis_params.AnalysisHardwareListParams,
345
+ http_client: Optional[httpx.AsyncClient] = None,
275
346
  ) -> analysis_result.GraphResult:
276
347
  poller = JobPoller(base_url=routes.ANALYZER_HC_TABLE_GRAPH_FULL_PATH)
277
- 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
+ )
278
351
  return _parse_job_response(result, analysis_result.GraphResult)
279
352
 
280
353
  @classmethod
281
354
  async def call_available_devices_task(
282
355
  cls,
283
356
  params: analysis_params.AnalysisOptionalDevicesParams,
357
+ http_client: Optional[httpx.AsyncClient] = None,
284
358
  ) -> analysis_result.DevicesResult:
285
- data = await cls._call_task(
286
- http_method=HTTPMethod.POST,
287
- url=routes.ANALYZER_OPTIONAL_DEVICES_FULL_PATH,
288
- 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,
289
384
  )
290
- 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]
291
400
 
292
401
  @classmethod
293
402
  async def call_generate_hamiltonian_task(
294
- 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,
295
406
  ) -> operator.PauliOperator:
296
407
  poller = JobPoller(
297
408
  base_url=routes.GENERATE_HAMILTONIAN_FULL_PATH,
298
- use_versioned_url=False,
299
409
  )
300
- 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
+ )
301
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)
@@ -1,25 +1,18 @@
1
- import abc
2
1
  import asyncio
3
2
  import functools
4
- import inspect
5
3
  import itertools
6
4
  import logging
7
5
  import time
8
- import types
6
+ from collections.abc import AsyncGenerator, Awaitable, Iterable
9
7
  from typing import (
10
8
  Any,
11
- AsyncGenerator,
12
- Awaitable,
13
9
  Callable,
14
- Iterable,
15
10
  Optional,
16
11
  SupportsFloat,
17
12
  TypeVar,
18
13
  Union,
19
14
  )
20
15
 
21
- from classiq.exceptions import ClassiqValueError
22
-
23
16
  T = TypeVar("T")
24
17
  ASYNC_SUFFIX = "_async"
25
18
 
@@ -58,74 +51,6 @@ def syncify_function(async_func: Callable[..., Awaitable[T]]) -> Callable[..., T
58
51
  return async_wrapper
59
52
 
60
53
 
61
- def maybe_syncify_property_function(obj: Any) -> Any:
62
- """
63
- The object is the input to `property` (or to `property.setter`)
64
- Thus, we expect it to be either a function, or a function-that-returns-a-coroutine, or None
65
- The only thing that should be syncified is a function-that-returns-a-coroutine
66
- """
67
- if inspect.iscoroutinefunction(obj):
68
- return syncify_function(obj)
69
- elif isinstance(obj, types.FunctionType):
70
- return obj
71
- elif obj is None:
72
- return obj
73
- else:
74
- raise ClassiqValueError(f"Invalid type: {obj.__class__.__name__}")
75
-
76
-
77
- def syncify_property(async_prop: property) -> property:
78
- if inspect.iscoroutinefunction(async_prop.fset):
79
- raise ClassiqValueError(f"Setter cannot be `async def` (in {async_prop}")
80
- if inspect.iscoroutinefunction(async_prop.fdel):
81
- raise ClassiqValueError(f"Deleter cannot be `async def` (in {async_prop}")
82
-
83
- return property(
84
- maybe_syncify_property_function(async_prop.fget),
85
- async_prop.fset,
86
- async_prop.fdel,
87
- async_prop.__doc__,
88
- )
89
-
90
-
91
- # Explanation about metaclasses
92
- # https://stackoverflow.com/questions/100003/what-are-metaclasses-in-python
93
-
94
-
95
- class Asyncify(type):
96
- def __new__(
97
- mcls, name: str, bases: tuple, class_dict: dict # noqa: N804
98
- ) -> "Asyncify":
99
- new_attrs = {}
100
-
101
- for attr_name, attr_value in class_dict.items():
102
- if attr_name.endswith(ASYNC_SUFFIX):
103
- new_attr_name = attr_name[: -len(ASYNC_SUFFIX)]
104
- if new_attr_name in class_dict:
105
- raise ClassiqValueError(f"Method name collision: {new_attr_name}")
106
- else:
107
- new_attrs[new_attr_name] = attr_value
108
-
109
- new_class = super().__new__(mcls, name, bases, class_dict)
110
-
111
- for attr_name, attr_value in new_attrs.items():
112
- if isinstance(attr_value, property):
113
- setattr(new_class, attr_name, syncify_property(attr_value))
114
- elif isinstance(attr_value, types.FunctionType):
115
- setattr(new_class, attr_name, syncify_function(attr_value))
116
- else:
117
- raise ClassiqValueError(
118
- f"Invalid async type: {attr_value.__class__.__name__}"
119
- )
120
-
121
- return new_class
122
-
123
-
124
- # Used for resolving metaclass collision
125
- class AsyncifyABC(Asyncify, abc.ABCMeta):
126
- pass
127
-
128
-
129
54
  def enable_jupyter_notebook() -> None:
130
55
  import nest_asyncio # type: ignore[import]
131
56
 
@@ -172,7 +97,7 @@ def is_notebook() -> bool:
172
97
  return True # Jupyter notebook or qtconsole
173
98
  elif shell == "TerminalInteractiveShell":
174
99
  return False # Terminal running IPython
175
- elif "google.colab" in str(local_ipython):
100
+ elif "google.colab" in str(local_ipython): # noqa: SIM103
176
101
  return True
177
102
  else:
178
103
  return False # Other type (?)