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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. classiq/__init__.py +47 -32
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +2 -1
  3. classiq/_internals/api_wrapper.py +235 -97
  4. classiq/_internals/async_utils.py +1 -3
  5. classiq/_internals/authentication/auth0.py +26 -10
  6. classiq/_internals/authentication/authentication.py +11 -0
  7. classiq/_internals/authentication/device.py +10 -5
  8. classiq/_internals/authentication/password_manager.py +18 -6
  9. classiq/_internals/authentication/token_manager.py +10 -5
  10. classiq/_internals/client.py +94 -33
  11. classiq/_internals/config.py +3 -4
  12. classiq/_internals/host_checker.py +38 -15
  13. classiq/_internals/jobs.py +60 -57
  14. classiq/_internals/type_validation.py +9 -9
  15. classiq/analyzer/__init__.py +1 -3
  16. classiq/analyzer/analyzer.py +24 -19
  17. classiq/analyzer/analyzer_utilities.py +10 -10
  18. classiq/analyzer/rb.py +15 -15
  19. classiq/analyzer/show_interactive_hack.py +27 -4
  20. classiq/analyzer/url_utils.py +2 -3
  21. classiq/applications/__init__.py +3 -12
  22. classiq/applications/chemistry/__init__.py +14 -10
  23. classiq/applications/chemistry/ansatz_parameters.py +4 -4
  24. classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +165 -158
  25. classiq/applications/chemistry/ground_state_problem.py +1 -1
  26. classiq/{applications_model_constructors → applications}/combinatorial_helpers/allowed_constraints.py +4 -1
  27. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/arithmetic_expression.py +1 -1
  28. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/isolation.py +1 -1
  29. classiq/{applications_model_constructors → applications}/combinatorial_helpers/combinatorial_problem_utils.py +51 -15
  30. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_mapping.py +12 -12
  31. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_utils.py +8 -6
  32. classiq/{applications_model_constructors → applications}/combinatorial_helpers/memory.py +7 -11
  33. classiq/{applications_model_constructors → applications}/combinatorial_helpers/optimization_model.py +67 -40
  34. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
  35. classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
  36. classiq/{applications_model_constructors → applications}/combinatorial_helpers/sympy_utils.py +2 -2
  37. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/encoding.py +15 -20
  38. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/fixed_variables.py +14 -15
  39. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/ising_converter.py +11 -15
  40. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty.py +1 -2
  41. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty_support.py +3 -7
  42. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/sign_seperation.py +2 -3
  43. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/slack_variables.py +5 -8
  44. classiq/applications/combinatorial_optimization/__init__.py +20 -6
  45. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
  46. classiq/{applications_model_constructors → applications/combinatorial_optimization}/combinatorial_optimization_model_constructor.py +35 -33
  47. classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
  48. classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
  49. classiq/applications/finance/__init__.py +4 -5
  50. classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +48 -42
  51. classiq/applications/grover/__init__.py +9 -0
  52. classiq/{applications_model_constructors → applications/grover}/grover_model_constructor.py +52 -51
  53. classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
  54. classiq/applications/libraries/qmci_library.py +22 -0
  55. classiq/applications/qnn/__init__.py +2 -4
  56. classiq/applications/qnn/circuit_utils.py +6 -6
  57. classiq/applications/qnn/datasets/__init__.py +9 -11
  58. classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
  59. classiq/applications/qnn/datasets/dataset_not.py +2 -1
  60. classiq/applications/qnn/datasets/dataset_parity.py +2 -2
  61. classiq/applications/qnn/gradients/quantum_gradient.py +1 -1
  62. classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
  63. classiq/applications/qnn/qlayer.py +30 -10
  64. classiq/applications/qnn/torch_utils.py +4 -3
  65. classiq/applications/qnn/types.py +5 -5
  66. classiq/applications/qsvm/__init__.py +6 -4
  67. classiq/applications/qsvm/qsvm.py +3 -6
  68. classiq/applications/qsvm/qsvm_data_generation.py +3 -3
  69. classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
  70. classiq/execution/__init__.py +8 -3
  71. classiq/execution/all_hardware_devices.py +11 -0
  72. classiq/execution/execution_session.py +400 -0
  73. classiq/execution/iqcc.py +63 -0
  74. classiq/execution/jobs.py +197 -25
  75. classiq/execution/qnn.py +79 -0
  76. classiq/executor.py +20 -115
  77. classiq/interface/_version.py +1 -1
  78. classiq/interface/analyzer/analysis_params.py +43 -13
  79. classiq/interface/analyzer/cytoscape_graph.py +15 -9
  80. classiq/interface/analyzer/result.py +28 -32
  81. classiq/interface/applications/qsvm.py +20 -29
  82. classiq/interface/ast_node.py +16 -0
  83. classiq/interface/backend/backend_preferences.py +390 -121
  84. classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
  85. classiq/interface/backend/pydantic_backend.py +25 -22
  86. classiq/interface/backend/quantum_backend_providers.py +69 -16
  87. classiq/interface/chemistry/fermionic_operator.py +30 -21
  88. classiq/interface/chemistry/ground_state_problem.py +28 -25
  89. classiq/interface/chemistry/molecule.py +14 -10
  90. classiq/interface/chemistry/operator.py +64 -231
  91. classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
  92. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +1 -3
  93. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  94. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  95. classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
  96. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  97. classiq/interface/combinatorial_optimization/examples/set_cover.py +1 -2
  98. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +8 -9
  99. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  100. classiq/interface/combinatorial_optimization/result.py +1 -3
  101. classiq/interface/combinatorial_optimization/solver_types.py +1 -1
  102. classiq/interface/debug_info/debug_info.py +86 -0
  103. classiq/{exceptions.py → interface/exceptions.py} +37 -9
  104. classiq/interface/execution/iqcc.py +19 -0
  105. classiq/interface/execution/jobs.py +15 -12
  106. classiq/interface/execution/primitives.py +18 -0
  107. classiq/interface/executor/constants.py +1 -0
  108. classiq/interface/executor/execution_preferences.py +26 -114
  109. classiq/interface/executor/execution_request.py +24 -46
  110. classiq/interface/executor/execution_result.py +30 -8
  111. classiq/interface/executor/iqae_result.py +4 -6
  112. classiq/interface/executor/optimizer_preferences.py +17 -14
  113. classiq/interface/executor/quantum_code.py +28 -24
  114. classiq/interface/executor/quantum_instruction_set.py +2 -2
  115. classiq/interface/executor/register_initialization.py +11 -14
  116. classiq/interface/executor/result.py +83 -56
  117. classiq/interface/executor/vqe_result.py +10 -10
  118. classiq/interface/finance/function_input.py +35 -25
  119. classiq/interface/finance/gaussian_model_input.py +5 -5
  120. classiq/interface/finance/log_normal_model_input.py +4 -4
  121. classiq/interface/finance/model_input.py +4 -4
  122. classiq/interface/generator/adjacency.py +1 -3
  123. classiq/interface/generator/amplitude_loading.py +22 -12
  124. classiq/interface/generator/ansatz_library.py +5 -5
  125. classiq/interface/generator/application_apis/arithmetic_declarations.py +8 -5
  126. classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
  127. classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
  128. classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
  129. classiq/interface/generator/application_apis/finance_declarations.py +48 -69
  130. classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
  131. classiq/interface/generator/arith/argument_utils.py +46 -5
  132. classiq/interface/generator/arith/arithmetic.py +35 -16
  133. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +6 -7
  134. classiq/interface/generator/arith/arithmetic_expression_abc.py +66 -25
  135. classiq/interface/generator/arith/arithmetic_expression_parser.py +11 -11
  136. classiq/interface/generator/arith/arithmetic_expression_validator.py +47 -43
  137. classiq/interface/generator/arith/arithmetic_operations.py +14 -6
  138. classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
  139. classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
  140. classiq/interface/generator/arith/ast_node_rewrite.py +3 -2
  141. classiq/interface/generator/arith/binary_ops.py +218 -130
  142. classiq/interface/generator/arith/endianness.py +1 -1
  143. classiq/interface/generator/arith/extremum_operations.py +96 -25
  144. classiq/interface/generator/arith/logical_ops.py +14 -12
  145. classiq/interface/generator/arith/number_utils.py +12 -6
  146. classiq/interface/generator/arith/register_user_input.py +60 -37
  147. classiq/interface/generator/arith/unary_ops.py +49 -29
  148. classiq/interface/generator/arith/uncomputation_methods.py +1 -1
  149. classiq/interface/generator/builtin_api_builder.py +2 -9
  150. classiq/interface/generator/chemistry_function_params.py +3 -3
  151. classiq/interface/generator/circuit_code/circuit_code.py +7 -7
  152. classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
  153. classiq/interface/generator/commuting_pauli_exponentiation.py +7 -7
  154. classiq/interface/generator/compiler_keywords.py +5 -1
  155. classiq/interface/generator/complex_type.py +13 -18
  156. classiq/interface/generator/constant.py +3 -4
  157. classiq/interface/generator/control_state.py +34 -29
  158. classiq/interface/generator/copy.py +47 -0
  159. classiq/interface/generator/custom_ansatz.py +2 -5
  160. classiq/interface/generator/distance.py +3 -5
  161. classiq/interface/generator/excitations.py +3 -2
  162. classiq/interface/generator/expressions/atomic_expression_functions.py +21 -5
  163. classiq/interface/generator/expressions/enums/__init__.py +0 -10
  164. classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
  165. classiq/interface/generator/expressions/evaluated_expression.py +5 -5
  166. classiq/interface/generator/expressions/expression.py +26 -14
  167. classiq/interface/generator/expressions/expression_constants.py +9 -3
  168. classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
  169. classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
  170. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +34 -8
  171. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
  172. classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
  173. classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
  174. classiq/interface/generator/expressions/sympy_supported_expressions.py +19 -11
  175. classiq/interface/generator/finance.py +2 -2
  176. classiq/interface/generator/function_param_library.py +6 -6
  177. classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
  178. classiq/interface/generator/function_params.py +36 -64
  179. classiq/interface/generator/functions/__init__.py +0 -22
  180. classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
  181. classiq/interface/generator/functions/classical_function_declaration.py +18 -9
  182. classiq/interface/generator/functions/classical_type.py +47 -166
  183. classiq/interface/generator/functions/concrete_types.py +55 -0
  184. classiq/interface/generator/functions/function_declaration.py +13 -14
  185. classiq/interface/generator/functions/port_declaration.py +1 -13
  186. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  187. classiq/interface/generator/functions/type_name.py +90 -0
  188. classiq/interface/generator/generated_circuit_data.py +153 -20
  189. classiq/interface/generator/grover_diffuser.py +32 -25
  190. classiq/interface/generator/grover_operator.py +34 -25
  191. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
  192. classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
  193. classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +9 -9
  194. classiq/interface/generator/hardware/hardware_data.py +72 -34
  195. classiq/interface/generator/hardware_efficient_ansatz.py +20 -16
  196. classiq/interface/generator/hartree_fock.py +13 -5
  197. classiq/interface/generator/identity.py +10 -6
  198. classiq/interface/generator/linear_pauli_rotations.py +32 -20
  199. classiq/interface/generator/mcmt_method.py +1 -1
  200. classiq/interface/generator/mcu.py +17 -15
  201. classiq/interface/generator/mcx.py +24 -17
  202. classiq/interface/generator/model/__init__.py +2 -5
  203. classiq/interface/generator/model/constraints.py +26 -8
  204. classiq/interface/generator/model/model.py +27 -190
  205. classiq/interface/generator/model/preferences/preferences.py +115 -41
  206. classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +14 -17
  207. classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
  208. classiq/interface/generator/oracles/custom_oracle.py +15 -13
  209. classiq/interface/generator/oracles/oracle_abc.py +7 -7
  210. classiq/interface/generator/partitioned_register.py +7 -7
  211. classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
  212. classiq/interface/generator/preferences/optimization.py +1 -2
  213. classiq/interface/generator/qpe.py +41 -30
  214. classiq/interface/generator/qsvm.py +9 -10
  215. classiq/interface/generator/quantum_function_call.py +88 -73
  216. classiq/interface/generator/quantum_program.py +41 -24
  217. classiq/interface/generator/range_types.py +11 -12
  218. classiq/interface/generator/register_role.py +18 -6
  219. classiq/interface/generator/slice_parsing_utils.py +5 -5
  220. classiq/interface/generator/standard_gates/controlled_standard_gates.py +30 -39
  221. classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
  222. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  223. classiq/interface/generator/standard_gates/u_gate.py +7 -10
  224. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  225. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
  226. classiq/interface/generator/state_preparation/distributions.py +16 -15
  227. classiq/interface/generator/state_preparation/metrics.py +4 -7
  228. classiq/interface/generator/state_preparation/state_preparation.py +25 -20
  229. classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
  230. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
  231. classiq/interface/generator/transpiler_basis_gates.py +7 -3
  232. classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
  233. classiq/interface/generator/types/compilation_metadata.py +6 -0
  234. classiq/interface/generator/types/enum_declaration.py +54 -0
  235. classiq/interface/generator/types/qstruct_declaration.py +18 -0
  236. classiq/interface/generator/types/struct_declaration.py +7 -11
  237. classiq/interface/generator/ucc.py +5 -4
  238. classiq/interface/generator/unitary_gate.py +5 -5
  239. classiq/interface/generator/user_defined_function_params.py +4 -1
  240. classiq/interface/generator/validations/flow_graph.py +7 -7
  241. classiq/interface/generator/validations/validator_functions.py +4 -4
  242. classiq/interface/generator/visitor.py +23 -16
  243. classiq/interface/hardware.py +29 -8
  244. classiq/interface/helpers/classproperty.py +8 -0
  245. classiq/interface/helpers/custom_encoders.py +2 -2
  246. classiq/interface/helpers/custom_pydantic_types.py +40 -50
  247. classiq/interface/helpers/datastructures.py +26 -0
  248. classiq/interface/helpers/hashable_mixin.py +3 -2
  249. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  250. classiq/interface/helpers/pydantic_model_helpers.py +7 -5
  251. classiq/interface/helpers/validation_helpers.py +3 -20
  252. classiq/interface/helpers/versioned_model.py +1 -4
  253. classiq/interface/ide/ide_data.py +16 -20
  254. classiq/interface/ide/visual_model.py +130 -0
  255. classiq/interface/interface_version.py +1 -0
  256. classiq/interface/jobs.py +29 -69
  257. classiq/interface/model/allocate.py +16 -0
  258. classiq/interface/model/bind_operation.py +32 -9
  259. classiq/interface/model/classical_if.py +15 -0
  260. classiq/interface/model/classical_parameter_declaration.py +33 -3
  261. classiq/interface/model/control.py +45 -0
  262. classiq/interface/model/handle_binding.py +298 -20
  263. classiq/interface/model/inplace_binary_operation.py +29 -24
  264. classiq/interface/model/invert.py +12 -0
  265. classiq/interface/model/model.py +69 -61
  266. classiq/interface/model/native_function_definition.py +17 -20
  267. classiq/interface/model/parameter.py +13 -0
  268. classiq/interface/model/phase_operation.py +11 -0
  269. classiq/interface/model/port_declaration.py +27 -9
  270. classiq/interface/model/power.py +14 -0
  271. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +30 -18
  272. classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
  273. classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
  274. classiq/interface/model/quantum_function_call.py +141 -343
  275. classiq/interface/model/quantum_function_declaration.py +190 -157
  276. classiq/interface/model/quantum_lambda_function.py +33 -32
  277. classiq/interface/model/quantum_statement.py +71 -12
  278. classiq/interface/model/quantum_type.py +177 -40
  279. classiq/interface/model/quantum_variable_declaration.py +3 -25
  280. classiq/interface/model/repeat.py +15 -0
  281. classiq/interface/model/statement_block.py +40 -14
  282. classiq/interface/model/validation_handle.py +13 -6
  283. classiq/interface/model/variable_declaration_statement.py +3 -1
  284. classiq/interface/model/within_apply_operation.py +7 -5
  285. classiq/interface/server/global_versions.py +6 -7
  286. classiq/interface/server/routes.py +17 -21
  287. classiq/interface/source_reference.py +59 -0
  288. classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
  289. classiq/model_expansions/capturing/__init__.py +0 -0
  290. classiq/model_expansions/capturing/captured_vars.py +435 -0
  291. classiq/model_expansions/capturing/mangling_utils.py +56 -0
  292. classiq/model_expansions/closure.py +171 -0
  293. classiq/model_expansions/debug_flag.py +3 -0
  294. classiq/model_expansions/evaluators/__init__.py +0 -0
  295. classiq/model_expansions/evaluators/arg_type_match.py +158 -0
  296. classiq/model_expansions/evaluators/argument_types.py +42 -0
  297. classiq/model_expansions/evaluators/classical_expression.py +36 -0
  298. classiq/model_expansions/evaluators/control.py +144 -0
  299. classiq/model_expansions/evaluators/parameter_types.py +226 -0
  300. classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
  301. classiq/model_expansions/evaluators/type_type_match.py +90 -0
  302. classiq/model_expansions/expression_evaluator.py +135 -0
  303. classiq/model_expansions/expression_renamer.py +76 -0
  304. classiq/model_expansions/function_builder.py +247 -0
  305. classiq/model_expansions/generative_functions.py +158 -0
  306. classiq/model_expansions/interpreters/__init__.py +0 -0
  307. classiq/model_expansions/interpreters/base_interpreter.py +263 -0
  308. classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
  309. classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
  310. classiq/model_expansions/model_tables.py +18 -0
  311. classiq/model_expansions/quantum_operations/__init__.py +9 -0
  312. classiq/model_expansions/quantum_operations/bind.py +60 -0
  313. classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
  314. classiq/model_expansions/quantum_operations/classicalif.py +53 -0
  315. classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
  316. classiq/model_expansions/quantum_operations/emitter.py +181 -0
  317. classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
  318. classiq/model_expansions/quantum_operations/repeat.py +56 -0
  319. classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
  320. classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
  321. classiq/model_expansions/scope.py +240 -0
  322. classiq/model_expansions/scope_initialization.py +150 -0
  323. classiq/model_expansions/sympy_conversion/__init__.py +0 -0
  324. classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
  325. classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
  326. classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
  327. classiq/model_expansions/transformers/__init__.py +0 -0
  328. classiq/model_expansions/transformers/ast_renamer.py +26 -0
  329. classiq/model_expansions/transformers/var_splitter.py +299 -0
  330. classiq/model_expansions/utils/__init__.py +0 -0
  331. classiq/model_expansions/utils/counted_name_allocator.py +11 -0
  332. classiq/model_expansions/utils/handles_collector.py +33 -0
  333. classiq/model_expansions/visitors/__init__.py +0 -0
  334. classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
  335. classiq/model_expansions/visitors/variable_references.py +144 -0
  336. classiq/open_library/__init__.py +4 -0
  337. classiq/open_library/functions/__init__.py +130 -0
  338. classiq/open_library/functions/amplitude_estimation.py +30 -0
  339. classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
  340. classiq/open_library/functions/grover.py +157 -0
  341. classiq/open_library/functions/hea.py +115 -0
  342. classiq/open_library/functions/linear_pauli_rotation.py +82 -0
  343. classiq/open_library/functions/modular_exponentiation.py +201 -0
  344. classiq/open_library/functions/qaoa_penalty.py +117 -0
  345. classiq/open_library/functions/qft_functions.py +54 -0
  346. classiq/open_library/functions/qpe.py +46 -0
  347. classiq/open_library/functions/qsvt.py +331 -0
  348. classiq/open_library/functions/state_preparation.py +301 -0
  349. classiq/open_library/functions/swap_test.py +27 -0
  350. classiq/open_library/functions/utility_functions.py +81 -0
  351. classiq/open_library/functions/variational.py +52 -0
  352. classiq/qmod/__init__.py +10 -10
  353. classiq/qmod/builtins/__init__.py +19 -2
  354. classiq/qmod/builtins/classical_execution_primitives.py +36 -14
  355. classiq/qmod/builtins/classical_functions.py +39 -43
  356. classiq/qmod/builtins/constants.py +10 -0
  357. classiq/qmod/builtins/enums.py +208 -0
  358. classiq/qmod/builtins/functions/__init__.py +137 -0
  359. classiq/qmod/builtins/functions/allocation.py +150 -0
  360. classiq/qmod/builtins/functions/arithmetic.py +55 -0
  361. classiq/qmod/builtins/functions/benchmarking.py +8 -0
  362. classiq/qmod/builtins/functions/chemistry.py +91 -0
  363. classiq/qmod/builtins/functions/exponentiation.py +105 -0
  364. classiq/qmod/builtins/functions/finance.py +34 -0
  365. classiq/qmod/builtins/functions/operators.py +16 -0
  366. classiq/qmod/builtins/functions/qsvm.py +24 -0
  367. classiq/qmod/builtins/functions/standard_gates.py +651 -0
  368. classiq/qmod/builtins/operations.py +373 -40
  369. classiq/qmod/builtins/structs.py +103 -80
  370. classiq/qmod/cfunc.py +2 -2
  371. classiq/qmod/classical_function.py +4 -8
  372. classiq/qmod/cparam.py +64 -0
  373. classiq/qmod/create_model_function.py +56 -0
  374. classiq/qmod/declaration_inferrer.py +143 -101
  375. classiq/qmod/expression_query.py +20 -4
  376. classiq/qmod/generative.py +42 -0
  377. classiq/qmod/model_state_container.py +18 -6
  378. classiq/qmod/native/__init__.py +7 -0
  379. classiq/qmod/native/expression_to_qmod.py +16 -11
  380. classiq/qmod/native/pretty_printer.py +187 -97
  381. classiq/qmod/pretty_print/__init__.py +7 -0
  382. classiq/qmod/pretty_print/expression_to_python.py +222 -0
  383. classiq/qmod/pretty_print/pretty_printer.py +572 -0
  384. classiq/qmod/python_classical_type.py +67 -0
  385. classiq/qmod/qfunc.py +60 -8
  386. classiq/qmod/qmod_constant.py +93 -26
  387. classiq/qmod/qmod_parameter.py +68 -59
  388. classiq/qmod/qmod_variable.py +468 -155
  389. classiq/qmod/quantum_callable.py +17 -7
  390. classiq/qmod/quantum_expandable.py +269 -96
  391. classiq/qmod/quantum_function.py +196 -41
  392. classiq/qmod/semantics/__init__.py +0 -0
  393. classiq/qmod/semantics/annotation/__init__.py +0 -0
  394. classiq/qmod/semantics/annotation/call_annotation.py +92 -0
  395. classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
  396. classiq/qmod/semantics/error_manager.py +88 -0
  397. classiq/qmod/semantics/lambdas.py +25 -0
  398. classiq/qmod/semantics/static_semantics_visitor.py +384 -0
  399. classiq/qmod/semantics/validation/__init__.py +0 -0
  400. classiq/qmod/semantics/validation/constants_validation.py +16 -0
  401. classiq/qmod/semantics/validation/func_call_validation.py +99 -0
  402. classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
  403. classiq/qmod/semantics/validation/handle_validation.py +85 -0
  404. classiq/qmod/semantics/validation/main_validation.py +33 -0
  405. classiq/qmod/semantics/validation/types_validation.py +128 -0
  406. classiq/qmod/symbolic.py +147 -123
  407. classiq/qmod/symbolic_expr.py +27 -12
  408. classiq/qmod/symbolic_type.py +2 -5
  409. classiq/qmod/type_attribute_remover.py +32 -0
  410. classiq/qmod/utilities.py +98 -4
  411. classiq/qmod/write_qmod.py +17 -3
  412. classiq/synthesis.py +210 -22
  413. {classiq-0.38.0.dist-info → classiq-0.65.3.dist-info}/METADATA +16 -9
  414. classiq-0.65.3.dist-info/RECORD +521 -0
  415. classiq/_internals/_qfunc_ext.py +0 -6
  416. classiq/applications/benchmarking/__init__.py +0 -9
  417. classiq/applications/benchmarking/mirror_benchmarking.py +0 -70
  418. classiq/applications/numpy_utils.py +0 -37
  419. classiq/applications_model_constructors/__init__.py +0 -25
  420. classiq/applications_model_constructors/combinatorial_helpers/multiple_comp_basis_sp.py +0 -34
  421. classiq/applications_model_constructors/combinatorial_helpers/pauli_helpers/pauli_utils.py +0 -65
  422. classiq/applications_model_constructors/combinatorial_helpers/pyomo_utils.py +0 -243
  423. classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
  424. classiq/applications_model_constructors/libraries/qmci_library.py +0 -107
  425. classiq/builtin_functions/__init__.py +0 -43
  426. classiq/builtin_functions/amplitude_loading.py +0 -3
  427. classiq/builtin_functions/binary_ops.py +0 -1
  428. classiq/builtin_functions/exponentiation.py +0 -5
  429. classiq/builtin_functions/qpe.py +0 -4
  430. classiq/builtin_functions/qsvm.py +0 -7
  431. classiq/builtin_functions/range_types.py +0 -5
  432. classiq/builtin_functions/standard_gates.py +0 -1
  433. classiq/builtin_functions/state_preparation.py +0 -6
  434. classiq/builtin_functions/suzuki_trotter.py +0 -3
  435. classiq/interface/executor/aws_execution_cost.py +0 -73
  436. classiq/interface/executor/error_mitigation.py +0 -6
  437. classiq/interface/generator/credit_risk_example/linear_gci.py +0 -122
  438. classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -69
  439. classiq/interface/generator/expressions/enums/chemistry.py +0 -28
  440. classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
  441. classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
  442. classiq/interface/generator/expressions/enums/optimizers.py +0 -9
  443. classiq/interface/generator/expressions/enums/pauli.py +0 -8
  444. classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
  445. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
  446. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
  447. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
  448. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -1229
  449. classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -95
  450. classiq/interface/generator/functions/foreign_function_definition.py +0 -114
  451. classiq/interface/generator/functions/function_implementation.py +0 -107
  452. classiq/interface/generator/functions/native_function_definition.py +0 -155
  453. classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
  454. classiq/interface/generator/functions/register.py +0 -44
  455. classiq/interface/generator/functions/register_mapping_data.py +0 -106
  456. classiq/interface/generator/inequality_mixer.py +0 -51
  457. classiq/interface/generator/model/classical_main_validator.py +0 -106
  458. classiq/interface/generator/range_mixer.py +0 -56
  459. classiq/interface/generator/state_propagator.py +0 -74
  460. classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -1
  461. classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
  462. classiq/interface/ide/show.py +0 -34
  463. classiq/interface/model/call_synthesis_data.py +0 -68
  464. classiq/interface/model/common_model_types.py +0 -23
  465. classiq/interface/model/quantum_expressions/control_state.py +0 -38
  466. classiq/interface/model/quantum_if_operation.py +0 -94
  467. classiq/interface/model/resolvers/function_call_resolver.py +0 -43
  468. classiq/interface/model/validations/handle_validation_base.py +0 -55
  469. classiq/interface/model/validations/handles_validator.py +0 -156
  470. classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
  471. classiq/model/__init__.py +0 -14
  472. classiq/model/composite_function_generator.py +0 -33
  473. classiq/model/function_handler.py +0 -462
  474. classiq/model/logic_flow.py +0 -149
  475. classiq/model/logic_flow_change_handler.py +0 -71
  476. classiq/model/model.py +0 -229
  477. classiq/qmod/builtins/functions.py +0 -913
  478. classiq/qmod/qmod_struct.py +0 -37
  479. classiq/quantum_functions/__init__.py +0 -17
  480. classiq/quantum_functions/annotation_parser.py +0 -205
  481. classiq/quantum_functions/decorators.py +0 -22
  482. classiq/quantum_functions/function_library.py +0 -181
  483. classiq/quantum_functions/function_parser.py +0 -74
  484. classiq/quantum_functions/quantum_function.py +0 -236
  485. classiq-0.38.0.dist-info/RECORD +0 -454
  486. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/__init__.py +0 -0
  487. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/__init__.py +0 -0
  488. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/__init__.py +0 -0
  489. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +0 -0
  490. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/py.typed +0 -0
  491. /classiq/{applications_model_constructors/combinatorial_helpers/transformations → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
  492. /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
  493. /classiq/{interface/generator/credit_risk_example → applications/hamiltonian}/__init__.py +0 -0
  494. /classiq/{interface/generator/functions/core_lib_declarations → applications/libraries}/__init__.py +0 -0
  495. /classiq/interface/{model/resolvers → debug_info}/__init__.py +0 -0
  496. /classiq/{_internals → interface}/enum_utils.py +0 -0
  497. /classiq/interface/{model/validations → generator/functions/builtins}/__init__.py +0 -0
  498. /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → model_expansions/__init__.py} +0 -0
  499. {classiq-0.38.0.dist-info → classiq-0.65.3.dist-info}/WHEEL +0 -0
