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,13 +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
-
10
- from classiq.exceptions import ClassiqValueError
11
11
 
12
12
 
13
13
  class SuzukiParameters(pydantic.BaseModel):
@@ -19,7 +19,8 @@ class SuzukiParameters(pydantic.BaseModel):
19
19
  default=1, description="The number of repetitions in the Suzuki-Trotter"
20
20
  )
21
21
 
22
- @pydantic.validator("order")
22
+ @pydantic.field_validator("order")
23
+ @classmethod
23
24
  def _validate_order(cls, order: int) -> int:
24
25
  if order != 1 and order % 2:
25
26
  raise ClassiqValueError(
@@ -27,8 +28,7 @@ class SuzukiParameters(pydantic.BaseModel):
27
28
  )
28
29
  return order
29
30
 
30
- class Config:
31
- frozen = True
31
+ model_config = ConfigDict(frozen=True)
32
32
 
33
33
 
34
34
  class SuzukiTrotter(HamiltonianEvolution):
@@ -36,10 +36,9 @@ class SuzukiTrotter(HamiltonianEvolution):
36
36
  Suzuki trotterization of a Hermitian operator
37
37
  """
38
38
 
39
- evolution_coefficient: ParameterFloatType = pydantic.Field(
39
+ evolution_coefficient: FunctionParamsNumericParameter = pydantic.Field(
40
40
  default=1.0,
41
41
  description="A global coefficient multiplying the operator.",
42
- is_exec_param=True,
43
42
  )
44
43
  suzuki_parameters: SuzukiParameters = pydantic.Field(
45
44
  default_factory=SuzukiParameters, description="The Suziki parameters."
@@ -48,7 +47,8 @@ class SuzukiTrotter(HamiltonianEvolution):
48
47
  default=False, description="Whether to disable the reordering of Pauli terms."
49
48
  )
50
49
 
51
- @pydantic.validator("pauli_operator")
50
+ @pydantic.field_validator("pauli_operator")
51
+ @classmethod
52
52
  def _validate_no_complex_coefficients(
53
53
  cls, pauli_operator: PauliOperator
54
54
  ) -> PauliOperator:
@@ -1,10 +1,13 @@
1
1
  import itertools
2
2
  from collections import defaultdict
3
- from typing import Any, Dict, List, MutableSet, Optional
3
+ from collections.abc import MutableSet
4
+ from typing import Any, Optional
4
5
 
5
6
  import pydantic
7
+ from typing_extensions import Self
6
8
 
7
9
  from classiq.interface.backend.backend_preferences import BackendPreferences
10
+ from classiq.interface.exceptions import ClassiqValueError
8
11
  from classiq.interface.generator.transpiler_basis_gates import (
9
12
  DEFAULT_BASIS_GATES,
10
13
  DEFAULT_ROUTING_BASIS_GATES,
@@ -14,16 +17,32 @@ from classiq.interface.generator.transpiler_basis_gates import (
14
17
  )
15
18
  from classiq.interface.helpers.custom_pydantic_types import PydanticNonNegIntTuple
16
19
 
17
- from classiq.exceptions import ClassiqValueError
18
-
19
- ConnectivityMap = List[PydanticNonNegIntTuple]
20
+ ConnectivityMap = list[PydanticNonNegIntTuple]
20
21
  BACKEND_VALIDATION_ERROR_MESSAGE = (
21
22
  "Backend service provider and backend name should be specified together."
22
23
  )
23
24
 
24
25
 
25
26
  class HardwareData(pydantic.BaseModel):
26
- basis_gates: List[str] = pydantic.Field(
27
+ """
28
+ Hardware-specific settings used in quantum circuit synthesis,
29
+ including basis gates, connectivity map, and connectivity symmetry.
30
+
31
+ Attributes:
32
+ basis_gates (List[str]):
33
+ The basis gates of the hardware, used during model optimization.
34
+ If not provided, default values are used based on the connectivity map's symmetry.
35
+
36
+ connectivity_map(Optional[ConnectivityMap]):
37
+ The qubit connectivity map, defined as a list of qubit pairs [[q0, q1], [q1, q2],...].
38
+ If not provided, the hardware is assumed to be fully connected.
39
+
40
+ is_symmetric_connectivity(bool):
41
+ Indicates whether the coupling map forms an undirected graph, meaning
42
+ that both qubits in each pair can act as control and target. Defaults to True.
43
+ """
44
+
45
+ basis_gates: list[str] = pydantic.Field(
27
46
  default=list(),
28
47
  description="The basis gates of the hardware. "
29
48
  "This set will be used during the model optimization. "
@@ -43,7 +62,8 @@ class HardwareData(pydantic.BaseModel):
43
62
  "If false, the first / second qubit denotes the control / target, respectively",
44
63
  )
45
64
 
46
- @pydantic.validator("connectivity_map")
65
+ @pydantic.field_validator("connectivity_map")
66
+ @classmethod
47
67
  def _validate_connectivity_map(
48
68
  cls, connectivity_map: Optional[ConnectivityMap]
49
69
  ) -> Optional[ConnectivityMap]:
@@ -54,39 +74,37 @@ class HardwareData(pydantic.BaseModel):
54
74
  connectivity_map = _reindex_qubits(connectivity_map)
55
75
  return connectivity_map
56
76
 
57
- @pydantic.root_validator()
58
- def _symmetrize_connectivity_map(cls, values: Dict[str, Any]) -> Dict[str, Any]:
59
- connectivity_map = values.get("connectivity_map")
77
+ @pydantic.model_validator(mode="after")
78
+ def _symmetrize_connectivity_map(self) -> Self:
79
+ connectivity_map = self.connectivity_map
60
80
  if connectivity_map is None:
61
- return values
81
+ return self
62
82
 
63
- is_symmetric = values.get("is_symmetric_connectivity")
83
+ is_symmetric = self.is_symmetric_connectivity
64
84
  if is_symmetric:
65
85
  connectivity_map = _symmetrize_connectivity_map(connectivity_map)
66
- values["connectivity_map"] = connectivity_map
86
+ self.connectivity_map = connectivity_map
67
87
 
68
88
  if not _is_connected_map(connectivity_map):
69
89
  raise ClassiqValueError(
70
90
  f"Connectivity map must be connected: {connectivity_map} is not connected."
71
91
  )
72
- return values
92
+ return self
73
93
 
74
- @pydantic.root_validator()
75
- def _validate_basis_gates(cls, values: Dict[str, Any]) -> Dict[str, Any]:
76
- connectivity_map = values.get("connectivity_map")
77
- specified_basis_gates = values.get("basis_gates", [])
94
+ @pydantic.model_validator(mode="after")
95
+ def _validate_basis_gates(self) -> Self:
96
+ connectivity_map = self.connectivity_map
97
+ specified_basis_gates = self.basis_gates
78
98
  if connectivity_map is None:
79
- values["basis_gates"] = specified_basis_gates or list(DEFAULT_BASIS_GATES)
80
- return values
99
+ self.basis_gates = specified_basis_gates or list(DEFAULT_BASIS_GATES)
100
+ return self
81
101
 
82
- is_symmetric_connectivity = values.get("is_symmetric")
102
+ is_symmetric_connectivity = self.is_symmetric_connectivity
83
103
  if is_symmetric_connectivity or _check_symmetry(connectivity_map):
84
- values["basis_gates"] = specified_basis_gates or list(DEFAULT_BASIS_GATES)
85
- return values
104
+ self.basis_gates = specified_basis_gates or list(DEFAULT_BASIS_GATES)
105
+ return self
86
106
 
87
- values["basis_gates"] = specified_basis_gates or list(
88
- DEFAULT_ROUTING_BASIS_GATES
89
- )
107
+ self.basis_gates = specified_basis_gates or list(DEFAULT_ROUTING_BASIS_GATES)
90
108
  invalid_gates = [
91
109
  gate
92
110
  for gate in specified_basis_gates
@@ -98,14 +116,21 @@ class HardwareData(pydantic.BaseModel):
98
116
  "is currently supported for the following two-qubit gates only: cx, ecr, rzx."
99
117
  )
100
118
 
101
- return values
119
+ return self
102
120
 
103
121
 
104
122
  class CustomHardwareSettings(HardwareData):
123
+ """
124
+ Custom hardware settings for quantum circuit synthesis.
125
+ This class inherits from HardwareData (please see class for more details)
126
+
127
+ """
128
+
105
129
  _width: Optional[int] = pydantic.PrivateAttr(default=None)
106
130
 
107
- @pydantic.validator("basis_gates")
108
- def validate_basis_gates(cls, basis_gates: List[str]) -> List[TranspilerBasisGates]:
131
+ @pydantic.field_validator("basis_gates", mode="after")
132
+ @classmethod
133
+ def validate_basis_gates(cls, basis_gates: list[str]) -> list[TranspilerBasisGates]:
109
134
  valid_gates = list(TranspilerBasisGates)
110
135
  invalid_gates = [gate for gate in basis_gates if gate not in valid_gates]
111
136
  if invalid_gates:
@@ -130,7 +155,7 @@ class CustomHardwareSettings(HardwareData):
130
155
 
131
156
  def _is_connected_map(connectivity_map: ConnectivityMap) -> bool:
132
157
  nodes: MutableSet[int] = set()
133
- node_to_neighbors: Dict[int, MutableSet[int]] = defaultdict(set)
158
+ node_to_neighbors: dict[int, MutableSet[int]] = defaultdict(set)
134
159
  for edge in connectivity_map:
135
160
  nodes.add(edge[0])
136
161
  nodes.add(edge[1])
@@ -143,7 +168,7 @@ def _is_connected_map(connectivity_map: ConnectivityMap) -> bool:
143
168
 
144
169
 
145
170
  def _node_dfs(
146
- node: int, node_to_neighbors: Dict[int, MutableSet[int]], visited: MutableSet[int]
171
+ node: int, node_to_neighbors: dict[int, MutableSet[int]], visited: MutableSet[int]
147
172
  ) -> None:
148
173
  visited.add(node)
149
174
  neighbors = node_to_neighbors[node]
@@ -156,7 +181,7 @@ def _node_dfs(
156
181
 
157
182
  def _reindex_qubits(connectivity_map: ConnectivityMap) -> ConnectivityMap:
158
183
  qubits = sorted({q for pair in connectivity_map for q in pair})
159
- return [(qubits.index(pair[0]), qubits.index(pair[1])) for pair in connectivity_map]
184
+ return [[qubits.index(pair[0]), qubits.index(pair[1])] for pair in connectivity_map]
160
185
 
161
186
 
162
187
  def _check_symmetry(connectivity_map: ConnectivityMap) -> bool:
@@ -168,17 +193,30 @@ def _symmetrize_connectivity_map(connectivity_map: ConnectivityMap) -> Connectiv
168
193
  # A more complicated implementation than using set to maintain the order
169
194
  connectivity_map_no_duplicates = []
170
195
  for edge in connectivity_map:
171
- reversed_edge = (edge[1], edge[0])
196
+ reversed_edge = [edge[1], edge[0]]
172
197
  if (
173
198
  edge not in connectivity_map_no_duplicates
174
199
  and reversed_edge not in connectivity_map_no_duplicates
175
200
  ):
176
201
  connectivity_map_no_duplicates.append(edge)
177
202
  reversed_connectivity_map = [
178
- (edge[1], edge[0]) for edge in connectivity_map_no_duplicates
203
+ [edge[1], edge[0]] for edge in connectivity_map_no_duplicates
179
204
  ]
180
205
  return connectivity_map_no_duplicates + reversed_connectivity_map
181
206
 
182
207
 
183
208
  class SynthesisHardwareData(HardwareData):
184
- backend_data: Optional[BackendPreferences]
209
+ """
210
+ Represents the synthesis-specific hardware data for a quantum circuit.
211
+
212
+ This class extends `HardwareData` and includes additional attributes that
213
+ pertain specifically to the hardware used during the synthesis of a quantum circuit.
214
+
215
+ Attributes:
216
+ backend_data (Optional[BackendPreferences]):
217
+ Preferences for the backend used during the synthesis process.
218
+ This can include specific backend configurations or settings.
219
+ Defaults to `None`.
220
+ """
221
+
222
+ backend_data: Optional[BackendPreferences] = pydantic.Field(default=None)
@@ -1,8 +1,11 @@
1
1
  import itertools
2
- from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union
2
+ from typing import TYPE_CHECKING, Optional, Union
3
3
 
4
4
  import pydantic
5
+ from pydantic_core.core_schema import ValidationInfo
5
6
 
7
+ from classiq.interface.enum_utils import StrEnum
8
+ from classiq.interface.exceptions import ClassiqValueError
6
9
  from classiq.interface.generator import function_params
7
10
  from classiq.interface.generator.arith.register_user_input import RegisterUserInput
8
11
  from classiq.interface.generator.function_params import (
@@ -15,10 +18,7 @@ from classiq.interface.generator.transpiler_basis_gates import (
15
18
  )
16
19
  from classiq.interface.helpers.custom_pydantic_types import PydanticNonNegIntTuple
17
20
 
18
- from classiq._internals.enum_utils import StrEnum
19
- from classiq.exceptions import ClassiqValueError
20
-
21
- ConnectivityMap = List[PydanticNonNegIntTuple]
21
+ ConnectivityMap = list[PydanticNonNegIntTuple]
22
22
 
23
23
 
24
24
  class SupportedConnectivityMaps(StrEnum):
@@ -45,16 +45,17 @@ class HardwareEfficientAnsatz(function_params.FunctionParams):
45
45
  num_qubits: pydantic.PositiveInt = pydantic.Field(
46
46
  default=None,
47
47
  description="Number of qubits in the ansatz.",
48
+ validate_default=True,
48
49
  )
49
50
  reps: pydantic.PositiveInt = pydantic.Field(
50
51
  default=1, description="Number of layers in the Ansatz"
51
52
  )
52
53
 
53
- one_qubit_gates: Union[str, List[str]] = pydantic.Field(
54
+ one_qubit_gates: Union[str, list[str]] = pydantic.Field(
54
55
  default=["x", "ry"],
55
56
  description='List of gates for the one qubit gates layer, e.g. ["x", "ry"]',
56
57
  )
57
- two_qubit_gates: Union[str, List[str]] = pydantic.Field(
58
+ two_qubit_gates: Union[str, list[str]] = pydantic.Field(
58
59
  default=["cx"],
59
60
  description='List of gates for the two qubit gates entangling layer, e.g. ["cx", "cry"]',
60
61
  )
@@ -63,11 +64,12 @@ class HardwareEfficientAnsatz(function_params.FunctionParams):
63
64
  description="Prefix for the generated parameters",
64
65
  )
65
66
 
66
- @pydantic.validator("num_qubits", pre=True, always=True)
67
+ @pydantic.field_validator("num_qubits", mode="before")
68
+ @classmethod
67
69
  def validate_num_qubits(
68
- cls, num_qubits: Optional[pydantic.PositiveInt], values: Dict[str, Any]
70
+ cls, num_qubits: Optional[pydantic.PositiveInt], info: ValidationInfo
69
71
  ) -> pydantic.PositiveInt:
70
- connectivity_map = values.get("connectivity_map")
72
+ connectivity_map = info.data.get("connectivity_map")
71
73
  conn_map_is_not_list = (
72
74
  isinstance(connectivity_map, SupportedConnectivityMaps)
73
75
  or connectivity_map is None
@@ -102,10 +104,11 @@ class HardwareEfficientAnsatz(function_params.FunctionParams):
102
104
  )
103
105
  return num_qubits
104
106
 
105
- @pydantic.validator("one_qubit_gates")
107
+ @pydantic.field_validator("one_qubit_gates")
108
+ @classmethod
106
109
  def validate_one_qubit_gates(
107
- cls, one_qubit_gates: Union[str, List[str]]
108
- ) -> Union[str, List[str]]:
110
+ cls, one_qubit_gates: Union[str, list[str]]
111
+ ) -> Union[str, list[str]]:
109
112
  one_qubit_gates_list = (
110
113
  [one_qubit_gates] if isinstance(one_qubit_gates, str) else one_qubit_gates
111
114
  )
@@ -114,10 +117,11 @@ class HardwareEfficientAnsatz(function_params.FunctionParams):
114
117
  raise ClassiqValueError(f"Invalid one qubit gate: {one_qubit_gate}")
115
118
  return one_qubit_gates
116
119
 
117
- @pydantic.validator("two_qubit_gates")
120
+ @pydantic.field_validator("two_qubit_gates")
121
+ @classmethod
118
122
  def validate_two_qubit_gates(
119
- cls, two_qubit_gates: Union[str, List[str]]
120
- ) -> Union[str, List[str]]:
123
+ cls, two_qubit_gates: Union[str, list[str]]
124
+ ) -> Union[str, list[str]]:
121
125
  two_qubit_gates_list = (
122
126
  [two_qubit_gates] if isinstance(two_qubit_gates, str) else two_qubit_gates
123
127
  )
@@ -1,16 +1,24 @@
1
+ from typing import Any, Union
2
+
1
3
  import pydantic
2
4
 
3
- from classiq.interface.chemistry.ground_state_problem import CHEMISTRY_PROBLEMS
5
+ from classiq.interface.chemistry.ground_state_problem import (
6
+ CHEMISTRY_PROBLEMS,
7
+ HamiltonianProblem,
8
+ MoleculeProblem,
9
+ )
10
+ from classiq.interface.exceptions import ClassiqValueError
4
11
  from classiq.interface.generator.chemistry_function_params import (
5
12
  ChemistryFunctionParams,
6
13
  )
7
14
 
8
- from classiq.exceptions import ClassiqValueError
9
-
10
15
 
11
16
  class HartreeFock(ChemistryFunctionParams):
12
- @pydantic.validator("gs_problem")
13
- def validate_gs_problem(cls, gs_problem):
17
+ @pydantic.field_validator("gs_problem")
18
+ @classmethod
19
+ def validate_gs_problem(
20
+ cls, gs_problem: Any
21
+ ) -> Union[MoleculeProblem, HamiltonianProblem]:
14
22
  if not isinstance(gs_problem, CHEMISTRY_PROBLEMS):
15
23
  raise ClassiqValueError(
16
24
  f"ground state problem must be of type {CHEMISTRY_PROBLEMS}"
@@ -1,14 +1,17 @@
1
- from typing import TYPE_CHECKING, List
1
+ from typing import TYPE_CHECKING, Annotated
2
2
 
3
3
  import pydantic
4
+ from pydantic import Field
4
5
 
5
6
  from classiq.interface.generator.arith.register_user_input import RegisterUserInput
6
7
  from classiq.interface.generator.function_params import FunctionParams
7
8
 
8
9
  if TYPE_CHECKING:
9
- NonEmptyRegisterUserInputList = List[RegisterUserInput]
10
+ NonEmptyRegisterUserInputList = list[RegisterUserInput]
10
11
  else:
11
- NonEmptyRegisterUserInputList = pydantic.conlist(RegisterUserInput, min_items=1)
12
+ NonEmptyRegisterUserInputList = Annotated[
13
+ list[RegisterUserInput], Field(min_length=1)
14
+ ]
12
15
 
13
16
 
14
17
  class Identity(FunctionParams):
@@ -16,10 +19,11 @@ class Identity(FunctionParams):
16
19
  description="registers describing the state (ordered)"
17
20
  )
18
21
 
19
- @pydantic.validator("arguments")
22
+ @pydantic.field_validator("arguments")
23
+ @classmethod
20
24
  def _validate_argument_names(
21
- cls, arguments: List[RegisterUserInput]
22
- ) -> List[RegisterUserInput]:
25
+ cls, arguments: list[RegisterUserInput]
26
+ ) -> list[RegisterUserInput]:
23
27
  return [
24
28
  arg if arg.name else arg.revalued(name=cls._get_default_arg_name(index))
25
29
  for index, arg in enumerate(arguments)
@@ -1,24 +1,28 @@
1
- from typing import TYPE_CHECKING, Any, Dict, List
1
+ from typing import TYPE_CHECKING, Annotated, Any
2
2
 
3
3
  import pydantic
4
+ from pydantic import StringConstraints
5
+ from typing_extensions import Self
4
6
 
7
+ from classiq.interface.exceptions import ClassiqValueError
5
8
  from classiq.interface.generator import function_params
6
9
  from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
7
10
 
8
- from classiq.exceptions import ClassiqValueError
9
-
10
11
  STATE = "state"
11
12
  TARGET = "target"
12
13
 
13
- LENGTH_ERROR_MESSAGE = "Slopes, offsets and basis values must have the same length"
14
+ LENGTH_ERROR_MESSAGE = "Field required"
14
15
 
15
16
  if TYPE_CHECKING:
16
17
  PydanticPauliBasisStr = str
17
18
  else:
18
- PydanticPauliBasisStr = pydantic.constr(
19
- to_lower=True,
20
- regex=r"[xyz]",
21
- )
19
+ PydanticPauliBasisStr = Annotated[
20
+ str,
21
+ StringConstraints(
22
+ to_lower=True,
23
+ pattern=r"[xyz]",
24
+ ),
25
+ ]
22
26
 
23
27
 
24
28
  class LinearPauliRotations(function_params.FunctionParams):
@@ -47,29 +51,37 @@ class LinearPauliRotations(function_params.FunctionParams):
47
51
  num_state_qubits: pydantic.PositiveInt = pydantic.Field(
48
52
  description="The number of input qubits"
49
53
  )
50
- bases: List[PydanticPauliBasisStr] = pydantic.Field(
54
+ bases: list[PydanticPauliBasisStr] = pydantic.Field(
51
55
  description="The types of Pauli rotations ('X', 'Y', 'Z')."
52
56
  )
53
- slopes: List[float] = pydantic.Field(
57
+ slopes: list[float] = pydantic.Field(
54
58
  description="The slopes of the controlled rotations."
55
59
  )
56
- offsets: List[float] = pydantic.Field(
60
+ offsets: list[float] = pydantic.Field(
57
61
  description="The offsets of the controlled rotations."
58
62
  )
59
63
 
60
- @pydantic.validator("bases", "slopes", "offsets", pre=True, always=True)
61
- def as_list(cls, v: Any) -> List[Any]:
64
+ @pydantic.field_validator("bases", "slopes", "offsets", mode="before")
65
+ @classmethod
66
+ def as_list(cls, v: Any) -> list[Any]:
62
67
  if not isinstance(v, list):
63
68
  v = [v]
64
- return v
69
+ res = []
70
+ for x in v:
71
+ element = x
72
+ if isinstance(x, str):
73
+ res.append(element.lower())
74
+ else:
75
+ res.append(element)
76
+ return res
65
77
 
66
- @pydantic.root_validator()
67
- def validate_lists(cls, values: Dict[str, Any]) -> Dict[str, Any]:
68
- offsets = values.get("offsets", list())
69
- bases = values.get("bases", list())
70
- slopes = values.get("slopes", list())
78
+ @pydantic.model_validator(mode="after")
79
+ def validate_lists(self) -> Self:
80
+ offsets = self.offsets or list()
81
+ bases = self.bases or list()
82
+ slopes = self.slopes or list()
71
83
  if len(slopes) == len(offsets) and len(offsets) == len(bases):
72
- return values
84
+ return self
73
85
  raise ClassiqValueError(LENGTH_ERROR_MESSAGE)
74
86
 
75
87
  def _create_ios(self) -> None:
@@ -1,4 +1,4 @@
1
- from classiq._internals.enum_utils import StrEnum
1
+ from classiq.interface.enum_utils import StrEnum
2
2
 
3
3
 
4
4
  class McmtMethod(StrEnum):
@@ -1,13 +1,14 @@
1
- from typing import Any, Dict, Optional, cast
1
+ from typing import Any, Optional, cast
2
2
 
3
3
  import pydantic
4
4
 
5
+ from classiq.interface.exceptions import ClassiqValueError
5
6
  from classiq.interface.generator.arith.register_user_input import RegisterUserInput
6
7
  from classiq.interface.generator.control_state import ControlState
7
- from classiq.interface.generator.function_params import FunctionParams
8
- from classiq.interface.generator.parameters import ParameterFloatType
9
-
10
- from classiq.exceptions import ClassiqValueError
8
+ from classiq.interface.generator.function_params import (
9
+ FunctionParams,
10
+ FunctionParamsNumericParameter,
11
+ )
11
12
 
12
13
  CTRL = "CTRL"
13
14
  TARGET = "TARGET"
@@ -30,17 +31,17 @@ class Mcu(FunctionParams):
30
31
  e^(i*phi)*sin(theta/2) & e^(i*(phi+lam))*cos(theta/2) \\
31
32
  """
