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,98 +1,56 @@
1
- from datetime import timedelta
2
- from typing import Any, Dict, List, Optional, TypeVar, Union
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
-
27
- DIFFERENT_TIMEOUT_MSG = (
28
- "Timeout is defined differently in the execution preferences and the "
29
- "AWS Backend Preferences."
30
- )
31
-
32
- TIMEOUT_LARGE_FOR_AWS_MSG = (
33
- "Timeout is larger than the current allowed limit of "
34
- f"{timedelta(MAX_EXECUTION_TIMEOUT_SECONDS)}"
35
- )
36
-
37
20
 
38
21
  class QaeWithQpeEstimationMethod(int, ReprEnum):
39
22
  MAXIMUM_LIKELIHOOD = 0
40
23
  BEST_FIT = 1
41
24
 
42
25
 
43
- class AmplitudeAmplification(pydantic.BaseModel):
44
- iterations: List[int] = pydantic.Field(
45
- default_factory=list,
46
- description="Number or list of numbers of iteration to use",
47
- )
48
- growth_rate: float = pydantic.Field(
49
- default=1.25,
50
- description="Number of iteration used is set to round(growth_rate**iterations)",
51
- )
52
- sample_from_iterations: bool = pydantic.Field(
53
- default=False,
54
- description="If True, number of iterations used is picked randomly from "
55
- "[1, iteration] range",
56
- )
57
- num_of_highest_probability_states_to_check: pydantic.PositiveInt = pydantic.Field(
58
- default=1, description="Then number of highest probability states to check"
59
- )
60
-
61
- @pydantic.validator("iterations")
62
- def _validate_iterations(cls, iterations: Union[List[int], int]) -> List[int]:
63
- if isinstance(iterations, int):
64
- return [iterations]
65
- return iterations
66
-
67
-
68
26
  class ExecutionPreferences(pydantic.BaseModel):
69
- timeout_sec: Optional[pydantic.PositiveInt] = pydantic.Field(
70
- default=None,
71
- description="If set, limits the execution runtime. Value is in seconds. "
72
- "Not supported on all platforms.",
73
- )
74
- amplitude_amplification: AmplitudeAmplification = pydantic.Field(
75
- default_factory=AmplitudeAmplification,
76
- description="Settings related to amplitude amplification execution, used during the grover execution.",
77
- )
78
- optimizer_preferences: Optional[OptimizerPreferences] = pydantic.Field(
79
- default_factory=None,
80
- description="Settings related to VQE execution.",
81
- )
82
- error_mitigation_method: Optional[ErrorMitigationMethod] = pydantic.Field(
83
- default=None,
84
- description="Error mitigation method. Currently supports complete and tensored "
85
- "measurement calibration.",
86
- )
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
+
87
45
  noise_properties: Optional[NoiseProperties] = pydantic.Field(
88
46
  default=None, description="Properties of the noise in the circuit"
89
47
  )
90
48
  random_seed: int = pydantic.Field(
91
- default=None,
49
+ default_factory=create_random_seed,
92
50
  description="The random seed used for the execution",
93
51
  )
94
52
  backend_preferences: BackendPreferencesTypes = backend_preferences_field(
95
- backend_name=ClassiqAerBackendNames.AER_SIMULATOR
53
+ backend_name=ClassiqSimulatorBackendNames.SIMULATOR
96
54
  )
97
55
  num_shots: Optional[pydantic.PositiveInt] = pydantic.Field(default=None)
98
56
  transpile_to_hardware: TranspilationOption = pydantic.Field(
@@ -101,88 +59,13 @@ class ExecutionPreferences(pydantic.BaseModel):
101
59
  title="Transpilation Option",
102
60
  )
103
61
  job_name: Optional[str] = pydantic.Field(
104
- min_length=1,
105
- description="The job name",
62
+ min_length=1, description="The job name", default=None
106
63
  )
107
64
 
