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,16 +1,18 @@
1
1
  import math
2
- from typing import Any, Dict, Generic, List, Sequence, Tuple, TypeVar
2
+ from collections.abc import Sequence
3
+ from typing import Any, Generic, TypeVar
3
4
 
4
5
  import pydantic
6
+ from pydantic import BaseModel, ConfigDict, Field, field_validator
7
+ from pydantic_core.core_schema import ValidationInfo
5
8
 
9
+ from classiq.interface.exceptions import ClassiqError
6
10
  from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
7
11
  from classiq.interface.generator.function_params import FunctionParams
8
12
  from classiq.interface.helpers.hashable_pydantic_base_model import (
9
13
  HashablePydanticBaseModel,
10
14
  )
11
15
 
12
- from classiq.exceptions import ClassiqError
13
-
14
16
  STATE_NAME: str = "state"
15
17
  TARGET_NAME: str = "target"
16
18
  _REL_TOLERANCE: float = 0.01
@@ -19,25 +21,24 @@ Breakpoint = TypeVar("Breakpoint")
19
21
 
20
22
 
21
23
  class AffineMap(HashablePydanticBaseModel):
22
- slope: float = pydantic.Field(default=1.0)
23
- offset: float = pydantic.Field(default=0.0)
24
+ slope: float = Field(default=1.0)
25
+ offset: float = Field(default=0.0)
24
26
 
25
27
  def evaluate(self, x: float) -> float:
26
28
  return self.offset + self.slope * x
27
29
 
28
- def image_bounds(self, domain_bounds: Tuple[float, float]) -> Tuple[float, float]:
30
+ def image_bounds(self, domain_bounds: tuple[float, float]) -> tuple[float, float]:
29
31
  return self.evaluate(domain_bounds[0]), self.evaluate(domain_bounds[1])
30
32
 
31
- class Config:
32
- frozen = True
33
+ model_config = ConfigDict(frozen=True)
33
34
 
34
35
 
35
36
  class PiecewiseLinearAmplitudeLoadingABC(
36
- FunctionParams, pydantic.generics.GenericModel, Generic[Breakpoint]
37
+ FunctionParams, BaseModel, Generic[Breakpoint]
37
38
  ):
38
- num_qubits: pydantic.PositiveInt = pydantic.Field()
39
- breakpoints: Sequence[pydantic.NonNegativeInt] = pydantic.Field()
40
- affine_maps: Sequence[AffineMap] = pydantic.Field()
39
+ num_qubits: int = Field()
40
+ breakpoints: Sequence[int] = Field()
41
+ affine_maps: Sequence[AffineMap] = Field()
41
42
 
42
43
  def _create_ios(self) -> None:
