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,7 +1,9 @@
1
- from typing import Any, Dict, Literal, Optional, Union
1
+ from typing import Literal, Optional, 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.control_state import ControlState
7
9
  from classiq.interface.generator.standard_gates.standard_gates import (
@@ -9,8 +11,6 @@ from classiq.interface.generator.standard_gates.standard_gates import (
9
11
  _StandardGate,
10
12
  )
11
13
 
12
- from classiq.exceptions import ClassiqValueError
13
-
14
14
  CONTROLLED_GATE_CONTROL: str = "CTRL"
15
15
  CONTROLLED_GATE_TARGET: str = DEFAULT_STANDARD_GATE_ARG_NAME
16
16
  DEFAULT_NUM_CTRL_QUBITS: int = 1
@@ -26,37 +26,20 @@ class ControlledGate(_StandardGate): # type: ignore[misc]
26
26
  num_ctrl_qubits: pydantic.PositiveInt = pydantic.Field(
27
27
  default=DEFAULT_NUM_CTRL_QUBITS
28
28
  )
29
-
30
- def _create_ios(self) -> None:
31
- _StandardGate._create_ios(self)
32
- control = RegisterUserInput(
33
- name=CONTROLLED_GATE_CONTROL, size=self.num_ctrl_qubits
34
- )
35
- self._inputs[CONTROLLED_GATE_CONTROL] = control
36
- self._outputs[CONTROLLED_GATE_CONTROL] = control
37
-
38
- def to_control_state(self) -> ControlState:
39
- return ControlState(
40
- name=CONTROLLED_GATE_CONTROL, num_ctrl_qubits=self.num_ctrl_qubits
41
- )
42
-
43
-
44
- class ControlledGateWithState(ControlledGate): # type: ignore[misc]
45
- """
46
- Base model for controlled Gates with control over the controlled_state
47
- """
48
-
49
29
  ctrl_state: CtrlState = pydantic.Field(
50
30
  description="The control state in decimal or as a bit string (e.g. '1011'). If not specified, the control "
51
31
  "state is 2**num_ctrl_qubits - 1.\n"
52
- "The gate will be performed if the state of the control qubits matches the control state"
32
+ "The gate will be performed if the state of the control qubits matches the control state",
33
+ default=None,
34
+ validate_default=True,
53
35
  )
54
36
 
55
- @pydantic.validator("ctrl_state", always=True)
37
+ @pydantic.field_validator("ctrl_state")
38
+ @classmethod
56
39
  def _validate_ctrl_state(
57
- cls, ctrl_state: CtrlState, values: Dict[str, Any]
40
+ cls, ctrl_state: CtrlState, info: ValidationInfo
58
41
  ) -> CtrlState:
59
- num_ctrl_qubits: int = values.get("num_ctrl_qubits", DEFAULT_NUM_CTRL_QUBITS)
42
+ num_ctrl_qubits: int = info.data.get("num_ctrl_qubits", DEFAULT_NUM_CTRL_QUBITS)
60
43
  ctrl_state = ctrl_state if ctrl_state is not None else "1" * num_ctrl_qubits
61
44
 
62
45
  if isinstance(ctrl_state, str) and len(ctrl_state) != num_ctrl_qubits:
@@ -79,12 +62,20 @@ class ControlledGateWithState(ControlledGate): # type: ignore[misc]
79
62
  )
80
63
  return ControlState(name=CONTROLLED_GATE_CONTROL, ctrl_state=ctrl_state_str)
81
64
 
65
+ def _create_ios(self) -> None:
66
+ _StandardGate._create_ios(self)
67
+ control = RegisterUserInput(
68
+ name=CONTROLLED_GATE_CONTROL, size=self.num_ctrl_qubits
69
+ )
70
+ self._inputs[CONTROLLED_GATE_CONTROL] = control
71
+ self._outputs[CONTROLLED_GATE_CONTROL] = control
72
+
82
73
 
83
74
  def _num_to_control_string(ctrl_state_int: int, num_ctrl_qubits: int) -> str:
84
75
  return format(ctrl_state_int, f"0{num_ctrl_qubits}b")
85
76
 
86
77
 
87
- class CXGate(ControlledGateWithState): # type: ignore[misc]
78
+ class CXGate(ControlledGate): # type: ignore[misc]
88
79
  """
89
80
  The Controlled-X Gate
90
81
  """
@@ -95,7 +86,7 @@ class CXGate(ControlledGateWithState): # type: ignore[misc]
95
86
  return 2