108
- def __init__(self, **kwargs: Any) -> None:
109
- super().__init__(**kwargs)
110
-
111
- @pydantic.validator("num_shots", always=True)
112
- def validate_num_shots(
113
- cls, original_num_shots: Optional[pydantic.PositiveInt], values: Dict[str, Any]
114
- ) -> Optional[pydantic.PositiveInt]:
115
- return _choose_original_or_optimizer_attribute(
116
- original_num_shots, "num_shots", None, values
117
- )
118
-
119
- @pydantic.validator("backend_preferences", always=True)
120
- def validate_timeout_for_aws(
121
- cls, backend_preferences: BackendPreferencesTypes, values: Dict[str, Any]
122
- ) -> BackendPreferencesTypes:
123
- timeout = values.get("timeout_sec", None)
124
- if (
125
- not isinstance(backend_preferences, AwsBackendPreferences)
126
- or timeout is None
127
- ):
128
- return backend_preferences
129
- if (
130
- timeout != backend_preferences.job_timeout
131
- and backend_preferences.job_timeout != AWS_DEFAULT_JOB_TIMEOUT_SECONDS
132
- ):
133
- raise ValueError(DIFFERENT_TIMEOUT_MSG)
134
- if timeout > MAX_EXECUTION_TIMEOUT_SECONDS:
135
- raise ValueError(TIMEOUT_LARGE_FOR_AWS_MSG)
136
-
137
- backend_preferences.job_timeout = timeout
138
- return backend_preferences
139
-
140
- @pydantic.validator("random_seed", always=True)
141
- def validate_random_seed(
142
- cls, original_random_seed: Optional[int], values: Dict[str, Any]
143
- ) -> int:
144
- return _choose_original_or_optimizer_attribute(
145
- original_random_seed, "random_seed", create_random_seed(), values
146
- )
147
-
148
-
149
- T = TypeVar("T")
150
-
151
-
152
- def _choose_original_or_optimizer_attribute(
153
- original_attribute: Optional[T],
154
- attribure_name: str,
155
- default_value: T,
156
- values: Dict[str, Any],
157
- ) -> T:
158
- optimizer_preferences = values.get("optimizer_preferences", None)
159
- optimizer_attribute = getattr(optimizer_preferences, attribure_name, None)
160
-
161
- if original_attribute is None and optimizer_attribute is None:
162
- return default_value
163
-
164
- elif optimizer_attribute is None:
165
- # mypy doesn't understand that original_attribute is not None
166
- return original_attribute # type: ignore[return-value]
167
-
168
- elif original_attribute is None:
169
- return optimizer_attribute
170
-
171
- elif original_attribute != optimizer_attribute:
172
- raise ValueError(
173
- f"Different {attribure_name} were given for ExecutionPreferences and OptimizerPreferences."
174
- )
175
-
176
- else: # This case is original_num_shots == optimizer_num_shots != None
177
- return original_attribute
178
-
179
65
 
180
66
  __all__ = [
181
67
  "ExecutionPreferences",
182
- "AmplitudeAmplification",
183
- "ErrorMitigationMethod",
184
68
  "NoiseProperties",
185
- "OptimizerPreferences",
186
69
  "OptimizerType",
187
70
  "QaeWithQpeEstimationMethod",
188
71
  ]
@@ -1,99 +1,79 @@
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
- from pydantic import BaseModel
5
+ from pydantic import BaseModel, Field
6
6
 
7
- from classiq.interface.backend.backend_preferences import IonqBackendPreferences
8
7
  from classiq.interface.executor.estimation import OperatorsEstimation
9
8
  from classiq.interface.executor.execution_preferences import ExecutionPreferences
10
- from classiq.interface.executor.quantum_program import (
11
- QuantumInstructionSet,
12
- QuantumProgram,
13
- )
14
- from classiq.interface.generator.generated_circuit import GeneratedCircuit
9
+ from classiq.interface.executor.quantum_code import QuantumCode
10
+ from classiq.interface.generator.quantum_program import QuantumProgram
11
+ from classiq.interface.helpers.custom_encoders import CUSTOM_ENCODERS
15
12
  from classiq.interface.helpers.versioned_model import VersionedModel
16
13
  from classiq.interface.jobs import JobStatus
17
14
 
18
15
 
19
- class GeneratedCircuitExecution(GeneratedCircuit):
20
- execution_type: Literal["generated_circuit"] = "generated_circuit"
16
+ class QuantumProgramExecution(QuantumProgram):
17
+ execution_type: Literal["quantum_program2"] = "quantum_program2"
21
18
 
22
19
 
23
- class QuantumProgramExecution(QuantumProgram):
24
- execution_type: Literal["quantum_program"] = "quantum_program"
20
+ class QuantumCodeExecution(QuantumCode):
21
+ execution_type: Literal["quantum_code"] = "quantum_code"
25
22
 
26
23
 
27
24
  class EstimateOperatorsExecution(OperatorsEstimation):
28
25
  execution_type: Literal["estimate_operators"] = "estimate_operators"
29
26
 
30
27
 
