classiq 0.38.0__py3-none-any.whl → 0.65.4__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.4.dist-info}/METADATA +16 -9
  414. classiq-0.65.4.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.4.dist-info}/WHEEL +0 -0
@@ -1,10 +1,12 @@
1
1
  from __future__ import annotations
2
2
 
3
- from datetime import timedelta
4
- from typing import Any, Dict, Iterable, List, Optional, Union
3
+ import warnings
4
+ from collections.abc import Iterable
5
+ from typing import Any, Optional, Union
5
6
 
6
7
  import pydantic
7
- from pydantic import BaseModel, validator
8
+ from pydantic import BaseModel
9
+ from pydantic_settings import BaseSettings, SettingsConfigDict
8
10
 
9
11
  from classiq.interface.backend import pydantic_backend
10
12
  from classiq.interface.backend.quantum_backend_providers import (
@@ -12,24 +14,31 @@ from classiq.interface.backend.quantum_backend_providers import (
12
14
  AliceBobBackendNames,
13
15
  AmazonBraketBackendNames,
14
16
  AzureQuantumBackendNames,
15
- ClassiqAerBackendNames,
16
17
  ClassiqNvidiaBackendNames,
18
+ ClassiqSimulatorBackendNames,
19
+ IntelBackendNames,
17
20
  IonqBackendNames,
18
21
  OQCBackendNames,
19
22
  ProviderTypeVendor,
20
23
  ProviderVendor,
21
24
  )
25
+ from classiq.interface.exceptions import ClassiqDeprecationWarning
22
26
  from classiq.interface.hardware import Provider
23
- from classiq.interface.helpers.pydantic_model_helpers import values_with_discriminator
24
-
25
- from classiq.exceptions import ClassiqValueError
26
27
 
27
28
 
28
29
  class BackendPreferences(BaseModel):
29
- # Due to the way the field is currently implemented, i.e. it redefined with different types
30
- # in the subclass, it shouldn't be dumped with exclude_unset. This causes this field not to appear.
31
- # For example: don't use obj.dict(exclude_unset=True).
32
- backend_service_provider: str = pydantic.Field(
30
+ """
31
+ Preferences for the execution of the quantum program.
32
+
33
+ For more details, refer to:
34
+ [BackendPreferences](https://docs.classiq.io/latest/reference-manual/python-sdk/?h=backend#classiq.Preferences.backend_preferences)
35
+
36
+ Attributes:
37
+ backend_service_provider (str): Provider company or cloud for the requested backend.
38
+ backend_name (str): Name of the requested backend or target.
39
+ """
40
+
41
+ backend_service_provider: ProviderVendor = pydantic.Field(
33
42
  ..., description="Provider company or cloud for the requested backend."
34
43
  )
35
44
  backend_name: str = pydantic.Field(
@@ -40,89 +49,220 @@ class BackendPreferences(BaseModel):
40
49
  def hw_provider(self) -> Provider:
41
50
  return Provider(self.backend_service_provider)
42
51
 
43
- @pydantic.validator("backend_service_provider", pre=True)
44
- def validate_backend_service_provider(
45
- cls, backend_service_provider: Any
46
- ) -> Provider:
47
- return validate_backend_service_provider(backend_service_provider)
48
-
49
52
  @classmethod
50
53
  def batch_preferences(
51
54
  cls, *, backend_names: Iterable[str], **kwargs: Any
52
- ) -> List[BackendPreferences]:
55
+ ) -> list[BackendPreferences]:
53
56
  return [cls(backend_name=name, **kwargs) for name in backend_names]
54
57
 
55
58
  def is_nvidia_backend(self) -> bool:
56
59
  return False
57
60
 
58
61
 
59
- AWS_DEFAULT_JOB_TIMEOUT_SECONDS = int(timedelta(minutes=5).total_seconds())
60
-
61
-
62
62
  class AliceBobBackendPreferences(BackendPreferences):
63
- backend_service_provider: ProviderTypeVendor.ALICE_BOB
64
- api_key: pydantic_backend.PydanticAliceBobApiKeyType = pydantic.Field(
65
- ..., description="AliceBob API key"
63
+ """
64
+ Backend preferences specific to Alice&Bob for quantum computing tasks.
65
+
66
+ This class includes configuration options for setting up a backend using Alice&Bob's quantum hardware.
67
+ It extends the base `BackendPreferences` class and provides additional parameters required for working
68
+ with Alice&Bob's cat qubits, including settings for photon dissipation rates, repetition code distance,
69
+ and the average number of photons.
70
+
71
+ Attributes:
72
+ backend_service_provider (ProviderTypeVendor.ALICE_BOB):
73
+ The service provider for the backend, which is Alice&Bob.
74
+
75
+ distance (Optional[int]):
76
+ The number of times information is duplicated in the repetition code.
77
+ - **Tooltip**: Phase-flip probability decreases exponentially with this parameter, bit-flip probability increases linearly.
78
+ - **Supported Values**: 3 to 300, though practical values are usually lower than 30.
79
+ - **Default**: None.
80
+
81
+ kappa_1 (Optional[float]):
82
+ The rate at which the cat qubit loses one photon, creating a bit-flip.
83
+ - **Tooltip**: Lower values mean lower error rates.
84
+ - **Supported Values**: 10 to 10^5. Current hardware is at ~10^3.
85
+ - **Default**: None.
86
+
87
+ kappa_2 (Optional[float]):
88
+ The rate at which the cat qubit is stabilized using two-photon dissipation.
89
+ - **Tooltip**: Higher values mean lower error rates.
90
+ - **Supported Values**: 100 to 10^9. Current hardware is at ~10^5.
91
+ - **Default**: None.
92
+
93
+ average_nb_photons (Optional[float]):
94
+ The average number of photons.
95
+ - **Tooltip**: Bit-flip probability decreases exponentially with this parameter, phase-flip probability increases linearly.
96
+ - **Supported Values**: 4 to 10^5, though practical values are usually lower than 30.
97
+ - **Default**: None.
98
+
99
+ api_key (str):
100
+ The API key required to access Alice&Bob's quantum hardware.
101
+ - **Required**: Yes.
102
+
103
+ For more details, refer to the [Alice&Bob Backend Documentation](https://docs.classiq.io/latest/reference-manual/executor/cloud-providers/alice-and-bob-backends/).
104
+ """
105
+
106
+ backend_service_provider: ProviderTypeVendor.ALICE_BOB = pydantic.Field(
107
+ default=ProviderVendor.ALICE_AND_BOB
108
+ )
109
+ distance: Optional[int] = pydantic.Field(
110
+ default=None, description="Repetition code distance"
111
+ )
112
+ kappa_1: Optional[float] = pydantic.Field(
113
+ default=None, description="One-photon dissipation rate (Hz)"
114
+ )
115
+ kappa_2: Optional[float] = pydantic.Field(
116
+ default=None, description="Two-photon dissipation rate (Hz)"
117
+ )
118
+ average_nb_photons: Optional[float] = pydantic.Field(
119
+ default=None, description="Average number of photons"
120
+ )
121
+ api_key: Optional[pydantic_backend.PydanticAliceBobApiKeyType] = pydantic.Field(
122
+ default=None, description="AliceBob API key"
66
123
  )
67
124
 
68
- @pydantic.root_validator(pre=True)
69
- def _set_backend_service_provider(cls, values: Dict[str, Any]) -> Dict[str, Any]:
70
- return values_with_discriminator(
71
- values, "backend_service_provider", ProviderVendor.ALICE_AND_BOB
72
- )
125
+ @property
126
+ def parameters(self) -> dict[str, Any]:
127
+ parameters = {
128
+ "distance": self.distance,
129
+ "kappa1": self.kappa_1,
130
+ "kappa2": self.kappa_2,
131
+ "averageNbPhotons": self.average_nb_photons,
132
+ }
133
+ return {k: v for k, v in parameters.items() if v is not None}
134
+
135
+ @pydantic.field_validator("api_key", mode="after")
136
+ @classmethod
137
+ def _validate_api_key(cls, api_key: Optional[str]) -> Optional[str]:
138
+ if api_key is not None:
139
+ warnings.warn(
140
+ "API key is no longer required for Alice&Bob backends.",
141
+ ClassiqDeprecationWarning,
142
+ stacklevel=2,
143
+ )
144
+ return api_key
73
145
 
74
146
 
75
147
  class ClassiqBackendPreferences(BackendPreferences):
76
- backend_service_provider: ProviderTypeVendor.CLASSIQ
148
+ """
149
+ Represents backend preferences specific to Classiq quantum computing targets.
77
150
 
78
- @pydantic.root_validator(pre=True)
79
- def _set_backend_service_provider(cls, values: Dict[str, Any]) -> Dict[str, Any]:
80
- return values_with_discriminator(
81
- values, "backend_service_provider", ProviderVendor.CLASSIQ
82
- )
151
+ This class is used to configure the backend options for executing quantum circuits on Classiq's platform.
152
+ The relevant backend names for Classiq targets are specified in `ClassiqSimulatorBackendNames` & `ClassiqNvidiaBackendNames`.
153
+
154
+ For more details, refer to the [Classiq Backend Documentation](https://docs.classiq.io/latest/reference-manual/executor/cloud-providers/classiq-backends/).
155
+ """
156
+
157
+ backend_service_provider: ProviderTypeVendor.CLASSIQ = pydantic.Field(
158
+ default=ProviderVendor.CLASSIQ
159
+ )
83
160
 
84
161
  def is_nvidia_backend(self) -> bool:
85
162
  return self.backend_name in list(ClassiqNvidiaBackendNames)
86
163
 
164
+ # CAD-25390
165
+ @pydantic.field_validator("backend_name")
166
+ @classmethod
167
+ def _validate_nvidia_name_backwards_compatibility(cls, backend_name: str) -> str:
168
+ if backend_name == "nvidia_state_vector_simulator":
169
+ warnings.warn(
170
+ "The name 'nvidia_state_vector_simulator' is deprecated and "
171
+ "will be removed soon, no earlier than January 12th 2025. "
172
+ "Please use ClassiqNvidiaBackendNames.SIMULATOR instead",
173
+ ClassiqDeprecationWarning,
174
+ stacklevel=2,
175
+ )
176
+ return backend_name
177
+
87
178
 
88
179
  class AwsBackendPreferences(BackendPreferences):
89
- backend_service_provider: ProviderTypeVendor.AMAZON_BRAKET
90
- aws_role_arn: pydantic_backend.PydanticAwsRoleArn = pydantic.Field(
91
- description="ARN of the role to be assumed for execution on your Braket account."
180
+ """
181
+ AWS-specific backend preferences for quantum computing tasks using Amazon Braket.
182
+
183
+ This class contains configuration options specific to Amazon Braket, including the AWS role
184
+ ARN, S3 bucket details, and the folder path within the S3 bucket. It extends the base
185
+ `BackendPreferences` class to provide additional properties required for interaction with
186
+ Amazon Braket.
187
+
188
+ Attributes:
189
+ backend_service_provider (ProviderTypeVendor.AMAZON_BRAKET):
190
+ The service provider for the backend, which is Amazon Braket.
191
+
192
+ aws_role_arn (pydantic_backend.PydanticAwsRoleArn):
193
+ The Amazon Resource Name (ARN) of the role that will be assumed for execution
194
+ on your Braket account. This is a required field and should be provided to allow
195
+ secure and authorized access to AWS resources.
196
+
197
+ s3_bucket_name (str):
198
+ The name of the S3 bucket where results and other related data will be stored.
199
+ This field should contain a valid S3 bucket name under your AWS account.
200
+
201
+ s3_folder (pydantic_backend.PydanticS3BucketKey):
202
+ The folder path within the specified S3 bucket. This allows for organizing
203
+ results and data under a specific directory within the S3 bucket.
204
+
205
+
206
+ For more details, refer to:
207
+ [AwsBackendPreferences examples](https://docs.classiq.io/latest/reference-manual/executor/cloud-providers/amazon-backends/?h=awsbackend#usage)
208
+ """
209
+
210
+ backend_service_provider: ProviderTypeVendor.AMAZON_BRAKET = pydantic.Field(
211
+ default=ProviderVendor.AMAZON_BRAKET
92
212
  )
93
- s3_bucket_name: str = pydantic.Field(description="S3 Bucket Name")
94
- s3_folder: pydantic_backend.PydanticS3BucketKey = pydantic.Field(
95
- description="S3 Folder Path Within The S3 Bucket"
213
+ aws_role_arn: Optional[str] = pydantic.Field(
214
+ default=None,
215
+ description="ARN of the role to be assumed for execution on your Braket account.",
216
+ )
217
+ s3_bucket_name: Optional[str] = pydantic.Field(
218
+ default=None, description="S3 Bucket Name"
96
219
  )
97
- job_timeout: pydantic_backend.PydanticExecutionTimeout = pydantic.Field(
98
- description="Timeout for Jobs sent for execution in seconds.",
99
- default=AWS_DEFAULT_JOB_TIMEOUT_SECONDS,
220
+ s3_folder: Optional[str] = pydantic.Field(
221
+ default=None, description="S3 Folder Path Within The S3 Bucket"
222
+ )
223
+ run_through_classiq: bool = pydantic.Field(
224
+ default=False,
225
+ description="Run through Classiq's credentials while using user's allocated budget.",
100
226
  )
101
227
 
102
- @validator("s3_bucket_name")
103
- def _validate_s3_bucket_name(
104
- cls, s3_bucket_name: str, values: Dict[str, Any]
105
- ) -> str:
106
- s3_bucket_name = s3_bucket_name.strip()
107
- if not s3_bucket_name.startswith("amazon-braket-"):
108
- raise ClassiqValueError('S3 bucket name should start with "amazon-braket-"')
109
- return s3_bucket_name
110
228
 
111
- @pydantic.root_validator(pre=True)
112
- def _set_backend_service_provider(cls, values: Dict[str, Any]) -> Dict[str, Any]:
113
- return values_with_discriminator(
114
- values, "backend_service_provider", ProviderVendor.AMAZON_BRAKET
115
- )
229
+ class IBMBackendProvider(BaseModel):
230
+ """
116
231
 
232
+ Represents the provider specs for identifying an IBM Quantum backend.
233
+
234
+ Attributes:
235
+ hub (str): hub parameter of IBM Quantum provider. Defaults to `"ibm-q"`.
236
+ group (str): group parameter of IBM Quantum provider. Defaults to `"open"`.
237
+ project (str): project parameter of IBM Quantum provider. Defaults to `"main"`.
238
+
239
+ """
117
240
 
118
- class IBMBackendProvider(BaseModel):
119
241
  hub: str = "ibm-q"
120
242
  group: str = "open"
121
243
  project: str = "main"
122
244
 
123
245
 
124
246
  class IBMBackendPreferences(BackendPreferences):
125
- backend_service_provider: ProviderTypeVendor.IBM_QUANTUM
247
+ """
248
+ Represents the backend preferences specific to IBM Quantum services.
249
+
250
+ Inherits from `BackendPreferences` and adds additional fields and validations
251
+ specific to IBM Quantum backends.
252
+
253
+ Attributes:
254
+ backend_service_provider (ProviderTypeVendor.IBM_QUANTUM): Indicates the backend service provider as IBM Quantum.
255
+ access_token (Optional[str]): The IBM Quantum access token to be used with IBM Quantum hosted backends. Defaults to `None`.
256
+ provider (IBMBackendProvider): Specifications for identifying a single IBM Quantum provider. Defaults to a new `IBMBackendProvider`.
257
+ qctrl_api_key (Optional[str]): QCTRL API key to access QCTRL optimization abilities.
258
+ run_through_classiq (bool): Run through Classiq's credentials. Defaults to `False`.
259
+
260
+ See examples in the [IBM Quantum Backend Documentation](https://docs.classiq.io/latest/reference-manual/executor/cloud-providers/ibm-backends/?h=).
261
+ """
262
+
263
+ backend_service_provider: ProviderTypeVendor.IBM_QUANTUM = pydantic.Field(
264
+ default=ProviderVendor.IBM_QUANTUM
265
+ )
126
266
  access_token: Optional[str] = pydantic.Field(
127
267
  default=None,
128
268
  description="IBM Quantum access token to be used"
@@ -132,15 +272,28 @@ class IBMBackendPreferences(BackendPreferences):
132
272
  default_factory=IBMBackendProvider,
133
273
  description="Provider specs. for identifying a single IBM Quantum provider.",
134
274
  )
275
+ qctrl_api_key: Optional[str] = pydantic.Field(
276
+ default=None,
277
+ description="QCTRL API key to access QCTRL optimization abilities",
278
+ )
279
+ run_through_classiq: bool = pydantic.Field(
280
+ default=False,
281
+ description="Run through Classiq's credentials",
282
+ )
135
283
 
136
- @pydantic.root_validator(pre=True)
137
- def _set_backend_service_provider(cls, values: Dict[str, Any]) -> Dict[str, Any]:
138
- return values_with_discriminator(
139
- values, "backend_service_provider", ProviderVendor.IBM_QUANTUM
140
- )
141
284
 
285
+ class AzureCredential(BaseSettings):
286
+ """
287
+ Represents the credentials and configuration required to authenticate with Azure services.
288
+
289
+ Attributes:
290
+ tenant_id (str): Azure Tenant ID used to identify the directory in which the application is registered.
291
+ client_id (str): Azure Client ID, also known as the application ID, which is used to authenticate the application.
292
+ client_secret (str): Azure Client Secret associated with the application, used for authentication.
293
+ resource_id (pydantic_backend.PydanticAzureResourceIDType): Azure Resource ID, including the subscription ID,
294
+ resource group, and workspace, typically used for personal resources.
295
+ """
142
296
 
143
- class AzureCredential(pydantic.BaseSettings):
144
297
  tenant_id: str = pydantic.Field(description="Azure Tenant ID")
145
298
  client_id: str = pydantic.Field(description="Azure Client ID")
146
299
  client_secret: str = pydantic.Field(description="Azure Client Secret")
@@ -148,15 +301,39 @@ class AzureCredential(pydantic.BaseSettings):
148
301
  description="Azure Resource ID (including Azure subscription ID, resource "
149
302
  "group and workspace), for personal resource",
150
303
  )
304
+ model_config = SettingsConfigDict(
305
+ title="Azure Service Principal Credential",
306
+ env_prefix="AZURE_",
307
+ case_sensitive=False,
308
+ extra="allow",
309
+ )
151
310
 
152
- class Config:
153
- title = "Azure Service Principal Credential"
154
- env_prefix = "AZURE_"
155
- case_sensitive = False
311
+ def __init__(self, **data: Any) -> None:
312
+ initial_data = {
313
+ field: data[field] for field in data if field in self.model_fields
314
+ }
315
+ super().__init__(**data)
316
+ for field, value in initial_data.items():
317
+ setattr(self, field, value)
156
318
 
157
319
 
158
320
  class AzureBackendPreferences(BackendPreferences):
159
- backend_service_provider: ProviderTypeVendor.AZURE_QUANTUM
321
+ """
322
+ This class inherits from BackendPreferences.
323
+ This is where you specify Azure Quantum preferences.
324
+ See usage in the [Azure Backend Documentation](https://docs.classiq.io/latest/reference-manual/executor/cloud-providers/azure-backends/).
325
+
326
+ Attributes:
327
+ location (str): Azure personal resource region. Defaults to `"East US"`.
328
+ credentials (Optional[AzureCredential]): The service principal credential to access personal quantum workspace. Defaults to `None`.
329
+ ionq_error_mitigation_flag (Optional[bool]): Error mitigation configuration upon running on IonQ through Azure. Defaults to `False`.
330
+
331
+
332
+ """
333
+
334
+ backend_service_provider: ProviderTypeVendor.AZURE_QUANTUM = pydantic.Field(
335
+ default=ProviderVendor.AZURE_QUANTUM
336
+ )
160
337
 
161
338
  location: str = pydantic.Field(
162
339
  default="East US", description="Azure personal resource region"
@@ -167,53 +344,151 @@ class AzureBackendPreferences(BackendPreferences):
167
344
  description="The service principal credential to access personal quantum workspace",
168
345
  )
169
346
 
347
+ ionq_error_mitigation_flag: Optional[bool] = pydantic.Field(
348
+ default=False,
349
+ description="Error mitigation configuration upon running on IonQ through Azure.",
350
+ )
351
+
170
352
  @property
171
353
  def run_through_classiq(self) -> bool:
172
- return self.credentials is None
354
+ """
355
+
356
+ Returns: `True` if there are no Azure Credentials.
357
+ Therefore you will be running through Classiq's credentials.
173
358
 
174
- @pydantic.root_validator(pre=True)
175
- def _set_backend_service_provider(cls, values: Dict[str, Any]) -> Dict[str, Any]:
176
- return values_with_discriminator(
177
- values, "backend_service_provider", ProviderVendor.AZURE_QUANTUM
178
- )
359
+ """
360
+ return self.credentials is None
179
361
 
180
362
 
181
363
  class IonqBackendPreferences(BackendPreferences):
182
- backend_service_provider: ProviderTypeVendor.IONQ
183
- api_key: pydantic_backend.PydanticIonQApiKeyType = pydantic.Field(
184
- ..., description="IonQ API key"
185
- )
364
+ """
365
+ Represents the backend preferences specific to IonQ services.
366
+
367
+ Inherits from `BackendPreferences` and adds additional fields and configurations
368
+ specific to IonQ backends
369
+
370
+ Attributes:
371
+ backend_service_provider (ProviderTypeVendor.IONQ): Indicates the backend service provider as IonQ.
372
+ api_key (PydanticIonQApiKeyType): The IonQ API key required for accessing IonQ's quantum computing services.
373
+ error_mitigation (bool): A configuration option to enable or disable error mitigation during execution. Defaults to `False`.
374
+ run_through_classiq (bool): Running through Classiq's credentials while using user's allocated budget.
186
375
 
187
- @pydantic.root_validator(pre=True)
188
- def _set_backend_service_provider(cls, values: Dict[str, Any]) -> Dict[str, Any]:
189
- return values_with_discriminator(
190
- values, "backend_service_provider", ProviderVendor.IONQ
191
- )
376
+ See examples in the [IonQ Backend Documentation](https://docs.classiq.io/latest/reference-manual/executor/cloud-providers/ionq-backends/?h=).
377
+ """
378
+
379
+ backend_service_provider: ProviderTypeVendor.IONQ = pydantic.Field(
380
+ default=ProviderVendor.IONQ
381
+ )
382
+ api_key: Optional[pydantic_backend.PydanticIonQApiKeyType] = pydantic.Field(
383
+ default=None, description="IonQ API key"
384
+ )
385
+ error_mitigation: bool = pydantic.Field(
386
+ default=False,
387
+ description="Error mitigation configuration.",
388
+ )
389
+ run_through_classiq: bool = pydantic.Field(
390
+ default=False,
391
+ description="Running through Classiq's credentials while using user's allocated budget.",
392
+ )
192
393
 
193
394
 
194
395
  class GCPBackendPreferences(BackendPreferences):
195
- backend_service_provider: ProviderTypeVendor.GOOGLE
396
+ """
397
+ Represents the backend preferences specific to Google Cloud Platform (GCP) services.
398
+
399
+ Inherits from `BackendPreferences` and sets the backend service provider to Google.
400
+
401
+ Attributes:
402
+ backend_service_provider (ProviderTypeVendor.GOOGLE): Indicates the backend service provider as Google,
403
+ specifically for quantum computing services on Google Cloud Platform (GCP).
196
404
 
197
- @pydantic.root_validator(pre=True)
198
- def _set_backend_service_provider(cls, values: Dict[str, Any]) -> Dict[str, Any]:
199
- return values_with_discriminator(
200
- values, "backend_service_provider", ProviderVendor.GOOGLE
201
- )
405
+ See examples in the [Google Cloud Backend Documentation](https://docs.classiq.io/latest/reference-manual/executor/cloud-providers/google-backends/?h=).
406
+ """
407
+
408
+ backend_service_provider: ProviderTypeVendor.GOOGLE = pydantic.Field(
409
+ default=ProviderVendor.GOOGLE
410
+ )
202
411
 
203
412
  def is_nvidia_backend(self) -> bool:
204
413
  return True
205
414
 
206
415
 
207
416
  class OQCBackendPreferences(BackendPreferences):
208
- backend_service_provider: ProviderTypeVendor.OQC
417
+ """
418
+
419
+ This class inherits from `BackendPreferences`.
420
+ This is where you specify OQC preferences.
421
+
422
+ Attributes:
423
+ username (str): OQC username
424
+ password (str): OQC password
425
+ """
426
+
427
+ backend_service_provider: ProviderTypeVendor.OQC = pydantic.Field(
428
+ default=ProviderVendor.OQC
429
+ )
209
430
  username: str = pydantic.Field(description="OQC username")
210
431
  password: str = pydantic.Field(description="OQC password")
211
432
 
212
- @pydantic.root_validator(pre=True)
213
- def _set_backend_service_provider(cls, values: Dict[str, Any]) -> Dict[str, Any]:
214
- return values_with_discriminator(
215
- values, "backend_service_provider", ProviderVendor.OQC
216
- )
433
+
434
+ class IntelBackendPreferences(BackendPreferences):
435
+ """
436
+ Represents backend preferences specific to Classiq quantum computing targets.
437
+
438
+ This class is used to configure the backend options for executing quantum circuits on Classiq's platform.
439
+ The relevant backend names for Classiq targets are specified in `ClassiqSimulatorBackendNames` & `ClassiqNvidiaBackendNames`.
440
+
441
+ For more details, refer to the [Classiq Backend Documentation](https://docs.classiq.io/latest/reference-manual/executor/cloud-providers/classiq-backends/).
442
+ """
443
+
444
+ backend_service_provider: ProviderTypeVendor.INTEL = pydantic.Field(
445
+ default=ProviderVendor.INTEL
446
+ )
447
+
448
+
449
+ class AQTBackendPreferences(BackendPreferences):
450
+ """
451
+ NOTE: This is a work in progress and is subject to change.
452
+
453
+ Represents the backend preferences specific to AQT (Alpine Quantum Technologies).
454
+
455
+ Attributes:
456
+ api_key: The API key required to access AQT's quantum computing services.
457
+ workspace: The AQT workspace where the simulator/hardware is located.
458
+ """
459
+
460
+ backend_service_provider: ProviderTypeVendor.AQT = pydantic.Field(
461
+ default=ProviderVendor.AQT
462
+ )
463
+ api_key: str = pydantic.Field(description="AQT API key")
464
+ workspace: str = pydantic.Field(description="AQT workspace")
465
+
466
+
467
+ class IQCCBackendPreferences(BackendPreferences):
468
+ """
469
+ NOTE: This is a work in progress and is subject to change.
470
+
471
+ Represents the backend preferences specific to IQCC (Israeli Quantum Computing
472
+ Center).
473
+
474
+ Attributes:
475
+ auth_token: The authorization token generated by calling `generate_iqcc_token`.
476
+ target_id: The target ID of the login node.
477
+ target_scope_id: The scope ID of the specified target.
478
+ ssh_user_name: The user name to use when connecting to the SSH server on the login node.
479
+ ssh_key: The private key to use when connecting to the SSH server on the login node.
480
+ slurm_account: The account to use when initiating SLURM jobs.
481
+ """
482
+
483
+ backend_service_provider: ProviderTypeVendor.IQCC = pydantic.Field(
484
+ default=ProviderVendor.IQCC
485
+ )
486
+ auth_token: str
487
+ target_id: str
488
+ target_scope_id: str
489
+ ssh_user_name: str
490
+ ssh_key: str
491
+ slurm_account: str
217
492
 
218
493
 
219
494
  def is_exact_simulator(backend_preferences: BackendPreferences) -> bool:
@@ -221,13 +496,13 @@ def is_exact_simulator(backend_preferences: BackendPreferences) -> bool:
221
496
 
222
497
 
223
498
  def default_backend_preferences(
224
- backend_name: str = ClassiqAerBackendNames.AER_SIMULATOR,
499
+ backend_name: str = ClassiqSimulatorBackendNames.SIMULATOR,
225
500
  ) -> BackendPreferences:
226
501
  return ClassiqBackendPreferences(backend_name=backend_name)
227
502
 
228
503
 
229
504
  def backend_preferences_field(
230
- backend_name: str = ClassiqAerBackendNames.AER_SIMULATOR,
505
+ backend_name: str = ClassiqSimulatorBackendNames.SIMULATOR,
231
506
  ) -> Any:
232
507
  return pydantic.Field(
233
508
  default_factory=lambda: default_backend_preferences(backend_name),
@@ -245,37 +520,31 @@ BackendPreferencesTypes = Union[
245
520
  GCPBackendPreferences,
246
521
  AliceBobBackendPreferences,
247
522
  OQCBackendPreferences,
523
+ IntelBackendPreferences,
524
+ AQTBackendPreferences,
525
+ IQCCBackendPreferences,
248
526
  ]
249
527
 
250
528
  __all__ = [
529
+ "AQTBackendPreferences",
530
+ "AliceBobBackendNames",
531
+ "AliceBobBackendPreferences",
532
+ "AmazonBraketBackendNames",
533
+ "AwsBackendPreferences",
251
534
  "AzureBackendPreferences",
252
535
  "AzureCredential",
253
536
  "AzureQuantumBackendNames",
254
537
  "ClassiqBackendPreferences",
255
- "ClassiqAerBackendNames",
538
+ "ClassiqNvidiaBackendNames",
539
+ "ClassiqSimulatorBackendNames",
540
+ "GCPBackendPreferences",
256
541
  "IBMBackendPreferences",
257
542
  "IBMBackendProvider",
258
- "AwsBackendPreferences",
259
- "AmazonBraketBackendNames",
260
- "IonqBackendPreferences",
543
+ "IQCCBackendPreferences",
544
+ "IntelBackendNames",
545
+ "IntelBackendPreferences",
261
546
  "IonqBackendNames",
262
- "ClassiqNvidiaBackendNames",
263
- "GCPBackendPreferences",
264
- "AliceBobBackendPreferences",
265
- "AliceBobBackendNames",
266
- "OQCBackendPreferences",
547
+ "IonqBackendPreferences",
267
548
  "OQCBackendNames",
549
+ "OQCBackendPreferences",
268
550
  ]
269
-
270
-
271
- def validate_backend_service_provider(backend_service_provider: Any) -> Provider:
272
- if isinstance(backend_service_provider, Provider):
273
- return backend_service_provider
274
- if isinstance(backend_service_provider, str):
275
- for member in Provider:
276
- if member.lower() == backend_service_provider.lower():
277
- return Provider(member)
278
- raise ClassiqValueError(
279
- f"""Vendor {backend_service_provider} is not supported.
280
- The supported providers are {', '.join(Provider)}."""
281
- )