96
87
 
97
88
 
98
- class CCXGate(ControlledGateWithState): # type: ignore[misc]
89
+ class CCXGate(ControlledGate): # type: ignore[misc]
99
90
  """
100
91
  The Double Controlled-X Gate
101
92
  """
@@ -106,7 +97,7 @@ class CCXGate(ControlledGateWithState): # type: ignore[misc]
106
97
  return 2
107
98
 
108
99
 
109
- class C3XGate(ControlledGateWithState): # type: ignore[misc]
100
+ class C3XGate(ControlledGate): # type: ignore[misc]
110
101
  """
111
102
  The X Gate controlled on 3 qubits
112
103
  """
@@ -118,7 +109,7 @@ class C3XGate(ControlledGateWithState): # type: ignore[misc]
118
109
  return 2
119
110
 
120
111
 
121
- class C4XGate(ControlledGateWithState): # type: ignore[misc]
112
+ class C4XGate(ControlledGate): # type: ignore[misc]
122
113
  """
123
114
  The X Gate controlled on 4 qubits
124
115
  """
@@ -130,7 +121,7 @@ class C4XGate(ControlledGateWithState): # type: ignore[misc]
130
121
  return 2
131
122
 
132
123
 
133
- class CYGate(ControlledGateWithState): # type: ignore[misc]
124
+ class CYGate(ControlledGate): # type: ignore[misc]
134
125
  """
135
126
  The Controlled-Y Gate
136
127
  """
@@ -139,7 +130,7 @@ class CYGate(ControlledGateWithState): # type: ignore[misc]
139
130
  return 2
140
131
 
141
132
 
142
- class CZGate(ControlledGateWithState): # type: ignore[misc]
133
+ class CZGate(ControlledGate): # type: ignore[misc]
143
134
  """
144
135
  The Controlled-Z Gate
145
136
  """
@@ -148,7 +139,7 @@ class CZGate(ControlledGateWithState): # type: ignore[misc]
148
139
  return 2
149
140
 
150
141
 
151
- class CHGate(ControlledGateWithState): # type: ignore[misc]
142
+ class CHGate(ControlledGate): # type: ignore[misc]
152
143
  """
153
144
  The Controlled-H Gate
154
145
  """
@@ -157,7 +148,7 @@ class CHGate(ControlledGateWithState): # type: ignore[misc]
157
148
  return 2
158
149
 
159
150
 
160
- class CSXGate(ControlledGateWithState): # type: ignore[misc]
151
+ class CSXGate(ControlledGate): # type: ignore[misc]
161
152
  """
162
153
  The Controlled-SX Gate
163
154
  """
@@ -166,25 +157,25 @@ class CSXGate(ControlledGateWithState): # type: ignore[misc]
166
157
  return 4
167
158
 
168
159
 
169
- class CRXGate(ControlledGateWithState, angles=["theta"]): # type: ignore[misc]
160
+ class CRXGate(ControlledGate, angles=["theta"]): # type: ignore[misc]
170
161
  """
171
162
  The Controlled-RX Gate
172
163
  """
173
164
 
174
165
 
175
- class CRYGate(ControlledGateWithState, angles=["theta"]): # type: ignore[misc]
166
+ class CRYGate(ControlledGate, angles=["theta"]): # type: ignore[misc]
176
167
  """
177
168
  The Controlled-RY Gate
178
169
  """
179
170
 
180
171
 
181
- class CRZGate(ControlledGateWithState, angles=["theta"]): # type: ignore[misc]
172
+ class CRZGate(ControlledGate, angles=["theta"]): # type: ignore[misc]
182
173
  """
183
174
  The Controlled-RZ Gate
184
175
  """
185
176
 
186
177
 
187
- class CPhaseGate(ControlledGateWithState, angles=["theta"]): # type: ignore[misc]
178
+ class CPhaseGate(ControlledGate, angles=["theta"]): # type: ignore[misc]
188
179
  """
189
180
  The Controlled-Phase Gate
190
181
  """
@@ -2,7 +2,7 @@ from typing import Any
2
2
 
3
3
  import pydantic
4
4
 
5
- from classiq.interface.generator.parameters import ParameterFloatType
5
+ from classiq.interface.generator.function_params import FunctionParamsNumericParameter
6
6
 
7
7
  PydanticMetaClass: Any = type(pydantic.BaseModel)
8
8
 
@@ -16,14 +16,10 @@ class MyMetaAngledClass(type):
16
16
  @staticmethod