31
- ExecutionPayloads = Union[
32
- GeneratedCircuitExecution, QuantumProgramExecution, EstimateOperatorsExecution
28
+ ExecutionPayloads = Annotated[
29
+ Union[QuantumProgramExecution, QuantumCodeExecution, EstimateOperatorsExecution],
30
+ Field(discriminator="execution_type"),
33
31
  ]
34
32
 
35
33
 
36
- class ExecutionRequest(BaseModel):
34
+ class ExecutionRequest(BaseModel, json_encoders=CUSTOM_ENCODERS):
37
35
  execution_payload: ExecutionPayloads
38
36
  preferences: ExecutionPreferences = pydantic.Field(
39
37
  default_factory=ExecutionPreferences,
40
38
  description="preferences for the execution",
41
39
  )
42
40
 
43
- @pydantic.validator("preferences")
44
- def validate_ionq_backend(
45
- cls, preferences: ExecutionPreferences, values: Dict[str, Any]
46
- ) -> ExecutionPreferences:
47
- """
48
- This function implement the following check:
49
- BE \\ payload | IonQ program | Qasm program | Other
50
- --------------|--------------|--------------|------
51
- IonQ backend | V | V | X
52
- Other backend | X | V | V
53
- Since:
54
- - We can't execute non-programs on the IonQ backends
55
- - We can't execute IonQ programs on non-IonQ backends
56
- """
57
- quantum_program = values.get("execution_payload")
58
- is_ionq_backend = isinstance(
59
- preferences.backend_preferences, IonqBackendPreferences
60
- )
61
- if isinstance(quantum_program, QuantumProgram):
62
- if (
63
- quantum_program.syntax == QuantumInstructionSet.IONQ
64
- and not is_ionq_backend
65
- ):
66
- raise ValueError("Can only execute IonQ code on IonQ backend.")
67
- else:
68
- # If we handle anything other than a program.
69
- if is_ionq_backend:
70
- raise ValueError(
71
- "IonQ backend supports only execution of QuantumPrograms"
72
- )
73
- return preferences
74
-
75
41
 
76
42
  class QuantumProgramExecutionRequest(ExecutionRequest):
77
- execution_payload: QuantumProgramExecution
43
+ execution_payload: QuantumCodeExecution
44
+
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=[])
78
56
 
79
57
 
80
58
  class ExecutionJobDetails(VersionedModel):
81
59
  id: str
82
60
 
83
- name: Optional[str]
61
+ name: Optional[str] = Field(default=None)
84
62
  start_time: datetime
85
- end_time: Optional[datetime]
63
+ end_time: Optional[datetime] = Field(default=None)
86
64
 
87
- provider: Optional[str]
88
- backend_name: Optional[str]
65
+ provider: Optional[str] = Field(default=None)
66
+ backend_name: Optional[str] = Field(default=None)
89
67
 
90
68
  status: JobStatus
91
69
 
92
- num_shots: Optional[int]
93
- 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)
94
74
 
95
- error: Optional[str]
75
+ cost: Optional[JobCost] = Field(default=None)
96
76
 
97
77
 
98
78
  class ExecutionJobsQueryResults(VersionedModel):
99
- 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]
@@ -1,12 +1,13 @@
1
- from typing import List, Optional
1
+ from typing import Optional
2
2
 
3
3
  import pydantic
4
4
  from pydantic import BaseModel
5
+ from pydantic_core.core_schema import ValidationInfo
5
6
 
7
+ from classiq.interface.enum_utils import StrEnum
8
+ from classiq.interface.exceptions import ClassiqValueError
6
9
  from classiq.interface.helpers.custom_pydantic_types import PydanticAlphaParamCVAR
7
10
 
8
- from classiq._internals.enum_utils import StrEnum
9
-
10
11
 
11
12
  class CostType(StrEnum):
12
13
  MIN = "MIN"
@@ -33,10 +34,10 @@ class OptimizerPreferences(BaseModel):
33
34
  max_iteration: pydantic.PositiveInt = pydantic.Field(
34
35
  default=100, description="Maximal number of optimizer iterations"
35
36
  )
