classiq 0.38.0__py3-none-any.whl → 0.65.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. classiq/__init__.py +47 -32
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +2 -1
  3. classiq/_internals/api_wrapper.py +235 -97
  4. classiq/_internals/async_utils.py +1 -3
  5. classiq/_internals/authentication/auth0.py +26 -10
  6. classiq/_internals/authentication/authentication.py +11 -0
  7. classiq/_internals/authentication/device.py +10 -5
  8. classiq/_internals/authentication/password_manager.py +18 -6
  9. classiq/_internals/authentication/token_manager.py +10 -5
  10. classiq/_internals/client.py +94 -33
  11. classiq/_internals/config.py +3 -4
  12. classiq/_internals/host_checker.py +38 -15
  13. classiq/_internals/jobs.py +60 -57
  14. classiq/_internals/type_validation.py +9 -9
  15. classiq/analyzer/__init__.py +1 -3
  16. classiq/analyzer/analyzer.py +24 -19
  17. classiq/analyzer/analyzer_utilities.py +10 -10
  18. classiq/analyzer/rb.py +15 -15
  19. classiq/analyzer/show_interactive_hack.py +27 -4
  20. classiq/analyzer/url_utils.py +2 -3
  21. classiq/applications/__init__.py +3 -12
  22. classiq/applications/chemistry/__init__.py +14 -10
  23. classiq/applications/chemistry/ansatz_parameters.py +4 -4
  24. classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +165 -158
  25. classiq/applications/chemistry/ground_state_problem.py +1 -1
  26. classiq/{applications_model_constructors → applications}/combinatorial_helpers/allowed_constraints.py +4 -1
  27. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/arithmetic_expression.py +1 -1
  28. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/isolation.py +1 -1
  29. classiq/{applications_model_constructors → applications}/combinatorial_helpers/combinatorial_problem_utils.py +51 -15
  30. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_mapping.py +12 -12
  31. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_utils.py +8 -6
  32. classiq/{applications_model_constructors → applications}/combinatorial_helpers/memory.py +7 -11
  33. classiq/{applications_model_constructors → applications}/combinatorial_helpers/optimization_model.py +67 -40
  34. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
  35. classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
  36. classiq/{applications_model_constructors → applications}/combinatorial_helpers/sympy_utils.py +2 -2
  37. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/encoding.py +15 -20
  38. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/fixed_variables.py +14 -15
  39. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/ising_converter.py +11 -15
  40. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty.py +1 -2
  41. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty_support.py +3 -7
  42. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/sign_seperation.py +2 -3
  43. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/slack_variables.py +5 -8
  44. classiq/applications/combinatorial_optimization/__init__.py +20 -6
  45. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
  46. classiq/{applications_model_constructors → applications/combinatorial_optimization}/combinatorial_optimization_model_constructor.py +35 -33
  47. classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
  48. classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
  49. classiq/applications/finance/__init__.py +4 -5
  50. classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +48 -42
  51. classiq/applications/grover/__init__.py +9 -0
  52. classiq/{applications_model_constructors → applications/grover}/grover_model_constructor.py +52 -51
  53. classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
  54. classiq/applications/libraries/qmci_library.py +22 -0
  55. classiq/applications/qnn/__init__.py +2 -4
  56. classiq/applications/qnn/circuit_utils.py +6 -6
  57. classiq/applications/qnn/datasets/__init__.py +9 -11
  58. classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
  59. classiq/applications/qnn/datasets/dataset_not.py +2 -1
  60. classiq/applications/qnn/datasets/dataset_parity.py +2 -2
  61. classiq/applications/qnn/gradients/quantum_gradient.py +1 -1
  62. classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
  63. classiq/applications/qnn/qlayer.py +30 -10
  64. classiq/applications/qnn/torch_utils.py +4 -3
  65. classiq/applications/qnn/types.py +5 -5
  66. classiq/applications/qsvm/__init__.py +6 -4
  67. classiq/applications/qsvm/qsvm.py +3 -6
  68. classiq/applications/qsvm/qsvm_data_generation.py +3 -3
  69. classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
  70. classiq/execution/__init__.py +8 -3
  71. classiq/execution/all_hardware_devices.py +11 -0
  72. classiq/execution/execution_session.py +400 -0
  73. classiq/execution/iqcc.py +63 -0
  74. classiq/execution/jobs.py +197 -25
  75. classiq/execution/qnn.py +79 -0
  76. classiq/executor.py +20 -115
  77. classiq/interface/_version.py +1 -1
  78. classiq/interface/analyzer/analysis_params.py +43 -13
  79. classiq/interface/analyzer/cytoscape_graph.py +15 -9
  80. classiq/interface/analyzer/result.py +28 -32
  81. classiq/interface/applications/qsvm.py +20 -29
  82. classiq/interface/ast_node.py +16 -0
  83. classiq/interface/backend/backend_preferences.py +390 -121
  84. classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
  85. classiq/interface/backend/pydantic_backend.py +25 -22
  86. classiq/interface/backend/quantum_backend_providers.py +69 -16
  87. classiq/interface/chemistry/fermionic_operator.py +30 -21
  88. classiq/interface/chemistry/ground_state_problem.py +28 -25
  89. classiq/interface/chemistry/molecule.py +14 -10
  90. classiq/interface/chemistry/operator.py +64 -231
  91. classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
  92. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +1 -3
  93. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  94. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  95. classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
  96. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  97. classiq/interface/combinatorial_optimization/examples/set_cover.py +1 -2
  98. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +8 -9
  99. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  100. classiq/interface/combinatorial_optimization/result.py +1 -3
  101. classiq/interface/combinatorial_optimization/solver_types.py +1 -1
  102. classiq/interface/debug_info/debug_info.py +86 -0
  103. classiq/{exceptions.py → interface/exceptions.py} +37 -9
  104. classiq/interface/execution/iqcc.py +19 -0
  105. classiq/interface/execution/jobs.py +15 -12
  106. classiq/interface/execution/primitives.py +18 -0
  107. classiq/interface/executor/constants.py +1 -0
  108. classiq/interface/executor/execution_preferences.py +26 -114
  109. classiq/interface/executor/execution_request.py +24 -46
  110. classiq/interface/executor/execution_result.py +30 -8
  111. classiq/interface/executor/iqae_result.py +4 -6
  112. classiq/interface/executor/optimizer_preferences.py +17 -14
  113. classiq/interface/executor/quantum_code.py +28 -24
  114. classiq/interface/executor/quantum_instruction_set.py +2 -2
  115. classiq/interface/executor/register_initialization.py +11 -14
  116. classiq/interface/executor/result.py +83 -56
  117. classiq/interface/executor/vqe_result.py +10 -10
  118. classiq/interface/finance/function_input.py +35 -25
  119. classiq/interface/finance/gaussian_model_input.py +5 -5
  120. classiq/interface/finance/log_normal_model_input.py +4 -4
  121. classiq/interface/finance/model_input.py +4 -4
  122. classiq/interface/generator/adjacency.py +1 -3
  123. classiq/interface/generator/amplitude_loading.py +22 -12
  124. classiq/interface/generator/ansatz_library.py +5 -5
  125. classiq/interface/generator/application_apis/arithmetic_declarations.py +8 -5
  126. classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
  127. classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
  128. classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
  129. classiq/interface/generator/application_apis/finance_declarations.py +48 -69
  130. classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
  131. classiq/interface/generator/arith/argument_utils.py +46 -5
  132. classiq/interface/generator/arith/arithmetic.py +35 -16
  133. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +6 -7
  134. classiq/interface/generator/arith/arithmetic_expression_abc.py +66 -25
  135. classiq/interface/generator/arith/arithmetic_expression_parser.py +11 -11
  136. classiq/interface/generator/arith/arithmetic_expression_validator.py +47 -43
  137. classiq/interface/generator/arith/arithmetic_operations.py +14 -6
  138. classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
  139. classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
  140. classiq/interface/generator/arith/ast_node_rewrite.py +3 -2
  141. classiq/interface/generator/arith/binary_ops.py +218 -130
  142. classiq/interface/generator/arith/endianness.py +1 -1
  143. classiq/interface/generator/arith/extremum_operations.py +96 -25
  144. classiq/interface/generator/arith/logical_ops.py +14 -12
  145. classiq/interface/generator/arith/number_utils.py +12 -6
  146. classiq/interface/generator/arith/register_user_input.py +60 -37
  147. classiq/interface/generator/arith/unary_ops.py +49 -29
  148. classiq/interface/generator/arith/uncomputation_methods.py +1 -1
  149. classiq/interface/generator/builtin_api_builder.py +2 -9
  150. classiq/interface/generator/chemistry_function_params.py +3 -3
  151. classiq/interface/generator/circuit_code/circuit_code.py +7 -7
  152. classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
  153. classiq/interface/generator/commuting_pauli_exponentiation.py +7 -7
  154. classiq/interface/generator/compiler_keywords.py +5 -1
  155. classiq/interface/generator/complex_type.py +13 -18
  156. classiq/interface/generator/constant.py +3 -4
  157. classiq/interface/generator/control_state.py +34 -29
  158. classiq/interface/generator/copy.py +47 -0
  159. classiq/interface/generator/custom_ansatz.py +2 -5
  160. classiq/interface/generator/distance.py +3 -5
  161. classiq/interface/generator/excitations.py +3 -2
  162. classiq/interface/generator/expressions/atomic_expression_functions.py +21 -5
  163. classiq/interface/generator/expressions/enums/__init__.py +0 -10
  164. classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
  165. classiq/interface/generator/expressions/evaluated_expression.py +5 -5
  166. classiq/interface/generator/expressions/expression.py +26 -14
  167. classiq/interface/generator/expressions/expression_constants.py +9 -3
  168. classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
  169. classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
  170. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +34 -8
  171. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
  172. classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
  173. classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
  174. classiq/interface/generator/expressions/sympy_supported_expressions.py +19 -11
  175. classiq/interface/generator/finance.py +2 -2
  176. classiq/interface/generator/function_param_library.py +6 -6
  177. classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
  178. classiq/interface/generator/function_params.py +36 -64
  179. classiq/interface/generator/functions/__init__.py +0 -22
  180. classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
  181. classiq/interface/generator/functions/classical_function_declaration.py +18 -9
  182. classiq/interface/generator/functions/classical_type.py +47 -166
  183. classiq/interface/generator/functions/concrete_types.py +55 -0
  184. classiq/interface/generator/functions/function_declaration.py +13 -14
  185. classiq/interface/generator/functions/port_declaration.py +1 -13
  186. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  187. classiq/interface/generator/functions/type_name.py +90 -0
  188. classiq/interface/generator/generated_circuit_data.py +153 -20
  189. classiq/interface/generator/grover_diffuser.py +32 -25
  190. classiq/interface/generator/grover_operator.py +34 -25
  191. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
  192. classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
  193. classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +9 -9
  194. classiq/interface/generator/hardware/hardware_data.py +72 -34
  195. classiq/interface/generator/hardware_efficient_ansatz.py +20 -16
  196. classiq/interface/generator/hartree_fock.py +13 -5
  197. classiq/interface/generator/identity.py +10 -6
  198. classiq/interface/generator/linear_pauli_rotations.py +32 -20
  199. classiq/interface/generator/mcmt_method.py +1 -1
  200. classiq/interface/generator/mcu.py +17 -15
  201. classiq/interface/generator/mcx.py +24 -17
  202. classiq/interface/generator/model/__init__.py +2 -5
  203. classiq/interface/generator/model/constraints.py +26 -8
  204. classiq/interface/generator/model/model.py +27 -190
  205. classiq/interface/generator/model/preferences/preferences.py +115 -41
  206. classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +14 -17
  207. classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
  208. classiq/interface/generator/oracles/custom_oracle.py +15 -13
  209. classiq/interface/generator/oracles/oracle_abc.py +7 -7
  210. classiq/interface/generator/partitioned_register.py +7 -7
  211. classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
  212. classiq/interface/generator/preferences/optimization.py +1 -2
  213. classiq/interface/generator/qpe.py +41 -30
  214. classiq/interface/generator/qsvm.py +9 -10
  215. classiq/interface/generator/quantum_function_call.py +88 -73
  216. classiq/interface/generator/quantum_program.py +41 -24
  217. classiq/interface/generator/range_types.py +11 -12
  218. classiq/interface/generator/register_role.py +18 -6
  219. classiq/interface/generator/slice_parsing_utils.py +5 -5
  220. classiq/interface/generator/standard_gates/controlled_standard_gates.py +30 -39
  221. classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
  222. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  223. classiq/interface/generator/standard_gates/u_gate.py +7 -10
  224. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  225. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
  226. classiq/interface/generator/state_preparation/distributions.py +16 -15
  227. classiq/interface/generator/state_preparation/metrics.py +4 -7
  228. classiq/interface/generator/state_preparation/state_preparation.py +25 -20
  229. classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
  230. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
  231. classiq/interface/generator/transpiler_basis_gates.py +7 -3
  232. classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
  233. classiq/interface/generator/types/compilation_metadata.py +6 -0
  234. classiq/interface/generator/types/enum_declaration.py +54 -0
  235. classiq/interface/generator/types/qstruct_declaration.py +18 -0
  236. classiq/interface/generator/types/struct_declaration.py +7 -11
  237. classiq/interface/generator/ucc.py +5 -4
  238. classiq/interface/generator/unitary_gate.py +5 -5
  239. classiq/interface/generator/user_defined_function_params.py +4 -1
  240. classiq/interface/generator/validations/flow_graph.py +7 -7
  241. classiq/interface/generator/validations/validator_functions.py +4 -4
  242. classiq/interface/generator/visitor.py +23 -16
  243. classiq/interface/hardware.py +29 -8
  244. classiq/interface/helpers/classproperty.py +8 -0
  245. classiq/interface/helpers/custom_encoders.py +2 -2
  246. classiq/interface/helpers/custom_pydantic_types.py +40 -50
  247. classiq/interface/helpers/datastructures.py +26 -0
  248. classiq/interface/helpers/hashable_mixin.py +3 -2
  249. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  250. classiq/interface/helpers/pydantic_model_helpers.py +7 -5
  251. classiq/interface/helpers/validation_helpers.py +3 -20
  252. classiq/interface/helpers/versioned_model.py +1 -4
  253. classiq/interface/ide/ide_data.py +16 -20
  254. classiq/interface/ide/visual_model.py +130 -0
  255. classiq/interface/interface_version.py +1 -0
  256. classiq/interface/jobs.py +29 -69
  257. classiq/interface/model/allocate.py +16 -0
  258. classiq/interface/model/bind_operation.py +32 -9
  259. classiq/interface/model/classical_if.py +15 -0
  260. classiq/interface/model/classical_parameter_declaration.py +33 -3
  261. classiq/interface/model/control.py +45 -0
  262. classiq/interface/model/handle_binding.py +298 -20
  263. classiq/interface/model/inplace_binary_operation.py +29 -24
  264. classiq/interface/model/invert.py +12 -0
  265. classiq/interface/model/model.py +69 -61
  266. classiq/interface/model/native_function_definition.py +17 -20
  267. classiq/interface/model/parameter.py +13 -0
  268. classiq/interface/model/phase_operation.py +11 -0
  269. classiq/interface/model/port_declaration.py +27 -9
  270. classiq/interface/model/power.py +14 -0
  271. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +30 -18
  272. classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
  273. classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
  274. classiq/interface/model/quantum_function_call.py +141 -343
  275. classiq/interface/model/quantum_function_declaration.py +190 -157
  276. classiq/interface/model/quantum_lambda_function.py +33 -32
  277. classiq/interface/model/quantum_statement.py +71 -12
  278. classiq/interface/model/quantum_type.py +177 -40
  279. classiq/interface/model/quantum_variable_declaration.py +3 -25
  280. classiq/interface/model/repeat.py +15 -0
  281. classiq/interface/model/statement_block.py +40 -14
  282. classiq/interface/model/validation_handle.py +13 -6
  283. classiq/interface/model/variable_declaration_statement.py +3 -1
  284. classiq/interface/model/within_apply_operation.py +7 -5
  285. classiq/interface/server/global_versions.py +6 -7
  286. classiq/interface/server/routes.py +17 -21
  287. classiq/interface/source_reference.py +59 -0
  288. classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
  289. classiq/model_expansions/capturing/__init__.py +0 -0
  290. classiq/model_expansions/capturing/captured_vars.py +435 -0
  291. classiq/model_expansions/capturing/mangling_utils.py +56 -0
  292. classiq/model_expansions/closure.py +171 -0
  293. classiq/model_expansions/debug_flag.py +3 -0
  294. classiq/model_expansions/evaluators/__init__.py +0 -0
  295. classiq/model_expansions/evaluators/arg_type_match.py +158 -0
  296. classiq/model_expansions/evaluators/argument_types.py +42 -0
  297. classiq/model_expansions/evaluators/classical_expression.py +36 -0
  298. classiq/model_expansions/evaluators/control.py +144 -0
  299. classiq/model_expansions/evaluators/parameter_types.py +226 -0
  300. classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
  301. classiq/model_expansions/evaluators/type_type_match.py +90 -0
  302. classiq/model_expansions/expression_evaluator.py +135 -0
  303. classiq/model_expansions/expression_renamer.py +76 -0
  304. classiq/model_expansions/function_builder.py +247 -0
  305. classiq/model_expansions/generative_functions.py +158 -0
  306. classiq/model_expansions/interpreters/__init__.py +0 -0
  307. classiq/model_expansions/interpreters/base_interpreter.py +263 -0
  308. classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
  309. classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
  310. classiq/model_expansions/model_tables.py +18 -0
  311. classiq/model_expansions/quantum_operations/__init__.py +9 -0
  312. classiq/model_expansions/quantum_operations/bind.py +60 -0
  313. classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
  314. classiq/model_expansions/quantum_operations/classicalif.py +53 -0
  315. classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
  316. classiq/model_expansions/quantum_operations/emitter.py +181 -0
  317. classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
  318. classiq/model_expansions/quantum_operations/repeat.py +56 -0
  319. classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
  320. classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
  321. classiq/model_expansions/scope.py +240 -0
  322. classiq/model_expansions/scope_initialization.py +150 -0
  323. classiq/model_expansions/sympy_conversion/__init__.py +0 -0
  324. classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
  325. classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
  326. classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
  327. classiq/model_expansions/transformers/__init__.py +0 -0
  328. classiq/model_expansions/transformers/ast_renamer.py +26 -0
  329. classiq/model_expansions/transformers/var_splitter.py +299 -0
  330. classiq/model_expansions/utils/__init__.py +0 -0
  331. classiq/model_expansions/utils/counted_name_allocator.py +11 -0
  332. classiq/model_expansions/utils/handles_collector.py +33 -0
  333. classiq/model_expansions/visitors/__init__.py +0 -0
  334. classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
  335. classiq/model_expansions/visitors/variable_references.py +144 -0
  336. classiq/open_library/__init__.py +4 -0
  337. classiq/open_library/functions/__init__.py +130 -0
  338. classiq/open_library/functions/amplitude_estimation.py +30 -0
  339. classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
  340. classiq/open_library/functions/grover.py +157 -0
  341. classiq/open_library/functions/hea.py +115 -0
  342. classiq/open_library/functions/linear_pauli_rotation.py +82 -0
  343. classiq/open_library/functions/modular_exponentiation.py +201 -0
  344. classiq/open_library/functions/qaoa_penalty.py +117 -0
  345. classiq/open_library/functions/qft_functions.py +54 -0
  346. classiq/open_library/functions/qpe.py +46 -0
  347. classiq/open_library/functions/qsvt.py +331 -0
  348. classiq/open_library/functions/state_preparation.py +301 -0
  349. classiq/open_library/functions/swap_test.py +27 -0
  350. classiq/open_library/functions/utility_functions.py +81 -0
  351. classiq/open_library/functions/variational.py +52 -0
  352. classiq/qmod/__init__.py +10 -10
  353. classiq/qmod/builtins/__init__.py +19 -2
  354. classiq/qmod/builtins/classical_execution_primitives.py +36 -14
  355. classiq/qmod/builtins/classical_functions.py +39 -43
  356. classiq/qmod/builtins/constants.py +10 -0
  357. classiq/qmod/builtins/enums.py +208 -0
  358. classiq/qmod/builtins/functions/__init__.py +137 -0
  359. classiq/qmod/builtins/functions/allocation.py +150 -0
  360. classiq/qmod/builtins/functions/arithmetic.py +55 -0
  361. classiq/qmod/builtins/functions/benchmarking.py +8 -0
  362. classiq/qmod/builtins/functions/chemistry.py +91 -0
  363. classiq/qmod/builtins/functions/exponentiation.py +105 -0
  364. classiq/qmod/builtins/functions/finance.py +34 -0
  365. classiq/qmod/builtins/functions/operators.py +16 -0
  366. classiq/qmod/builtins/functions/qsvm.py +24 -0
  367. classiq/qmod/builtins/functions/standard_gates.py +651 -0
  368. classiq/qmod/builtins/operations.py +373 -40
  369. classiq/qmod/builtins/structs.py +103 -80
  370. classiq/qmod/cfunc.py +2 -2
  371. classiq/qmod/classical_function.py +4 -8
  372. classiq/qmod/cparam.py +64 -0
  373. classiq/qmod/create_model_function.py +56 -0
  374. classiq/qmod/declaration_inferrer.py +143 -101
  375. classiq/qmod/expression_query.py +20 -4
  376. classiq/qmod/generative.py +42 -0
  377. classiq/qmod/model_state_container.py +18 -6
  378. classiq/qmod/native/__init__.py +7 -0
  379. classiq/qmod/native/expression_to_qmod.py +16 -11
  380. classiq/qmod/native/pretty_printer.py +187 -97
  381. classiq/qmod/pretty_print/__init__.py +7 -0
  382. classiq/qmod/pretty_print/expression_to_python.py +222 -0
  383. classiq/qmod/pretty_print/pretty_printer.py +572 -0
  384. classiq/qmod/python_classical_type.py +67 -0
  385. classiq/qmod/qfunc.py +60 -8
  386. classiq/qmod/qmod_constant.py +93 -26
  387. classiq/qmod/qmod_parameter.py +68 -59
  388. classiq/qmod/qmod_variable.py +468 -155
  389. classiq/qmod/quantum_callable.py +17 -7
  390. classiq/qmod/quantum_expandable.py +269 -96
  391. classiq/qmod/quantum_function.py +196 -41
  392. classiq/qmod/semantics/__init__.py +0 -0
  393. classiq/qmod/semantics/annotation/__init__.py +0 -0
  394. classiq/qmod/semantics/annotation/call_annotation.py +92 -0
  395. classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
  396. classiq/qmod/semantics/error_manager.py +88 -0
  397. classiq/qmod/semantics/lambdas.py +25 -0
  398. classiq/qmod/semantics/static_semantics_visitor.py +384 -0
  399. classiq/qmod/semantics/validation/__init__.py +0 -0
  400. classiq/qmod/semantics/validation/constants_validation.py +16 -0
  401. classiq/qmod/semantics/validation/func_call_validation.py +99 -0
  402. classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
  403. classiq/qmod/semantics/validation/handle_validation.py +85 -0
  404. classiq/qmod/semantics/validation/main_validation.py +33 -0
  405. classiq/qmod/semantics/validation/types_validation.py +128 -0
  406. classiq/qmod/symbolic.py +147 -123
  407. classiq/qmod/symbolic_expr.py +27 -12
  408. classiq/qmod/symbolic_type.py +2 -5
  409. classiq/qmod/type_attribute_remover.py +32 -0
  410. classiq/qmod/utilities.py +98 -4
  411. classiq/qmod/write_qmod.py +17 -3
  412. classiq/synthesis.py +210 -22
  413. {classiq-0.38.0.dist-info → classiq-0.65.3.dist-info}/METADATA +16 -9
  414. classiq-0.65.3.dist-info/RECORD +521 -0
  415. classiq/_internals/_qfunc_ext.py +0 -6
  416. classiq/applications/benchmarking/__init__.py +0 -9
  417. classiq/applications/benchmarking/mirror_benchmarking.py +0 -70
  418. classiq/applications/numpy_utils.py +0 -37
  419. classiq/applications_model_constructors/__init__.py +0 -25
  420. classiq/applications_model_constructors/combinatorial_helpers/multiple_comp_basis_sp.py +0 -34
  421. classiq/applications_model_constructors/combinatorial_helpers/pauli_helpers/pauli_utils.py +0 -65
  422. classiq/applications_model_constructors/combinatorial_helpers/pyomo_utils.py +0 -243
  423. classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
  424. classiq/applications_model_constructors/libraries/qmci_library.py +0 -107
  425. classiq/builtin_functions/__init__.py +0 -43
  426. classiq/builtin_functions/amplitude_loading.py +0 -3
  427. classiq/builtin_functions/binary_ops.py +0 -1
  428. classiq/builtin_functions/exponentiation.py +0 -5
  429. classiq/builtin_functions/qpe.py +0 -4
  430. classiq/builtin_functions/qsvm.py +0 -7
  431. classiq/builtin_functions/range_types.py +0 -5
  432. classiq/builtin_functions/standard_gates.py +0 -1
  433. classiq/builtin_functions/state_preparation.py +0 -6
  434. classiq/builtin_functions/suzuki_trotter.py +0 -3
  435. classiq/interface/executor/aws_execution_cost.py +0 -73
  436. classiq/interface/executor/error_mitigation.py +0 -6
  437. classiq/interface/generator/credit_risk_example/linear_gci.py +0 -122
  438. classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -69
  439. classiq/interface/generator/expressions/enums/chemistry.py +0 -28
  440. classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
  441. classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
  442. classiq/interface/generator/expressions/enums/optimizers.py +0 -9
  443. classiq/interface/generator/expressions/enums/pauli.py +0 -8
  444. classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
  445. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
  446. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
  447. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
  448. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -1229
  449. classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -95
  450. classiq/interface/generator/functions/foreign_function_definition.py +0 -114
  451. classiq/interface/generator/functions/function_implementation.py +0 -107
  452. classiq/interface/generator/functions/native_function_definition.py +0 -155
  453. classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
  454. classiq/interface/generator/functions/register.py +0 -44
  455. classiq/interface/generator/functions/register_mapping_data.py +0 -106
  456. classiq/interface/generator/inequality_mixer.py +0 -51
  457. classiq/interface/generator/model/classical_main_validator.py +0 -106
  458. classiq/interface/generator/range_mixer.py +0 -56
  459. classiq/interface/generator/state_propagator.py +0 -74
  460. classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -1
  461. classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
  462. classiq/interface/ide/show.py +0 -34
  463. classiq/interface/model/call_synthesis_data.py +0 -68
  464. classiq/interface/model/common_model_types.py +0 -23
  465. classiq/interface/model/quantum_expressions/control_state.py +0 -38
  466. classiq/interface/model/quantum_if_operation.py +0 -94
  467. classiq/interface/model/resolvers/function_call_resolver.py +0 -43
  468. classiq/interface/model/validations/handle_validation_base.py +0 -55
  469. classiq/interface/model/validations/handles_validator.py +0 -156
  470. classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
  471. classiq/model/__init__.py +0 -14
  472. classiq/model/composite_function_generator.py +0 -33
  473. classiq/model/function_handler.py +0 -462
  474. classiq/model/logic_flow.py +0 -149
  475. classiq/model/logic_flow_change_handler.py +0 -71
  476. classiq/model/model.py +0 -229
  477. classiq/qmod/builtins/functions.py +0 -913
  478. classiq/qmod/qmod_struct.py +0 -37
  479. classiq/quantum_functions/__init__.py +0 -17
  480. classiq/quantum_functions/annotation_parser.py +0 -205
  481. classiq/quantum_functions/decorators.py +0 -22
  482. classiq/quantum_functions/function_library.py +0 -181
  483. classiq/quantum_functions/function_parser.py +0 -74
  484. classiq/quantum_functions/quantum_function.py +0 -236
  485. classiq-0.38.0.dist-info/RECORD +0 -454
  486. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/__init__.py +0 -0
  487. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/__init__.py +0 -0
  488. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/__init__.py +0 -0
  489. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +0 -0
  490. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/py.typed +0 -0
  491. /classiq/{applications_model_constructors/combinatorial_helpers/transformations → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
  492. /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
  493. /classiq/{interface/generator/credit_risk_example → applications/hamiltonian}/__init__.py +0 -0
  494. /classiq/{interface/generator/functions/core_lib_declarations → applications/libraries}/__init__.py +0 -0
  495. /classiq/interface/{model/resolvers → debug_info}/__init__.py +0 -0
  496. /classiq/{_internals → interface}/enum_utils.py +0 -0
  497. /classiq/interface/{model/validations → generator/functions/builtins}/__init__.py +0 -0
  498. /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → model_expansions/__init__.py} +0 -0
  499. {classiq-0.38.0.dist-info → classiq-0.65.3.dist-info}/WHEEL +0 -0
