classiq 0.38.0__py3-none-any.whl → 0.65.4__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.4.dist-info}/METADATA +16 -9
  414. classiq-0.65.4.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.4.dist-info}/WHEEL +0 -0
@@ -1,26 +1,25 @@
1
1
  import abc
2
- from typing import Dict
2
+ from collections.abc import Sequence
3
3
 
4
- import pydantic
5
- from pydantic.main import BaseModel
4
+ from pydantic import ConfigDict
6
5
 
7
- from classiq.interface.generator.functions.classical_type import ConcreteClassicalType
6
+ from classiq.interface.model.classical_parameter_declaration import (
7
+ AnonClassicalParameterDeclaration,
8
+ )
9
+ from classiq.interface.model.parameter import Parameter
8
10
 
9
11
 
10
- class FunctionDeclaration(BaseModel, abc.ABC):
12
+ class FunctionDeclaration(Parameter, abc.ABC):
11
13
  """
12
14
  Facilitates the creation of a common function interface object.
13
15
  """
14
16
 
15
- name: str = pydantic.Field(description="The name of the function")
17
+ @property
18
+ @abc.abstractmethod
19
+ def param_decls(self) -> Sequence["AnonClassicalParameterDeclaration"]:
20
+ pass
16
21
 
17
- param_decls: Dict[str, ConcreteClassicalType] = pydantic.Field(
18
- description="The expected interface of the functions parameters",
19
- default_factory=dict,
20
- )
22
+ model_config = ConfigDict(extra="forbid")
21
23
 
22
- class Config:
23
- extra = pydantic.Extra.forbid
24
24
 
25
-
26
- FunctionDeclaration.update_forward_refs()
25
+ FunctionDeclaration.model_rebuild()
@@ -1,12 +1,8 @@
1
1
  from typing import Any
2
2
 
3
- import pydantic
4
- from pydantic import BaseModel
5
-
3
+ from classiq.interface.enum_utils import StrEnum
6
4
  from classiq.interface.generator.function_params import PortDirection
7
5
 
8
- from classiq._internals.enum_utils import StrEnum
9
-
10
6
 
11
7
  class PortDeclarationDirection(StrEnum):
12
8
  Input = "input"
@@ -39,11 +35,3 @@ class PortDeclarationDirection(StrEnum):
39
35
  cls, port_direction: PortDirection
40
36
  ) -> "PortDeclarationDirection":
41
37
  return cls(port_direction.value)
42
-
43
-
44
- class SynthesisPortDeclaration(BaseModel):
45
- name: str
46
- size: int
47
- direction: PortDeclarationDirection
48
- is_signed: bool = pydantic.Field(default=False)
49
- fraction_places: int = pydantic.Field(default=0)
@@ -1,3 +1,4 @@
1
- from typing import Any, Mapping
1
+ from collections.abc import Mapping
2
+ from typing import Any
2
3
 
3
4
  QmodPyStruct = Mapping[str, Any]
@@ -0,0 +1,90 @@
1
+ from collections.abc import Mapping
2
+ from typing import TYPE_CHECKING, Any, Literal, Optional
3
+
4
+ import pydantic
5
+
6
+ from classiq.interface.exceptions import ClassiqInternalError
7
+ from classiq.interface.generator.expressions.qmod_qstruct_proxy import QmodQStructProxy
8
+ from classiq.interface.generator.functions.classical_type import (
9
+ ClassicalType,
10
+ )
11
+ from classiq.interface.helpers.pydantic_model_helpers import values_with_discriminator
12
+ from classiq.interface.model.handle_binding import HandleBinding
13
+ from classiq.interface.model.quantum_type import (
14
+ QuantumType,
15
+ )
16
+
17
+ if TYPE_CHECKING:
18
+ from classiq.interface.generator.functions.concrete_types import ConcreteQuantumType
19
+
20
+
21
+ class TypeName(ClassicalType, QuantumType):
22
+ kind: Literal["struct_instance"]
23
+ name: str = pydantic.Field(description="The type name of the instance")
24
+ _assigned_fields: Optional[Mapping[str, "ConcreteQuantumType"]] = (
25
+ pydantic.PrivateAttr(default=None)
26
+ )
27
+
28
+ @pydantic.model_validator(mode="before")
29
+ @classmethod
30
+ def _set_kind(cls, values: Any) -> dict[str, Any]:
31
+ return values_with_discriminator(values, "kind", "struct_instance")
32
+
33
+ def _update_size_in_bits_from_declaration(self) -> None:
34
+ fields_types = list(self.fields.values())
35
+ for field_type in fields_types:
36
+ field_type._update_size_in_bits_from_declaration()
37
+ if all(field_type.has_size_in_bits for field_type in fields_types):
38
+ self._size_in_bits = sum(
39
+ field_type.size_in_bits for field_type in fields_types
40
+ )
41
+
42
+ def get_proxy(self, handle: "HandleBinding") -> "QmodQStructProxy":
43
+ from classiq.interface.generator.expressions.qmod_qstruct_proxy import (
44
+ QmodQStructProxy,
45
+ )
46
+
47
+ return QmodQStructProxy(
48
+ handle=handle, struct_name=self.name, fields=self.fields
49
+ )
50
+
51
+ @property
52
+ def qmod_type_name(self) -> str:
53
+ return self.name
54
+
55
+ @property
56
+ def type_name(self) -> str:
57
+ return self.name
58
+
59
+ @property
60
+ def fields(self) -> Mapping[str, "ConcreteQuantumType"]:
61
+ if self._assigned_fields is None:
62
+ raise ClassiqInternalError("Fields not set")
63
+ return self._assigned_fields
64
+
65
+ @property
66
+ def has_fields(self) -> bool:
67
+ return self._assigned_fields is not None
68
+
69
+ def set_fields(self, fields: Mapping[str, "ConcreteQuantumType"]) -> None:
70
+ self._assigned_fields = fields
71
+
72
+ @property
73
+ def is_instantiated(self) -> bool:
74
+ return self.has_fields and all(
75
+ field_type.is_instantiated for field_type in self.fields.values()
76
+ )
77
+
78
+ @property
79
+ def is_evaluated(self) -> bool:
80
+ return self.has_fields and all(
81
+ field_type.is_evaluated for field_type in self.fields.values()
82
+ )
83
+
84
+
85
+ class Enum(TypeName):
86
+ pass
87
+
88
+
89
+ class Struct(TypeName):
90
+ pass
@@ -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,16 +58,25 @@ 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
82
  if isinstance(key, int):
