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

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