17
17
  def _create_new_namespace(namespace: dict, **kwargs: Any) -> dict:
18
18
  angles = kwargs.get("angles", [])
19
- annotations = {angle: ParameterFloatType for angle in angles}
20
- fields = {
21
- angle: pydantic.fields.FieldInfo(is_exec_param=True) for angle in angles
22
- }
19
+ annotations = {angle: FunctionParamsNumericParameter for angle in angles}
23
20
  original_annotations = namespace.get("__annotations__", {})
24
21
  return {
25
22
  **namespace,
26
- **fields,
27
23
  **{"__annotations__": {**original_annotations, **annotations}},
28
24
  }
29
25
 
@@ -1,4 +1,4 @@
1
- from typing import Any, List, Literal, Optional
1
+ from typing import Any, Literal, Optional
2
2
 
3
3
  import pydantic
4
4
 
@@ -13,7 +13,7 @@ To add new standard gates, refer to the following guide
13
13
  https://docs.google.com/document/d/1Nt9frxnPkSn8swNpOQ983E95eaEiDWaiuWAKglGtUAA/edit#heading=h.e9g9309bzkxt
14
14
  """
15
15
 
16
- _POSSIBLE_PARAMETERS: List[str] = ["theta", "phi", "lam"]
16
+ _POSSIBLE_PARAMETERS: list[str] = ["theta", "phi", "lam"]
17
17
  DEFAULT_STANDARD_GATE_ARG_NAME: str = "TARGET"
18
18
 
19
19
 
@@ -39,7 +39,7 @@ class _StandardGate(FunctionParams, metaclass=MyMetaAngledClassModel): # type:
39
39
  return self._num_target_qubits
40
40
 
41
41
  def __init_subclass__(
42
- cls, angles: Optional[List[str]] = None, **kwargs: Any
42
+ cls, angles: Optional[list[str]] = None, **kwargs: Any
43
43
  ) -> None:
44
44
  super().__init_subclass__(**kwargs)
45
45
 
@@ -2,7 +2,7 @@ import pydantic
2
2
 
3
3
  from classiq.interface.generator import function_params
4
4
  from classiq.interface.generator.arith.register_user_input import RegisterUserInput
5
- from classiq.interface.generator.parameters import ParameterFloatType
5
+ from classiq.interface.generator.function_params import FunctionParamsNumericParameter
6
6
  from classiq.interface.generator.standard_gates.standard_gates import (
7
7
  DEFAULT_STANDARD_GATE_ARG_NAME,
8
8
  )
@@ -18,24 +18,20 @@ class UGate(function_params.FunctionParams):
18
18
  e^(i*phi)*sin(theta/2) & e^(i*(phi+lam))*cos(theta/2) \\
19
19
  """
20
20
 
