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,17 +1,26 @@
1
- from typing import Dict, List, Literal, Optional, Tuple, Union
1
+ import logging
2
+ from typing import Literal, Optional, Union
2
3
 
3
4
  import pydantic
5
+ from pydantic import ConfigDict
4
6
  from typing_extensions import TypeAlias
5
7
 
8
+ from classiq.interface.enum_utils import StrEnum
6
9
  from classiq.interface.generator.control_state import ControlState
7
10
  from classiq.interface.generator.register_role import RegisterRole
8
11
  from classiq.interface.generator.synthesis_metadata.synthesis_execution_data import (
9
12
  ExecutionData,
10
13
  )
11
14
 
12
- ParameterName = str
13
- IOQubitMapping: TypeAlias = Dict[str, Tuple[int, ...]]
15
+ from classiq.model_expansions.capturing.mangling_utils import (
16
+ demangle_capture_name,
17
+ demangle_name,
18
+ is_captured_var_name,
19
+ )
14
20
 
21
+ _logger = logging.getLogger(__name__)
22
+ ParameterName = str
23
+ IOQubitMapping: TypeAlias = dict[str, tuple[int, ...]]
15
24
 
16
25
  CLASSIQ_HIERARCHY_SEPARATOR: Literal["."] = "."
17
26
 
@@ -21,7 +30,7 @@ VISUALIZATION_HIDE_LIST = [
21
30
  "control",
22
31
  "mcx",
23
32
  "iteration",
24
- "operand",
33
+ "stmt_block",
25
34
  ]
26
35
 
27
36
 
@@ -39,8 +48,8 @@ class QubitMapping(pydantic.BaseModel):
39
48
  class GeneratedRegister(pydantic.BaseModel):
40
49
  name: str
41
50
  role: RegisterRole
42
- qubit_indexes_relative: List[int]
43
- qubit_indexes_absolute: List[int]
51
+ qubit_indexes_relative: list[int]
52
+ qubit_indexes_absolute: list[int]
44
53
 
45
54
  def __len__(self) -> int:
46
55
  return self.qubit_indexes_relative.__len__()
@@ -49,21 +58,30 @@ class GeneratedRegister(pydantic.BaseModel):
49
58
  def width(self) -> int:
50
59
  return len(self)
51
60
 
61
+ @property
62
+ def is_captured(self) -> bool:
63
+ return is_captured_var_name(self.name)
64
+
65
+ @staticmethod
66
+ def demangle_name(name: str) -> str:
67
+ if is_captured_var_name(name):
68
+ return demangle_capture_name(name)
69
+ return demangle_name(name)
70
+
52
71
 
53
72
  class GeneratedFunction(pydantic.BaseModel):
54
73
  name: str
55
- control_states: List[ControlState]
56
- registers: List[GeneratedRegister] = list()
57
- depth: Optional[int]
58
- width: Optional[int]
59
- released_auxiliary_qubits: List[int] = list()
60
- dangling_inputs: Dict[str, GeneratedRegister] = dict()
61
- dangling_outputs: Dict[str, GeneratedRegister] = dict()
74
+ control_states: list[ControlState]
75
+ registers: list[GeneratedRegister] = list()
76
+ depth: Optional[int] = pydantic.Field(default=None)
77
+ width: Optional[int] = pydantic.Field(default=None)
78
+ dangling_inputs: dict[str, GeneratedRegister] = dict()
79
+ dangling_outputs: dict[str, GeneratedRegister] = dict()
62
80
 
63
81
  def __getitem__(self, key: Union[int, str]) -> GeneratedRegister:
64
- if type(key) is int:
82
+ if isinstance(key, int):
65
83
  return self.registers[key]
66
- if type(key) is str:
84
+ if isinstance(key, str):
67
85
  for register in self.registers:
68
86
  if key == register.name:
69
87
  return register
@@ -85,7 +103,7 @@ class GeneratedFunction(pydantic.BaseModel):
85
103
 
86
104
  class GeneratedCircuitData(pydantic.BaseModel):
87
105
  width: int
88
- circuit_parameters: List[ParameterName] = pydantic.Field(default_factory=list)
106
+ circuit_parameters: list[ParameterName] = pydantic.Field(default_factory=list)
89
107
  qubit_mapping: QubitMapping = pydantic.Field(default_factory=QubitMapping)
