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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (516) hide show
  1. classiq/__init__.py +49 -34
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +3 -2
  3. classiq/_analyzer_extras/interactive_hardware.py +3 -3
  4. classiq/_internals/api_wrapper.py +241 -95
  5. classiq/_internals/async_utils.py +2 -77
  6. classiq/_internals/authentication/auth0.py +26 -10
  7. classiq/_internals/authentication/authentication.py +11 -0
  8. classiq/_internals/authentication/device.py +18 -8
  9. classiq/_internals/authentication/password_manager.py +40 -13
  10. classiq/_internals/authentication/token_manager.py +11 -6
  11. classiq/_internals/client.py +106 -37
  12. classiq/_internals/config.py +3 -4
  13. classiq/_internals/host_checker.py +38 -15
  14. classiq/_internals/jobs.py +56 -50
  15. classiq/_internals/type_validation.py +9 -9
  16. classiq/analyzer/__init__.py +1 -3
  17. classiq/analyzer/analyzer.py +50 -47
  18. classiq/analyzer/analyzer_utilities.py +15 -15
  19. classiq/analyzer/rb.py +19 -20
  20. classiq/analyzer/show_interactive_hack.py +30 -7
  21. classiq/analyzer/url_utils.py +2 -3
  22. classiq/applications/__init__.py +3 -12
  23. classiq/applications/chemistry/__init__.py +14 -10
  24. classiq/applications/chemistry/ansatz_parameters.py +4 -4
  25. classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +170 -170
  26. classiq/applications/chemistry/ground_state_problem.py +1 -1
  27. classiq/applications/combinatorial_helpers/allowed_constraints.py +23 -0
  28. classiq/applications/combinatorial_helpers/arithmetic/arithmetic_expression.py +35 -0
  29. classiq/applications/combinatorial_helpers/arithmetic/isolation.py +42 -0
  30. classiq/applications/combinatorial_helpers/combinatorial_problem_utils.py +166 -0
  31. classiq/applications/combinatorial_helpers/encoding_mapping.py +107 -0
  32. classiq/applications/combinatorial_helpers/encoding_utils.py +124 -0
  33. classiq/applications/combinatorial_helpers/memory.py +75 -0
  34. classiq/applications/combinatorial_helpers/optimization_model.py +193 -0
  35. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +31 -0
  36. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
  37. classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
  38. classiq/applications/combinatorial_helpers/sympy_utils.py +22 -0
  39. classiq/applications/combinatorial_helpers/transformations/encoding.py +189 -0
  40. classiq/applications/combinatorial_helpers/transformations/fixed_variables.py +143 -0
  41. classiq/applications/combinatorial_helpers/transformations/ising_converter.py +120 -0
  42. classiq/applications/combinatorial_helpers/transformations/penalty.py +31 -0
  43. classiq/applications/combinatorial_helpers/transformations/penalty_support.py +37 -0
  44. classiq/applications/combinatorial_helpers/transformations/sign_seperation.py +74 -0
  45. classiq/applications/combinatorial_helpers/transformations/slack_variables.py +87 -0
  46. classiq/applications/combinatorial_optimization/__init__.py +24 -5
  47. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
  48. classiq/applications/combinatorial_optimization/combinatorial_optimization_model_constructor.py +137 -0
  49. classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
  50. classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
  51. classiq/applications/finance/__init__.py +4 -5
  52. classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +50 -57
  53. classiq/applications/grover/__init__.py +9 -0
  54. classiq/applications/grover/grover_model_constructor.py +157 -0
  55. classiq/applications/hamiltonian/__init__.py +0 -0
  56. classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
  57. classiq/applications/libraries/__init__.py +0 -0
  58. classiq/applications/libraries/qmci_library.py +22 -0
  59. classiq/applications/qnn/__init__.py +2 -4
  60. classiq/applications/qnn/circuit_utils.py +8 -8
  61. classiq/applications/qnn/datasets/__init__.py +9 -11
  62. classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
  63. classiq/applications/qnn/datasets/dataset_not.py +2 -1
  64. classiq/applications/qnn/datasets/dataset_parity.py +2 -2
  65. classiq/applications/qnn/gradients/quantum_gradient.py +2 -2
  66. classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
  67. classiq/applications/qnn/qlayer.py +30 -10
  68. classiq/applications/qnn/torch_utils.py +4 -3
  69. classiq/applications/qnn/types.py +7 -7
  70. classiq/applications/qsvm/__init__.py +6 -4
  71. classiq/applications/qsvm/qsvm.py +4 -10
  72. classiq/applications/qsvm/qsvm_data_generation.py +5 -8
  73. classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
  74. classiq/execution/__init__.py +8 -3
  75. classiq/execution/all_hardware_devices.py +11 -0
  76. classiq/execution/execution_session.py +400 -0
  77. classiq/execution/iqcc.py +63 -0
  78. classiq/execution/jobs.py +197 -25
  79. classiq/execution/qnn.py +79 -0
  80. classiq/executor.py +23 -117
  81. classiq/interface/_version.py +1 -1
  82. classiq/interface/analyzer/analysis_params.py +49 -16
  83. classiq/interface/analyzer/cytoscape_graph.py +15 -9
  84. classiq/interface/analyzer/result.py +36 -32
  85. classiq/interface/applications/qsvm.py +28 -25
  86. classiq/interface/ast_node.py +16 -0
  87. classiq/interface/backend/backend_preferences.py +390 -119
  88. classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
  89. classiq/interface/backend/pydantic_backend.py +27 -22
  90. classiq/interface/backend/quantum_backend_providers.py +70 -16
  91. classiq/interface/chemistry/fermionic_operator.py +43 -32
  92. classiq/interface/chemistry/ground_state_problem.py +42 -24
  93. classiq/interface/chemistry/molecule.py +20 -14
  94. classiq/interface/chemistry/operator.py +75 -236
  95. classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
  96. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +2 -4
  97. classiq/interface/combinatorial_optimization/examples/greater_than_ilp.py +1 -1
  98. classiq/interface/combinatorial_optimization/examples/ilp.py +2 -1
  99. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  100. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  101. classiq/interface/combinatorial_optimization/examples/mds.py +2 -1
  102. classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
  103. classiq/interface/combinatorial_optimization/examples/mis.py +4 -1
  104. classiq/interface/combinatorial_optimization/examples/mvc.py +2 -1
  105. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  106. classiq/interface/combinatorial_optimization/examples/set_cover.py +3 -3
  107. classiq/interface/combinatorial_optimization/examples/tsp.py +4 -3
  108. classiq/interface/combinatorial_optimization/examples/tsp_digraph.py +6 -2
  109. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +14 -9
  110. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  111. classiq/interface/combinatorial_optimization/result.py +1 -3
  112. classiq/interface/combinatorial_optimization/solver_types.py +1 -1
  113. classiq/interface/debug_info/__init__.py +0 -0
  114. classiq/interface/debug_info/debug_info.py +86 -0
  115. classiq/interface/exceptions.py +201 -0
  116. classiq/interface/execution/iqcc.py +19 -0
  117. classiq/interface/execution/jobs.py +15 -12
  118. classiq/interface/execution/primitives.py +18 -0
  119. classiq/interface/executor/constants.py +1 -0
  120. classiq/interface/executor/estimation.py +2 -2
  121. classiq/interface/executor/execution_preferences.py +26 -143
  122. classiq/interface/executor/execution_request.py +36 -56
  123. classiq/interface/executor/execution_result.py +30 -8
  124. classiq/interface/executor/iqae_result.py +4 -6
  125. classiq/interface/executor/optimizer_preferences.py +34 -22
  126. classiq/interface/executor/{quantum_program.py → quantum_code.py} +44 -34
  127. classiq/interface/executor/quantum_instruction_set.py +3 -2
  128. classiq/interface/executor/register_initialization.py +12 -17
  129. classiq/interface/executor/result.py +122 -64
  130. classiq/interface/executor/vqe_result.py +11 -11
  131. classiq/interface/finance/function_input.py +42 -19
  132. classiq/interface/finance/gaussian_model_input.py +7 -5
  133. classiq/interface/finance/log_normal_model_input.py +6 -4
  134. classiq/interface/finance/model_input.py +6 -4
  135. classiq/interface/generator/adjacency.py +1 -3
  136. classiq/interface/generator/amplitude_loading.py +27 -14
  137. classiq/interface/generator/ansatz_library.py +5 -5
  138. classiq/interface/generator/application_apis/__init__.py +1 -0
  139. classiq/interface/generator/application_apis/arithmetic_declarations.py +17 -0
  140. classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
  141. classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
  142. classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
  143. classiq/interface/generator/application_apis/finance_declarations.py +48 -69
  144. classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
  145. classiq/interface/generator/arith/argument_utils.py +57 -6
  146. classiq/interface/generator/arith/arithmetic.py +37 -16
  147. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +15 -17
  148. classiq/interface/generator/arith/arithmetic_expression_abc.py +70 -26
  149. classiq/interface/generator/arith/arithmetic_expression_parser.py +18 -12
  150. classiq/interface/generator/arith/arithmetic_expression_validator.py +61 -43
  151. classiq/interface/generator/arith/arithmetic_operations.py +19 -16
  152. classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
  153. classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
  154. classiq/interface/generator/arith/ast_node_rewrite.py +4 -3
  155. classiq/interface/generator/arith/binary_ops.py +375 -139
  156. classiq/interface/generator/arith/endianness.py +1 -1
  157. classiq/interface/generator/arith/extremum_operations.py +96 -23
  158. classiq/interface/generator/arith/logical_ops.py +16 -12
  159. classiq/interface/generator/arith/machine_precision.py +3 -0
  160. classiq/interface/generator/arith/number_utils.py +44 -48
  161. classiq/interface/generator/arith/register_user_input.py +70 -27
  162. classiq/interface/generator/arith/unary_ops.py +57 -46
  163. classiq/interface/generator/arith/uncomputation_methods.py +1 -1
  164. classiq/interface/generator/builtin_api_builder.py +2 -9
  165. classiq/interface/generator/chemistry_function_params.py +5 -5
  166. classiq/interface/generator/circuit_code/circuit_code.py +7 -7
  167. classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
  168. classiq/interface/generator/commuting_pauli_exponentiation.py +8 -6
  169. classiq/interface/generator/compiler_keywords.py +8 -0
  170. classiq/interface/generator/complex_type.py +13 -25
  171. classiq/interface/generator/constant.py +3 -4
  172. classiq/interface/generator/control_state.py +35 -28
  173. classiq/interface/generator/copy.py +47 -0
  174. classiq/interface/generator/custom_ansatz.py +2 -5
  175. classiq/interface/generator/distance.py +3 -5
  176. classiq/interface/generator/excitations.py +3 -2
  177. classiq/interface/generator/expressions/atomic_expression_functions.py +26 -8
  178. classiq/interface/generator/expressions/enums/__init__.py +0 -10
  179. classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
  180. classiq/interface/generator/expressions/evaluated_expression.py +21 -7
  181. classiq/interface/generator/expressions/expression.py +27 -15
  182. classiq/interface/generator/expressions/expression_constants.py +9 -3
  183. classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
  184. classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
  185. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +59 -0
  186. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
  187. classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
  188. classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
  189. classiq/interface/generator/expressions/sympy_supported_expressions.py +20 -11
  190. classiq/interface/generator/finance.py +3 -3
  191. classiq/interface/generator/function_param_library.py +6 -6
  192. classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
  193. classiq/interface/generator/function_params.py +42 -69
  194. classiq/interface/generator/functions/__init__.py +0 -22
  195. classiq/interface/generator/functions/builtins/__init__.py +0 -0
  196. classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
  197. classiq/interface/generator/functions/classical_function_declaration.py +18 -9
  198. classiq/interface/generator/functions/classical_type.py +47 -166
  199. classiq/interface/generator/functions/concrete_types.py +55 -0
  200. classiq/interface/generator/functions/function_declaration.py +13 -14
  201. classiq/interface/generator/functions/port_declaration.py +1 -13
  202. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  203. classiq/interface/generator/functions/type_name.py +90 -0
  204. classiq/interface/generator/generated_circuit_data.py +155 -22
  205. classiq/interface/generator/grover_diffuser.py +32 -25
  206. classiq/interface/generator/grover_operator.py +34 -23
  207. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
  208. classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
  209. classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +12 -8
  210. classiq/interface/generator/hardware/hardware_data.py +76 -36
  211. classiq/interface/generator/hardware_efficient_ansatz.py +38 -17
  212. classiq/interface/generator/hartree_fock.py +14 -4
  213. classiq/interface/generator/identity.py +10 -6
  214. classiq/interface/generator/linear_pauli_rotations.py +33 -19
  215. classiq/interface/generator/mcmt_method.py +1 -1
  216. classiq/interface/generator/mcu.py +20 -16
  217. classiq/interface/generator/mcx.py +29 -20
  218. classiq/interface/generator/model/__init__.py +2 -5
  219. classiq/interface/generator/model/constraints.py +27 -8
  220. classiq/interface/generator/model/model.py +32 -203
  221. classiq/interface/generator/model/preferences/preferences.py +118 -43
  222. classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +27 -22
  223. classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
  224. classiq/interface/generator/oracles/custom_oracle.py +17 -13
  225. classiq/interface/generator/oracles/oracle_abc.py +9 -9
  226. classiq/interface/generator/partitioned_register.py +7 -7
  227. classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
  228. classiq/interface/generator/preferences/optimization.py +1 -2
  229. classiq/interface/generator/qpe.py +47 -34
  230. classiq/interface/generator/qsvm.py +13 -17
  231. classiq/interface/generator/quantum_function_call.py +107 -87
  232. classiq/interface/generator/{generated_circuit.py → quantum_program.py} +50 -37
  233. classiq/interface/generator/range_types.py +13 -12
  234. classiq/interface/generator/register_role.py +18 -6
  235. classiq/interface/generator/slice_parsing_utils.py +11 -6
  236. classiq/interface/generator/standard_gates/controlled_standard_gates.py +32 -39
  237. classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
  238. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  239. classiq/interface/generator/standard_gates/u_gate.py +7 -10
  240. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  241. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
  242. classiq/interface/generator/state_preparation/distributions.py +16 -15
  243. classiq/interface/generator/state_preparation/metrics.py +5 -7
  244. classiq/interface/generator/state_preparation/state_preparation.py +30 -23
  245. classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
  246. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
  247. classiq/interface/generator/transpiler_basis_gates.py +7 -3
  248. classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
  249. classiq/interface/generator/types/compilation_metadata.py +6 -0
  250. classiq/interface/generator/types/enum_declaration.py +54 -0
  251. classiq/interface/generator/types/qstruct_declaration.py +18 -0
  252. classiq/interface/generator/types/struct_declaration.py +15 -14
  253. classiq/interface/generator/ucc.py +9 -6
  254. classiq/interface/generator/unitary_gate.py +10 -6
  255. classiq/interface/generator/user_defined_function_params.py +4 -1
  256. classiq/interface/generator/validations/flow_graph.py +11 -9
  257. classiq/interface/generator/validations/validator_functions.py +8 -6
  258. classiq/interface/generator/visitor.py +23 -16
  259. classiq/interface/hardware.py +31 -10
  260. classiq/interface/helpers/classproperty.py +8 -0
  261. classiq/interface/helpers/custom_encoders.py +3 -0
  262. classiq/interface/helpers/custom_pydantic_types.py +40 -50
  263. classiq/interface/helpers/datastructures.py +26 -0
  264. classiq/interface/helpers/hashable_mixin.py +3 -2
  265. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  266. classiq/interface/helpers/pydantic_model_helpers.py +7 -11
  267. classiq/interface/helpers/validation_helpers.py +4 -21
  268. classiq/interface/helpers/versioned_model.py +1 -1
  269. classiq/interface/ide/ide_data.py +16 -20
  270. classiq/interface/ide/visual_model.py +130 -0
  271. classiq/interface/interface_version.py +1 -0
  272. classiq/interface/jobs.py +35 -6
  273. classiq/interface/model/allocate.py +16 -0
  274. classiq/interface/model/bind_operation.py +44 -14
  275. classiq/interface/model/classical_if.py +15 -0
  276. classiq/interface/model/classical_parameter_declaration.py +33 -3
  277. classiq/interface/model/control.py +45 -0
  278. classiq/interface/model/handle_binding.py +298 -20
  279. classiq/interface/model/inplace_binary_operation.py +31 -26
  280. classiq/interface/model/invert.py +12 -0
  281. classiq/interface/model/model.py +87 -73
  282. classiq/interface/model/native_function_definition.py +16 -21
  283. classiq/interface/model/parameter.py +13 -0
  284. classiq/interface/model/phase_operation.py +11 -0
  285. classiq/interface/model/port_declaration.py +27 -9
  286. classiq/interface/model/power.py +14 -0
  287. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +38 -21
  288. classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
  289. classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
  290. classiq/interface/model/quantum_function_call.py +146 -462
  291. classiq/interface/model/quantum_function_declaration.py +193 -152
  292. classiq/interface/model/quantum_lambda_function.py +65 -0
  293. classiq/interface/model/quantum_statement.py +71 -12
  294. classiq/interface/model/quantum_type.py +205 -67
  295. classiq/interface/model/quantum_variable_declaration.py +4 -26
  296. classiq/interface/model/repeat.py +15 -0
  297. classiq/interface/model/statement_block.py +58 -0
  298. classiq/interface/model/validation_handle.py +13 -6
  299. classiq/interface/model/variable_declaration_statement.py +3 -1
  300. classiq/interface/model/within_apply_operation.py +13 -0
  301. classiq/interface/pyomo_extension/pyomo_sympy_bimap.py +4 -1
  302. classiq/interface/server/global_versions.py +6 -7
  303. classiq/interface/server/routes.py +22 -21
  304. classiq/interface/source_reference.py +59 -0
  305. classiq/model_expansions/__init__.py +0 -0
  306. classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
  307. classiq/model_expansions/capturing/__init__.py +0 -0
  308. classiq/model_expansions/capturing/captured_vars.py +435 -0
  309. classiq/model_expansions/capturing/mangling_utils.py +56 -0
  310. classiq/model_expansions/closure.py +171 -0
  311. classiq/model_expansions/debug_flag.py +3 -0
  312. classiq/model_expansions/evaluators/__init__.py +0 -0
  313. classiq/model_expansions/evaluators/arg_type_match.py +158 -0
  314. classiq/model_expansions/evaluators/argument_types.py +42 -0
  315. classiq/model_expansions/evaluators/classical_expression.py +36 -0
  316. classiq/model_expansions/evaluators/control.py +144 -0
  317. classiq/model_expansions/evaluators/parameter_types.py +226 -0
  318. classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
  319. classiq/model_expansions/evaluators/type_type_match.py +90 -0
  320. classiq/model_expansions/expression_evaluator.py +135 -0
  321. classiq/model_expansions/expression_renamer.py +76 -0
  322. classiq/model_expansions/function_builder.py +247 -0
  323. classiq/model_expansions/generative_functions.py +158 -0
  324. classiq/model_expansions/interpreters/__init__.py +0 -0
  325. classiq/model_expansions/interpreters/base_interpreter.py +263 -0
  326. classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
  327. classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
  328. classiq/model_expansions/model_tables.py +18 -0
  329. classiq/model_expansions/quantum_operations/__init__.py +9 -0
  330. classiq/model_expansions/quantum_operations/bind.py +60 -0
  331. classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
  332. classiq/model_expansions/quantum_operations/classicalif.py +53 -0
  333. classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
  334. classiq/model_expansions/quantum_operations/emitter.py +181 -0
  335. classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
  336. classiq/model_expansions/quantum_operations/repeat.py +56 -0
  337. classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
  338. classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
  339. classiq/model_expansions/scope.py +240 -0
  340. classiq/model_expansions/scope_initialization.py +150 -0
  341. classiq/model_expansions/sympy_conversion/__init__.py +0 -0
  342. classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
  343. classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
  344. classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
  345. classiq/model_expansions/transformers/__init__.py +0 -0
  346. classiq/model_expansions/transformers/ast_renamer.py +26 -0
  347. classiq/model_expansions/transformers/var_splitter.py +299 -0
  348. classiq/model_expansions/utils/__init__.py +0 -0
  349. classiq/model_expansions/utils/counted_name_allocator.py +11 -0
  350. classiq/model_expansions/utils/handles_collector.py +33 -0
  351. classiq/model_expansions/visitors/__init__.py +0 -0
  352. classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
  353. classiq/model_expansions/visitors/variable_references.py +144 -0
  354. classiq/open_library/__init__.py +4 -0
  355. classiq/open_library/functions/__init__.py +130 -0
  356. classiq/open_library/functions/amplitude_estimation.py +30 -0
  357. classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
  358. classiq/open_library/functions/grover.py +157 -0
  359. classiq/open_library/functions/hea.py +115 -0
  360. classiq/open_library/functions/linear_pauli_rotation.py +82 -0
  361. classiq/open_library/functions/modular_exponentiation.py +201 -0
  362. classiq/open_library/functions/qaoa_penalty.py +117 -0
  363. classiq/open_library/functions/qft_functions.py +54 -0
  364. classiq/open_library/functions/qpe.py +46 -0
  365. classiq/open_library/functions/qsvt.py +331 -0
  366. classiq/open_library/functions/state_preparation.py +301 -0
  367. classiq/open_library/functions/swap_test.py +27 -0
  368. classiq/open_library/functions/utility_functions.py +81 -0
  369. classiq/open_library/functions/variational.py +52 -0
  370. classiq/qmod/__init__.py +17 -10
  371. classiq/qmod/builtins/__init__.py +19 -2
  372. classiq/qmod/builtins/classical_execution_primitives.py +60 -47
  373. classiq/qmod/builtins/classical_functions.py +44 -38
  374. classiq/qmod/builtins/constants.py +10 -0
  375. classiq/qmod/builtins/enums.py +208 -0
  376. classiq/qmod/builtins/functions/__init__.py +137 -0
  377. classiq/qmod/builtins/functions/allocation.py +150 -0
  378. classiq/qmod/builtins/functions/arithmetic.py +55 -0
  379. classiq/qmod/builtins/functions/benchmarking.py +8 -0
  380. classiq/qmod/builtins/functions/chemistry.py +91 -0
  381. classiq/qmod/builtins/functions/exponentiation.py +105 -0
  382. classiq/qmod/builtins/functions/finance.py +34 -0
  383. classiq/qmod/builtins/functions/operators.py +16 -0
  384. classiq/qmod/builtins/functions/qsvm.py +24 -0
  385. classiq/qmod/builtins/functions/standard_gates.py +651 -0
  386. classiq/qmod/builtins/operations.py +379 -57
  387. classiq/qmod/builtins/structs.py +103 -80
  388. classiq/qmod/cfunc.py +42 -0
  389. classiq/qmod/classical_function.py +8 -20
  390. classiq/qmod/cparam.py +64 -0
  391. classiq/qmod/create_model_function.py +56 -0
  392. classiq/qmod/declaration_inferrer.py +145 -112
  393. classiq/qmod/expression_query.py +39 -0
  394. classiq/qmod/generative.py +42 -0
  395. classiq/qmod/model_state_container.py +19 -5
  396. classiq/qmod/native/__init__.py +7 -0
  397. classiq/qmod/native/expression_to_qmod.py +194 -0
  398. classiq/qmod/native/pretty_printer.py +401 -0
  399. classiq/qmod/pretty_print/__init__.py +7 -0
  400. classiq/qmod/pretty_print/expression_to_python.py +222 -0
  401. classiq/qmod/pretty_print/pretty_printer.py +572 -0
  402. classiq/qmod/python_classical_type.py +67 -0
  403. classiq/qmod/qfunc.py +79 -0
  404. classiq/qmod/qmod_constant.py +143 -0
  405. classiq/qmod/qmod_parameter.py +84 -53
  406. classiq/qmod/qmod_variable.py +497 -100
  407. classiq/qmod/quantum_callable.py +17 -7
  408. classiq/qmod/quantum_expandable.py +278 -105
  409. classiq/qmod/quantum_function.py +232 -48
  410. classiq/qmod/semantics/__init__.py +0 -0
  411. classiq/qmod/semantics/annotation/__init__.py +0 -0
  412. classiq/qmod/semantics/annotation/call_annotation.py +92 -0
  413. classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
  414. classiq/qmod/semantics/error_manager.py +88 -0
  415. classiq/qmod/semantics/lambdas.py +25 -0
  416. classiq/qmod/semantics/static_semantics_visitor.py +384 -0
  417. classiq/qmod/semantics/validation/__init__.py +0 -0
  418. classiq/qmod/semantics/validation/constants_validation.py +16 -0
  419. classiq/qmod/semantics/validation/func_call_validation.py +99 -0
  420. classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
  421. classiq/qmod/semantics/validation/handle_validation.py +85 -0
  422. classiq/qmod/semantics/validation/main_validation.py +33 -0
  423. classiq/qmod/semantics/validation/types_validation.py +128 -0
  424. classiq/qmod/symbolic.py +178 -111
  425. classiq/qmod/symbolic_expr.py +36 -12
  426. classiq/qmod/symbolic_type.py +2 -5
  427. classiq/qmod/type_attribute_remover.py +32 -0
  428. classiq/qmod/utilities.py +108 -1
  429. classiq/qmod/write_qmod.py +53 -0
  430. classiq/synthesis.py +210 -22
  431. {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/METADATA +16 -8
  432. classiq-0.65.3.dist-info/RECORD +521 -0
  433. {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/WHEEL +1 -1
  434. classiq/_internals/_qfunc_ext.py +0 -6
  435. classiq/applications/benchmarking/__init__.py +0 -9
  436. classiq/applications/benchmarking/mirror_benchmarking.py +0 -67
  437. classiq/applications/numpy_utils.py +0 -37
  438. classiq/applications_model_constructors/__init__.py +0 -17
  439. classiq/applications_model_constructors/combinatorial_optimization_model_constructor.py +0 -178
  440. classiq/applications_model_constructors/grover_model_constructor.py +0 -227
  441. classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
  442. classiq/applications_model_constructors/libraries/qmci_library.py +0 -109
  443. classiq/builtin_functions/__init__.py +0 -43
  444. classiq/builtin_functions/amplitude_loading.py +0 -3
  445. classiq/builtin_functions/binary_ops.py +0 -1
  446. classiq/builtin_functions/exponentiation.py +0 -5
  447. classiq/builtin_functions/qpe.py +0 -4
  448. classiq/builtin_functions/qsvm.py +0 -7
  449. classiq/builtin_functions/range_types.py +0 -5
  450. classiq/builtin_functions/standard_gates.py +0 -1
  451. classiq/builtin_functions/state_preparation.py +0 -6
  452. classiq/builtin_functions/suzuki_trotter.py +0 -3
  453. classiq/exceptions.py +0 -131
  454. classiq/interface/executor/aws_execution_cost.py +0 -72
  455. classiq/interface/executor/error_mitigation.py +0 -6
  456. classiq/interface/generator/credit_risk_example/linear_gci.py +0 -115
  457. classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -59
  458. classiq/interface/generator/expressions/enums/chemistry.py +0 -28
  459. classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
  460. classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
  461. classiq/interface/generator/expressions/enums/optimizers.py +0 -9
  462. classiq/interface/generator/expressions/enums/pauli.py +0 -8
  463. classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
  464. classiq/interface/generator/expressions/qmod_qnum_proxy.py +0 -22
  465. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
  466. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
  467. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
  468. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -862
  469. classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -169
  470. classiq/interface/generator/functions/foreign_function_definition.py +0 -106
  471. classiq/interface/generator/functions/function_implementation.py +0 -103
  472. classiq/interface/generator/functions/native_function_definition.py +0 -153
  473. classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
  474. classiq/interface/generator/functions/register.py +0 -42
  475. classiq/interface/generator/functions/register_mapping_data.py +0 -102
  476. classiq/interface/generator/inequality_mixer.py +0 -51
  477. classiq/interface/generator/model/classical_main_validator.py +0 -106
  478. classiq/interface/generator/range_mixer.py +0 -56
  479. classiq/interface/generator/state_propagator.py +0 -63
  480. classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -2
  481. classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
  482. classiq/interface/generator/types/builtin_struct_declarations/qaoa_declarations.py +0 -23
  483. classiq/interface/generator/types/combinatorial_problem.py +0 -26
  484. classiq/interface/ide/show.py +0 -34
  485. classiq/interface/model/common_model_types.py +0 -23
  486. classiq/interface/model/numeric_reinterpretation.py +0 -25
  487. classiq/interface/model/operator_synthesis_data.py +0 -48
  488. classiq/interface/model/quantum_expressions/control_state.py +0 -38
  489. classiq/interface/model/quantum_if_operation.py +0 -95
  490. classiq/interface/model/resolvers/function_call_resolver.py +0 -43
  491. classiq/interface/model/validations/handle_validation_base.py +0 -55
  492. classiq/interface/model/validations/handles_validator.py +0 -154
  493. classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
  494. classiq/model/__init__.py +0 -14
  495. classiq/model/composite_function_generator.py +0 -33
  496. classiq/model/function_handler.py +0 -466
  497. classiq/model/function_handler.pyi +0 -152
  498. classiq/model/logic_flow.py +0 -149
  499. classiq/model/logic_flow_change_handler.py +0 -71
  500. classiq/model/model.py +0 -246
  501. classiq/qmod/builtins/functions.py +0 -896
  502. classiq/qmod/qmod_struct.py +0 -37
  503. classiq/quantum_functions/__init__.py +0 -17
  504. classiq/quantum_functions/annotation_parser.py +0 -207
  505. classiq/quantum_functions/decorators.py +0 -22
  506. classiq/quantum_functions/function_library.py +0 -181
  507. classiq/quantum_functions/function_parser.py +0 -74
  508. classiq/quantum_functions/quantum_function.py +0 -236
  509. classiq-0.37.1.dist-info/RECORD +0 -418
  510. /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers}/__init__.py +0 -0
  511. /classiq/{interface/generator/credit_risk_example → applications/combinatorial_helpers/arithmetic}/__init__.py +0 -0
  512. /classiq/{interface/generator/functions/core_lib_declarations → applications/combinatorial_helpers/pauli_helpers}/__init__.py +0 -0
  513. /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → applications/combinatorial_helpers/py.typed} +0 -0
  514. /classiq/{interface/model/resolvers → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
  515. /classiq/{interface/model/validations → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
  516. /classiq/{_internals → interface}/enum_utils.py +0 -0
@@ -1,6 +1,4 @@
1
- from typing import Set
2
-
3
- from classiq._internals.enum_utils import StrEnum
1
+ from classiq.interface.enum_utils import StrEnum
4
2
 
5
3
 
6
4
  class RegisterRole(StrEnum):
@@ -10,9 +8,10 @@ class RegisterRole(StrEnum):
10
8
  ZERO_INPUT = "zero_input"
11
9
  ZERO_OUTPUT = "zero_output"
12
10
  GARBAGE_OUTPUT = "garbage_output"
11
+ EXPLICIT_ZERO_INPUT = "explicit_zero_input"
13
12
 
14
13
  @staticmethod
15
- def output_roles(include_garbage: bool = False) -> Set["RegisterRole"]:
14
+ def output_roles(include_garbage: bool = False) -> set["RegisterRole"]:
16
15
  roles = {
17
16
  RegisterRole.OUTPUT,
18
17
  RegisterRole.ZERO_OUTPUT,
@@ -23,5 +22,18 @@ class RegisterRole(StrEnum):
23
22
  return roles
24
23
 
25
24
  @staticmethod
26
- def input_roles() -> Set["RegisterRole"]:
27
- return {RegisterRole.INPUT, RegisterRole.ZERO_INPUT, RegisterRole.AUXILIARY}
25
+ def input_roles() -> set["RegisterRole"]:
26
+ return {
27
+ RegisterRole.INPUT,
28
+ RegisterRole.ZERO_INPUT,
29
+ RegisterRole.AUXILIARY,
30
+ RegisterRole.EXPLICIT_ZERO_INPUT,
31
+ }
32
+
33
+ @staticmethod
34
+ def clean_output_roles() -> set["RegisterRole"]:
35
+ return {RegisterRole.ZERO_OUTPUT, RegisterRole.AUXILIARY}
36
+
37
+ @staticmethod
38
+ def dirty_output_roles() -> set["RegisterRole"]:
39
+ return {RegisterRole.OUTPUT, RegisterRole.GARBAGE_OUTPUT}
@@ -1,6 +1,8 @@
1
1
  import re
2
- from typing import Match, Optional, Tuple
2
+ from re import Match
3
+ from typing import Optional
3
4
 
5
+ from classiq.interface.exceptions import ClassiqValueError
4
6
  from classiq.interface.generator.function_params import NAME_REGEX
5
7
 
6
8
  NAME = "name"
@@ -10,12 +12,12 @@ SLICING_CHARS = rf"[0-9\-{SEPARATOR}]+"
10
12
  IO_REGEX = rf"(?P<{NAME}>{NAME_REGEX})(\[(?P<{SLICING}>{SLICING_CHARS})\])?"
11
13
 
12
14
 
13
- def parse_io_slicing(io_str: str) -> Tuple[str, slice]:
15
+ def parse_io_slicing(io_str: str) -> tuple[str, slice]:
14
16
  name, slicing = separate_name_and_slice(io_str)
15
17
  return name, get_slice(slicing)
16
18
 
17
19
 
18
- def separate_name_and_slice(io_str: str) -> Tuple[str, Optional[str]]:
20
+ def separate_name_and_slice(io_str: str) -> tuple[str, Optional[str]]:
19
21
  match: Optional[Match] = re.fullmatch(IO_REGEX, io_str)
20
22
  if match is None:
21
23
  raise AssertionError("Input/output name validation error")
@@ -33,9 +35,12 @@ def get_slice(slicing: Optional[str]) -> slice:
33
35
 
34
36
  if len(split) == 1:
35
37
  index_block = split[0]
36
- # failing int raises ValueError which Pydantic captures
37
- # RegEx matching should deem this scenario impossible
38
- index = int(index_block)
38
+ try:
39
+ index = int(index_block)
40
+ except ValueError:
41
+ raise ClassiqValueError(
42
+ f"Index {index_block!r} is not an integer"
43
+ ) from None
39
44
  stop = index + 1 if index != -1 else None
40
45
  return slice(index, stop, None)
41
46
 
@@ -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 (
@@ -24,46 +26,29 @@ class ControlledGate(_StandardGate): # type: ignore[misc]
24
26
  num_ctrl_qubits: pydantic.PositiveInt = pydantic.Field(
25
27
  default=DEFAULT_NUM_CTRL_QUBITS
26
28
  )
27
-
28
- def _create_ios(self) -> None:
29
- _StandardGate._create_ios(self)
30
- control = RegisterUserInput(
31
- name=CONTROLLED_GATE_CONTROL, size=self.num_ctrl_qubits
32
- )
33
- self._inputs[CONTROLLED_GATE_CONTROL] = control
34
- self._outputs[CONTROLLED_GATE_CONTROL] = control
35
-
36
- def to_control_state(self) -> ControlState:
37
- return ControlState(
38
- name=CONTROLLED_GATE_CONTROL, num_ctrl_qubits=self.num_ctrl_qubits
39
- )
40
-
41
-
42
- class ControlledGateWithState(ControlledGate): # type: ignore[misc]
43
- """
44
- Base model for controlled Gates with control over the controlled_state
45
- """
46
-
47
29
  ctrl_state: CtrlState = pydantic.Field(
48
30
  description="The control state in decimal or as a bit string (e.g. '1011'). If not specified, the control "
49
31
  "state is 2**num_ctrl_qubits - 1.\n"
50
- "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,
51
35
  )
52
36
 
53
- @pydantic.validator("ctrl_state", always=True)
37
+ @pydantic.field_validator("ctrl_state")
38
+ @classmethod
54
39
  def _validate_ctrl_state(
55
- cls, ctrl_state: CtrlState, values: Dict[str, Any]
40
+ cls, ctrl_state: CtrlState, info: ValidationInfo
56
41
  ) -> CtrlState:
57
- 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)
58
43
  ctrl_state = ctrl_state if ctrl_state is not None else "1" * num_ctrl_qubits
59
44
 
60
45
  if isinstance(ctrl_state, str) and len(ctrl_state) != num_ctrl_qubits:
61
- raise ValueError(
46
+ raise ClassiqValueError(
62
47
  f"Invalid control state: {ctrl_state!r}. "
63
48
  f"Expected {num_ctrl_qubits} qubits"
64
49
  )
65
50
  elif isinstance(ctrl_state, int) and ctrl_state >= 2**num_ctrl_qubits:
66
- raise ValueError(
51
+ raise ClassiqValueError(
67
52
  f"Invalid control state: {ctrl_state}. "
68
53
  f"Expected value between 0 and {2**num_ctrl_qubits-1}"
69
54
  )
@@ -77,12 +62,20 @@ class ControlledGateWithState(ControlledGate): # type: ignore[misc]
77
62
  )
78
63
  return ControlState(name=CONTROLLED_GATE_CONTROL, ctrl_state=ctrl_state_str)
79
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
+
80
73
 
81
74
  def _num_to_control_string(ctrl_state_int: int, num_ctrl_qubits: int) -> str:
82
75
  return format(ctrl_state_int, f"0{num_ctrl_qubits}b")
83
76
 
84
77
 
85
- class CXGate(ControlledGateWithState): # type: ignore[misc]
78
+ class CXGate(ControlledGate): # type: ignore[misc]
86
79
  """
87
80
  The Controlled-X Gate
88
81
  """
@@ -93,7 +86,7 @@ class CXGate(ControlledGateWithState): # type: ignore[misc]
93
86
  return 2
94
87
 
95
88
 
96
- class CCXGate(ControlledGateWithState): # type: ignore[misc]
89
+ class CCXGate(ControlledGate): # type: ignore[misc]
97
90
  """
98
91
  The Double Controlled-X Gate
99
92
  """
@@ -104,7 +97,7 @@ class CCXGate(ControlledGateWithState): # type: ignore[misc]
104
97
  return 2
105
98
 
106
99
 
107
- class C3XGate(ControlledGateWithState): # type: ignore[misc]
100
+ class C3XGate(ControlledGate): # type: ignore[misc]
108
101
  """
109
102
  The X Gate controlled on 3 qubits
110
103
  """
@@ -116,7 +109,7 @@ class C3XGate(ControlledGateWithState): # type: ignore[misc]
116
109
  return 2
117
110
 
118
111
 
119
- class C4XGate(ControlledGateWithState): # type: ignore[misc]
112
+ class C4XGate(ControlledGate): # type: ignore[misc]
120
113
  """
121
114
  The X Gate controlled on 4 qubits
122
115
  """
@@ -128,7 +121,7 @@ class C4XGate(ControlledGateWithState): # type: ignore[misc]
128
121
  return 2
129
122
 
130
123
 
131
- class CYGate(ControlledGateWithState): # type: ignore[misc]
124
+ class CYGate(ControlledGate): # type: ignore[misc]
132
125
  """
133
126
  The Controlled-Y Gate
134
127
  """
@@ -137,7 +130,7 @@ class CYGate(ControlledGateWithState): # type: ignore[misc]
137
130
  return 2
138
131
 
139
132
 
140
- class CZGate(ControlledGateWithState): # type: ignore[misc]
133
+ class CZGate(ControlledGate): # type: ignore[misc]
141
134
  """
142
135
  The Controlled-Z Gate
143
136
  """
@@ -146,7 +139,7 @@ class CZGate(ControlledGateWithState): # type: ignore[misc]
146
139
  return 2
147
140
 
148
141
 
149
- class CHGate(ControlledGateWithState): # type: ignore[misc]
142
+ class CHGate(ControlledGate): # type: ignore[misc]
150
143
  """
151
144
  The Controlled-H Gate
152
145
  """
@@ -155,7 +148,7 @@ class CHGate(ControlledGateWithState): # type: ignore[misc]
155
148
  return 2
156
149
 
157
150
 
158
- class CSXGate(ControlledGateWithState): # type: ignore[misc]
151
+ class CSXGate(ControlledGate): # type: ignore[misc]
159
152
  """
160
153
  The Controlled-SX Gate
161
154
  """
@@ -164,25 +157,25 @@ class CSXGate(ControlledGateWithState): # type: ignore[misc]
164
157
  return 4
165
158
 
166
159
 
167
- class CRXGate(ControlledGateWithState, angles=["theta"]): # type: ignore[misc]
160
+ class CRXGate(ControlledGate, angles=["theta"]): # type: ignore[misc]
168
161
  """
169
162
  The Controlled-RX Gate
170
163
  """
171
164
 
172
165
 
173
- class CRYGate(ControlledGateWithState, angles=["theta"]): # type: ignore[misc]
166
+ class CRYGate(ControlledGate, angles=["theta"]): # type: ignore[misc]
174
167
  """
175
168
  The Controlled-RY Gate
176
169
  """
177
170
 
178
171
 
179
- class CRZGate(ControlledGateWithState, angles=["theta"]): # type: ignore[misc]
172
+ class CRZGate(ControlledGate, angles=["theta"]): # type: ignore[misc]
180
173
  """
181
174
  The Controlled-RZ Gate
182
175
  """
183
176
 
184
177
 
185
- class CPhaseGate(ControlledGateWithState, angles=["theta"]): # type: ignore[misc]
178
+ class CPhaseGate(ControlledGate, angles=["theta"]): # type: ignore[misc]
186
179
  """
187
180
  The Controlled-Phase Gate
188
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,16 +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
-
9
- _AMPLITUDE_SUPPORTING_METRICS: FrozenSet = frozenset(
7
+ _AMPLITUDE_SUPPORTING_METRICS: frozenset = frozenset(
10
8
  {"L2", "L1", "MAX_PROBABILITY", "TOTAL_VARIATION"}
11
9
  )
12
10
 
13
- _ZERO_DIVERGENT_METRICS: FrozenSet = frozenset({"KL", "BHATTACHARYYA"})
11
+ _ZERO_DIVERGENT_METRICS: frozenset = frozenset({"KL", "BHATTACHARYYA"})
14
12
 
15
13
 
16
14
  class Metrics(StrEnum):
@@ -30,7 +28,7 @@ class Metrics(StrEnum):
30
28
  try:
31
29
  return Metrics(sp_opt_method.value)
32
30
  except ValueError:
33
- raise ValueError(
31
+ raise ClassiqValueError(
34
32
  f"Failed to convert {sp_opt_method} to an error metric"
35
33
  ) from None
36
34
 
@@ -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,
@@ -24,19 +27,24 @@ from classiq.interface.generator.validations.validator_functions import (
24
27
 
25
28
  class StatePreparation(StatePreparationABC):
26
29
  amplitudes: Optional[Amplitudes] = pydantic.Field(
27
- description="vector of probabilities", default=None
30
+ description="vector of probabilities",
31
+ default=None,
32
+ validate_default=True,
28
33
  )
29
34
  probabilities: Optional[Probabilities] = pydantic.Field(
30
- description="vector of amplitudes", default=None
35
+ description="vector of amplitudes",
36
+ default=None,
37
+ validate_default=True,
31
38
  )
32
- error_metric: Dict[Metrics, NonNegativeFloatRange] = pydantic.Field(
39
+ error_metric: dict[Metrics, NonNegativeFloatRange] = pydantic.Field(
33
40
  default_factory=lambda: {
34
41
  Metrics.L2: NonNegativeFloatRange(lower_bound=0, upper_bound=1e-4)
35
42
  }
36
43
  )
37
44
  # The order of validations is important: amplitudes, probabilities, error_metric
38
45
 
39
- @pydantic.validator("amplitudes", always=True, pre=True)
46
+ @pydantic.field_validator("amplitudes", mode="before")
47
+ @classmethod
40
48
  def _initialize_amplitudes(
41
49
  cls, amplitudes: Optional[FlexibleAmplitudes]
42
50
  ) -> Optional[Amplitudes]:
@@ -46,11 +54,12 @@ class StatePreparation(StatePreparationABC):
46
54
  if amplitudes.ndim == 1:
47
55
  return validate_amplitudes(tuple(amplitudes))
48
56
 
49
- raise ValueError(
57
+ raise ClassiqValueError(
50
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"
51
59
  )
52
60
 
53
- @pydantic.validator("probabilities", always=True, pre=True)
61
+ @pydantic.field_validator("probabilities", mode="before")
62
+ @classmethod
54
63
  def _initialize_probabilities(
55
64
  cls, probabilities: Optional[FlexibleProbabilities]
56
65
  ) -> Optional[Union[PMF, GaussianMixture, dict]]:
@@ -64,15 +73,16 @@ class StatePreparation(StatePreparationABC):
64
73
  if probabilities.ndim == 1:
65
74
  return PMF(pmf=probabilities.tolist())
66
75
 
67
- raise ValueError(
76
+ raise ClassiqValueError(
68
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"
69
78
  )
70
79
 
71
- @pydantic.validator("error_metric", always=True, pre=True)
80
+ @pydantic.field_validator("error_metric", mode="before")
81
+ @classmethod
72
82
  def _validate_error_metric(
73
- cls, error_metric: Dict[Metrics, NonNegativeFloatRange], values: Dict[str, Any]
74
- ) -> Dict[Metrics, NonNegativeFloatRange]:
75
- 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"):
76
86
  return error_metric
77
87
  unsupported_metrics = {
78
88
  Metrics(metric).value
@@ -80,27 +90,24 @@ class StatePreparation(StatePreparationABC):
80
90
  if not Metrics(metric).supports_amplitudes
81
91
  }
82
92
  if unsupported_metrics:
83
- raise ValueError(
93
+ raise ClassiqValueError(
84
94
  f"{unsupported_metrics} are not supported for amplitude preparation"
85
95
  )
86
96
  return error_metric
87
97
 
88
- @pydantic.root_validator
89
- def _validate_either_probabilities_or_amplitudes(
90
- cls,
91
- values: Dict[str, Any],
92
- ) -> Optional[Union[PMF, GaussianMixture, dict]]:
93
- amplitudes = values.get("amplitudes")
94
- 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
95
102
  if amplitudes is not None and probabilities is not None:
96
- raise ValueError(
103
+ raise ClassiqValueError(
97
104
  "StatePreparation can't get both probabilities and amplitudes"
98
105
  )
99
- return values
106
+ return self
100
107
 
101
108
  @property
102
109
  def num_state_qubits(self) -> int:
103
110
  distribution = self.probabilities or self.amplitudes
104
111
  if distribution is None:
105
- raise ValueError("Must have either probabilities or amplitudes")
112
+ raise ClassiqValueError("Must have either probabilities or amplitudes")
106
113
  return num_of_qubits(distribution)
@@ -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
  }