@@ -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,
@@ -18,8 +20,6 @@ from classiq.interface.generator.oracles.oracle_function_param_list import (
18
20
  from classiq.interface.generator.range_types import NonNegativeFloatRange
19
21
  from classiq.interface.generator.state_preparation import Metrics, StatePreparation
20
22
 
21
- from classiq.exceptions import ClassiqValueError
22
-
23
23
  _DEFAULT_ORACLE_DISCRIMINATOR: FunctionParamsDiscriminator = (
24
24
  ArithmeticOracle.discriminator()
25
25
  )
@@ -27,44 +27,53 @@ _DEFAULT_ORACLE_DISCRIMINATOR: FunctionParamsDiscriminator = (
27
27
 
28
28
  class GroverOperator(FunctionParams):
29
29
  oracle: str = pydantic.Field(
30
- default=_DEFAULT_ORACLE_DISCRIMINATOR, description="Oracle function"
30
+ default=_DEFAULT_ORACLE_DISCRIMINATOR,
31
+ description="Oracle function",
32
+ validate_default=True,
31
33
  )
32
34
  oracle_params: OracleABC = pydantic.Field(description="Oracle function parameters")
33
35
  state_preparation: str = pydantic.Field(
34
- default="", description="State preparation function"
36
+ default="",
37
+ description="State preparation function",
38
+ validate_default=True,
35
39
  )
36
40
  state_preparation_params: GroverStatePreparation = pydantic.Field(
37
- default=None, description="State preparation function parameters"
41
+ default=None,
42
+ description="State preparation function parameters",
43
+ validate_default=True,
38
44
  )
39
45
 
40
46
  def _create_ios(self) -> None:
41
47
  self._inputs = {**self.oracle_params.inputs}
42
48
  self._outputs = {**self.oracle_params.outputs}
43
49
 
44
- @pydantic.root_validator(pre=True)
45
- def _parse_oracle(cls, values: Dict[str, Any]) -> Dict[str, Any]:
46
- oracle_params = values.get("oracle_params")
47
- if isinstance(oracle_params, dict):
48
- values["oracle_params"] = parse_function_params(
49
- params=oracle_params,
50
- discriminator=values.get("oracle", _DEFAULT_ORACLE_DISCRIMINATOR),
51
- param_classes=oracle_function_param_library.param_list,
52
- no_discriminator_error=ClassiqValueError("Invalid oracle name"),
53
- bad_function_error=ClassiqValueError("Invalid oracle params"),
54
- )
55
- elif isinstance(oracle_params, FunctionParams):
56
- values["oracle"] = oracle_params.discriminator()
57
- else:
58
- raise ClassiqValueError("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")
59
67
  return values
60
68
 
61
- @pydantic.validator("state_preparation_params", always=True)
69
+ @pydantic.field_validator("state_preparation_params", mode="before")
70
+ @classmethod
62
71
  def _validate_state_preparation(
63
72
  cls,
64
73
  state_preparation_params: Optional[GroverStatePreparation],
65
- values: Dict[str, Any],
74
+ info: ValidationInfo,
66
75
  ) -> GroverStatePreparation:
67
- oracle = values.get("oracle_params")
76
+ oracle = info.data.get("oracle_params")
68
77
  assert oracle is not None, "Must receive an oracle"
69
78
  state_preparation_params = (
70
79
  state_preparation_params
@@ -74,7 +83,7 @@ class GroverOperator(FunctionParams):
74
83
  )
75
84
  assert GroverDiffuser(
76
85
  state_preparation_params=state_preparation_params,
77
- state_preparation=values.get("state_preparation", ""),
86
+ state_preparation=info.data.get("state_preparation", ""),
78
87
  variables=oracle.variables(),
79
88
  ), "Cannot construct a GroverDiffuser"
80
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)