@@ -1,16 +1,15 @@
1
1
  import itertools
2
2
  import sys
3
+ from collections.abc import Iterator
4
+ from types import GenericAlias as TypesGenericAlias
3
5
  from typing import ( # type: ignore[attr-defined]
4
6
  Any,
5
- Dict,
6
- Iterator,
7
- List,
8
7
  Optional,
9
- Type,
10
8
  Union,
11
9
  _GenericAlias,
12
10
  )
13
11
 
12
+ from classiq.interface.exceptions import ClassiqQRegError
14
13
  from classiq.interface.generator.arith.register_user_input import (
15
14
  RegisterArithmeticInfo,
16
15
  RegisterUserInput,
@@ -18,11 +17,6 @@ from classiq.interface.generator.arith.register_user_input import (
18
17
  from classiq.interface.generator.function_params import ArithmeticIODict, IOName
19
18
  from classiq.interface.generator.register_role import RegisterRole
20
19
 
21
- from classiq.exceptions import ClassiqQRegError
22
-
23
- if sys.version_info >= (3, 9):
24
- from types import GenericAlias as TypesGenericAlias
25
-
26
20
 
27
21
  # This class is used for QReg, to support type-hint initialization
28
22
  # Due to the `size` property of QReg
@@ -81,14 +75,17 @@ class QReg:
81
75
  """Initializes a new QReg with the specified number of qubits.
82
76
 
83
77
  Args:
84
- size (int): The number of qubits in the QReg.
78
+ size: The number of qubits in the QReg.
85
79
  """
86
80
  if size <= 0:
87
81
  raise ClassiqQRegError(f"Cannot create {size} new qubits")
88
82
  self._qubits = [Qubit() for _ in range(size)]
89
83
 
84
+ def __hash__(self) -> int:
85
+ return super.__hash__(self)
86
+
90
87
  @classmethod
91
- def _from_qubits(cls, qubits: List[Qubit]) -> "QReg":
88
+ def _from_qubits(cls, qubits: list[Qubit]) -> "QReg":
92
89
  if (
93
90
  not isinstance(qubits, list)
94
91
  or not all(isinstance(qubit, Qubit) for qubit in qubits)
@@ -139,7 +136,7 @@ class QReg:
139
136
  return len(self._qubits)
140
137
 
141
138
  @property
142
- def qubits(self) -> List[Qubit]:
139
+ def qubits(self) -> list[Qubit]:
143
140
  return self._qubits
144
141
 
145
142
  def __class_getitem__(cls, params: Any) -> QRegGenericAlias:
@@ -229,7 +226,7 @@ _PROP_TO_QREG_TYPE = {
229
226
  }
230
227
 
231
228
 
232
- def _get_qreg_type_from_arithmetic_info(info: RegisterArithmeticInfo) -> Type["QReg"]:
229
+ def _get_qreg_type_from_arithmetic_info(info: RegisterArithmeticInfo) -> type["QReg"]:
233
230
  return _PROP_TO_QREG_TYPE[(info.is_signed, info.is_frac)]
234
231
 
235
232
 
@@ -245,7 +242,7 @@ def _get_qreg_generic_alias_from_arithmetic_info(
245
242
 
246
243
  def get_type_and_size_dict(
247
244
  arithmetic_info_dict: ArithmeticIODict,
248
- ) -> Dict[IOName, QRegGenericAlias]:
245
+ ) -> dict[IOName, QRegGenericAlias]:
249
246
  return {
250
247
  io_name: _get_qreg_generic_alias_from_arithmetic_info(info)
251
248
  for io_name, info in arithmetic_info_dict.items()
@@ -253,11 +250,11 @@ def get_type_and_size_dict(
253
250
 
254
251
 
255
252
  __all__ = [
253
+ "AuxQReg",
256
254
  "QReg",
257
- "QSInt",
258
- "QUInt",
259
255
  "QSFixed",
256
+ "QSInt",
260
257
  "QUFixed",
258
+ "QUInt",
261
259
  "ZeroQReg",
262
- "AuxQReg",
263
260
  ]
@@ -1,9 +1,9 @@
1
1
  import ast
2
2
  import re
3
- from typing import Dict
4
3
 
5
4
  import numexpr # type: ignore[import]
6
5
 
6
+ from classiq.interface.exceptions import ClassiqArithmeticError, ClassiqValueError
7
7
  from classiq.interface.generator.arith import number_utils
8
8
  from classiq.interface.generator.arith.arithmetic import Arithmetic
9
9
  from classiq.interface.generator.arith.arithmetic_expression_abc import (
@@ -17,8 +17,6 @@ from classiq.interface.generator.oracles.oracle_abc import (
17
17
  VariableTypedResultMap,
18
18
  )
19
19
 
20
- from classiq.exceptions import ClassiqArithmeticError, ClassiqValueError
21
-
22
20
 
23
21
  class ArithmeticOracle(OracleABC[float], ArithmeticExpressionABC):
24
22
  @staticmethod
@@ -62,7 +60,7 @@ class ArithmeticOracle(OracleABC[float], ArithmeticExpressionABC):
62
60
 
63
61
  @staticmethod
64
62
  def _simplify_negations_of_boolean_variables(
65
- expression: str, input_definitions: Dict[str, RegisterArithmeticInfo]
63
+ expression: str, input_definitions: dict[str, RegisterArithmeticInfo]
66
64
  ) -> str:
67
65
  for var_name in input_definitions:
68
66
  if getattr(input_definitions[var_name], "size", 0) == 1:
@@ -1,7 +1,8 @@
1
- from typing import Any, Dict
1
+ from typing import Any
2
2
 
3
3
  import pydantic
4
4
 
5
+ from classiq.interface.exceptions import ClassiqValueError
5
6
  from classiq.interface.generator.function_params import parse_function_params_values
6
7
  from classiq.interface.generator.oracles.oracle_abc import (
7
8
  ArithmeticIODict,
@@ -11,8 +12,6 @@ from classiq.interface.generator.oracles.oracle_abc import (
11
12
  )
12
13
  from classiq.interface.generator.user_defined_function_params import CustomFunction
13
14
 
14
- from classiq.exceptions import ClassiqValueError
15
-
16
15
  QubitState = str
17
16
 
18
17
 
@@ -23,18 +22,21 @@ class CustomOracle(OracleABC[QubitState]):
23
22
  default_factory=CustomFunction,
24
23
  )
25
24
 
26
- @pydantic.root_validator(pre=True)
27
- def _parse_oracle(cls, values: Dict[str, Any]) -> Dict[str, Any]:
28
- parse_function_params_values(
29
- values=values,
30
- params_key="custom_oracle_params",
31
- discriminator_key="custom_oracle",
32
- param_classes={CustomFunction},
33
- default_parser_class=CustomFunction,
34
- )
25
+ @pydantic.model_validator(mode="before")
26
+ @classmethod
27
+ def _parse_oracle(cls, values: Any) -> dict[str, Any]:
28
+ if isinstance(values, dict):
29
+ parse_function_params_values(
30
+ values=values,
31
+ params_key="custom_oracle_params",
32
+ discriminator_key="custom_oracle",
33
+ param_classes={CustomFunction},
34
+ default_parser_class=CustomFunction,
35
+ )
35
36
  return values
36
37
 
37
- @pydantic.validator("custom_oracle_params")
38
+ @pydantic.field_validator("custom_oracle_params")
39
+ @classmethod
38
40
  def _validate_names_match_oracle(
39
41
  cls, custom_oracle_params: CustomFunction
40
42
  ) -> CustomFunction:
@@ -1,19 +1,19 @@
1
1
  import abc
2
- from typing import Dict, Generic, List, Optional, Sequence, TypeVar
2
+ from collections.abc import Sequence
3
+ from typing import Generic, Optional, TypeVar
3
4
 
4
5
  import numpy as np
5
6
 
7
+ from classiq.interface.exceptions import ClassiqOracleError
6
8
  from classiq.interface.executor.result import State
7
9
  from classiq.interface.generator.arith.register_user_input import RegisterUserInput
8
10
  from classiq.interface.generator.function_params import ArithmeticIODict, FunctionParams
9
11
  from classiq.interface.generator.generated_circuit_data import IOQubitMapping
10
12
 
11
- from classiq.exceptions import ClassiqOracleError
12
-
13
13
  ProblemResultType = TypeVar("ProblemResultType")
14
14
 
15
- VariableBinResultMap = Dict[str, State]
16
- VariableTypedResultMap = Dict[str, ProblemResultType]
15
+ VariableBinResultMap = dict[str, State]
16
+ VariableTypedResultMap = dict[str, ProblemResultType]
17
17
 
18
18
 
19
19
  class OracleABC(abc.ABC, FunctionParams, Generic[ProblemResultType]):
@@ -59,7 +59,7 @@ class OracleABC(abc.ABC, FunctionParams, Generic[ProblemResultType]):
59
59
  ) -> bool:
60
60
  pass
61
61
 
62
- def variables(self) -> List[RegisterUserInput]:
62
+ def variables(self) -> list[RegisterUserInput]:
63
63
  return [
64
64
  RegisterUserInput.from_arithmetic_info(info=info, name=name)
65
65
  for name, info in self._inputs.items()
@@ -72,5 +72,5 @@ class OracleABC(abc.ABC, FunctionParams, Generic[ProblemResultType]):
72
72
  )
73
73
 
74
74
 
75
- def _reverse_endianness(indices: Sequence[int], state_length: int) -> List[int]:
75
+ def _reverse_endianness(indices: Sequence[int], state_length: int) -> list[int]:
76
76
  return [state_length - 1 - index for index in indices]
@@ -1,11 +1,11 @@
1
1
  import itertools
2
+ from collections.abc import Iterator
2
3
  from dataclasses import dataclass
3
- from typing import Iterator, List, Optional, Tuple
4
+ from typing import Optional
4
5
 
6
+ from classiq.interface.exceptions import ClassiqValueError
5
7
  from classiq.interface.generator.slice_parsing_utils import parse_io_slicing
6
8
 
7
- from classiq.exceptions import ClassiqValueError
8
-
9
9
 
10
10
  @dataclass(frozen=True)
11
11
  class PartitionedRegister:
@@ -13,7 +13,7 @@ class PartitionedRegister:
13
13
 
14
14
  # There are up to num_qubits qubits within the partitions, with unique values from 0 to num_qubits-1
15
15
  num_qubits: int
16
- partitions: Tuple[Tuple[int, ...], ...]
16
+ partitions: tuple[tuple[int, ...], ...]
17
17
 
18
18
  def __post_init__(self) -> None:
19
19
  if not self.partitions:
@@ -48,7 +48,7 @@ class PartitionedRegister:
48
48
  return RegisterPartition(self, _index=None)
49
49
 
50
50
  @property
51
- def _leftover_qubits(self) -> Tuple[int, ...]:
51
+ def _leftover_qubits(self) -> tuple[int, ...]:
52
52
  total_qubits = set(itertools.chain.from_iterable(self.partitions))
53
53
  return tuple(
54
54
  qubit for qubit in range(self.num_qubits) if qubit not in total_qubits
@@ -60,7 +60,7 @@ class PartitionedRegister:
60
60
 
61
61
  def all_register_partitions(
62
62
  self, include_leftover_partition: bool = False
63
- ) -> List["RegisterPartition"]:
63
+ ) -> list["RegisterPartition"]:
64
64
  all_partitions = [self.get_partition(i) for i in range(len(self.partitions))]
65
65
  if include_leftover_partition:
66
66
  all_partitions.append(self.leftover_partition)
@@ -83,7 +83,7 @@ class RegisterPartition:
83
83
  raise ClassiqValueError(message)
84
84
 
85
85
  @property
86
- def qubits(self) -> Tuple[int, ...]:
86
+ def qubits(self) -> tuple[int, ...]:
87
87
  if self._index is None:
88
88
  return self.partitioned_register._leftover_qubits
89
89
  return self.partitioned_register.partitions[self._index]
@@ -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:
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:
68
64
  raise ClassiqValueError("At least one specification must be provided.")
69
- return values
65
+ return self
70
66
 
71
67
 
72
68
  class PhaseEstimation(FunctionParams):
@@ -105,28 +101,42 @@ 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):
@@ -136,22 +146,23 @@ class PhaseEstimation(FunctionParams):
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
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"):
165
+ ) != validation_info.data.get("size"):
155
166
  raise ClassiqValueError(
156
167
  "Length of max_depths must match the provided size."
157
168
  )
@@ -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,
@@ -13,9 +16,6 @@ from classiq.interface.helpers.hashable_pydantic_base_model import (
13
16
  HashablePydanticBaseModel,
14
17
  )
15
18
 
16
- from classiq._internals.enum_utils import StrEnum
17
- from classiq.exceptions import ClassiqQSVMError, ClassiqValueError
18
-
19
19
  VALID_PAULI_LETTERS = ("I", "X", "Y", "Z")
20
20
 
21
21
 
@@ -29,9 +29,7 @@ class QSVMFeatureMapEntanglement(StrEnum):
29
29
 
30
30
  class QSVMFeatureMapDimensional(HashablePydanticBaseModel):
31
31
  feature_dimension: Optional[int] = None
32
-
33
- class Config:
34
- frozen = True
32
+ model_config = ConfigDict(frozen=True)
35
33
 
36
34
 
37
35
  class QSVMFeatureMapPauli(QSVMFeatureMapDimensional):
@@ -39,12 +37,13 @@ class QSVMFeatureMapPauli(QSVMFeatureMapDimensional):
39
37
  reps: int = 2
40
38
  entanglement: QSVMFeatureMapEntanglement = QSVMFeatureMapEntanglement.LINEAR
41
39
  alpha: float = 2.0
42
- paulis: List[str] = ["Z", "ZZ"]
40
+ paulis: list[str] = ["Z", "ZZ"]
43
41
  parameter_prefix: str = "x"
44
42
  name: str = "PauliFeatureMap"
45
43
 
46
- @pydantic.validator("paulis", pre=True)
47
- 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]:
48
47
  # iterate every letter in every string in the list of paulis
49
48
  for s in paulis:
50
49
  if not all(map(VALID_PAULI_LETTERS.__contains__, s.upper())):