@@ -0,0 +1,86 @@
1
+ import json
2
+ from collections.abc import Mapping
3
+ from typing import Any, Optional, Union
4
+ from uuid import UUID
5
+
6
+ from pydantic import BaseModel, Field
7
+
8
+ from classiq.interface.enum_utils import StrEnum
9
+ from classiq.interface.generator.generated_circuit_data import (
10
+ FunctionDebugInfoInterface,
11
+ OperationLevel,
12
+ )
13
+
14
+ ParameterValue = Union[float, int, str, None]
15
+
16
+
17
+ class StatementType(StrEnum):
18
+ CONTROL = "control"
19
+ POWER = "power"
20
+ INVERT = "invert"
21
+ WITHIN_APPLY = "within_apply"
22
+ ASSIGNMENT = "assignment"
23
+ REPEAT = "repeat"
24
+
25
+
26
+ class FunctionDebugInfo(BaseModel):
27
+ name: str
28
+ # Parameters describe classical parameters passed to function
29
+ parameters: dict[str, str]
30
+ level: OperationLevel
31
+ statement_type: Union[StatementType, None] = None
32
+ is_allocate_or_free: bool = Field(default=False)
33
+ is_inverse: bool = Field(default=False)
34
+ port_to_passed_variable_map: dict[str, str] = Field(default_factory=dict)
35
+
36
+ @staticmethod
37
+ def param_controller(value: Any) -> str:
38
+ try:
39
+ return json.dumps(value)
40
+ except TypeError:
41
+ return repr(value)
42
+
43
+ def update_map_from_port_mapping(self, port_mapping: Mapping[str, str]) -> None:
44
+ new_port_to_passed_variable_map = self.port_to_passed_variable_map.copy()
45
+ for old_key, new_key in port_mapping.items():
46
+ if old_key in new_port_to_passed_variable_map:
47
+ new_port_to_passed_variable_map[new_key] = (
48
+ new_port_to_passed_variable_map.pop(old_key)
49
+ )
50
+ self.port_to_passed_variable_map = new_port_to_passed_variable_map
51
+
52
+ def update_map_from_inout_port_mapping(
53
+ self, port_mapping: Mapping[str, tuple[str, str]]
54
+ ) -> None:
55
+ new_port_to_passed_variable_map = self.port_to_passed_variable_map.copy()
56
+ for old_key, (new_key1, new_key2) in port_mapping.items():
57
+ if old_key in new_port_to_passed_variable_map:
58
+ value = new_port_to_passed_variable_map.pop(old_key)
59
+ new_port_to_passed_variable_map[new_key1] = value
60
+ new_port_to_passed_variable_map[new_key2] = value
61
+ self.port_to_passed_variable_map = new_port_to_passed_variable_map
62
+
63
+
64
+ class DebugInfoCollection(BaseModel):
65
+ # Pydantic only started supporting UUID as keys in Pydantic V2
66
+ # See https://github.com/pydantic/pydantic/issues/2096#issuecomment-814860206
67
+ # For now, we use strings as keys in the raw data and use UUID in the wrapper logic
68
+ data: dict[str, FunctionDebugInfo] = Field(default={})
69
+ blackbox_data: dict[str, FunctionDebugInfoInterface] = Field(default={})
70
+
71
+ def __setitem__(self, key: UUID, value: FunctionDebugInfo) -> None:
72
+ self.data[str(key)] = value
73
+
74
+ def get(self, key: UUID) -> Optional[FunctionDebugInfo]:
75
+ return self.data.get(str(key))
76
+
77
+ def __getitem__(self, key: UUID) -> FunctionDebugInfo:
78
+ return self.data[str(key)]
79
+
80
+ def __contains__(self, key: UUID) -> bool:
81
+ return str(key) in self.data
82
+
83
+ def get_blackbox_data(self, key: UUID) -> Optional[FunctionDebugInfoInterface]:
84
+ if (debug_info := self.get(key)) is None:
85
+ return None
86
+ return self.blackbox_data.get(debug_info.name)
@@ -1,19 +1,21 @@
1
1
  import logging