32
33
 
33
- theta: ParameterFloatType = pydantic.Field(
34
- default=0, description="Theta radian angle.", is_exec_param=True
34
+ theta: FunctionParamsNumericParameter = pydantic.Field(
35
+ default=0, description="Theta radian angle."
35
36
  )
36
- phi: ParameterFloatType = pydantic.Field(
37
- default=0, description="Phi radian angle.", is_exec_param=True
37
+ phi: FunctionParamsNumericParameter = pydantic.Field(
38
+ default=0, description="Phi radian angle."
38
39
  )
39
- lam: ParameterFloatType = pydantic.Field(
40
- default=0, description="Lambda radian angle.", is_exec_param=True
40
+ lam: FunctionParamsNumericParameter = pydantic.Field(
41
+ default=0, description="Lambda radian angle."
41
42
  )
42
- gam: ParameterFloatType = pydantic.Field(
43
- default=0, description="gam radian angle.", is_exec_param=True
43
+ gam: FunctionParamsNumericParameter = pydantic.Field(
44
+ default=0, description="gam radian angle."
44
45
  )
45
46
 
46
47
  num_ctrl_qubits: Optional[pydantic.PositiveInt] = pydantic.Field(
@@ -50,8 +51,9 @@ class Mcu(FunctionParams):
50
51
  default=None, description="string of the control state"
51
52
  )
52
53
 
53
- @pydantic.root_validator()
54
- def _validate_control(cls, values: Dict[str, Any]) -> Dict[str, Any]:
54
+ @pydantic.model_validator(mode="before")
55
+ @classmethod
56
+ def _validate_control(cls, values: Any) -> dict[str, Any]:
55
57
  num_ctrl_qubits = values.get("num_ctrl_qubits")
56
58
  ctrl_state = values.get("ctrl_state")
57
59
 
@@ -1,13 +1,13 @@
1
- from typing import Any, Dict, List, 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.arith.register_user_input import RegisterUserInput
6
8
  from classiq.interface.generator.control_state import ControlState
7
9
  from classiq.interface.generator.function_params import FunctionParams
8
10
 
9
- from classiq.exceptions import ClassiqValueError
10
-
11
11
  CTRL = "CTRL_IN"
12
12
  TARGET_QUBIT = "TARGET_QUBIT"
13
13
 
@@ -17,29 +17,34 @@ class Mcx(FunctionParams):
17
17
  multi-controlled x-gate
18
18
  """
19
19
 
20
- arguments: List[RegisterUserInput] = pydantic.Field(
20
+ arguments: list[RegisterUserInput] = pydantic.Field(
21
21
  default_factory=list, description="registers describing the state (ordered)"
22
22
  )
23
23
  num_ctrl_qubits: Optional[pydantic.PositiveInt] = pydantic.Field(
24
- description="number of control qubits"
24
+ description="number of control qubits",
25
+ default=None,
26
+ )
27
+ ctrl_state: str = pydantic.Field(
28
+ default="", description="control state string", validate_default=True
25
29
  )
26
- ctrl_state: str = pydantic.Field(default="", description="control state string")
27
30
 
28
- @pydantic.validator("arguments", always=True)
31
+ @pydantic.field_validator("arguments")
32
+ @classmethod
29
33
  def _validate_argument_names(
30
- cls, arguments: List[RegisterUserInput]
31
- ) -> List[RegisterUserInput]:
32
- register_name_list: List[Optional[str]] = [arg.name for arg in arguments]
34
+ cls, arguments: list[RegisterUserInput]
35
+ ) -> list[RegisterUserInput]:
36
+ register_name_list: list[Optional[str]] = [arg.name for arg in arguments]
33
37
  if None in register_name_list:
34
38
  raise ClassiqValueError("All registers must be named")
35
39
  if len(set(register_name_list)) != len(register_name_list):
36
40
  raise ClassiqValueError("Registers must have distinct names")
37
41
  return arguments
38
42
 
39
- @pydantic.validator("num_ctrl_qubits", always=True)
40
- def _validate_sizes(cls, num_ctrl_qubits: int, values: Dict[str, Any]) -> int:
43
+ @pydantic.model_validator(mode="before")
44
+ @classmethod
45
+ def _validate_sizes(cls, values: dict[str, Any]) -> dict[str, Any]:
41
46
  arguments_size = sum(arg.size for arg in values.get("arguments", list()))
42
-
47
+ num_ctrl_qubits = values.get("num_ctrl_qubits")
43
48
  if not num_ctrl_qubits:
44
49
  num_ctrl_qubits = arguments_size - 1
45
50
 
@@ -52,11 +57,13 @@ class Mcx(FunctionParams):
52
57
  values["arguments"] = [ctrl_register, target_register]
53
58
  elif num_ctrl_qubits != arguments_size - 1:
54
59
  raise ClassiqValueError("Given sizes do not match")
55
- return num_ctrl_qubits
60
+ values["num_ctrl_qubits"] = num_ctrl_qubits
61
+ return values
56
62
 
57
- @pydantic.validator("ctrl_state", always=True)
58
- def _validate_ctrl_state(cls, ctrl_state: str, values: Dict[str, Any]) -> str:
59
- num_ctrl_qubits = values.get("num_ctrl_qubits", -1)
63
+ @pydantic.field_validator("ctrl_state")
64
+ @classmethod
65
+ def _validate_ctrl_state(cls, ctrl_state: str, info: ValidationInfo) -> str:
66
+ num_ctrl_qubits = info.data.get("num_ctrl_qubits", -1)
60
67
  if not ctrl_state:
61
68
  return "1" * num_ctrl_qubits
62
69
  if len(ctrl_state) != num_ctrl_qubits: