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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. classiq/__init__.py +47 -32
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +2 -1
  3. classiq/_internals/api_wrapper.py +235 -97
  4. classiq/_internals/async_utils.py +1 -3
  5. classiq/_internals/authentication/auth0.py +26 -10
  6. classiq/_internals/authentication/authentication.py +11 -0
  7. classiq/_internals/authentication/device.py +10 -5
  8. classiq/_internals/authentication/password_manager.py +18 -6
  9. classiq/_internals/authentication/token_manager.py +10 -5
  10. classiq/_internals/client.py +94 -33
  11. classiq/_internals/config.py +3 -4
  12. classiq/_internals/host_checker.py +38 -15
  13. classiq/_internals/jobs.py +60 -57
  14. classiq/_internals/type_validation.py +9 -9
  15. classiq/analyzer/__init__.py +1 -3
  16. classiq/analyzer/analyzer.py +24 -19
  17. classiq/analyzer/analyzer_utilities.py +10 -10
  18. classiq/analyzer/rb.py +15 -15
  19. classiq/analyzer/show_interactive_hack.py +27 -4
  20. classiq/analyzer/url_utils.py +2 -3
  21. classiq/applications/__init__.py +3 -12
  22. classiq/applications/chemistry/__init__.py +14 -10
  23. classiq/applications/chemistry/ansatz_parameters.py +4 -4
  24. classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +165 -158
  25. classiq/applications/chemistry/ground_state_problem.py +1 -1
  26. classiq/{applications_model_constructors → applications}/combinatorial_helpers/allowed_constraints.py +4 -1
  27. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/arithmetic_expression.py +1 -1
  28. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/isolation.py +1 -1
  29. classiq/{applications_model_constructors → applications}/combinatorial_helpers/combinatorial_problem_utils.py +51 -15
  30. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_mapping.py +12 -12
  31. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_utils.py +8 -6
  32. classiq/{applications_model_constructors → applications}/combinatorial_helpers/memory.py +7 -11
  33. classiq/{applications_model_constructors → applications}/combinatorial_helpers/optimization_model.py +67 -40
  34. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
  35. classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
  36. classiq/{applications_model_constructors → applications}/combinatorial_helpers/sympy_utils.py +2 -2
  37. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/encoding.py +15 -20
  38. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/fixed_variables.py +14 -15
  39. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/ising_converter.py +11 -15
  40. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty.py +1 -2
  41. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty_support.py +3 -7
  42. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/sign_seperation.py +2 -3
  43. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/slack_variables.py +5 -8
  44. classiq/applications/combinatorial_optimization/__init__.py +20 -6
  45. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
  46. classiq/{applications_model_constructors → applications/combinatorial_optimization}/combinatorial_optimization_model_constructor.py +35 -33
  47. classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
  48. classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
  49. classiq/applications/finance/__init__.py +4 -5
  50. classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +48 -42
  51. classiq/applications/grover/__init__.py +9 -0
  52. classiq/{applications_model_constructors → applications/grover}/grover_model_constructor.py +52 -51
  53. classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
  54. classiq/applications/libraries/qmci_library.py +22 -0
  55. classiq/applications/qnn/__init__.py +2 -4
  56. classiq/applications/qnn/circuit_utils.py +6 -6
  57. classiq/applications/qnn/datasets/__init__.py +9 -11
  58. classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
  59. classiq/applications/qnn/datasets/dataset_not.py +2 -1
  60. classiq/applications/qnn/datasets/dataset_parity.py +2 -2
  61. classiq/applications/qnn/gradients/quantum_gradient.py +1 -1
  62. classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
  63. classiq/applications/qnn/qlayer.py +30 -10
  64. classiq/applications/qnn/torch_utils.py +4 -3
  65. classiq/applications/qnn/types.py +5 -5
  66. classiq/applications/qsvm/__init__.py +6 -4
  67. classiq/applications/qsvm/qsvm.py +3 -6
  68. classiq/applications/qsvm/qsvm_data_generation.py +3 -3
  69. classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
  70. classiq/execution/__init__.py +8 -3
  71. classiq/execution/all_hardware_devices.py +11 -0
  72. classiq/execution/execution_session.py +400 -0
  73. classiq/execution/iqcc.py +63 -0
  74. classiq/execution/jobs.py +197 -25
  75. classiq/execution/qnn.py +79 -0
  76. classiq/executor.py +20 -115
  77. classiq/interface/_version.py +1 -1
  78. classiq/interface/analyzer/analysis_params.py +43 -13
  79. classiq/interface/analyzer/cytoscape_graph.py +15 -9
  80. classiq/interface/analyzer/result.py +28 -32
  81. classiq/interface/applications/qsvm.py +20 -29
  82. classiq/interface/ast_node.py +16 -0
  83. classiq/interface/backend/backend_preferences.py +390 -121
  84. classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
  85. classiq/interface/backend/pydantic_backend.py +25 -22
  86. classiq/interface/backend/quantum_backend_providers.py +69 -16
  87. classiq/interface/chemistry/fermionic_operator.py +30 -21
  88. classiq/interface/chemistry/ground_state_problem.py +28 -25
  89. classiq/interface/chemistry/molecule.py +14 -10
  90. classiq/interface/chemistry/operator.py +64 -231
  91. classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
  92. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +1 -3
  93. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  94. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  95. classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
  96. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  97. classiq/interface/combinatorial_optimization/examples/set_cover.py +1 -2
  98. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +8 -9
  99. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  100. classiq/interface/combinatorial_optimization/result.py +1 -3
  101. classiq/interface/combinatorial_optimization/solver_types.py +1 -1
  102. classiq/interface/debug_info/debug_info.py +86 -0
  103. classiq/{exceptions.py → interface/exceptions.py} +37 -9
  104. classiq/interface/execution/iqcc.py +19 -0
  105. classiq/interface/execution/jobs.py +15 -12
  106. classiq/interface/execution/primitives.py +18 -0
  107. classiq/interface/executor/constants.py +1 -0
  108. classiq/interface/executor/execution_preferences.py +26 -114
  109. classiq/interface/executor/execution_request.py +24 -46
  110. classiq/interface/executor/execution_result.py +30 -8
  111. classiq/interface/executor/iqae_result.py +4 -6
  112. classiq/interface/executor/optimizer_preferences.py +17 -14
  113. classiq/interface/executor/quantum_code.py +28 -24
  114. classiq/interface/executor/quantum_instruction_set.py +2 -2
  115. classiq/interface/executor/register_initialization.py +11 -14
  116. classiq/interface/executor/result.py +83 -56
  117. classiq/interface/executor/vqe_result.py +10 -10
  118. classiq/interface/finance/function_input.py +35 -25
  119. classiq/interface/finance/gaussian_model_input.py +5 -5
  120. classiq/interface/finance/log_normal_model_input.py +4 -4
  121. classiq/interface/finance/model_input.py +4 -4
  122. classiq/interface/generator/adjacency.py +1 -3
  123. classiq/interface/generator/amplitude_loading.py +22 -12
  124. classiq/interface/generator/ansatz_library.py +5 -5
  125. classiq/interface/generator/application_apis/arithmetic_declarations.py +8 -5
  126. classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
  127. classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
  128. classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
  129. classiq/interface/generator/application_apis/finance_declarations.py +48 -69
  130. classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
  131. classiq/interface/generator/arith/argument_utils.py +46 -5
  132. classiq/interface/generator/arith/arithmetic.py +35 -16
  133. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +6 -7
  134. classiq/interface/generator/arith/arithmetic_expression_abc.py +66 -25
  135. classiq/interface/generator/arith/arithmetic_expression_parser.py +11 -11
  136. classiq/interface/generator/arith/arithmetic_expression_validator.py +47 -43
  137. classiq/interface/generator/arith/arithmetic_operations.py +14 -6
  138. classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
  139. classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
  140. classiq/interface/generator/arith/ast_node_rewrite.py +3 -2
  141. classiq/interface/generator/arith/binary_ops.py +218 -130
  142. classiq/interface/generator/arith/endianness.py +1 -1
  143. classiq/interface/generator/arith/extremum_operations.py +96 -25
  144. classiq/interface/generator/arith/logical_ops.py +14 -12
  145. classiq/interface/generator/arith/number_utils.py +12 -6
  146. classiq/interface/generator/arith/register_user_input.py +60 -37
  147. classiq/interface/generator/arith/unary_ops.py +49 -29
  148. classiq/interface/generator/arith/uncomputation_methods.py +1 -1
  149. classiq/interface/generator/builtin_api_builder.py +2 -9
  150. classiq/interface/generator/chemistry_function_params.py +3 -3
  151. classiq/interface/generator/circuit_code/circuit_code.py +7 -7
  152. classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
  153. classiq/interface/generator/commuting_pauli_exponentiation.py +7 -7
  154. classiq/interface/generator/compiler_keywords.py +5 -1
  155. classiq/interface/generator/complex_type.py +13 -18
  156. classiq/interface/generator/constant.py +3 -4
  157. classiq/interface/generator/control_state.py +34 -29
  158. classiq/interface/generator/copy.py +47 -0
  159. classiq/interface/generator/custom_ansatz.py +2 -5
  160. classiq/interface/generator/distance.py +3 -5
  161. classiq/interface/generator/excitations.py +3 -2
  162. classiq/interface/generator/expressions/atomic_expression_functions.py +21 -5
  163. classiq/interface/generator/expressions/enums/__init__.py +0 -10
  164. classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
  165. classiq/interface/generator/expressions/evaluated_expression.py +5 -5
  166. classiq/interface/generator/expressions/expression.py +26 -14
  167. classiq/interface/generator/expressions/expression_constants.py +9 -3
  168. classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
  169. classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
  170. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +34 -8
  171. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
  172. classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
  173. classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
  174. classiq/interface/generator/expressions/sympy_supported_expressions.py +19 -11
  175. classiq/interface/generator/finance.py +2 -2
  176. classiq/interface/generator/function_param_library.py +6 -6
  177. classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
  178. classiq/interface/generator/function_params.py +36 -64
  179. classiq/interface/generator/functions/__init__.py +0 -22
  180. classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
  181. classiq/interface/generator/functions/classical_function_declaration.py +18 -9
  182. classiq/interface/generator/functions/classical_type.py +47 -166
  183. classiq/interface/generator/functions/concrete_types.py +55 -0
  184. classiq/interface/generator/functions/function_declaration.py +13 -14
  185. classiq/interface/generator/functions/port_declaration.py +1 -13
  186. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  187. classiq/interface/generator/functions/type_name.py +90 -0
  188. classiq/interface/generator/generated_circuit_data.py +153 -20
  189. classiq/interface/generator/grover_diffuser.py +32 -25
  190. classiq/interface/generator/grover_operator.py +34 -25
  191. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
  192. classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
  193. classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +9 -9
  194. classiq/interface/generator/hardware/hardware_data.py +72 -34
  195. classiq/interface/generator/hardware_efficient_ansatz.py +20 -16
  196. classiq/interface/generator/hartree_fock.py +13 -5
  197. classiq/interface/generator/identity.py +10 -6
  198. classiq/interface/generator/linear_pauli_rotations.py +32 -20
  199. classiq/interface/generator/mcmt_method.py +1 -1
  200. classiq/interface/generator/mcu.py +17 -15
  201. classiq/interface/generator/mcx.py +24 -17
  202. classiq/interface/generator/model/__init__.py +2 -5
  203. classiq/interface/generator/model/constraints.py +26 -8
  204. classiq/interface/generator/model/model.py +27 -190
  205. classiq/interface/generator/model/preferences/preferences.py +115 -41
  206. classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +14 -17
  207. classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
  208. classiq/interface/generator/oracles/custom_oracle.py +15 -13
  209. classiq/interface/generator/oracles/oracle_abc.py +7 -7
  210. classiq/interface/generator/partitioned_register.py +7 -7
  211. classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
  212. classiq/interface/generator/preferences/optimization.py +1 -2
  213. classiq/interface/generator/qpe.py +41 -30
  214. classiq/interface/generator/qsvm.py +9 -10
  215. classiq/interface/generator/quantum_function_call.py +88 -73
  216. classiq/interface/generator/quantum_program.py +41 -24
  217. classiq/interface/generator/range_types.py +11 -12
  218. classiq/interface/generator/register_role.py +18 -6
  219. classiq/interface/generator/slice_parsing_utils.py +5 -5
  220. classiq/interface/generator/standard_gates/controlled_standard_gates.py +30 -39
  221. classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
  222. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  223. classiq/interface/generator/standard_gates/u_gate.py +7 -10
  224. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  225. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
  226. classiq/interface/generator/state_preparation/distributions.py +16 -15
  227. classiq/interface/generator/state_preparation/metrics.py +4 -7
  228. classiq/interface/generator/state_preparation/state_preparation.py +25 -20
  229. classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
  230. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
  231. classiq/interface/generator/transpiler_basis_gates.py +7 -3
  232. classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
  233. classiq/interface/generator/types/compilation_metadata.py +6 -0
  234. classiq/interface/generator/types/enum_declaration.py +54 -0
  235. classiq/interface/generator/types/qstruct_declaration.py +18 -0
  236. classiq/interface/generator/types/struct_declaration.py +7 -11
  237. classiq/interface/generator/ucc.py +5 -4
  238. classiq/interface/generator/unitary_gate.py +5 -5
  239. classiq/interface/generator/user_defined_function_params.py +4 -1
  240. classiq/interface/generator/validations/flow_graph.py +7 -7
  241. classiq/interface/generator/validations/validator_functions.py +4 -4
  242. classiq/interface/generator/visitor.py +23 -16
  243. classiq/interface/hardware.py +29 -8
  244. classiq/interface/helpers/classproperty.py +8 -0
  245. classiq/interface/helpers/custom_encoders.py +2 -2
  246. classiq/interface/helpers/custom_pydantic_types.py +40 -50
  247. classiq/interface/helpers/datastructures.py +26 -0
  248. classiq/interface/helpers/hashable_mixin.py +3 -2
  249. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  250. classiq/interface/helpers/pydantic_model_helpers.py +7 -5
  251. classiq/interface/helpers/validation_helpers.py +3 -20
  252. classiq/interface/helpers/versioned_model.py +1 -4
  253. classiq/interface/ide/ide_data.py +16 -20
  254. classiq/interface/ide/visual_model.py +130 -0
  255. classiq/interface/interface_version.py +1 -0
  256. classiq/interface/jobs.py +29 -69
  257. classiq/interface/model/allocate.py +16 -0
  258. classiq/interface/model/bind_operation.py +32 -9
  259. classiq/interface/model/classical_if.py +15 -0
  260. classiq/interface/model/classical_parameter_declaration.py +33 -3
  261. classiq/interface/model/control.py +45 -0
  262. classiq/interface/model/handle_binding.py +298 -20
  263. classiq/interface/model/inplace_binary_operation.py +29 -24
  264. classiq/interface/model/invert.py +12 -0
  265. classiq/interface/model/model.py +69 -61
  266. classiq/interface/model/native_function_definition.py +17 -20
  267. classiq/interface/model/parameter.py +13 -0
  268. classiq/interface/model/phase_operation.py +11 -0
  269. classiq/interface/model/port_declaration.py +27 -9
  270. classiq/interface/model/power.py +14 -0
  271. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +30 -18
  272. classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
  273. classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
  274. classiq/interface/model/quantum_function_call.py +141 -343
  275. classiq/interface/model/quantum_function_declaration.py +190 -157
  276. classiq/interface/model/quantum_lambda_function.py +33 -32
  277. classiq/interface/model/quantum_statement.py +71 -12
  278. classiq/interface/model/quantum_type.py +177 -40
  279. classiq/interface/model/quantum_variable_declaration.py +3 -25
  280. classiq/interface/model/repeat.py +15 -0
  281. classiq/interface/model/statement_block.py +40 -14
  282. classiq/interface/model/validation_handle.py +13 -6
  283. classiq/interface/model/variable_declaration_statement.py +3 -1
  284. classiq/interface/model/within_apply_operation.py +7 -5
  285. classiq/interface/server/global_versions.py +6 -7
  286. classiq/interface/server/routes.py +17 -21
  287. classiq/interface/source_reference.py +59 -0
  288. classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
  289. classiq/model_expansions/capturing/__init__.py +0 -0
  290. classiq/model_expansions/capturing/captured_vars.py +435 -0
  291. classiq/model_expansions/capturing/mangling_utils.py +56 -0
  292. classiq/model_expansions/closure.py +171 -0
  293. classiq/model_expansions/debug_flag.py +3 -0
  294. classiq/model_expansions/evaluators/__init__.py +0 -0
  295. classiq/model_expansions/evaluators/arg_type_match.py +158 -0
  296. classiq/model_expansions/evaluators/argument_types.py +42 -0
  297. classiq/model_expansions/evaluators/classical_expression.py +36 -0
  298. classiq/model_expansions/evaluators/control.py +144 -0
  299. classiq/model_expansions/evaluators/parameter_types.py +226 -0
  300. classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
  301. classiq/model_expansions/evaluators/type_type_match.py +90 -0
  302. classiq/model_expansions/expression_evaluator.py +135 -0
  303. classiq/model_expansions/expression_renamer.py +76 -0
  304. classiq/model_expansions/function_builder.py +247 -0
  305. classiq/model_expansions/generative_functions.py +158 -0
  306. classiq/model_expansions/interpreters/__init__.py +0 -0
  307. classiq/model_expansions/interpreters/base_interpreter.py +263 -0
  308. classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
  309. classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
  310. classiq/model_expansions/model_tables.py +18 -0
  311. classiq/model_expansions/quantum_operations/__init__.py +9 -0
  312. classiq/model_expansions/quantum_operations/bind.py +60 -0
  313. classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
  314. classiq/model_expansions/quantum_operations/classicalif.py +53 -0
  315. classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
  316. classiq/model_expansions/quantum_operations/emitter.py +181 -0
  317. classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
  318. classiq/model_expansions/quantum_operations/repeat.py +56 -0
  319. classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
  320. classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
  321. classiq/model_expansions/scope.py +240 -0
  322. classiq/model_expansions/scope_initialization.py +150 -0
  323. classiq/model_expansions/sympy_conversion/__init__.py +0 -0
  324. classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
  325. classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
  326. classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
  327. classiq/model_expansions/transformers/__init__.py +0 -0
  328. classiq/model_expansions/transformers/ast_renamer.py +26 -0
  329. classiq/model_expansions/transformers/var_splitter.py +299 -0
  330. classiq/model_expansions/utils/__init__.py +0 -0
  331. classiq/model_expansions/utils/counted_name_allocator.py +11 -0
  332. classiq/model_expansions/utils/handles_collector.py +33 -0
  333. classiq/model_expansions/visitors/__init__.py +0 -0
  334. classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
  335. classiq/model_expansions/visitors/variable_references.py +144 -0
  336. classiq/open_library/__init__.py +4 -0
  337. classiq/open_library/functions/__init__.py +130 -0
  338. classiq/open_library/functions/amplitude_estimation.py +30 -0
  339. classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
  340. classiq/open_library/functions/grover.py +157 -0
  341. classiq/open_library/functions/hea.py +115 -0
  342. classiq/open_library/functions/linear_pauli_rotation.py +82 -0
  343. classiq/open_library/functions/modular_exponentiation.py +201 -0
  344. classiq/open_library/functions/qaoa_penalty.py +117 -0
  345. classiq/open_library/functions/qft_functions.py +54 -0
  346. classiq/open_library/functions/qpe.py +46 -0
  347. classiq/open_library/functions/qsvt.py +331 -0
  348. classiq/open_library/functions/state_preparation.py +301 -0
  349. classiq/open_library/functions/swap_test.py +27 -0
  350. classiq/open_library/functions/utility_functions.py +81 -0
  351. classiq/open_library/functions/variational.py +52 -0
  352. classiq/qmod/__init__.py +10 -10
  353. classiq/qmod/builtins/__init__.py +19 -2
  354. classiq/qmod/builtins/classical_execution_primitives.py +36 -14
  355. classiq/qmod/builtins/classical_functions.py +39 -43
  356. classiq/qmod/builtins/constants.py +10 -0
  357. classiq/qmod/builtins/enums.py +208 -0
  358. classiq/qmod/builtins/functions/__init__.py +137 -0
  359. classiq/qmod/builtins/functions/allocation.py +150 -0
  360. classiq/qmod/builtins/functions/arithmetic.py +55 -0
  361. classiq/qmod/builtins/functions/benchmarking.py +8 -0
  362. classiq/qmod/builtins/functions/chemistry.py +91 -0
  363. classiq/qmod/builtins/functions/exponentiation.py +105 -0
  364. classiq/qmod/builtins/functions/finance.py +34 -0
  365. classiq/qmod/builtins/functions/operators.py +16 -0
  366. classiq/qmod/builtins/functions/qsvm.py +24 -0
  367. classiq/qmod/builtins/functions/standard_gates.py +651 -0
  368. classiq/qmod/builtins/operations.py +373 -40
  369. classiq/qmod/builtins/structs.py +103 -80
  370. classiq/qmod/cfunc.py +2 -2
  371. classiq/qmod/classical_function.py +4 -8
  372. classiq/qmod/cparam.py +64 -0
  373. classiq/qmod/create_model_function.py +56 -0
  374. classiq/qmod/declaration_inferrer.py +143 -101
  375. classiq/qmod/expression_query.py +20 -4
  376. classiq/qmod/generative.py +42 -0
  377. classiq/qmod/model_state_container.py +18 -6
  378. classiq/qmod/native/__init__.py +7 -0
  379. classiq/qmod/native/expression_to_qmod.py +16 -11
  380. classiq/qmod/native/pretty_printer.py +187 -97
  381. classiq/qmod/pretty_print/__init__.py +7 -0
  382. classiq/qmod/pretty_print/expression_to_python.py +222 -0
  383. classiq/qmod/pretty_print/pretty_printer.py +572 -0
  384. classiq/qmod/python_classical_type.py +67 -0
  385. classiq/qmod/qfunc.py +60 -8
  386. classiq/qmod/qmod_constant.py +93 -26
  387. classiq/qmod/qmod_parameter.py +68 -59
  388. classiq/qmod/qmod_variable.py +468 -155
  389. classiq/qmod/quantum_callable.py +17 -7
  390. classiq/qmod/quantum_expandable.py +269 -96
  391. classiq/qmod/quantum_function.py +196 -41
  392. classiq/qmod/semantics/__init__.py +0 -0
  393. classiq/qmod/semantics/annotation/__init__.py +0 -0
  394. classiq/qmod/semantics/annotation/call_annotation.py +92 -0
  395. classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
  396. classiq/qmod/semantics/error_manager.py +88 -0
  397. classiq/qmod/semantics/lambdas.py +25 -0
  398. classiq/qmod/semantics/static_semantics_visitor.py +384 -0
  399. classiq/qmod/semantics/validation/__init__.py +0 -0
  400. classiq/qmod/semantics/validation/constants_validation.py +16 -0
  401. classiq/qmod/semantics/validation/func_call_validation.py +99 -0
  402. classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
  403. classiq/qmod/semantics/validation/handle_validation.py +85 -0
  404. classiq/qmod/semantics/validation/main_validation.py +33 -0
  405. classiq/qmod/semantics/validation/types_validation.py +128 -0
  406. classiq/qmod/symbolic.py +147 -123
  407. classiq/qmod/symbolic_expr.py +27 -12
  408. classiq/qmod/symbolic_type.py +2 -5
  409. classiq/qmod/type_attribute_remover.py +32 -0
  410. classiq/qmod/utilities.py +98 -4
  411. classiq/qmod/write_qmod.py +17 -3
  412. classiq/synthesis.py +210 -22
  413. {classiq-0.38.0.dist-info → classiq-0.65.3.dist-info}/METADATA +16 -9
  414. classiq-0.65.3.dist-info/RECORD +521 -0
  415. classiq/_internals/_qfunc_ext.py +0 -6
  416. classiq/applications/benchmarking/__init__.py +0 -9
  417. classiq/applications/benchmarking/mirror_benchmarking.py +0 -70
  418. classiq/applications/numpy_utils.py +0 -37
  419. classiq/applications_model_constructors/__init__.py +0 -25
  420. classiq/applications_model_constructors/combinatorial_helpers/multiple_comp_basis_sp.py +0 -34
  421. classiq/applications_model_constructors/combinatorial_helpers/pauli_helpers/pauli_utils.py +0 -65
  422. classiq/applications_model_constructors/combinatorial_helpers/pyomo_utils.py +0 -243
  423. classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
  424. classiq/applications_model_constructors/libraries/qmci_library.py +0 -107
  425. classiq/builtin_functions/__init__.py +0 -43
  426. classiq/builtin_functions/amplitude_loading.py +0 -3
  427. classiq/builtin_functions/binary_ops.py +0 -1
  428. classiq/builtin_functions/exponentiation.py +0 -5
  429. classiq/builtin_functions/qpe.py +0 -4
  430. classiq/builtin_functions/qsvm.py +0 -7
  431. classiq/builtin_functions/range_types.py +0 -5
  432. classiq/builtin_functions/standard_gates.py +0 -1
  433. classiq/builtin_functions/state_preparation.py +0 -6
  434. classiq/builtin_functions/suzuki_trotter.py +0 -3
  435. classiq/interface/executor/aws_execution_cost.py +0 -73
  436. classiq/interface/executor/error_mitigation.py +0 -6
  437. classiq/interface/generator/credit_risk_example/linear_gci.py +0 -122
  438. classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -69
  439. classiq/interface/generator/expressions/enums/chemistry.py +0 -28
  440. classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
  441. classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
  442. classiq/interface/generator/expressions/enums/optimizers.py +0 -9
  443. classiq/interface/generator/expressions/enums/pauli.py +0 -8
  444. classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
  445. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
  446. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
  447. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
  448. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -1229
  449. classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -95
  450. classiq/interface/generator/functions/foreign_function_definition.py +0 -114
  451. classiq/interface/generator/functions/function_implementation.py +0 -107
  452. classiq/interface/generator/functions/native_function_definition.py +0 -155
  453. classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
  454. classiq/interface/generator/functions/register.py +0 -44
  455. classiq/interface/generator/functions/register_mapping_data.py +0 -106
  456. classiq/interface/generator/inequality_mixer.py +0 -51
  457. classiq/interface/generator/model/classical_main_validator.py +0 -106
  458. classiq/interface/generator/range_mixer.py +0 -56
  459. classiq/interface/generator/state_propagator.py +0 -74
  460. classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -1
  461. classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
  462. classiq/interface/ide/show.py +0 -34
  463. classiq/interface/model/call_synthesis_data.py +0 -68
  464. classiq/interface/model/common_model_types.py +0 -23
  465. classiq/interface/model/quantum_expressions/control_state.py +0 -38
  466. classiq/interface/model/quantum_if_operation.py +0 -94
  467. classiq/interface/model/resolvers/function_call_resolver.py +0 -43
  468. classiq/interface/model/validations/handle_validation_base.py +0 -55
  469. classiq/interface/model/validations/handles_validator.py +0 -156
  470. classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
  471. classiq/model/__init__.py +0 -14
  472. classiq/model/composite_function_generator.py +0 -33
  473. classiq/model/function_handler.py +0 -462
  474. classiq/model/logic_flow.py +0 -149
  475. classiq/model/logic_flow_change_handler.py +0 -71
  476. classiq/model/model.py +0 -229
  477. classiq/qmod/builtins/functions.py +0 -913
  478. classiq/qmod/qmod_struct.py +0 -37
  479. classiq/quantum_functions/__init__.py +0 -17
  480. classiq/quantum_functions/annotation_parser.py +0 -205
  481. classiq/quantum_functions/decorators.py +0 -22
  482. classiq/quantum_functions/function_library.py +0 -181
  483. classiq/quantum_functions/function_parser.py +0 -74
  484. classiq/quantum_functions/quantum_function.py +0 -236
  485. classiq-0.38.0.dist-info/RECORD +0 -454
  486. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/__init__.py +0 -0
  487. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/__init__.py +0 -0
  488. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/__init__.py +0 -0
  489. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +0 -0
  490. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/py.typed +0 -0
  491. /classiq/{applications_model_constructors/combinatorial_helpers/transformations → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
  492. /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
  493. /classiq/{interface/generator/credit_risk_example → applications/hamiltonian}/__init__.py +0 -0
  494. /classiq/{interface/generator/functions/core_lib_declarations → applications/libraries}/__init__.py +0 -0
  495. /classiq/interface/{model/resolvers → debug_info}/__init__.py +0 -0
  496. /classiq/{_internals → interface}/enum_utils.py +0 -0
  497. /classiq/interface/{model/validations → generator/functions/builtins}/__init__.py +0 -0
  498. /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → model_expansions/__init__.py} +0 -0
  499. {classiq-0.38.0.dist-info → classiq-0.65.3.dist-info}/WHEEL +0 -0
@@ -1,9 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import TYPE_CHECKING, List, Optional
3
+ from typing import TYPE_CHECKING, Annotated, Optional
4
4
 
5
- import pydantic
6
- from pydantic import BaseModel
5
+ from pydantic import BaseModel, ConfigDict, Field
7
6
 
8
7
  # This file is based on autogenerated code from: https://static.ionq.co/schemas/circuit-v0.json using
9
8
  # https://pydantic-docs.helpmanual.io/datamodel_code_generator/
@@ -12,35 +11,28 @@ from pydantic import BaseModel
12
11
  if TYPE_CHECKING:
13
12
  PydanticGateName = str
14
13
  else:
15
- PydanticGateName = pydantic.constr(
16
- regex=r"^\w+$",
17
- min_length=1,
18
- )
14
+ PydanticGateName = Annotated[
15
+ str,
16
+ Field(
17
+ pattern=r"^\w+$",
18
+ min_length=1,
19
+ ),
20
+ ]
19
21
 
20
22
 
21
23
  class Gate(BaseModel):
22
24
  gate: PydanticGateName
23
25
  target: Optional[int] = None
24
26
  control: Optional[int] = None
25
- targets: Optional[List[int]] = None
26
- controls: Optional[List[int]] = None
27
-
28
- # Ionq changes format sometimes.
29
- # One example is that `IonqQauntumCircuit` got a field name "gateset" with the value "qis"
30
- # Another is that `Gate` got a field named "rotation"
31
- class Config:
32
- extra = pydantic.Extra.allow
27
+ targets: Optional[list[int]] = None
28
+ controls: Optional[list[int]] = None
29
+ model_config = ConfigDict(extra="allow")
33
30
 
34
31
 
35
32
  class IonqQuantumCircuit(BaseModel):
36
33
  qubits: int
37
- circuit: List[Gate]
38
-
39
- # Ionq changes format sometimes.
40
- # One example is that `IonqQauntumCircuit` got a field name "gateset" with the value "qis"
41
- # Another is that `Gate` got a field named "rotation"
42
- class Config:
43
- extra = pydantic.Extra.allow
34
+ circuit: list[Gate]
35
+ model_config = ConfigDict(extra="allow")
44
36
 
45
37
  @classmethod
46
38
  def from_string(cls, code: str) -> IonqQuantumCircuit:
@@ -48,4 +40,4 @@ class IonqQuantumCircuit(BaseModel):
48
40
  commentless_code = "\n".join(
49
41
  line for line in code_lines if not line.startswith("//")
50
42
  )
51
- return cls.parse_raw(commentless_code)
43
+ return cls.model_validate_json(commentless_code)
@@ -1,22 +1,18 @@
1
- from datetime import timedelta
2
- from typing import TYPE_CHECKING
1
+ from typing import TYPE_CHECKING, Annotated
3
2
 
4
- import pydantic
3
+ from pydantic import Field, StrictStr, constr
5
4
 
6
5
  AZURE_QUANTUM_RESOURCE_ID_REGEX = r"^/subscriptions/([a-fA-F0-9-]*)/resourceGroups/([^\s/]*)/providers/Microsoft\.Quantum/Workspaces/([^\s/]*)$"
7
6
 
8
7
  _IONQ_API_KEY_LENGTH: int = 32
9
8
  _ALICE_BOB_API_KEY_LENGTH: int = 72
10
9
  INVALID_API_KEY: str = _IONQ_API_KEY_LENGTH * "a"
11
- INVALID_API_KEY_ALICE_BOB: str = _ALICE_BOB_API_KEY_LENGTH * "a"
12
10
  INVALID_EMAIL_OQC: str = "aa@aa.aa"
13
- INVALID_PASSWORD_OQC: str = "Aa1!Aa1!"
14
- MAX_EXECUTION_TIMEOUT_SECONDS = timedelta(hours=4).total_seconds()
11
+ INVALID_PASSWORD_OQC: str = "Aa1!Aa1!" # noqa: S105
15
12
 
16
13
  EXECUTION_PARAMETER_PATTERN = "[_a-z][_a-z0-9]*"
17
14
 
18
15
  if TYPE_CHECKING:
19
- PydanticExecutionTimeout = int
20
16
  PydanticAwsRoleArn = str
21
17
  PydanticS3BucketKey = str
22
18
  PydanticS3BucketName = str
@@ -28,24 +24,31 @@ if TYPE_CHECKING:
28
24
  else:
29
25
  # TODO Simplify regular expressions in this file
30
26
 
31
- PydanticAwsRoleArn = pydantic.constr(
32
- strip_whitespace=True,
33
- )
27
+ PydanticAwsRoleArn = Annotated[
28
+ StrictStr,
29
+ constr(
30
+ strip_whitespace=True,
31
+ ),
32
+ ]
34
33
 
35
- PydanticS3BucketKey = pydantic.constr(strip_whitespace=True, min_length=1)
34
+ PydanticS3BucketKey = Annotated[
35
+ StrictStr, constr(strip_whitespace=True, min_length=1)
36
+ ]
36
37
 
37
- PydanticAzureResourceIDType = pydantic.constr(regex=AZURE_QUANTUM_RESOURCE_ID_REGEX)
38
+ PydanticAzureResourceIDType = Annotated[
39
+ str, Field(pattern=AZURE_QUANTUM_RESOURCE_ID_REGEX)
40
+ ]
38
41
 
39
- PydanticIonQApiKeyType = pydantic.constr(
40
- regex=f"[A-Za-z0-9]{{{_IONQ_API_KEY_LENGTH}}}"
41
- )
42
+ PydanticIonQApiKeyType = Annotated[
43
+ str, Field(pattern=f"[A-Za-z0-9]{{{_IONQ_API_KEY_LENGTH}}}")
44
+ ]
42
45
 
43
- PydanticAliceBobApiKeyType = pydantic.constr(
44
- regex=f"[A-Za-z0-9]{{{_ALICE_BOB_API_KEY_LENGTH}}}"
45
- )
46
+ PydanticAliceBobApiKeyType = Annotated[
47
+ StrictStr, constr(min_length=1, strip_whitespace=True)
48
+ ]
46
49
 
47
- PydanticExecutionTimeout = pydantic.conint(gt=0, le=MAX_EXECUTION_TIMEOUT_SECONDS)
50
+ PydanticArgumentNameType = Annotated[str, Field(pattern="[_a-zA-Z][_a-zA-Z0-9]*")]
48
51
 
49
- PydanticArgumentNameType = pydantic.constr(regex="[_a-zA-Z][_a-zA-Z0-9]*")
50
-
51
- PydanticExecutionParameter = pydantic.constr(regex=EXECUTION_PARAMETER_PATTERN)
52
+ PydanticExecutionParameter = Annotated[
53
+ str, Field(pattern=EXECUTION_PARAMETER_PATTERN)
54
+ ]
@@ -1,6 +1,6 @@
1
1
  from typing import Literal, Union
2
2
 
3
- from classiq._internals.enum_utils import StrEnum
3
+ from classiq.interface.enum_utils import StrEnum
4
4
 
5
5
 
6
6
  class AnalyzerProviderVendor(StrEnum):