2
- from typing import Iterable, List
2
+ from collections.abc import Iterable
3
+ from typing import Optional
3
4
 
4
5
  _logger = logging.getLogger(__name__)
5
6
 
6
7
  CLASSIQ_SLACK_COMMUNITY_LINK = (
7
- "\nIf you need further assistance, please reach out on our Community Slack channel at: https://short.classiq.io/join-slack"
8
- "\nIf the error persists feel free to open a ticket at: https://short.classiq.io/support"
8
+ "\nIf you need further assistance, please reach out on our Community Slack channel "
9
+ "at: https://short.classiq.io/join-slack"
9
10
  )
10
11
 
11
12
 
12
13
  class ClassiqError(Exception):
13
14
  def __init__(self, message: str) -> None:
14
- message_with_link = message + CLASSIQ_SLACK_COMMUNITY_LINK
15
- super().__init__(message_with_link)
16
15
  self._raw_message = message
16
+ if CLASSIQ_SLACK_COMMUNITY_LINK not in message:
17
+ message = message + CLASSIQ_SLACK_COMMUNITY_LINK
18
+ super().__init__(message)
17
19
 
18
20
  @property
19
21
  def raw_message(self) -> str:
@@ -25,7 +27,7 @@ class ClassiqExecutionError(ClassiqError):
25
27
 