21
- theta: ParameterFloatType = pydantic.Field(
21
+ theta: FunctionParamsNumericParameter = pydantic.Field(
22
22
  description="Angle to rotate by the Y-axis.",
23
- is_exec_param=True,
24
23
  )
25
24
 
26
- phi: ParameterFloatType = pydantic.Field(
25
+ phi: FunctionParamsNumericParameter = pydantic.Field(
27
26
  description="First angle to rotate by the Z-axis.",
28
- is_exec_param=True,
29
27
  )
30
28
 
31
- lam: ParameterFloatType = pydantic.Field(
29
+ lam: FunctionParamsNumericParameter = pydantic.Field(
32
30
  description="Second angle to rotate by the Z-axis.",
33
- is_exec_param=True,
34
31
  )
35
32
 
36
- gam: ParameterFloatType = pydantic.Field(
33
+ gam: FunctionParamsNumericParameter = pydantic.Field(
37
34
  description="Angle to apply phase gate by.",
38
- is_exec_param=True,
39
35
  )
40
36
 
41
37
  _inputs = pydantic.PrivateAttr(
@@ -56,5 +52,6 @@ class UGate(function_params.FunctionParams):
56
52
  @property
57
53
  def is_parametric(self) -> bool:
58
54
  return not all(
59
- isinstance(getattr(self, angle), (float, int)) for angle in self._params
55
+ isinstance(getattr(self, angle), (float, int))
56
+ for angle in ["theta", "phi", "lam", "gam"]
60
57
  )
@@ -1,4 +1,4 @@
1
- from typing import FrozenSet, Literal
1
+ from typing import Literal
2
2
 
3
3
  import pydantic
4
4
 
@@ -7,8 +7,8 @@ from classiq.interface.generator.state_preparation.state_preparation_abc import
7
7
  )
8
8
 
9
9
  BellStateName = Literal["psi+", "psi-", "phi+", "phi-"]
10
- _ALIGNED_STATES: FrozenSet[BellStateName] = frozenset({"phi+", "phi-"})
11
- _SIGNED_STATES: FrozenSet[BellStateName] = frozenset({"psi-", "phi-"})
10
+ _ALIGNED_STATES: frozenset[BellStateName] = frozenset({"phi+", "phi-"})
11
+ _SIGNED_STATES: frozenset[BellStateName] = frozenset({"psi-", "phi-"})
12
12
 
13
13
 
14
14
  class BellStatePreparation(StatePreparationABC):
@@ -12,7 +12,8 @@ class ComputationalBasisStatePreparation(StatePreparationABC):
12
12
  description="binary computational state to create"
13
13
  )
14
14
 
15
- @pydantic.validator("computational_state")
15
+ @pydantic.field_validator("computational_state")
16
+ @classmethod
16
17
  def _validate_computational_state(
17
18
  cls, computational_state: PydanticNonEmptyString
18
19
  ) -> PydanticNonEmptyString:
@@ -1,7 +1,9 @@
1
- from typing import Collection, Tuple, Union
1
+ from collections.abc import Collection, Sequence
2
+ from typing import Union
2
3
 
3
4
  import pydantic
4
5
  from numpy.typing import ArrayLike
6
+ from pydantic import ConfigDict
5
7
 
6
8
  from classiq.interface.generator.validations.validator_functions import (
7
9
  validate_probabilities,
@@ -10,36 +12,35 @@ from classiq.interface.helpers.custom_pydantic_types import PydanticProbabilityF
10
12
 
11
13
 
12
14
  class PMF(pydantic.BaseModel):
13
- pmf: Tuple[PydanticProbabilityFloat, ...]
14
- _validate_amplitudes = pydantic.validator("pmf", allow_reuse=True)(
15
- validate_probabilities
16
- )
15
+ pmf: tuple[PydanticProbabilityFloat, ...]
16
+
17
+ @pydantic.field_validator("pmf")
18
+ @classmethod
19
+ def _validate_pmf(
20
+ cls, pmf: tuple[PydanticProbabilityFloat, ...]
21
+ ) -> Sequence[PydanticProbabilityFloat]:
22
+ return validate_probabilities(cls, pmf)
17
23
 
18
- class Config:
19
- frozen = True
24
+ model_config = ConfigDict(frozen=True)
20
25
 
21
26
 
22
27
  class GaussianMoments(pydantic.BaseModel):
23
28
  mu: float
24
29
  sigma: pydantic.PositiveFloat
25
-
26
- class Config:
27
- frozen = True
30
+ model_config = ConfigDict(frozen=True)
28
31
 
29
32
 
30
33
  class GaussianMixture(pydantic.BaseModel):
31
- gaussian_moment_list: Tuple[GaussianMoments, ...]
34
+ gaussian_moment_list: tuple[GaussianMoments, ...]
32
35
  num_qubits: pydantic.PositiveInt = pydantic.Field(
33
36
  description="Number of qubits for the provided state."
34
37
  )
35
-
36
- class Config:
37
- frozen = True
38
+ model_config = ConfigDict(frozen=True)
38
39
 
39
40
 
40
41
  Probabilities = Union[PMF, GaussianMixture]
41
42
  FlexibleProbabilities = Union[Probabilities, ArrayLike, dict, Collection[float]]
42
- Amplitudes = Tuple[float, ...]
43
+ Amplitudes = tuple[float, ...]
43
44
  FlexibleAmplitudes = Union[ArrayLike, Collection[float]]
44
45
  Distribution = Union[Amplitudes, Probabilities]
45
46
 
@@ -1,17 +1,14 @@
1
- from typing import FrozenSet
2
-
1
+ from classiq.interface.enum_utils import StrEnum
2
+ from classiq.interface.exceptions import ClassiqValueError
3
3
  from classiq.interface.generator.preferences.optimization import (
4
4
  StatePrepOptimizationMethod,
5
5
  )
6
6
 
7
- from classiq._internals.enum_utils import StrEnum
8
- from classiq.exceptions import ClassiqValueError
9
-
10
- _AMPLITUDE_SUPPORTING_METRICS: FrozenSet = frozenset(
7
+ _AMPLITUDE_SUPPORTING_METRICS: frozenset = frozenset(
11
8
  {"L2", "L1", "MAX_PROBABILITY", "TOTAL_VARIATION"}
12
9
  )
13
10
 
14
- _ZERO_DIVERGENT_METRICS: FrozenSet = frozenset({"KL", "BHATTACHARYYA"})
11
+ _ZERO_DIVERGENT_METRICS: frozenset = frozenset({"KL", "BHATTACHARYYA"})
15
12
 
16
13
 
17
14
  class Metrics(StrEnum):
@@ -1,8 +1,11 @@
1
- from typing import Any, Dict, Optional, Union
1
+ from typing import Optional, Union
2
2
 
3
3
  import numpy as np
4
4
  import pydantic
5
+ from pydantic_core.core_schema import ValidationInfo
6
+ from typing_extensions import Self
5
7
 
8
+ from classiq.interface.exceptions import ClassiqValueError
6
9
  from classiq.interface.generator.range_types import NonNegativeFloatRange
7
10
  from classiq.interface.generator.state_preparation.distributions import (
8
11
  PMF,
@@ -21,24 +24,27 @@ from classiq.interface.generator.validations.validator_functions import (
21
24
  validate_amplitudes,
22
25
  )
23
26
 
24
- from classiq.exceptions import ClassiqValueError
25
-
26
27
 
27
28
  class StatePreparation(StatePreparationABC):
28
29
  amplitudes: Optional[Amplitudes] = pydantic.Field(
29
- description="vector of probabilities", default=None
30
+ description="vector of probabilities",
31
+ default=None,
32
+ validate_default=True,
30
33
  )
31
34
  probabilities: Optional[Probabilities] = pydantic.Field(
32
- description="vector of amplitudes", default=None
35
+ description="vector of amplitudes",
36
+ default=None,
37
+ validate_default=True,
33
38
  )
34
- error_metric: Dict[Metrics, NonNegativeFloatRange] = pydantic.Field(
39
+ error_metric: dict[Metrics, NonNegativeFloatRange] = pydantic.Field(
35
40
  default_factory=lambda: {
36
41
  Metrics.L2: NonNegativeFloatRange(lower_bound=0, upper_bound=1e-4)
37
42
  }
38
43
  )
39
44
  # The order of validations is important: amplitudes, probabilities, error_metric
40
45
 
41
- @pydantic.validator("amplitudes", always=True, pre=True)
46
+ @pydantic.field_validator("amplitudes", mode="before")
47
+ @classmethod
42
48
  def _initialize_amplitudes(
43
49
  cls, amplitudes: Optional[FlexibleAmplitudes]
44
50
  ) -> Optional[Amplitudes]:
@@ -52,7 +58,8 @@ class StatePreparation(StatePreparationABC):
52
58
  "Invalid amplitudes were given, please ensure the amplitude is a vector of float in the form of either tuple or list or numpy array"
53
59
  )
54
60
 
55
- @pydantic.validator("probabilities", always=True, pre=True)
61
+ @pydantic.field_validator("probabilities", mode="before")
62
+ @classmethod
56
63
  def _initialize_probabilities(
57
64
  cls, probabilities: Optional[FlexibleProbabilities]
58
65
  ) -> Optional[Union[PMF, GaussianMixture, dict]]:
@@ -70,11 +77,12 @@ class StatePreparation(StatePreparationABC):
70
77
  "Invalid probabilities were given, please ensure the probabilities is a vector of float in the form of either tuple or list or numpy array"
71
78
  )
72
79
 
73
- @pydantic.validator("error_metric", always=True, pre=True)
80
+ @pydantic.field_validator("error_metric", mode="before")
81
+ @classmethod
74
82
  def _validate_error_metric(
75
- cls, error_metric: Dict[Metrics, NonNegativeFloatRange], values: Dict[str, Any]
76
- ) -> Dict[Metrics, NonNegativeFloatRange]:
77
- if not values.get("amplitudes"):
83
+ cls, error_metric: dict[Metrics, NonNegativeFloatRange], info: ValidationInfo
84
+ ) -> dict[Metrics, NonNegativeFloatRange]:
85
+ if not info.data.get("amplitudes"):
78
86
  return error_metric
79
87
  unsupported_metrics = {
80
88
  Metrics(metric).value
@@ -87,18 +95,15 @@ class StatePreparation(StatePreparationABC):
87
95
  )
88
96
  return error_metric
89
97
 
90
- @pydantic.root_validator
91
- def _validate_either_probabilities_or_amplitudes(
92
- cls,
93
- values: Dict[str, Any],
94
- ) -> Optional[Union[PMF, GaussianMixture, dict]]:
95
- amplitudes = values.get("amplitudes")
96
- probabilities = values.get("probabilities")
98
+ @pydantic.model_validator(mode="after")
99
+ def _validate_either_probabilities_or_amplitudes(self) -> Self:
100
+ amplitudes = self.amplitudes
101
+ probabilities = self.probabilities
97
102
  if amplitudes is not None and probabilities is not None:
98
103
  raise ClassiqValueError(
99
104
  "StatePreparation can't get both probabilities and amplitudes"
100
105
  )
101
- return values
106
+ return self
102
107
 
103
108
  @property
104
109
  def num_state_qubits(self) -> int:
@@ -1,10 +1,7 @@
1
- from typing import Optional
2
-
3
1
  import pydantic
4
2
 
5
3
 
6
4
  class SynthesisStepDurations(pydantic.BaseModel):
7
- model_preprocessing: Optional[float] = None
8
5
  preprocessing: float
9
6
  solving: float
10
7
  conversion_to_circuit: float
@@ -14,7 +11,6 @@ class SynthesisStepDurations(pydantic.BaseModel):
14
11
  return sum(
15
12
  time if time is not None else 0
16
13
  for time in (
17
- self.model_preprocessing,
18
14
  self.preprocessing,
19
15
  self.solving,
20
16
  self.conversion_to_circuit,
@@ -1,25 +1,39 @@
1
- from typing import Dict, Optional, Set
1
+ from typing import Optional
2
2
 
3
3
  import pydantic
4
+ import sympy
4
5
 
5
6
  from classiq.interface.backend.pydantic_backend import PydanticExecutionParameter
7
+ from classiq.interface.exceptions import ClassiqValueError
8
+ from classiq.interface.generator.parameters import ParameterType
6
9
 
7
10
 
8
11
  class FunctionExecutionData(pydantic.BaseModel):
9
- power_parameter: Optional[PydanticExecutionParameter] = pydantic.Field(default=None)
12
+ power_parameter: Optional[ParameterType] = pydantic.Field(default=None)
13
+
14
+ @property
15
+ def power_var(self) -> Optional[str]:
16
+ if self.power_parameter is None:
17
+ return None
18
+ power_vars = sympy.sympify(self.power_parameter).free_symbols
19
+ if len(power_vars) != 1:
20
+ raise ClassiqValueError(
21
+ f"Power parameter expression: {self.power_parameter} must contain exactly one variable"
22
+ )
23
+ return str(list(power_vars)[0])
10
24
 
11
25
 
12
26
  class ExecutionData(pydantic.BaseModel):
13
- function_execution: Dict[str, FunctionExecutionData] = pydantic.Field(
27
+ function_execution: dict[str, FunctionExecutionData] = pydantic.Field(
14
28
  default_factory=dict
15
29
  )
16
30
 
17
31
  @property
18
32
  def execution_parameters(
19
33
  self,
20
- ) -> Set[PydanticExecutionParameter]:
34
+ ) -> set[PydanticExecutionParameter]:
21
35
  return {
22
- function_execution_data.power_parameter
36
+ function_execution_data.power_var
23
37
  for function_execution_data in self.function_execution.values()
24
- if function_execution_data.power_parameter is not None
38
+ if function_execution_data.power_var is not None
25
39
  }
@@ -1,10 +1,10 @@
1
- from typing import TYPE_CHECKING, FrozenSet, Optional
1
+ from typing import TYPE_CHECKING, Optional
2
2
 
3
3
  from typing_extensions import TypeAlias
4
4
 
5
- from classiq._internals.enum_utils import StrEnum
5
+ from classiq.interface.enum_utils import StrEnum
6
6
 
7
- BasisGates: TypeAlias = FrozenSet[str]
7
+ BasisGates: TypeAlias = frozenset[str]
8
8
 
9
9
  SINGLE_QUBIT_GATES: BasisGates = frozenset(
10
10
  (
@@ -86,6 +86,10 @@ class LowerValsEnum(StrEnum):
86
86
  if TYPE_CHECKING:
87
87
  # A subset of the gates for better type checking
88
88
  class TranspilerBasisGates(StrEnum):
89
+ """
90
+ A subset of the gates used in the transpiler.
91
+ """
92
+
89
93
  X = "x"
90
94
  CX = "cx"
91
95
  CZ = "cz"