@@ -18,6 +18,9 @@ class ProviderVendor(StrEnum):
18
18
  GOOGLE = "Google"
19
19
  ALICE_AND_BOB = "Alice & Bob"
20
20
  OQC = "OQC"
21
+ INTEL = "Intel"
22
+ AQT = "AQT"
23
+ IQCC = "IQCC"
21
24
 
22
25
 
23
26
  class ProviderTypeVendor:
@@ -29,23 +32,41 @@ class ProviderTypeVendor:
29
32
  GOOGLE = Literal[ProviderVendor.GOOGLE]
30
33
  ALICE_BOB = Literal[ProviderVendor.ALICE_AND_BOB]
31
34
  OQC = Literal[ProviderVendor.OQC]
35
+ INTEL = Literal[ProviderVendor.INTEL]
36
+ AQT = Literal[ProviderVendor.AQT]
37
+ IQCC = Literal[ProviderVendor.IQCC]
32
38
 
33
39
 
34
- class ClassiqAerBackendNames(StrEnum):
35
- AER_SIMULATOR = "aer_simulator"
36
- AER_SIMULATOR_STATEVECTOR = "aer_simulator_statevector"
37
- AER_SIMULATOR_DENSITY_MATRIX = "aer_simulator_density_matrix"
38
- AER_SIMULATOR_MATRIX_PRODUCT_STATE = "aer_simulator_matrix_product_state"
40
+ class ClassiqSimulatorBackendNames(StrEnum):
41
+ """
42
+
43
+ The simulator backends available in the Classiq provider.
44
+
45
+ """
46
+
47
+ SIMULATOR = "simulator"
48
+ SIMULATOR_STATEVECTOR = "simulator_statevector"
49
+ SIMULATOR_DENSITY_MATRIX = "simulator_density_matrix"
50
+ SIMULATOR_MATRIX_PRODUCT_STATE = "simulator_matrix_product_state"
39
51
 
40
52
 
41
53
  class IonqBackendNames(StrEnum):
54
+ """
55
+ IonQ backend names which Classiq Supports running on.
56
+ """
57
+
42
58
  SIMULATOR = "simulator"
43
59
  HARMONY = "qpu.harmony"
44
- ARIA = "qpu.aria-1"
45
- S11 = "qpu.s11"
60
+ ARIA_1 = "qpu.aria-1"
61
+ ARIA_2 = "qpu.aria-2"
62
+ FORTE_1 = "qpu.forte-1"
46
63
 
47
64
 
48
65
  class AzureQuantumBackendNames(StrEnum):
66
+ """
67
+ AzureQuantum backend names which Classiq Supports running on.
68
+ """
69
+
49
70
  IONQ_ARIA_1 = "ionq.qpu.aria-1"
50
71
  IONQ_ARIA_2 = "ionq.qpu.aria-2"
51
72
  IONQ_QPU = "ionq.qpu"
@@ -53,7 +74,6 @@ class AzureQuantumBackendNames(StrEnum):
53
74
  IONQ_SIMULATOR = "ionq.simulator"
54
75
  MICROSOFT_ESTIMATOR = "microsoft.estimator"
55
76
  MICROSOFT_FULLSTATE_SIMULATOR = "microsoft.simulator.fullstate"
56
- RIGETTI_ASPEN3 = "rigetti.qpu.aspen-m-3"
57
77
  RIGETTI_SIMULATOR = "rigetti.sim.qvm"
58
78
  RIGETTI_ANKAA2 = "rigetti.qpu.ankaa-2"
59
79
  RIGETTI_ANKAA9 = "rigetti.qpu.ankaa-9q-1"
@@ -72,6 +92,10 @@ class AzureQuantumBackendNames(StrEnum):
72
92
 
73
93
 
74
94
  class AmazonBraketBackendNames(StrEnum):
95
+ """
96
+ Amazon Braket backend names which Classiq Supports running on.
97
+ """
98
+
75
99
  AMAZON_BRAKET_SV1 = "SV1"
76
100
  AMAZON_BRAKET_TN1 = "TN1"
77
101
  AMAZON_BRAKET_DM1 = "dm1"
@@ -88,6 +112,10 @@ class AmazonBraketBackendNames(StrEnum):
88
112
  # # Using _normalize_backend_name from `ibm_hardware_graphs.py`
89
113
  # the_devices = [_normalize_backend_name(str(backend)) for backend in backends_list]
90
114
  class IBMQHardwareNames(StrEnum):
115
+ """
116
+ IBM backend names which Classiq Supports running on.
117
+ """
118
+
91
119
  ALMADEN = "Almaden"
92
120
  ARMONK = "Armonk"
93
121
  ATHENS = "Athens"
@@ -138,24 +166,46 @@ class IBMQHardwareNames(StrEnum):
138
166
 
139
167
 
140
168
  class ClassiqNvidiaBackendNames(StrEnum):
141
- SIMULATOR = "nvidia_state_vector_simulator"
169
+ """
170
+ Classiq's Nvidia simulator backend names.
171
+ """
172
+
173
+ SIMULATOR = "nvidia_simulator"
174
+ SIMULATOR_STATEVECTOR = "nvidia_simulator_statevector"
175
+
176
+
177
+ class IntelBackendNames(StrEnum):
178
+ SIMULATOR = "intel_qsdk_simulator"
142
179
 
143
180
 
144
- AllClassiqBackendNames = Union[ClassiqAerBackendNames, ClassiqNvidiaBackendNames]
181
+ AllClassiqBackendNames = Union[ClassiqSimulatorBackendNames, ClassiqNvidiaBackendNames]
145
182
 
146
183
 
147
184
  class GoogleNvidiaBackendNames(StrEnum):
185
+ """
186
+ Google backend names which Classiq Supports running on.
187
+ """
188
+
148
189
  CUQUANTUM = "cuquantum"
190
+ CUQUANTUM_STATEVECTOR = "cuquantum_statevector"
149
191
 
150
192
 
151
193
  class AliceBobBackendNames(StrEnum):
152
- PERFECT_QUBITS = "EMU:20Q:PERFECT_QUBITS"
153
- LOGICAL_TARGET = "EMU:40Q:LOGICAL_TARGET"
154
- LOGICAL_EARLY = "EMU:15Q:LOGICAL_EARLY"
155
- TRANSMONS = "EMU:7Q:TRANSMONS"
194
+ """
195
+ Alice & Bob backend names which Classiq Supports running on.
196
+ """
197
+
198
+ PERFECT_QUBITS = "PERFECT_QUBITS"
199
+ LOGICAL_TARGET = "LOGICAL_TARGET"
200
+ LOGICAL_EARLY = "LOGICAL_EARLY"
201
+ TRANSMONS = "TRANSMONS"
156
202
 
157
203
 
158
204
  class OQCBackendNames(StrEnum):
205
+ """
206
+ OQC backend names which Classiq Supports running on.
207
+ """
208
+
159
209
  LUCY = "Lucy"
160
210
 
161
211
 
@@ -166,7 +216,8 @@ EXACT_SIMULATORS = {
166
216
  AmazonBraketBackendNames.AMAZON_BRAKET_SV1,
167
217
  AmazonBraketBackendNames.AMAZON_BRAKET_TN1,
168
218
  AmazonBraketBackendNames.AMAZON_BRAKET_DM1,
169
- *ClassiqAerBackendNames,
219
+ *ClassiqSimulatorBackendNames,
220
+ *IntelBackendNames,
170
221
  *ClassiqNvidiaBackendNames,
171
222
  }
172
223
 
@@ -177,6 +228,7 @@ AllBackendsNameByVendor = Union[
177
228
  AzureQuantumBackendNames,
178
229
  AmazonBraketBackendNames,
179
230
  IonqBackendNames,
231
+ IntelBackendNames,
180
232
  ClassiqNvidiaBackendNames,
181
233
  AliceBobBackendNames,
182
234
  OQCBackendNames,
@@ -188,6 +240,7 @@ AllBackendsNameEnums = [
188
240
  AmazonBraketBackendNames,
189
241
  IonqBackendNames,
190
242
  AliceBobBackendNames,
243
+ IntelBackendNames,
191
244
  ClassiqNvidiaBackendNames,
192
245
  OQCBackendNames,
193
246
  ]
@@ -1,19 +1,19 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import itertools
4
- from typing import Set, Tuple, Union
4
+ from typing import Union
5
5
 
6
6
  import numpy as np
7
7
  import pydantic
8
+ from pydantic import ConfigDict
8
9
 
10
+ from classiq.interface.exceptions import ClassiqValueError
9
11
  from classiq.interface.helpers.hashable_pydantic_base_model import (
10
12
  HashablePydanticBaseModel,
11
13
  )
12
14
 
13
- from classiq.exceptions import ClassiqValueError
14
-
15
- LadderOperator = Tuple[str, int]
16
- FermionicOperatorTuple = Tuple["FermionicOperator", float]
15
+ LadderOperator = tuple[str, int]
16
+ FermionicOperatorTuple = tuple["FermionicOperator", float]
17
17
 
18
18
  _SUBSCRIPT_UNICODE_CHARS = {
19
19
  "0": "\u2080",
@@ -39,7 +39,10 @@ class FermionicOperator(HashablePydanticBaseModel):
39
39
  """
40
40
 
41
41
  op_list: list = pydantic.Field(
42
- description="A list of tuples each containing an index and a character; for example [('+', 0), ('-', 1)].",
42
+ description=(
43
+ "A list of tuples each containing an index and a character; for "
44
+ "example [('+', 0), ('-', 1)]."
45
+ ),
43
46
  )
44
47
 
45
48
  @staticmethod
@@ -51,22 +54,30 @@ class FermionicOperator(HashablePydanticBaseModel):
51
54
  raise ClassiqValueError("Ladder operator should be a tuple.") from exc
52
55
  if len(op) != 2:
53
56
  raise ClassiqValueError(
54
- "Ladder operator tuple should be of length two; for example (1, '+')."
57
+ "Ladder operator tuple should be of length two; for example ('+', 1)."
55
58
  )
56
59
 
57
- if op[0] not in ("+", "-"):
60
+ op_symbol = op[0]
61
+ if op_symbol == "LadderOperator.PLUS":
62
+ op_symbol = "+"
63
+ elif op_symbol == "LadderOperator.MINUS":
64
+ op_symbol = "-"
65
+ if op_symbol not in ("+", "-"):
58
66
  raise ClassiqValueError(
59
- "The first term in a ladder operator tuple indicates if its a raising ('+')"
60
- f" or lowering ('-') operator. Allowed input is: '+' or '-', received {op[0]}"
67
+ f"The first term in a ladder operator tuple indicates if its a raising "
68
+ f"(LadderOperator.PLUS / '+') or lowering (LadderOperator.MINUS / '-') "
69
+ f"operator. Received {op_symbol}"
61
70
  )
62
- if not isinstance(op[1], int):
71
+ op_index = op[1]
72
+ if not isinstance(op_index, int):
63
73
  raise ClassiqValueError(
64
74
  "The second term in a ladder operator tuple indicates its index and should be of type int"
65
75
  )
66
76
 
67
- return op # type: ignore[return-value] # mypy thinks that it is `Tuple[Any, ...]`, though the asserts here tell otherwise..
77
+ return (op_symbol, op_index)
68
78
 
69
- @pydantic.validator("op_list")
79
+ @pydantic.field_validator("op_list")
80
+ @classmethod
70
81
  def _validate_op_list(cls, op_list: list) -> list:
71
82
  return list(map(cls._validate_single_op, op_list))
72
83
 
@@ -90,8 +101,7 @@ class FermionicOperator(HashablePydanticBaseModel):
90
101
  "FermionicOperator can be summed together only with type FermionicOperator or SummedFermionicOperator"
91
102
  )
92
103
 
93
- class Config:
94
- frozen = True
104
+ model_config = ConfigDict(frozen=True)
95
105
 
96
106
  @staticmethod
97
107
  def _to_ladder_op(char: str) -> str:
@@ -108,7 +118,7 @@ class FermionicOperator(HashablePydanticBaseModel):
108
118
  )
109
119
 
110
120
  @property
111
- def all_indices(self) -> Set[int]:
121
+ def all_indices(self) -> set[int]:
112
122
  return {op[1] for op in self.op_list}
113
123
 
114
124
 
@@ -126,9 +136,7 @@ class SummedFermionicOperator(HashablePydanticBaseModel):
126
136
  op_list: list = pydantic.Field(
127
137
  description="A list of tuples each containing a FermionicOperator and a coefficient.",
128
138
  )
129
-
130
- class Config:
131
- frozen = True
139
+ model_config = ConfigDict(frozen=True)
132
140
 
133
141
  @staticmethod
134
142
  def _validate_single_op(op: tuple) -> FermionicOperatorTuple:
@@ -157,7 +165,8 @@ class SummedFermionicOperator(HashablePydanticBaseModel):
157
165
 
158
166
  return op # type: ignore[return-value] # mypy thinks that it is `Tuple[Any, ...]`, though the asserts here tell otherwise..
159
167
 
160
- @pydantic.validator("op_list")
168
+ @pydantic.field_validator("op_list")
169
+ @classmethod
161
170
  def _validate_op_list(cls, op_list: list) -> list:
162
171
  return list(map(cls._validate_single_op, op_list))
163
172
 
@@ -186,7 +195,7 @@ class SummedFermionicOperator(HashablePydanticBaseModel):
186
195
  return True
187
196
 
188
197
  @property
189
- def _all_indices(self) -> Set[int]:
198
+ def _all_indices(self) -> set[int]:
190
199
  return set(
191
200
  itertools.chain.from_iterable(op.all_indices for op, _ in self.op_list)
192
201
  )
@@ -1,18 +1,17 @@
1
- from typing import Any, Dict, List, Literal, Optional, Tuple, Union
1
+ from typing import Annotated, Literal, Optional, Union, cast
2
2
 
3
3
  import pydantic
4
- from pydantic import Field
5
- from typing_extensions import Annotated
4
+ from pydantic import ConfigDict, Field
5
+ from pydantic_core.core_schema import ValidationInfo
6
6
 
7
7
  from classiq.interface.chemistry.fermionic_operator import SummedFermionicOperator
8
8
  from classiq.interface.chemistry.molecule import Molecule
9
+ from classiq.interface.enum_utils import StrEnum
10
+ from classiq.interface.exceptions import ClassiqValueError
9
11
  from classiq.interface.helpers.hashable_pydantic_base_model import (
10
12
  HashablePydanticBaseModel,
11
13
  )
12
14
 
13
- from classiq._internals.enum_utils import StrEnum
14
- from classiq.exceptions import ClassiqValueError
15
-
16
15
  """
17
16
  The correct type hint is:
18
17
  NumSpinUpParticles = pydantic.NonNegativeInt
@@ -29,7 +28,7 @@ And use a list, and manually check its length
29
28
  """
30
29
  NumSpinUpParticles = pydantic.NonNegativeInt
31
30
  NumSpinDownParticles = pydantic.NonNegativeInt
32
- NumParticles = Tuple[NumSpinUpParticles, NumSpinDownParticles]
31
+ NumParticles = tuple[NumSpinUpParticles, NumSpinDownParticles]
33
32
 
34
33
 
35
34
  class FermionMapping(StrEnum):
@@ -53,18 +52,19 @@ class GroundStateProblem(HashablePydanticBaseModel):
53
52
  )
54
53
  num_qubits: Optional[int] = pydantic.Field(default=None)
55
54
 
56
- @pydantic.validator("z2_symmetries")
57
- def _validate_z2_symmetries(
58
- cls, z2_symmetries: bool, values: Dict[str, Any]
59
- ) -> bool:
60
- if z2_symmetries and values.get("mapping") == FermionMapping.FAST_BRAVYI_KITAEV:
55
+ @pydantic.field_validator("z2_symmetries")
56
+ @classmethod
57
+ def _validate_z2_symmetries(cls, z2_symmetries: bool, info: ValidationInfo) -> bool:
58
+ if (
59
+ z2_symmetries
60
+ and info.data.get("mapping") == FermionMapping.FAST_BRAVYI_KITAEV
61
+ ):
61
62
  raise ClassiqValueError(
62
63
  "z2 symmetries reduction can not be used for fast_bravyi_kitaev mapping"
63
64
  )
64
65
  return z2_symmetries
65
66
 
66
- class Config:
67
- frozen = True
67
+ model_config = ConfigDict(frozen=True)
68
68
 
69
69
 
70
70
  class MoleculeProblem(GroundStateProblem):
@@ -73,7 +73,7 @@ class MoleculeProblem(GroundStateProblem):
73
73
  molecule: Molecule
74
74
  basis: str = pydantic.Field(default="sto3g", description="Molecular basis set")
75
75
  freeze_core: bool = pydantic.Field(default=False)
76
- remove_orbitals: List[int] = pydantic.Field(
76
+ remove_orbitals: list[int] = pydantic.Field(
77
77
  default_factory=list, description="list of orbitals to remove"
78
78
  )
79
79
 
@@ -84,24 +84,27 @@ class HamiltonianProblem(GroundStateProblem):
84
84
  hamiltonian: SummedFermionicOperator = pydantic.Field(
85
85
  description="Hamiltonian as a fermionic operator"
86
86
  )
87
- num_particles: List[pydantic.PositiveInt] = pydantic.Field(
87
+ num_particles: list[pydantic.PositiveInt] = pydantic.Field(
88
88
  description="Tuple containing the numbers of alpha particles and beta particles"
89
89
  )
90
90
 
91
- @pydantic.validator("num_particles")
92
- def _validate_num_particles(cls, num_particles: List[int]) -> List[int]:
93
- assert isinstance(num_particles, list)
91
+ @pydantic.field_validator("num_particles", mode="before")
92
+ @classmethod
93
+ def _validate_num_particles(
94
+ cls,
95
+ num_particles: Union[
96
+ list[Union[int, float]], tuple[Union[int, float], Union[int, float]]
97
+ ],
98
+ ) -> list[int]:
99
+ assert isinstance(num_particles, (list, tuple))
94
100
  assert len(num_particles) == 2
95
101
 
96
- # This probably will never happen, since pydantic automatically converts
97
- # floats to ints
98
- assert isinstance(num_particles[0], int)
99
- assert num_particles[0] >= 1
102
+ num_particles = [int(x) for x in num_particles]
100
103
 
101
- assert isinstance(num_particles[1], int)
104
+ assert num_particles[0] >= 1
102
105
  assert num_particles[1] >= 1
103
106
 
104
- return num_particles
107
+ return cast(list[int], num_particles)
105
108
 
106
109
 
107
110
  CHEMISTRY_PROBLEMS = (MoleculeProblem, HamiltonianProblem)
@@ -1,15 +1,15 @@
1
- from typing import List, Literal, Union
1
+ from typing import Literal, Union
2
2
 
3
3
  import pydantic
4
+ from pydantic import ConfigDict
4
5
 
5
6
  from classiq.interface.chemistry.elements import ELEMENTS
7
+ from classiq.interface.exceptions import ClassiqValueError
6
8
  from classiq.interface.helpers.custom_pydantic_types import AtomType
7
9
  from classiq.interface.helpers.hashable_pydantic_base_model import (
8
10
  HashablePydanticBaseModel,
9
11
  )
10
12
 
11
- from classiq.exceptions import ClassiqValueError
12
-
13
13
 
14
14
  class Atom(HashablePydanticBaseModel):
15
15
  symbol: Literal[tuple(ELEMENTS)] = pydantic.Field(description="The atom symbol") # type: ignore[valid-type]
@@ -19,9 +19,9 @@ class Atom(HashablePydanticBaseModel):
19
19
 
20
20
 
21
21
  class Molecule(HashablePydanticBaseModel):
22
- atoms: List[Atom] = pydantic.Field(
22
+ atoms: list[Atom] = pydantic.Field(
23
23
  description="A list of atoms each containing the atoms symbol and its (x,y,z) location",
24
- min_items=1,
24
+ min_length=1,
25
25
  )
26
26
  spin: pydantic.NonNegativeInt = pydantic.Field(
27
27
  default=1, description="spin of the molecule"
@@ -31,15 +31,20 @@ class Molecule(HashablePydanticBaseModel):
31
31
  )
32
32
 
33
33
  @property
34
- def atoms_type(self) -> List[AtomType]:
34
+ def atoms_type(self) -> list[AtomType]:
35
35
  return [(atom.symbol, [atom.x, atom.y, atom.z]) for atom in self.atoms]
36
36
 
37
- @pydantic.validator("atoms", each_item=True, pre=True)
38
- def _validate_atoms(cls, atom: Union[AtomType, Atom]) -> Atom:
37
+ @classmethod
38
+ def _validate_atom(cls, atom: Union[AtomType, Atom]) -> Atom:
39
39
  if isinstance(atom, (list, tuple)):
40
40
  return cls._validate_old_atoms_type(atom)
41
41
  return atom
42
42
 
43
+ @pydantic.field_validator("atoms", mode="before")
44
+ @classmethod
45
+ def _validate_atoms(cls, atoms: list[Union[AtomType, Atom]]) -> list[Atom]:
46
+ return [cls._validate_atom(atom) for atom in atoms]
47
+
43
48
  @staticmethod
44
49
  def _validate_old_atoms_type(atom: AtomType) -> Atom:
45
50
  if len(atom) != 2:
@@ -63,5 +68,4 @@ class Molecule(HashablePydanticBaseModel):
63
68
 
64
69
  return Atom(symbol=symbol, x=coordinate[0], y=coordinate[1], z=coordinate[2])
65
70
 
66
- class Config:
67
- frozen = True
71
+ model_config = ConfigDict(frozen=True)