26
28
 
27
29
  class ClassiqMissingOutputFormatError(ClassiqError):
28
- def __init__(self, missing_formats: List[str]) -> None:
30
+ def __init__(self, missing_formats: list[str]) -> None:
29
31
  msg = (
30
32
  f"Cannot create program because output format is missing. "
31
33
  f"Expected one of the following formats: {missing_formats}"
@@ -45,12 +47,14 @@ class ClassiqAnalyzerError(ClassiqError):
45
47
  pass
46
48
 
47
49
 
48
- class ClassiqAnalyzerGraphError(ClassiqError):
50
+ class ClassiqAnalyzerVisualizationError(ClassiqError):
49
51
  pass
50
52
 
51
53
 
52
54
  class ClassiqAPIError(ClassiqError):
53
- pass
55
+ def __init__(self, message: str, status_code: Optional[int] = None) -> None:
56
+ self.status_code = status_code
57
+ super().__init__(message)
54
58
 
55
59
 
56
60
  class ClassiqVersionError(ClassiqError):
@@ -143,7 +147,7 @@ class ClassiqCombOptNoSolutionError(ClassiqError):
143
147
 
144
148
  class ClassiqCombOptTrivialProblemError(ClassiqError):
145
149
 
146
- def __init__(self, solution: List[int]) -> None:
150
+ def __init__(self, solution: list[int]) -> None:
147
151
  super().__init__(
148
152
  message=f"The problem doesn't have free decision variables. "
149
153
  f"The trivial solution is {solution}."
@@ -171,3 +175,27 @@ class ClassiqExecutorInvalidHamiltonianError(ClassiqCombOptError):
171
175
 
172
176
  def __init__(self) -> None:
173
177
  super().__init__("Invalid hamiltonian")
178
+
179
+
180
+ class ClassiqSemanticError(ClassiqError):
181
+ pass
182
+
183
+
184
+ class ClassiqDeprecationWarning(FutureWarning):
185
+ pass
186
+
187
+
188
+ class ClassiqExpansionError(ClassiqError):
189
+ pass
190
+
191
+
192
+ class ClassiqInternalError(ClassiqError):
193
+ def __init__(self, message: Optional[str] = None) -> None:
194
+ final_message = "Internal error occurred. Please contact Classiq support."
195
+ if message is not None:
196
+ final_message += f"\nError: {message}"
197
+ super().__init__(final_message)
198
+
199
+
200
+ class ClassiqInternalExpansionError(ClassiqInternalError):
201
+ pass
@@ -0,0 +1,19 @@
1
+ from classiq.interface.helpers.versioned_model import VersionedModel
2
+
3
+
4
+ class IQCCInitAuthData(VersionedModel):
5
+ auth_scope_id: str
6
+ auth_method_id: str
7
+
8
+
9
+ class IQCCInitAuthResponse(VersionedModel):
10
+ auth_url: str
11
+ token_id: str
12
+
13
+
14
+ class IQCCProbeAuthData(IQCCInitAuthData):
15
+ token_id: str
16
+
17
+
18
+ class IQCCProbeAuthResponse(VersionedModel):
19
+ auth_token: str
@@ -1,28 +1,31 @@
1
1
  from datetime import datetime
2
- from typing import List, Optional
2
+ from typing import Optional
3
3
 
4
- from pydantic import BaseModel, Extra
4
+ from pydantic import BaseModel, Field
5
5
 
6
+ from classiq.interface.executor.execution_request import JobCost
6
7
  from classiq.interface.jobs import JobStatus
7
8
 
8
9
 
9
- class ExecutionJobDetailsV1(BaseModel, extra=Extra.ignore):
10
+ class ExecutionJobDetailsV1(BaseModel, extra="ignore"):
10
11
  id: str
11
12
 
12
- name: Optional[str]
13
+ name: Optional[str] = None
13
14
  start_time: datetime
14
- end_time: Optional[datetime]
15
+ end_time: Optional[datetime] = None
15
16
 
16
- provider: Optional[str]
17
- backend_name: Optional[str]
17
+ provider: Optional[str] = None
18
+ backend_name: Optional[str] = None
18
19
 
19
20
  status: JobStatus
20
21
 
21
- num_shots: Optional[int]
22
- program_id: Optional[str]
22
+ num_shots: Optional[int] = None
23
+ program_id: Optional[str] = None
23
24
 
24
- error: Optional[str]
25
+ error: Optional[str] = None
25
26
 
27
+ cost: Optional[JobCost] = Field(default=None)
26
28
 
27
- class ExecutionJobsQueryResultsV1(BaseModel, extra=Extra.ignore):
28
- results: List[ExecutionJobDetailsV1]
29
+
30
+ class ExecutionJobsQueryResultsV1(BaseModel, extra="ignore"):
31
+ results: list[ExecutionJobDetailsV1]
@@ -0,0 +1,18 @@
1
+ from typing import Optional
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+ from classiq.interface.chemistry.operator import PauliOperator
6
+ from classiq.interface.executor.quantum_code import Arguments
7
+ from classiq.interface.helpers.custom_encoders import CUSTOM_ENCODERS
8
+
9
+
10
+ class EstimateInput(BaseModel, json_encoders=CUSTOM_ENCODERS):
11
+ hamiltonian: PauliOperator
12
+ parameters: list[Arguments]
13
+
14
+
15
+ class PrimitivesInput(BaseModel, json_encoders=CUSTOM_ENCODERS):
16
+ sample: Optional[list[Arguments]] = Field(default=None)
17
+ estimate: Optional[EstimateInput] = Field(default=None)
18
+ random_seed: Optional[int] = Field(default=None)
@@ -0,0 +1 @@
1
+ DEFAULT_RESULT_NAME = "result"
@@ -1,40 +1,22 @@
1
- from datetime import timedelta
2
- from typing import Any, Dict, Optional, TypeVar
1
+ from typing import Optional
3
2
 
4
3
  import pydantic
5
4
 
6
5
  from classiq.interface.backend.backend_preferences import (
7
- AWS_DEFAULT_JOB_TIMEOUT_SECONDS,
8
- AwsBackendPreferences,
9
6
  BackendPreferencesTypes,
10
7
  backend_preferences_field,
11
8
  )
12
- from classiq.interface.backend.pydantic_backend import MAX_EXECUTION_TIMEOUT_SECONDS
13
- from classiq.interface.backend.quantum_backend_providers import ClassiqAerBackendNames
14
- from classiq.interface.executor.error_mitigation import ErrorMitigationMethod
15
- from classiq.interface.executor.optimizer_preferences import (
16
- OptimizerPreferences,
17
- OptimizerType,
9
+ from classiq.interface.backend.quantum_backend_providers import (
10
+ ClassiqSimulatorBackendNames,
18
11
  )
12
+ from classiq.interface.enum_utils import ReprEnum
13
+ from classiq.interface.executor.optimizer_preferences import OptimizerType
19
14
  from classiq.interface.generator.model.preferences.preferences import (
20
15
  TranspilationOption,
21
16
  )
22
17
  from classiq.interface.generator.model.preferences.randomness import create_random_seed
23
18
  from classiq.interface.generator.noise_properties import NoiseProperties
24
19
 
25
- from classiq._internals.enum_utils import ReprEnum
26
- from classiq.exceptions import ClassiqValueError
27
-
28
- DIFFERENT_TIMEOUT_MSG = (
29
- "Timeout is defined differently in the execution preferences and the "
30
- "AWS Backend Preferences."
31
- )
32
-
33
- TIMEOUT_LARGE_FOR_AWS_MSG = (
34
- "Timeout is larger than the current allowed limit of "
35
- f"{timedelta(MAX_EXECUTION_TIMEOUT_SECONDS)}"
36
- )
37
-
38
20
 
39
21
  class QaeWithQpeEstimationMethod(int, ReprEnum):
40
22
  MAXIMUM_LIKELIHOOD = 0
@@ -42,29 +24,33 @@ class QaeWithQpeEstimationMethod(int, ReprEnum):
42
24
 
43
25
 
44
26
  class ExecutionPreferences(pydantic.BaseModel):
45
- timeout_sec: Optional[pydantic.PositiveInt] = pydantic.Field(
46
- default=None,
47
- description="If set, limits the execution runtime. Value is in seconds. "
48
- "Not supported on all platforms.",
49
- )
50
- optimizer_preferences: Optional[OptimizerPreferences] = pydantic.Field(
51
- default_factory=None,
52
- description="Settings related to VQE execution.",
53
- )
54
- error_mitigation_method: Optional[ErrorMitigationMethod] = pydantic.Field(
55
- default=None,
56
- description="Error mitigation method. Currently supports complete and tensored "
57
- "measurement calibration.",
58
- )
27
+ """
28
+ Represents the execution settings for running a quantum program.
29
+ Execution preferences for running a quantum program.
30
+
31
+ For more details, refer to:
32
+ `ExecutionPreferences example: [ExecutionPreferences](https://docs.classiq.io/latest/reference-manual/executor/?h=execution+pref#execution-preferences)..
33
+
34
+ Attributes:
35
+ noise_properties (Optional[NoiseProperties]): Properties defining the noise in the quantum circuit. Defaults to `None`.
36
+ random_seed (int): The random seed used for the execution. Defaults to a randomly generated seed.
37
+ backend_preferences (BackendPreferencesTypes): Preferences for the backend used to execute the circuit.
38
+ Defaults to the Classiq Simulator.
39
+ num_shots (Optional[pydantic.PositiveInt]): The number of shots (executions) to be performed.
40
+ transpile_to_hardware (TranspilationOption): Option to transpile the circuit to the hardware's basis gates
41
+ before execution. Defaults to `TranspilationOption.DECOMPOSE`.
42
+ job_name (Optional[str]): The name of the job, with a minimum length of 1 character.
43
+ """
44
+
59
45
  noise_properties: Optional[NoiseProperties] = pydantic.Field(
60
46
  default=None, description="Properties of the noise in the circuit"
61
47
  )
62
48
  random_seed: int = pydantic.Field(
63
- default=None,
49
+ default_factory=create_random_seed,
64
50
  description="The random seed used for the execution",
65
51
  )
66
52
  backend_preferences: BackendPreferencesTypes = backend_preferences_field(
67
- backend_name=ClassiqAerBackendNames.AER_SIMULATOR
53
+ backend_name=ClassiqSimulatorBackendNames.SIMULATOR
68
54
  )
69
55
  num_shots: Optional[pydantic.PositiveInt] = pydantic.Field(default=None)
70
56
  transpile_to_hardware: TranspilationOption = pydantic.Field(
@@ -73,87 +59,13 @@ class ExecutionPreferences(pydantic.BaseModel):
73
59
  title="Transpilation Option",
74
60
  )
75
61
  job_name: Optional[str] = pydantic.Field(
76
- min_length=1,
77
- description="The job name",
62
+ min_length=1, description="The job name", default=None
78
63
  )
79
64
 
80
- def __init__(self, **kwargs: Any) -> None:
81
- super().__init__(**kwargs)
82
-
83
- @pydantic.validator("num_shots", always=True)
84
- def validate_num_shots(
85
- cls, original_num_shots: Optional[pydantic.PositiveInt], values: Dict[str, Any]
86
- ) -> Optional[pydantic.PositiveInt]:
87
- return _choose_original_or_optimizer_attribute(
88
- original_num_shots, "num_shots", None, values
89
- )
90
-
91
- @pydantic.validator("backend_preferences", always=True)
92
- def validate_timeout_for_aws(
93
- cls, backend_preferences: BackendPreferencesTypes, values: Dict[str, Any]
94
- ) -> BackendPreferencesTypes:
95
- timeout = values.get("timeout_sec", None)
96
- if (
97
- not isinstance(backend_preferences, AwsBackendPreferences)
98
- or timeout is None
99
- ):
100
- return backend_preferences
101
- if (
102
- timeout != backend_preferences.job_timeout
103
- and backend_preferences.job_timeout != AWS_DEFAULT_JOB_TIMEOUT_SECONDS
104
- ):
105
- raise ClassiqValueError(DIFFERENT_TIMEOUT_MSG)
106
- if timeout > MAX_EXECUTION_TIMEOUT_SECONDS:
107
- raise ClassiqValueError(TIMEOUT_LARGE_FOR_AWS_MSG)
108
-
109
- backend_preferences.job_timeout = timeout
110
- return backend_preferences
111
-
112
- @pydantic.validator("random_seed", always=True)
113
- def validate_random_seed(
114
- cls, original_random_seed: Optional[int], values: Dict[str, Any]
115
- ) -> int:
116
- return _choose_original_or_optimizer_attribute(
117
- original_random_seed, "random_seed", create_random_seed(), values
118
- )
119
-
120
-
121
- T = TypeVar("T")
122
-
123
-
124
- def _choose_original_or_optimizer_attribute(
125
- original_attribute: Optional[T],
126
- attribure_name: str,
127
- default_value: T,
128
- values: Dict[str, Any],
129
- ) -> T:
130
- optimizer_preferences = values.get("optimizer_preferences", None)
131
- optimizer_attribute = getattr(optimizer_preferences, attribure_name, None)
132
-
133
- if original_attribute is None and optimizer_attribute is None:
134
- return default_value
135
-
136
- elif optimizer_attribute is None:
137
- # mypy doesn't understand that original_attribute is not None
138
- return original_attribute # type: ignore[return-value]
139
-
140
- elif original_attribute is None:
141
- return optimizer_attribute
142
-
143
- elif original_attribute != optimizer_attribute:
144
- raise ClassiqValueError(
145
- f"Different {attribure_name} were given for ExecutionPreferences and OptimizerPreferences."
146
- )
147
-
148
- else: # This case is original_num_shots == optimizer_num_shots != None
149
- return original_attribute
150
-
151
65
 
152
66
  __all__ = [
153
67
  "ExecutionPreferences",
154
- "ErrorMitigationMethod",
155
68
  "NoiseProperties",
156
- "OptimizerPreferences",
157
69
  "OptimizerType",
158
70
  "QaeWithQpeEstimationMethod",
159
71
  ]
@@ -1,21 +1,17 @@
1
1
  from datetime import datetime
2
- from typing import Any, Dict, List, Literal, Optional, Union
2
+ from typing import Annotated, Literal, Optional, Union
3
3
 
4
4
  import pydantic
5
5
  from pydantic import BaseModel, Field
6
- from typing_extensions import Annotated
7
6
 
8
- from classiq.interface.backend.backend_preferences import IonqBackendPreferences
9
7
  from classiq.interface.executor.estimation import OperatorsEstimation
10
8
  from classiq.interface.executor.execution_preferences import ExecutionPreferences
11
- from classiq.interface.executor.quantum_code import QuantumCode, QuantumInstructionSet
9
+ from classiq.interface.executor.quantum_code import QuantumCode
12
10
  from classiq.interface.generator.quantum_program import QuantumProgram
13
11
  from classiq.interface.helpers.custom_encoders import CUSTOM_ENCODERS
14
12
  from classiq.interface.helpers.versioned_model import VersionedModel
15
13
  from classiq.interface.jobs import JobStatus
16
14
 
17
- from classiq.exceptions import ClassiqValueError
18
-
19
15
 
20
16
  class QuantumProgramExecution(QuantumProgram):
21
17
  execution_type: Literal["quantum_program2"] = "quantum_program2"
@@ -42,60 +38,42 @@ class ExecutionRequest(BaseModel, json_encoders=CUSTOM_ENCODERS):
42
38
  description="preferences for the execution",
43
39
  )
44
40
 
45
- @pydantic.validator("preferences")
46
- def validate_ionq_backend(
47
- cls, preferences: ExecutionPreferences, values: Dict[str, Any]
48
- ) -> ExecutionPreferences:
49
- """
50
- This function implement the following check:
51
- BE \\ payload | IonQ program | Qasm program | Other
52
- --------------|--------------|--------------|------
53
- IonQ backend | V | V | X
54
- Other backend | X | V | V
55
- Since:
56
- - We can't execute non-programs on the IonQ backends
57
- - We can't execute IonQ programs on non-IonQ backends
58
- """
59
- quantum_program = values.get("execution_payload")
60
- is_ionq_backend = isinstance(
61
- preferences.backend_preferences, IonqBackendPreferences
62
- )
63
- if isinstance(quantum_program, QuantumCode):
64
- if (
65
- quantum_program.syntax == QuantumInstructionSet.IONQ
66
- and not is_ionq_backend
67
- ):
68
- raise ClassiqValueError("Can only execute IonQ code on IonQ backend.")
69
- else:
70
- # If we handle anything other than a program.
71
- if is_ionq_backend:
72
- raise ClassiqValueError(
73
- "IonQ backend supports only execution of QuantumPrograms"
74
- )
75
- return preferences
76
-
77
41
 
78
42
  class QuantumProgramExecutionRequest(ExecutionRequest):
79
43
  execution_payload: QuantumCodeExecution
80
44
 
81
45
 
46
+ class ProviderJobs(BaseModel):
47
+ provider_job_id: str = Field(default="DUMMY")
48
+ cost: float = Field(default=0)
49
+
50
+
51
+ class JobCost(BaseModel):
52
+ total_cost: float = Field(default=0)
53
+ currency_code: str = Field(default="USD")
54
+ organization: Optional[str] = Field(default=None)
55
+ jobs: list[ProviderJobs] = Field(default=[])
56
+
57
+
82
58
  class ExecutionJobDetails(VersionedModel):
83
59
  id: str
84
60
 
85
- name: Optional[str]
61
+ name: Optional[str] = Field(default=None)
86
62
  start_time: datetime
87
- end_time: Optional[datetime]
63
+ end_time: Optional[datetime] = Field(default=None)
88
64
 
89
- provider: Optional[str]
90
- backend_name: Optional[str]
65
+ provider: Optional[str] = Field(default=None)
66
+ backend_name: Optional[str] = Field(default=None)
91
67
 
92
68
  status: JobStatus
93
69
 
94
- num_shots: Optional[int]
95
- program_id: Optional[str]
70
+ num_shots: Optional[int] = Field(default=None)
71
+ program_id: Optional[str] = Field(default=None)
72
+
73
+ error: Optional[str] = Field(default=None)
96
74
 
97
- error: Optional[str]
75
+ cost: Optional[JobCost] = Field(default=None)
98
76
 
99
77
 
100
78
  class ExecutionJobsQueryResults(VersionedModel):
101
- results: List[ExecutionJobDetails]
79
+ results: list[ExecutionJobDetails]
@@ -1,15 +1,19 @@
1
- from typing import Any, List, Literal, Union
1
+ from typing import Annotated, Any, Literal, Union
2
2
 
3
- from pydantic import BaseModel, Field
4
- from typing_extensions import Annotated, TypeAlias
3
+ from pydantic import BaseModel, ConfigDict, Field
4
+ from typing_extensions import TypeAlias
5
5
 
6
+ from classiq.interface.enum_utils import StrEnum
6
7
  from classiq.interface.executor.iqae_result import IQAEResult
7
- from classiq.interface.executor.result import EstimationResult, ExecutionDetails
8
+ from classiq.interface.executor.result import (
9
+ EstimationResult,
10
+ EstimationResults,
11
+ ExecutionDetails,
12
+ MultipleExecutionDetails,
13
+ )
8
14
  from classiq.interface.executor.vqe_result import VQESolverResult
9
15
  from classiq.interface.helpers.versioned_model import VersionedModel
10
16
 
11
- from classiq._internals.enum_utils import StrEnum
12
-
13
17
 
14
18
  class SavedResultValueType(StrEnum):
15
19
  Integer = "int"
@@ -17,7 +21,9 @@ class SavedResultValueType(StrEnum):
17
21
  Boolean = "bool"
18
22
  VQESolverResult = "VQESolverResult"
19
23
  ExecutionDetails = "ExecutionDetails"
24
+ MultipleExecutionDetails = "MultipleExecutionDetails"
20
25
  EstimationResult = "EstimationResult"
26
+ EstimationResults = "EstimationResults"
21
27
  IQAEResult = "IQAEResult"
22
28
  Unstructured = "Unstructured"
23
29
 
@@ -52,12 +58,24 @@ class TaggedExecutionDetails(BaseModel):
52
58
  value: ExecutionDetails
53
59
 
54
60
 
61
+ class TaggedMultipleExecutionDetails(BaseModel):
62
+ value_type: Literal[SavedResultValueType.MultipleExecutionDetails]
63
+ name: str
64
+ value: MultipleExecutionDetails
65
+
66
+
55
67
  class TaggedEstimationResult(BaseModel):
56
68
  value_type: Literal[SavedResultValueType.EstimationResult]
57
69
  name: str
58
70
  value: EstimationResult
59
71
 
60
72
 
73
+ class TaggedEstimationResults(BaseModel):
74
+ value_type: Literal[SavedResultValueType.EstimationResults]
75
+ name: str
76
+ value: EstimationResults
77
+
78
+
61
79
  class TaggedIQAEResult(BaseModel):
62
80
  value_type: Literal[SavedResultValueType.IQAEResult]
63
81
  name: str
@@ -67,7 +85,7 @@ class TaggedIQAEResult(BaseModel):
67
85
  class TaggedUnstructured(BaseModel):
68
86
  value_type: Literal[SavedResultValueType.Unstructured]
69
87
  name: str
70
- value: Any
88
+ value: Any = None
71
89
 
72
90
 
73
91
  SavedResult = Annotated[
@@ -77,15 +95,19 @@ SavedResult = Annotated[
77
95
  TaggedBoolean,
78
96
  TaggedVQESolverResult,
79
97
  TaggedExecutionDetails,
98
+ TaggedMultipleExecutionDetails,
80
99
  TaggedEstimationResult,
100
+ TaggedEstimationResults,
81
101
  TaggedIQAEResult,
82
102
  TaggedUnstructured,
83
103
  ],
84
104
  Field(..., discriminator="value_type"),
85
105
  ]
86
106
 
87
- ResultsCollection: TypeAlias = List[SavedResult]
107
+ ResultsCollection: TypeAlias = list[SavedResult]
88
108
 
89
109
 
90
110
  class ExecuteGeneratedCircuitResults(VersionedModel):
91
111
  results: ResultsCollection
112
+
113
+ model_config = ConfigDict(extra="forbid")
@@ -1,6 +1,4 @@
1
- from typing import List, Tuple
2
-
3
- from pydantic import BaseModel
1
+ from pydantic import BaseModel, Field
4
2
 
5
3
  from classiq.interface.executor.result import ExecutionDetails
6
4
  from classiq.interface.generator.functions.classical_type import QmodPyObject
@@ -14,6 +12,6 @@ class IQAEIterationData(BaseModel):
14
12
 
15
13
  class IQAEResult(VersionedModel, QmodPyObject):
16
14
  estimation: float
17
- confidence_interval: Tuple[float, float]
18
- iterations_data: List[IQAEIterationData]
19
- warnings: List[str]
15
+ confidence_interval: list[float] = Field(min_length=2, max_length=2)
16
+ iterations_data: list[IQAEIterationData]
17
+ warnings: list[str]