90
108
  execution_data: Optional[ExecutionData] = pydantic.Field(default=None)
91
109
 
@@ -94,13 +112,42 @@ class GeneratedCircuitData(pydantic.BaseModel):
94
112
  return cls(width=0)
95
113
 
96
114
 
97
- class FunctionDebugInfo(pydantic.BaseModel):
98
- generated_function: Optional[GeneratedFunction]
99
- children: List["FunctionDebugInfo"]
100
- relative_qubits: Tuple[int, ...]
115
+ class OperationLevel(StrEnum):
116
+ QMOD_FUNCTION_CALL = "QMOD_CALL"
117
+ QMOD_STATEMENT = "QMOD_STATEMENT"
118
+ ENGINE_FUNCTION_CALL = "ENGINE_CALL"
119
+ UNKNOWN = "UNKNOWN"
120
+
121
+
122
+ class OperationParameter(pydantic.BaseModel):
123
+ label: str
124
+ value: Optional[str] = None
125
+
126
+
127
+ class FunctionDebugInfoInterface(pydantic.BaseModel):
128
+ generated_function: Optional[GeneratedFunction] = pydantic.Field(default=None)
129
+ children: list["FunctionDebugInfoInterface"]
130
+ relative_qubits: tuple[int, ...]
131
+ absolute_qubits: Optional[tuple[int, ...]] = pydantic.Field(default=None)
132
+ is_basis_gate: Optional[bool] = pydantic.Field(default=None)
133
+ is_inverse: bool = pydantic.Field(default=False)
134
+ is_allocate_or_free: bool = pydantic.Field(default=False)
135
+ level: OperationLevel = pydantic.Field(default=OperationLevel.UNKNOWN)
136
+ parameters: list[OperationParameter] = list()
137
+ port_to_passed_variable_map: dict[str, str] = pydantic.Field(default={})
138
+
139
+ model_config = ConfigDict(extra="allow")
140
+ # Temporary field to store the override debug info for parallel old/new visualization
141
+ override_debug_info: Optional["FunctionDebugInfoInterface"] = None
101
142
 
102
143
  @property
103
- def registers(self) -> List[GeneratedRegister]:
144
+ def name(self) -> str:
145
+ if self.generated_function is None:
146
+ return ""
147
+ return self.generated_function.name
148
+
149
+ @property
150
+ def registers(self) -> list[GeneratedRegister]:
104
151
  if self.generated_function is None:
105
152
  return list()
106
153
  return self.generated_function.registers
@@ -112,7 +159,93 @@ class FunctionDebugInfo(pydantic.BaseModel):
112
159
  return len(self.generated_function.control_states) > 0
113
160
 
114
161
  @property
115
- def control_states(self) -> List[ControlState]:
162
+ def control_states(self) -> list[ControlState]:
116
163
  if self.generated_function is None:
117
164
  return list()
118
165
  return self.generated_function.control_states