43
44
  self._inputs = {
@@ -50,8 +51,8 @@ class PiecewiseLinearAmplitudeLoadingABC(
50
51
  def _max_index(self) -> int:
51
52
  return 2**self.num_qubits - 1
52
53
 
53
- def _get_image_bounds(self) -> Tuple[float, float]:
54
- piece_bounds: Sequence[Tuple[float, float]] = [
54
+ def _get_image_bounds(self) -> tuple[float, float]:
55
+ piece_bounds: Sequence[tuple[float, float]] = [
55
56
  affine_map.image_bounds((self.breakpoints[idx], self.breakpoints[idx + 1]))
56
57
  for idx, affine_map in enumerate(self.affine_maps)
57
58
  ]
@@ -59,19 +60,35 @@ class PiecewiseLinearAmplitudeLoadingABC(
59
60
  top = max(max(piece) for piece in piece_bounds)
60
61
  return bottom, top
61
62
 
62
- @pydantic.validator("breakpoints")
63
+ @field_validator("breakpoints", mode="before")
64
+ @classmethod
63
65
  def _validate_breakpoints(cls, breakpoints: Sequence[int]) -> Sequence[int]:
66
+ return cls.validate_breakpoints(breakpoints)
67
+
68
+ @classmethod
69
+ def validate_breakpoints(cls, breakpoints: Sequence[int]) -> Sequence[int]:
64
70
  assert len(breakpoints) == len(
65
71
  set(breakpoints)
66
72
  ), "Repeated breakpoints encountered"
67
73
  assert list(breakpoints) == sorted(breakpoints), "Breakpoints not sorted"
68
- return breakpoints
74
+ return list(map(int, breakpoints))
69
75
 
70
- @pydantic.root_validator(pre=True)
71
- def _validate_lengths(cls, values: Dict[str, Any]) -> Dict[str, Any]:
76
+ @pydantic.model_validator(mode="before")
77
+ @classmethod
78
+ def _validate_lengths(cls, values: Any) -> dict[str, Any]:
72
79
  breakpoints = values.get("breakpoints", list())
73
80
  affine_maps = values.get("affine_maps", list())
74
81
  num_qubits = values.get("num_qubits", int)
82
+ if isinstance(values, dict):
83
+ breakpoints = values.get("breakpoints", list())
84
+ affine_maps = values.get("affine_maps", list())
85
+ num_qubits = values.get("num_qubits", int)
86
+ elif isinstance(values, PiecewiseLinearAmplitudeLoadingABC):
87
+ breakpoints = values.breakpoints
88
+ affine_maps = values.affine_maps
89
+ num_qubits = values.num_qubits
90
+ values = values.__dict__
91
+
75
92
  assert len(breakpoints) - 1 == len(
76
93
  affine_maps
77
94
  ), "Size mismatch between the number of slopes and breakpoints. The number of breakpoints should be the number of slopes + 1"
@@ -81,28 +98,27 @@ class PiecewiseLinearAmplitudeLoadingABC(
81
98
  return values
82
99
 
83
100
 
84
- class PiecewiseLinearRotationAmplitudeLoading(
85
- PiecewiseLinearAmplitudeLoadingABC[pydantic.NonNegativeInt]
86
- ):
101
+ class PiecewiseLinearRotationAmplitudeLoading(PiecewiseLinearAmplitudeLoadingABC[int]):
87
102
  pass
88
103
 
89
- @pydantic.validator("breakpoints")
90
- def _validate_breakpoints(
91
- cls, breakpoints: Sequence[int], values: Dict[str, Any]
104
+ @field_validator("breakpoints")
105
+ @classmethod
106
+ def _validate_breakpoints_field(
107
+ cls, breakpoints: Sequence[int], info: ValidationInfo
92
108
  ) -> Sequence[int]:
93
- num_qubits = values.get("num_qubits")
109
+ num_qubits = info.data.get("num_qubits")
94
110
  assert isinstance(num_qubits, int), "Must have an integer number of qubits"
95
111
  assert min(breakpoints) == 0, "First breakpoint must be 0"
96
112
  assert (
97
113
  max(breakpoints) == 2**num_qubits - 1
98
114
  ), f"Last breakpoint must be {2**num_qubits - 1}"
99
- return PiecewiseLinearAmplitudeLoadingABC._validate_breakpoints(
115
+ return PiecewiseLinearAmplitudeLoadingABC.validate_breakpoints(
100
116
  breakpoints=breakpoints
101
117
  )
102
118
 
103
119
 
104
120
  class PiecewiseLinearAmplitudeLoading(PiecewiseLinearAmplitudeLoadingABC[float]):
105
- rescaling_factor: float = pydantic.Field(default=0.25 * math.pi)
121
+ rescaling_factor: float = Field(default=0.25 * math.pi)
106
122
 
107
123
  def rescaled(self) -> PiecewiseLinearRotationAmplitudeLoading:
108
124
  c, d = self._get_image_bounds()
@@ -111,11 +127,11 @@ class PiecewiseLinearAmplitudeLoading(PiecewiseLinearAmplitudeLoadingABC[float])
111
127
 
112
128
  a, b = self.breakpoints[0], self.breakpoints[-1]
113
129
 
114
- normalized_breakpoints: List[int] = [
130
+ normalized_breakpoints: list[int] = [
115
131
  round(self._max_index * (point - a) / (b - a)) for point in self.breakpoints
116
132
  ]
117
133
 
118
- normalized_affine_maps: List[AffineMap] = list()
134
+ normalized_affine_maps: list[AffineMap] = list()
119
135
  for affine_map in self.affine_maps:
120
136
  normalized_slope = (
121
137
  2 * affine_map.slope * self.rescaling_factor * (b - a)
@@ -1,11 +1,10 @@
1
1
  from pydantic import BaseModel
2
2
 
3
+ from classiq.interface.enum_utils import StrEnum
3
4
  from classiq.interface.helpers.custom_pydantic_types import (
4
5
  PydanticNonOneProbabilityFloat,
5
6
  )
6
7
 
7
- from classiq._internals.enum_utils import StrEnum
8
-
9
8
 
10
9
  # it seems to be ambiguous in this class. it is Identical to the Metrics, up to the
11
10
  # attribute RANDOM, However RANDOM isn't really used or treated in any part of the code.
@@ -1,7 +1,11 @@
1
- from typing import Any, Dict, Optional, Tuple
1
+ from typing import Any, Optional
2
2
 
3
3
  import pydantic
4
+ from pydantic import ConfigDict
5
+ from pydantic_core.core_schema import ValidationInfo
6
+ from typing_extensions import Self
4
7
 
8
+ from classiq.interface.exceptions import ClassiqMismatchIOsError, ClassiqValueError
5
9
  from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
6
10
  from classiq.interface.generator.function_param_list_without_self_reference import (
7
11
  function_param_library_without_self_reference,
@@ -17,8 +21,6 @@ from classiq.interface.generator.hamiltonian_evolution.exponentiation import (
17
21
  )
18
22
  from classiq.interface.generator.user_defined_function_params import CustomFunction
19
23
 
20
- from classiq.exceptions import ClassiqMismatchIOsError, ClassiqValueError
21
-
22
24
  PHASE_ESTIMATION_DEFAULT_OUTPUT_NAME = "PHASE_ESTIMATION"
23
25
  CUSTOM_FUNCTIONS_IO_MISMATCH_ERROR = (
24
26
  "Custom function provided to the QPE has different input and output names."
@@ -37,9 +39,7 @@ class ExponentiationScaling(pydantic.BaseModel):
37
39
  default=2.0,
38
40
  description="The scaling factor of the exponentiation max_depth; defaults to 2.",
39
41
  )
40
-
41
- class Config:
42
- frozen = True
42
+ model_config = ConfigDict(frozen=True)
43
43
 
44
44
 
45
45
  class ExponentiationSpecification(pydantic.BaseModel):
@@ -52,21 +52,17 @@ class ExponentiationSpecification(pydantic.BaseModel):
52
52
  default=None,
53
53
  description="The scaling of the exponentiation functions.",
54
54
  )
55
- max_depths: Optional[Tuple[pydantic.NonNegativeInt, ...]] = pydantic.Field(
55
+ max_depths: Optional[tuple[pydantic.NonNegativeInt, ...]] = pydantic.Field(
56
56
  default=None,
57
57
  description="The max_depth of each exponentiation function; overrides scaling.",
58
58
  )
59
+ model_config = ConfigDict(frozen=True)
59
60
 
60
- class Config:
61
- frozen = True
62
-
63
- @pydantic.root_validator
64
- def _validate_exponentiation_specification(
65
- cls, values: Dict[str, Any]
66
- ) -> Dict[str, Any]:
67
- if values.get("scaling") is None and values.get("max_depths") is None:
68
- raise ValueError("At least one specification must be provided.")
69
- return values
61
+ @pydantic.model_validator(mode="after")
62
+ def _validate_exponentiation_specification(self) -> Self:
63
+ if self.scaling is None and self.max_depths is None:
64
+ raise ClassiqValueError("At least one specification must be provided.")
65
+ return self
70
66
 
71
67
 
72
68
  class PhaseEstimation(FunctionParams):
@@ -105,52 +101,69 @@ class PhaseEstimation(FunctionParams):
105
101
  self._outputs[self._output_name] = RegisterArithmeticInfo(size=self.size)
106
102
  self._create_zero_input_registers({DEFAULT_ZERO_NAME: self.size})
107
103
 
108
- @pydantic.root_validator(pre=True)
109
- def _validate_composite_name(cls, values: Dict[str, Any]) -> Dict[str, Any]:
110
- if isinstance(values.get("unitary_params"), CustomFunction) and not values.get(
111
- "unitary"
112
- ):
104
+ @pydantic.model_validator(mode="before")
105
+ @classmethod
106
+ def _validate_composite_name(cls, values: Any) -> dict[str, Any]:
107
+ if not isinstance(values, dict):
108
+ return values
109
+ unitary_params = values.get("unitary_params")
110
+ unitary = values.get("unitary")
111
+
112
+ if isinstance(unitary_params, CustomFunction) and not unitary:
113
113
  raise ClassiqValueError(
114
114
  "`PhaseEstimation` of a user define function (`CustomFunction`) must receive the function name from the `unitary` field"
115
115
  )
116
116
  return values
117
117
 
118
- @pydantic.root_validator(pre=True)
119
- def _parse_function_params(cls, values: Dict[str, Any]) -> Dict[str, Any]:
118
+ @pydantic.model_validator(mode="before")
119
+ @classmethod
120
+ def _parse_function_params(
121
+ cls, values: Any, info: ValidationInfo
122
+ ) -> dict[str, Any]:
123
+ vals = info.data.copy() if info.data else {}
124
+ if isinstance(values, dict):
125
+ vals = values
126
+ elif isinstance(values, PhaseEstimation):
127
+ vals = values.model_dump()
128
+
120
129
  parse_function_params_values(
121
- values=values,
130
+ values=vals,
122
131
  params_key="unitary_params",
123
132
  discriminator_key="unitary",
124
133
  param_classes=function_param_library_without_self_reference.param_list,
125
134
  default_parser_class=CustomFunction,
126
135
  )
127
- return values
136
+ return vals
128
137
 
129
- @pydantic.validator("unitary_params")
138
+ @pydantic.field_validator("unitary_params")
139
+ @classmethod
130
140
  def _validate_unitary_params(cls, unitary_params: FunctionParams) -> FunctionParams:
131
141
  if not unitary_params.is_powerable():
132
142
  if isinstance(unitary_params, CustomFunction):
133
143
  raise ClassiqMismatchIOsError(CUSTOM_FUNCTIONS_IO_MISMATCH_ERROR)
134
- raise ValueError(
144
+ raise ClassiqValueError(
135
145
  f"Phase estimation of {unitary_params.discriminator()} is currently not supported."
136
146
  )
137
147
  return unitary_params
138
148
 
139
- @pydantic.validator("exponentiation_specification")
149
+ @pydantic.field_validator("exponentiation_specification")
150
+ @classmethod
140
151
  def _validate_exponentiation_specification(
141
152
  cls,
142
153
  exponentiation_specification: Optional[ExponentiationSpecification],
143
- values: Dict[str, Any],
154
+ validation_info: ValidationInfo,
144
155
  ) -> Optional[ExponentiationSpecification]:
145
156
  if exponentiation_specification is None:
146
157
  return exponentiation_specification
147
- unitary_params = values.get("unitary_params")
158
+ unitary_params = validation_info.data.get("unitary_params")
148
159
  if not isinstance(unitary_params, Exponentiation):
149
- raise ValueError(
160
+ raise ClassiqValueError(
150
161
  "exponentiation_specification is only valid for Exponentiation unitary_params."
151
162
  )
152
163
  if exponentiation_specification.max_depths is not None and len(
153
164
  exponentiation_specification.max_depths
154
- ) != values.get("size"):
155
- raise ValueError("Length of max_depths must match the provided size.")
165
+ ) != validation_info.data.get("size"):
166
+ raise ClassiqValueError(
167
+ "Length of max_depths must match the provided size."
168
+ )
156
169
  return exponentiation_specification
@@ -1,8 +1,11 @@
1
- from typing import List, Literal, Optional, Union
1
+ from typing import Literal, Optional, Union
2
2
 
3
3
  import numpy as np
4
4
  import pydantic
5
+ from pydantic import ConfigDict
5
6
 
7
+ from classiq.interface.enum_utils import StrEnum
8
+ from classiq.interface.exceptions import ClassiqQSVMError, ClassiqValueError
6
9
  from classiq.interface.generator.arith.register_user_input import RegisterUserInput
7
10
  from classiq.interface.generator.function_params import (
8
11
  DEFAULT_INPUT_NAME,
@@ -12,10 +15,6 @@ from classiq.interface.generator.function_params import (
12
15
  from classiq.interface.helpers.hashable_pydantic_base_model import (
13
16
  HashablePydanticBaseModel,
14
17
  )
15
- from classiq.interface.helpers.pydantic_model_helpers import get_discriminator_field
16
-
17
- from classiq._internals.enum_utils import StrEnum
18
- from classiq.exceptions import ClassiqQSVMError
19
18
 
20
19
  VALID_PAULI_LETTERS = ("I", "X", "Y", "Z")
21
20
 
@@ -30,36 +29,33 @@ class QSVMFeatureMapEntanglement(StrEnum):
30
29
 
31
30
  class QSVMFeatureMapDimensional(HashablePydanticBaseModel):
32
31
  feature_dimension: Optional[int] = None
33
-
34
- class Config:
35
- frozen = True
32
+ model_config = ConfigDict(frozen=True)
36
33
 
37
34
 
38
35
  class QSVMFeatureMapPauli(QSVMFeatureMapDimensional):
39
- map_type: Literal["pauli_feature_map"] = get_discriminator_field(
40
- "pauli_feature_map"
41
- )
36
+ map_type: Literal["pauli_feature_map"] = pydantic.Field(default="pauli_feature_map")
42
37
  reps: int = 2
43
38
  entanglement: QSVMFeatureMapEntanglement = QSVMFeatureMapEntanglement.LINEAR
44
39
  alpha: float = 2.0
45
- paulis: List[str] = ["Z", "ZZ"]
40
+ paulis: list[str] = ["Z", "ZZ"]
46
41
  parameter_prefix: str = "x"
47
42
  name: str = "PauliFeatureMap"
48
43
 
49
- @pydantic.validator("paulis", pre=True)
50
- def set_paulis(cls, paulis: List[str]) -> List[str]:
44
+ @pydantic.field_validator("paulis", mode="before")
45
+ @classmethod
46
+ def set_paulis(cls, paulis: list[str]) -> list[str]:
51
47
  # iterate every letter in every string in the list of paulis
52
48
  for s in paulis:
53
49
  if not all(map(VALID_PAULI_LETTERS.__contains__, s.upper())):
54
- raise ValueError(
50
+ raise ClassiqValueError(
55
51
  f"Invalid pauli string given: {s!r}. Expecting a combination of {VALID_PAULI_LETTERS}"
56
52
  )
57
53
  return list(map(str.upper, paulis))
58
54
 
59
55
 
60
56
  class QSVMFeatureMapBlochSphere(QSVMFeatureMapDimensional):
61
- map_type: Literal["bloch_sphere_feature_map"] = get_discriminator_field(
62
- "bloch_sphere_feature_map"
57
+ map_type: Literal["bloch_sphere_feature_map"] = pydantic.Field(
58
+ default="bloch_sphere_feature_map"
63
59
  )
64
60
 
65
61