36
- tolerance: pydantic.PositiveFloat = pydantic.Field(
37
+ tolerance: Optional[pydantic.PositiveFloat] = pydantic.Field(
37
38
  default=None, description="Final accuracy in the optimization"
38
39
  )
39
- step_size: pydantic.PositiveFloat = pydantic.Field(
40
+ step_size: Optional[pydantic.PositiveFloat] = pydantic.Field(
40
41
  default=None,
41
42
  description="step size for numerically " "calculating the gradient",
42
43
  )
@@ -44,7 +45,7 @@ class OptimizerPreferences(BaseModel):
44
45
  default=None,
45
46
  description="The random seed used for the generation",
46
47
  )
47
- initial_point: Optional[List[float]] = pydantic.Field(
48
+ initial_point: Optional[list[float]] = pydantic.Field(
48
49
  default=None,
49
50
  description="Initial values for the ansatz parameters",
50
51
  )
@@ -53,31 +54,39 @@ class OptimizerPreferences(BaseModel):
53
54
  description="If True, the optimizer will not compute the variance of the ansatz.",
54
55
  )
55
56
 
56
- @pydantic.validator("tolerance", pre=True, always=True)
57
- def check_tolerance(cls, tolerance, values):
58
- optimizer_type = values.get("type")
57
+ @pydantic.field_validator("tolerance", mode="before")
58
+ @classmethod
59
+ def check_tolerance(
60
+ cls, tolerance: Optional[pydantic.PositiveFloat], info: ValidationInfo
61
+ ) -> Optional[pydantic.PositiveFloat]:
62
+ optimizer_type = info.data.get("type")
59
63
  if tolerance is not None and optimizer_type == OptimizerType.SPSA:
60
- raise ValueError("No tolerance param for SPSA optimizer")
64
+ raise ClassiqValueError("No tolerance param for SPSA optimizer")
61
65
 
62
66
  if tolerance is None and optimizer_type != OptimizerType.SPSA:
63
- tolerance = 0.001
67
+ tolerance = pydantic.PositiveFloat(0.001)
64
68
 
65
69
  return tolerance
66
70
 
67
- @pydantic.validator("step_size", pre=True, always=True)
68
- def check_step_size(cls, step_size, values):
69
- optimizer_type = values.get("name")
71
+ @pydantic.field_validator("step_size", mode="before")
72
+ @classmethod
73
+ def check_step_size(
74
+ cls, step_size: Optional[pydantic.PositiveFloat], info: ValidationInfo
75
+ ) -> Optional[pydantic.PositiveFloat]:
76
+ optimizer_type = info.data.get("name")
70
77
  if step_size is not None and optimizer_type not in (
71
78
  OptimizerType.L_BFGS_B,
72
79
  OptimizerType.ADAM,
73
80
  ):
74
- raise ValueError("Use step_size only for L_BFGS_B or ADAM optimizers.")
81
+ raise ClassiqValueError(
82
+ "Use step_size only for L_BFGS_B or ADAM optimizers."
83
+ )
75
84
 
76
85
  if step_size is None and optimizer_type in (
77
86
  OptimizerType.L_BFGS_B,
78
87
  OptimizerType.ADAM,
79
88
  ):
80
- step_size = 0.05
89
+ step_size = pydantic.PositiveFloat(0.05)
81
90
 
82
91
  return step_size
83
92
 
@@ -91,7 +100,7 @@ class CombinatorialOptimizer(OptimizerPreferences):
91
100
  default=CostType.CVAR,
92
101
  description="Summarizing method of the measured bit strings",
93
102
  )
94
- alpha_cvar: PydanticAlphaParamCVAR = pydantic.Field(
103
+ alpha_cvar: Optional[PydanticAlphaParamCVAR] = pydantic.Field(
95
104
  default=None, description="Parameter for the CVAR summarizing method"
96
105
  )
97
106
  is_maximization: bool = pydantic.Field(
@@ -103,13 +112,16 @@ class CombinatorialOptimizer(OptimizerPreferences):
103
112
  description="Whether to check if all the solutions satisfy the constraints",
104
113
  )
105
114
 
106
- @pydantic.validator("alpha_cvar", pre=True, always=True)
107
- def check_alpha_cvar(cls, alpha_cvar, values):
108
- cost_type = values.get("cost_type")
115
+ @pydantic.field_validator("alpha_cvar", mode="before")
116
+ @classmethod
117
+ def check_alpha_cvar(
118
+ cls, alpha_cvar: Optional[PydanticAlphaParamCVAR], info: ValidationInfo
119
+ ) -> Optional[PydanticAlphaParamCVAR]:
120
+ cost_type = info.data.get("cost_type")
109
121
  if alpha_cvar is not None and cost_type != CostType.CVAR:
110
- raise ValueError("Use CVAR params only for CostType.CVAR.")
122
+ raise ClassiqValueError("Use CVAR params only for CostType.CVAR.")
111
123
 
112
124
  if alpha_cvar is None and cost_type == CostType.CVAR:
113
- alpha_cvar = 0.2
125
+ alpha_cvar = PydanticAlphaParamCVAR(0.2)
114
126
 
115
127
  return alpha_cvar