166
+
167
+ @staticmethod
168
+ def create_parameters_from_dict(
169
+ parameters: dict[str, str]
170
+ ) -> list[OperationParameter]:
171
+ return [
172
+ OperationParameter(label=key, value=value)
173
+ for key, value in parameters.items()
174
+ ]
175
+
176
+ def propagate_absolute_qubits(self) -> "FunctionDebugInfoInterface":
177
+ if self.absolute_qubits is None:
178
+ return self
179
+
180
+ updated_registers = [
181
+ register.model_copy(
182
+ update=dict(
183
+ qubit_indexes_absolute=list(
184
+ _get_absolute_from_relative(
185
+ self.absolute_qubits, tuple(register.qubit_indexes_relative)
186
+ )
187
+ )
188
+ )
189
+ )
190
+ for register in self.registers
191
+ ]
192
+ updated_generated_function = (
193
+ self.generated_function.model_copy(update=dict(registers=updated_registers))
194
+ if self.generated_function
195
+ else None
196
+ )
197
+
198
+ updated_children: list[FunctionDebugInfoInterface] = []
199
+ for child in self.children:
200
+ updated_child = child.white_new_absolute_qubits(self.absolute_qubits)
201
+ if updated_child.override_debug_info is None:
202
+ updated_child = updated_child.propagate_absolute_qubits()
203
+ else:
204
+ updated_child.override_debug_info = (
205
+ updated_child.override_debug_info.white_new_absolute_qubits(
206
+ absolute_qubits=self.absolute_qubits
207
+ ).propagate_absolute_qubits()
208
+ )
209
+ updated_children.append(updated_child)
210
+
211
+ return self.model_copy(
212
+ update=dict(
213
+ generated_function=updated_generated_function,
214
+ children=updated_children,
215
+ )
216
+ )
217
+
218
+ def white_new_absolute_qubits(
219
+ self, absolute_qubits: tuple[int, ...]
220
+ ) -> "FunctionDebugInfoInterface":
221
+ return self.model_copy(
222
+ update=dict(
223
+ absolute_qubits=_get_absolute_from_relative(
224
+ absolute_qubits, self.relative_qubits
225
+ )
226
+ )
227
+ )
228
+
229
+ def inverse(self) -> "FunctionDebugInfoInterface":
230
+ inverted_children = [child.inverse() for child in self.children[::-1]]
231
+ return self.model_copy(
232
+ update=dict(
233
+ is_inverse=not self.is_inverse,
234
+ children=inverted_children,
235
+ )
236
+ )
237
+
238
+
239
+ def _get_absolute_from_relative(
240
+ absolute_qubits: tuple[int, ...], relative_qubits: tuple[int, ...]
241
+ ) -> tuple[int, ...]:
242
+ if len(relative_qubits) == 0:
243
+ return tuple()
244
+ if max(relative_qubits) >= len(absolute_qubits):
245
+ _logger.warning(
246
+ "Invalid qubit computation (relative qubits: %s, absolute qubits: %s)",
247
+ relative_qubits,
248
+ absolute_qubits,
249
+ )
250
+ return tuple()
251
+ return tuple(absolute_qubits[relative_qubit] for relative_qubit in relative_qubits)
@@ -1,7 +1,9 @@
1
- from typing import Any, Dict, List, Set, Tuple, Union
1
+ from typing import Any, Union
2
2
 
3
3
  import pydantic
4
+ from pydantic_core.core_schema import ValidationInfo
4
5
 
6
+ from classiq.interface.exceptions import ClassiqValueError
5
7
  from classiq.interface.generator.arith.register_user_input import RegisterUserInput
6
8
  from classiq.interface.generator.function_params import (
7
9
  ArithmeticIODict,
@@ -11,13 +13,11 @@ from classiq.interface.generator.function_params import (
11
13
  from classiq.interface.generator.state_preparation import StatePreparation
12
14
  from classiq.interface.generator.user_defined_function_params import CustomFunction
13
15
 
14
- from classiq.exceptions import ClassiqValueError
15
-
16
16
  GroverStatePreparation = Union[StatePreparation, CustomFunction]
17
17
 
18
18
 
19
19
  class GroverDiffuser(FunctionParams):
20
- variables: List[RegisterUserInput]
20
+ variables: list[RegisterUserInput]
21
21
  state_preparation: str = pydantic.Field(
22
22
  default="", description="State preparation function"
23
23
  )
@@ -30,40 +30,47 @@ class GroverDiffuser(FunctionParams):
30
30
  self._inputs = {reg.name: reg for reg in self.variables}
31
31
  self._outputs = {reg.name: reg for reg in self.variables}
32
32
 
33
- @pydantic.root_validator(pre=True)
34
- def _validate_state_preparation_name(cls, values: Dict[str, Any]) -> Dict[str, Any]:
35
- if isinstance(
36
- values.get("state_preparation_params"), CustomFunction
37
- ) and not values.get("state_preparation"):
33
+ @pydantic.model_validator(mode="before")
34
+ @classmethod
35
+ def _validate_state_preparation_name(cls, values: Any) -> dict[str, Any]:
36
+ if (
37
+ isinstance(values, dict)
38
+ and isinstance(values.get("state_preparation_params"), CustomFunction)
39
+ and not values.get("state_preparation")
40
+ ):
38
41
  raise ClassiqValueError(
39
42
  "Must receive the function name from the `state_preparation` field for user defined functions"
40
43
  )
41
44
  return values
42
45
 
43
- @pydantic.root_validator(pre=True)
44
- def _parse_state_preparation(cls, values: Dict[str, Any]) -> Dict[str, Any]:
45
- parse_function_params_values(
46
- values=values,
47
- params_key="state_preparation_params",
48
- discriminator_key="state_preparation",
49
- param_classes={StatePreparation, CustomFunction},
50
- default_parser_class=CustomFunction,
51
- )
46
+ @pydantic.model_validator(mode="before")
47
+ @classmethod
48
+ def _parse_state_preparation(cls, values: Any) -> dict[str, Any]:
49
+ if isinstance(values, dict):
50
+ parse_function_params_values(
51
+ values=values,
52
+ params_key="state_preparation_params",
53
+ discriminator_key="state_preparation",
54
+ param_classes={StatePreparation, CustomFunction},
55
+ default_parser_class=CustomFunction,
56
+ )
52
57
  return values
53
58
 
54
- @pydantic.validator("variables")
59
+ @pydantic.field_validator("variables")
60
+ @classmethod
55
61
  def _validate_variables(
56
- cls, variables: List[RegisterUserInput]
57
- ) -> List[RegisterUserInput]:
62
+ cls, variables: list[RegisterUserInput]
63
+ ) -> list[RegisterUserInput]:
58
64
  names = {reg.name for reg in variables}
59
65
  assert len(variables) == len(names), "Repeating names not allowed"
60
66
  return variables
61
67
 
62
- @pydantic.validator("state_preparation_params")
68
+ @pydantic.field_validator("state_preparation_params")
69
+ @classmethod
63
70
  def _validate_state_preparation(
64
- cls, state_preparation_params: GroverStatePreparation, values: Dict[str, Any]
71
+ cls, state_preparation_params: GroverStatePreparation, info: ValidationInfo
65
72
  ) -> GroverStatePreparation:
66
- variables = values.get("variables", list())
73
+ variables = info.data.get("variables", list())
67
74
  sp_inputs = state_preparation_params.inputs_full(strict_zero_ios=False)
68
75
  sp_outputs = state_preparation_params.outputs
69
76
  if len(sp_inputs) == 1 and len(sp_outputs) == 1:
@@ -82,5 +89,5 @@ class GroverDiffuser(FunctionParams):
82
89
  return state_preparation_params
83
90
 
84
91
  @staticmethod
85
- def _names_and_sizes(transputs: ArithmeticIODict) -> Set[Tuple[str, int]]:
92
+ def _names_and_sizes(transputs: ArithmeticIODict) -> set[tuple[str, int]]:
86
93
  return {(name, reg.size) for name, reg in transputs.items()}
@@ -1,7 +1,9 @@
1
- from typing import Any, Dict, Optional
1
+ from typing import Any, Optional
2
2
 
3
3
  import pydantic
4
+ from pydantic_core.core_schema import ValidationInfo
4
5
 
6
+ from classiq.interface.exceptions import ClassiqValueError
5
7
  from classiq.interface.generator.function_params import (
6
8
  FunctionParams,
7
9
  FunctionParamsDiscriminator,
@@ -25,44 +27,53 @@ _DEFAULT_ORACLE_DISCRIMINATOR: FunctionParamsDiscriminator = (
25
27
 
26
28
  class GroverOperator(FunctionParams):
27
29
  oracle: str = pydantic.Field(
28
- default=_DEFAULT_ORACLE_DISCRIMINATOR, description="Oracle function"
30
+ default=_DEFAULT_ORACLE_DISCRIMINATOR,
31
+ description="Oracle function",
32
+ validate_default=True,
29
33
  )
30
34
  oracle_params: OracleABC = pydantic.Field(description="Oracle function parameters")
31
35
  state_preparation: str = pydantic.Field(
32
- default="", description="State preparation function"
36
+ default="",
37
+ description="State preparation function",
38
+ validate_default=True,
33
39
  )
34
40
  state_preparation_params: GroverStatePreparation = pydantic.Field(
35
- default=None, description="State preparation function parameters"
41
+ default=None,
42
+ description="State preparation function parameters",
43
+ validate_default=True,
36
44
  )
37
45
 
38
46
  def _create_ios(self) -> None:
39
47
  self._inputs = {**self.oracle_params.inputs}
40
48
  self._outputs = {**self.oracle_params.outputs}
41
49
 
42
- @pydantic.root_validator(pre=True)
43
- def _parse_oracle(cls, values: Dict[str, Any]) -> Dict[str, Any]:
44
- oracle_params = values.get("oracle_params")
45
- if isinstance(oracle_params, dict):
46
- values["oracle_params"] = parse_function_params(
47
- params=oracle_params,
48
- discriminator=values.get("oracle", _DEFAULT_ORACLE_DISCRIMINATOR),
49
- param_classes=oracle_function_param_library.param_list,
50
- no_discriminator_error=ValueError("Invalid oracle name"),
51
- bad_function_error=ValueError("Invalid oracle params"),
52
- )
53
- elif isinstance(oracle_params, FunctionParams):
54
- values["oracle"] = oracle_params.discriminator()
55
- else:
56
- raise ValueError("Invalid oracle params")
50
+ @pydantic.model_validator(mode="before")
51
+ @classmethod
52
+ def _parse_oracle(cls, values: Any) -> dict[str, Any]:
53
+ if isinstance(values, dict):
54
+ oracle_params = values.get("oracle_params")
55
+ if isinstance(oracle_params, dict):
56
+ values["oracle_params"] = parse_function_params(
57
+ params=oracle_params,
58
+ discriminator=values.get("oracle", _DEFAULT_ORACLE_DISCRIMINATOR),
59
+ param_classes=oracle_function_param_library.param_list,
60
+ no_discriminator_error=ClassiqValueError("Invalid oracle name"),
61
+ bad_function_error=ClassiqValueError("Invalid oracle params"),
62
+ )
63
+ elif isinstance(oracle_params, FunctionParams):
64
+ values["oracle"] = oracle_params.discriminator()
65
+ else:
66
+ raise ClassiqValueError("Invalid oracle params")
57
67
  return values
58
68
 
59
- @pydantic.validator("state_preparation_params", always=True)
69
+ @pydantic.field_validator("state_preparation_params", mode="before")
70
+ @classmethod
60
71
  def _validate_state_preparation(
61
72
  cls,
62
73
  state_preparation_params: Optional[GroverStatePreparation],
63
- values: Dict[str, Any],
74
+ info: ValidationInfo,
64
75
  ) -> GroverStatePreparation:
65
- oracle = values.get("oracle_params")
76
+ oracle = info.data.get("oracle_params")
66
77
  assert oracle is not None, "Must receive an oracle"
67
78
  state_preparation_params = (
68
79
  state_preparation_params
@@ -72,7 +83,7 @@ class GroverOperator(FunctionParams):
72
83
  )
73
84
  assert GroverDiffuser(
74
85
  state_preparation_params=state_preparation_params,
75
- state_preparation=values.get("state_preparation", ""),
86
+ state_preparation=info.data.get("state_preparation", ""),
76
87
  variables=oracle.variables(),
77
88
  ), "Cannot construct a GroverDiffuser"
78
89
  return state_preparation_params
@@ -4,12 +4,11 @@ import pydantic
4
4
 
5
5
  from classiq.interface.chemistry import operator
6
6
  from classiq.interface.chemistry.operator import PauliOperator
7
+ from classiq.interface.enum_utils import StrEnum
7
8
  from classiq.interface.generator.hamiltonian_evolution.hamiltonian_evolution import (
8
9
  HamiltonianEvolution,
9
10
  )
10
11
 
11
- from classiq._internals.enum_utils import StrEnum
12
-
13
12
 
14
13
  class ExponentiationOptimization(StrEnum):
15
14
  MINIMIZE_DEPTH = "MINIMIZE_DEPTH"
@@ -24,9 +23,7 @@ class ExponentiationConstraints(pydantic.BaseModel):
24
23
  default=None,
25
24
  description="Maximum approximation error of the exponentiation circuit.",
26
25
  )
27
-
28
- class Config:
29
- frozen = True
26
+ model_config = pydantic.ConfigDict(frozen=True)
30
27
 
31
28
 
32
29
  class Exponentiation(HamiltonianEvolution):
@@ -46,6 +43,7 @@ class Exponentiation(HamiltonianEvolution):
46
43
  description="What attribute to optimize.",
47
44
  )
48
45
 
49
- @pydantic.validator("pauli_operator")
46
+ @pydantic.field_validator("pauli_operator")
47
+ @classmethod
50
48
  def _validate_is_hermitian(cls, pauli_operator: PauliOperator) -> PauliOperator:
51
49
  return operator.validate_operator_is_hermitian(pauli_operator)
@@ -2,10 +2,10 @@ import pydantic
2
2
 
3
3
  from classiq.interface.chemistry import operator
4
4
  from classiq.interface.chemistry.operator import PauliOperator
5
+ from classiq.interface.generator.function_params import FunctionParamsNumericParameter
5
6
  from classiq.interface.generator.hamiltonian_evolution.hamiltonian_evolution import (
6
7
  HamiltonianEvolution,
7
8
  )
8
- from classiq.interface.generator.parameters import ParameterFloatType
9
9
 
10
10
 
11
11
  class QDrift(HamiltonianEvolution):
@@ -13,15 +13,15 @@ class QDrift(HamiltonianEvolution):
13
13
  qDrift trotterization of a Hermitian operator; see https://arxiv.org/abs/1811.08017
14
14
  """
15
15
 
16
- evolution_coefficient: ParameterFloatType = pydantic.Field(
16
+ evolution_coefficient: FunctionParamsNumericParameter = pydantic.Field(
17
17
  default=1.0,
18
18
  description="A global coefficient multiplying the operator.",
19
- is_exec_param=True,
20
19
  )
21
20
  num_qdrift: pydantic.PositiveInt = pydantic.Field(
22
21
  description="The number of elements in the qDrift product.",
23
22
  )
24
23
 
25
- @pydantic.validator("pauli_operator")
24
+ @pydantic.field_validator("pauli_operator")
25
+ @classmethod
26
26
  def _validate_is_hermitian(cls, pauli_operator: PauliOperator) -> PauliOperator:
27
27
  return operator.validate_operator_is_hermitian(pauli_operator)
@@ -1,11 +1,13 @@
1
1
  import pydantic
2
+ from pydantic import ConfigDict
2
3
 
3
4
  from classiq.interface.chemistry import operator
4
5
  from classiq.interface.chemistry.operator import PauliOperator
6
+ from classiq.interface.exceptions import ClassiqValueError
7
+ from classiq.interface.generator.function_params import FunctionParamsNumericParameter
5
8
  from classiq.interface.generator.hamiltonian_evolution.hamiltonian_evolution import (
6
9
  HamiltonianEvolution,
7
10
  )
8
- from classiq.interface.generator.parameters import ParameterFloatType
9
11
 
10
12
 
11
13
  class SuzukiParameters(pydantic.BaseModel):
@@ -17,14 +19,16 @@ class SuzukiParameters(pydantic.BaseModel):
17
19
  default=1, description="The number of repetitions in the Suzuki-Trotter"
18
20
  )
19
21
 
20
- @pydantic.validator("order")
22
+ @pydantic.field_validator("order")
23
+ @classmethod
21
24
  def _validate_order(cls, order: int) -> int:
22
25
  if order != 1 and order % 2:
23
- raise NotImplementedError
26
+ raise ClassiqValueError(
27
+ f"Odd order greater than 1 is not supported. Got {order}"
28
+ )
24
29
  return order
25
30
 
26
- class Config:
27
- frozen = True
31
+ model_config = ConfigDict(frozen=True)
28
32
 
29
33
 
30
34
  class SuzukiTrotter(HamiltonianEvolution):
@@ -32,10 +36,9 @@ class SuzukiTrotter(HamiltonianEvolution):
32
36
  Suzuki trotterization of a Hermitian operator
33
37
  """
34
38
 
35
- evolution_coefficient: ParameterFloatType = pydantic.Field(
39
+ evolution_coefficient: FunctionParamsNumericParameter = pydantic.Field(
36
40
  default=1.0,
37
41
  description="A global coefficient multiplying the operator.",
38
- is_exec_param=True,
39
42
  )
40
43
  suzuki_parameters: SuzukiParameters = pydantic.Field(
41
44
  default_factory=SuzukiParameters, description="The Suziki parameters."
@@ -44,7 +47,8 @@ class SuzukiTrotter(HamiltonianEvolution):
44
47
  default=False, description="Whether to disable the reordering of Pauli terms."
45
48
  )
46
49
 
47
- @pydantic.validator("pauli_operator")
50
+ @pydantic.field_validator("pauli_operator")
51
+ @classmethod
48
52
  def _validate_no_complex_coefficients(
49
53
  cls, pauli_operator: PauliOperator
50
54
  ) -> PauliOperator: