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,7 +1,12 @@
1
- from typing import Any, Dict, List, Literal, NewType, Optional, Set, Union
1
+ from collections import Counter
2
+ from collections.abc import Mapping
3
+ from typing import Any, Literal, NewType
2
4
 
3
5
  import pydantic
4
6
 
7
+ from classiq.interface.ast_node import ASTNode
8
+ from classiq.interface.debug_info.debug_info import DebugInfoCollection
9
+ from classiq.interface.exceptions import ClassiqValueError
5
10
  from classiq.interface.executor.execution_preferences import ExecutionPreferences
6
11
  from classiq.interface.generator.constant import Constant
7
12
  from classiq.interface.generator.functions.port_declaration import (
@@ -10,25 +15,19 @@ from classiq.interface.generator.functions.port_declaration import (
10
15
  from classiq.interface.generator.model.constraints import Constraints
11
16
  from classiq.interface.generator.model.preferences.preferences import Preferences
12
17
  from classiq.interface.generator.quantum_function_call import SUFFIX_RANDOMIZER
13
- from classiq.interface.generator.types.combinatorial_problem import (
14
- CombinatorialOptimizationStructDeclaration,
15
- )
18
+ from classiq.interface.generator.types.compilation_metadata import CompilationMetadata
19
+ from classiq.interface.generator.types.enum_declaration import EnumDeclaration
20
+ from classiq.interface.generator.types.qstruct_declaration import QStructDeclaration
16
21
  from classiq.interface.generator.types.struct_declaration import StructDeclaration
17
- from classiq.interface.helpers.pydantic_model_helpers import (
18
- get_discriminator_field,
19
- nameables_to_dict,
20
- )
22
+ from classiq.interface.helpers.pydantic_model_helpers import nameables_to_dict
21
23
  from classiq.interface.helpers.versioned_model import VersionedModel
22
- from classiq.interface.model.native_function_definition import NativeFunctionDefinition
23
- from classiq.interface.model.quantum_function_call import ConcreteQuantumStatement
24
- from classiq.interface.model.quantum_function_declaration import (
25
- QuantumFunctionDeclaration,
24
+ from classiq.interface.model.native_function_definition import (
25
+ NativeFunctionDefinition,
26
26
  )
27
- from classiq.interface.model.resolvers.function_call_resolver import (
28
- resolve_function_calls,
27
+ from classiq.interface.model.quantum_function_declaration import (
28
+ NamedParamsQuantumFunctionDeclaration,
29
29
  )
30
-
31
- from classiq.exceptions import ClassiqValueError
30
+ from classiq.interface.model.statement_block import StatementBlock
32
31
 
33
32
  USER_MODEL_MARKER = "user"
34
33
 
@@ -39,10 +38,6 @@ DEFAULT_PORT_SIZE = 1
39
38
 
40
39
  SerializedModel = NewType("SerializedModel", str)
41
40
 
42
- ConcreteStructDeclaration = Union[
43
- CombinatorialOptimizationStructDeclaration, StructDeclaration
44
- ]
45
-
46
41
  TYPE_NAME_CONFLICT_BUILTIN = (
47
42
  "Type '{name}' conflicts with a builtin type with the same name"
48
43
  )
@@ -60,29 +55,37 @@ class VersionedSerializedModel(VersionedModel):
60
55
  model: SerializedModel
61
56
 
62
57
 
63
- class Model(VersionedModel):
64
- """
65
- All the relevant data for generating quantum circuit in one place.
66
- """
58
+ class Model(VersionedModel, ASTNode):
67
59
 
68
- kind: Literal["user"] = get_discriminator_field(USER_MODEL_MARKER)
60
+ kind: Literal["user"] = pydantic.Field(default=USER_MODEL_MARKER)
69
61
 
70
62
  # Must be validated before logic_flow
71
- functions: List[NativeFunctionDefinition] = pydantic.Field(
63
+ functions: list[NativeFunctionDefinition] = pydantic.Field(
72
64
  default_factory=list,
73
65
  description="The user-defined custom type library.",
66
+ validate_default=True,
74
67
  )
75
68
 
76
- types: List[ConcreteStructDeclaration] = pydantic.Field(
69
+ enums: list[EnumDeclaration] = pydantic.Field(
77
70
  default_factory=list,
78
- description="The user-defined custom function library.",
71
+ description="user-defined enums",
72
+ )
73
+
74
+ types: list[StructDeclaration] = pydantic.Field(
75
+ default_factory=list,
76
+ description="user-defined structs",
77
+ )
78
+
79
+ qstructs: list[QStructDeclaration] = pydantic.Field(
80
+ default_factory=list,
81
+ description="user-defined quantum structs",
79
82
  )
80
83
 
81
84
  classical_execution_code: str = pydantic.Field(
82
85
  description="The classical execution code of the model", default=""
83
86
  )
84
87
 
85
- constants: List[Constant] = pydantic.Field(
88
+ constants: list[Constant] = pydantic.Field(
86
89
  default_factory=list,
87
90
  )
88
91
 
@@ -93,17 +96,32 @@ class Model(VersionedModel):
93
96
  )
94
97
  preferences: Preferences = pydantic.Field(default_factory=Preferences)
95
98
 
99
+ debug_info: DebugInfoCollection = pydantic.Field(
100
+ default_factory=DebugInfoCollection
101
+ )
102
+ functions_compilation_metadata: dict[str, CompilationMetadata] = pydantic.Field(
103
+ default_factory=dict
104
+ )
105
+
96
106
  @property
97
107
  def main_func(self) -> NativeFunctionDefinition:
98
108
  return self.function_dict[MAIN_FUNCTION_NAME] # type:ignore[return-value]
99
109
 
100
110
  @property
101
- def body(self) -> List[ConcreteQuantumStatement]:
111
+ def body(self) -> StatementBlock:
102
112
  return self.main_func.body
103
113
 
104
- @pydantic.validator("preferences", always=True)
105
- def _seed_suffix_randomizer(cls, preferences: Preferences) -> Preferences:
106
- SUFFIX_RANDOMIZER.seed(preferences.random_seed)
114
+ @pydantic.field_validator("preferences", mode="before")
115
+ @classmethod
116
+ def _seed_suffix_randomizer(cls, preferences: Any) -> Any:
117
+ if isinstance(preferences, dict):
118
+ SUFFIX_RANDOMIZER.seed(preferences.get("random_seed"))
119
+ elif isinstance(preferences, Preferences):
120
+ SUFFIX_RANDOMIZER.seed(preferences.random_seed)
121
+ else:
122
+ raise ClassiqValueError(
123
+ f"preferences must be either a dict or a Preferences object, not {type(preferences)}"
124
+ )
107
125
  return preferences
108
126
 
109
127
  def _get_qualified_direction(
@@ -114,63 +132,59 @@ class Model(VersionedModel):
114
132
  return direction
115
133
 
116
134
  @property
117
- def function_dict(self) -> Dict[str, QuantumFunctionDeclaration]:
135
+ def function_dict(self) -> Mapping[str, NamedParamsQuantumFunctionDeclaration]:
118
136
  return nameables_to_dict(self.functions)
119
137
 
120
- @pydantic.validator("functions", always=True)
138
+ @pydantic.field_validator("functions")
139
+ @classmethod
121
140
  def _add_empty_main(
122
- cls, functions: List[NativeFunctionDefinition]
123
- ) -> List[NativeFunctionDefinition]:
141
+ cls, functions: list[NativeFunctionDefinition]
142
+ ) -> list[NativeFunctionDefinition]:
124
143
  function_dict = nameables_to_dict(functions)
125
144
  if MAIN_FUNCTION_NAME not in function_dict:
126
145
  functions.append(_create_empty_main_function())
127
146
  return functions
128
147
 
129
- @pydantic.root_validator()
130
- def validate_static_correctness(cls, values: Dict[str, Any]) -> Dict[str, Any]:
131
- functions: Optional[List[QuantumFunctionDeclaration]] = values.get("functions")
132
- if functions is None:
133
- return values
134
-
135
- resolve_function_calls(
136
- values,
137
- nameables_to_dict(functions),
138
- )
139
- for func_def in functions:
140
- if isinstance(func_def, NativeFunctionDefinition):
141
- func_def.validate_body()
142
- return values
143
-
144
- @pydantic.validator("types")
145
- def types_validator(
146
- cls, types: List[ConcreteStructDeclaration]
147
- ) -> List[ConcreteStructDeclaration]:
148
- user_defined_types: Set[str] = set()
149
- for ctype in types:
150
- if ctype.name in StructDeclaration.BUILTIN_STRUCT_DECLARATIONS:
151
- raise ValueError(TYPE_NAME_CONFLICT_BUILTIN.format(name=ctype.name))
152
- if ctype.name in user_defined_types:
153
- raise ValueError(TYPE_NAME_CONFLICT_USER.format(name=ctype.name))
154
- user_defined_types.add(ctype.name)
155
-
156
- return types
157
-
158
148
  def get_model(self) -> SerializedModel:
159
- return SerializedModel(
160
- self.json(exclude_defaults=True, exclude_unset=True, indent=2)
161
- )
149
+ return SerializedModel(self.model_dump_json(indent=2))
162
150
 
163
- @pydantic.validator("functions")
151
+ @pydantic.field_validator("functions")
152
+ @classmethod
164
153
  def _validate_entry_point(
165
- cls, functions: List[NativeFunctionDefinition]
166
- ) -> List[NativeFunctionDefinition]:
154
+ cls, functions: list[NativeFunctionDefinition]
155
+ ) -> list[NativeFunctionDefinition]:
167
156
  function_dict = nameables_to_dict(functions)
168
157
  if MAIN_FUNCTION_NAME not in function_dict:
169
158
  raise ClassiqValueError("The model must contain a `main` function")
170
159
  if any(
171
160
  pd.direction != PortDeclarationDirection.Output
172
- for pd in function_dict[MAIN_FUNCTION_NAME].port_declarations.values()
161
+ for pd in function_dict[MAIN_FUNCTION_NAME].port_declarations
173
162
  ):
174
163
  raise ClassiqValueError("Function 'main' cannot declare quantum inputs")
175
164
 
176
165
  return functions
166
+
167
+ @pydantic.field_validator("constants")
168
+ @classmethod
169
+ def _validate_constants(cls, constants: list[Constant]) -> list[Constant]:
170
+ constant_definition_counts = Counter(
171
+ [constant.name for constant in constants]
172
+ ).items()
173
+ multiply_defined_constants = {
174
+ constant for constant, count in constant_definition_counts if count > 1
175
+ }
176
+ if len(multiply_defined_constants) > 0:
177
+ raise ClassiqValueError(
178
+ f"The following constants were defined more than once: "
179
+ f"{multiply_defined_constants}"
180
+ )
181
+ return constants
182
+
183
+ def dump_no_preferences_and_constraints(self) -> dict[str, Any]:
184
+ return self.model_dump(
185
+ exclude={
186
+ "constraints",
187
+ "execution_preferences",
188
+ "preferences",
189
+ },
190
+ )
@@ -1,20 +1,23 @@
1
- from typing import List
1
+ from typing import TYPE_CHECKING
2
2
 
3
3
  import pydantic
4
4
 
5
- from classiq.interface.model.quantum_function_call import ConcreteQuantumStatement
6
5
  from classiq.interface.model.quantum_function_declaration import (
7
- QuantumFunctionDeclaration,
8
- )
9
- from classiq.interface.model.validations.handles_validator import HandleValidator
10
- from classiq.interface.model.variable_declaration_statement import (
11
- VariableDeclarationStatement,
6
+ NamedParamsQuantumFunctionDeclaration,
12
7
  )
13
8
 
14
- from classiq.exceptions import ClassiqValueError
9
+ if TYPE_CHECKING:
10
+ from classiq.interface.model.statement_block import StatementBlock
11
+
12
+
13
+ class FunctionSynthesisData(pydantic.BaseModel):
14
+ should_synthesize_separately: bool = pydantic.Field(
15
+ default=False,
16
+ description="Whether the function should be synthesized separately.",
17
+ )
15
18
 
16
19
 
17
- class NativeFunctionDefinition(QuantumFunctionDeclaration):
20
+ class NativeFunctionDefinition(NamedParamsQuantumFunctionDeclaration):
18
21
  """
19
22
  Facilitates the creation of a user-defined composite function
20
23
 
@@ -22,17 +25,9 @@ class NativeFunctionDefinition(QuantumFunctionDeclaration):
22
25
  objects from other classes.
23
26
  """
24
27
 
25
- body: List[ConcreteQuantumStatement] = pydantic.Field(
28
+ body: "StatementBlock" = pydantic.Field(
26
29
  default_factory=list, description="List of function calls to perform."
27
30
  )
28
-
29
- def validate_body(self) -> None:
30
- handle_validator = HandleValidator(self.port_declarations)
31
-
32
- for statement in self.body:
33
- if isinstance(statement, VariableDeclarationStatement):
34
- handle_validator.handle_variable_declaration(statement)
35
- else:
36
- handle_validator.handle_call(statement)
37
-
38
- handle_validator.report_errored_handles(ClassiqValueError)
31
+ synthesis_data: FunctionSynthesisData = pydantic.Field(
32
+ default_factory=FunctionSynthesisData, deprecated=True, exclude=True
33
+ )
@@ -0,0 +1,13 @@
1
+ from typing import Optional
2
+
3
+ from classiq.interface.ast_node import ASTNode
4
+ from classiq.interface.exceptions import ClassiqError
5
+
6
+
7
+ class Parameter(ASTNode):
8
+ name: Optional[str]
9
+
10
+ def get_name(self) -> str:
11
+ if self.name is None:
12
+ raise ClassiqError("Cannot resolve parameter name")
13
+ return self.name
@@ -0,0 +1,11 @@
1
+ from typing import Literal
2
+
3
+ from classiq.interface.generator.expressions.expression import Expression
4
+ from classiq.interface.model.quantum_expressions.quantum_expression import (
5
+ QuantumExpressionOperation,
6
+ )
7
+
8
+
9
+ class PhaseOperation(QuantumExpressionOperation):
10
+ kind: Literal["PhaseOperation"]
11
+ theta: Expression
@@ -1,27 +1,45 @@
1
- from typing import Any, Mapping
1
+ from typing import Any, Literal
2
2
 
3
3
  import pydantic
4
+ from pydantic_core.core_schema import ValidationInfo
4
5
 
6
+ from classiq.interface.exceptions import ClassiqInternalError, ClassiqValueError
7
+ from classiq.interface.generator.functions.concrete_types import ConcreteQuantumType
5
8
  from classiq.interface.generator.functions.port_declaration import (
6
9
  PortDeclarationDirection,
7
10
  )
8
- from classiq.interface.model.quantum_variable_declaration import (
9
- QuantumVariableDeclaration,
10
- )
11
-
12
- from classiq.exceptions import ClassiqValueError
11
+ from classiq.interface.helpers.pydantic_model_helpers import values_with_discriminator
12
+ from classiq.interface.model.parameter import Parameter
13
13
 
14
14
 
15
- class PortDeclaration(QuantumVariableDeclaration):
15
+ class AnonPortDeclaration(Parameter):
16
+ quantum_type: ConcreteQuantumType
16
17
  direction: PortDeclarationDirection
18
+ kind: Literal["PortDeclaration"]
19
+
20
+ @pydantic.model_validator(mode="before")
21
+ @classmethod
22
+ def _set_kind(cls, values: Any) -> dict[str, Any]:
23
+ return values_with_discriminator(values, "kind", "PortDeclaration")
17
24
 
18
- @pydantic.validator("direction")
25
+ @pydantic.field_validator("direction", mode="before")
26
+ @classmethod
19
27
  def _direction_validator(
20
- cls, direction: PortDeclarationDirection, values: Mapping[str, Any]
28
+ cls, direction: PortDeclarationDirection, info: ValidationInfo
21
29
  ) -> PortDeclarationDirection:
30
+ values = info.data
22
31
  if direction is PortDeclarationDirection.Output:
23
32
  quantum_type = values.get("quantum_type")
24
33
  if quantum_type is None:
25
34
  raise ClassiqValueError("Port declaration is missing a type")
26
35
 
27
36
  return direction
37
+
38
+ def rename(self, new_name: str) -> "PortDeclaration":
39
+ if type(self) not in (AnonPortDeclaration, PortDeclaration):
40
+ raise ClassiqInternalError
41
+ return PortDeclaration(**{**self.__dict__, "name": new_name})
42
+
43
+
44
+ class PortDeclaration(AnonPortDeclaration):
45
+ name: str
@@ -0,0 +1,14 @@
1
+ from typing import TYPE_CHECKING, Literal
2
+
3
+ from classiq.interface.generator.expressions.expression import Expression
4
+ from classiq.interface.model.quantum_statement import QuantumOperation
5
+
6
+ if TYPE_CHECKING:
7
+ from classiq.interface.model.statement_block import StatementBlock
8
+
9
+
10
+ class Power(QuantumOperation):
11
+ kind: Literal["Power"]
12
+
13
+ power: Expression
14
+ body: "StatementBlock"
@@ -1,58 +1,75 @@
1
- from typing import Dict, Mapping, Union
1
+ from collections.abc import Mapping, Sequence
2
+ from typing import Literal
2
3
 
3
4
  import pydantic
4
5
 
6
+ from classiq.interface.exceptions import ClassiqValueError
5
7
  from classiq.interface.generator.amplitude_loading import (
6
8
  AMPLITUDE_IO_NAME,
7
9
  TARGET_OUTPUT_NAME,
8
10
  )
9
11
  from classiq.interface.model.handle_binding import (
12
+ ConcreteHandleBinding,
10
13
  HandleBinding,
11
- SlicedHandleBinding,
12
- SubscriptHandleBinding,
13
14
  )
14
15
  from classiq.interface.model.quantum_expressions.quantum_expression import (
15
16
  QuantumAssignmentOperation,
16
17
  )
18
+ from classiq.interface.model.quantum_statement import HandleMetadata
17
19
  from classiq.interface.model.quantum_type import QuantumBit, QuantumNumeric, QuantumType
18
20
 
19
- from classiq.exceptions import ClassiqValueError
20
-
21
21
  MULTI_VARS_UNSUPPORTED_ERROR = (
22
22
  "Amplitude Loading with more than one input variable is unsupported."
23
23
  )
24
24
 
25
- VAR_DOMAIN_ILLEGAL = (
26
- "Amplitude Loading input variable should be a fixed-point number between 0 and 1"
27
- )
25
+ VAR_TYPE_ILLEGAL = "Amplitude Loading input variable should be a quantum numeric"
28
26
 
29
27
 
30
28
  class AmplitudeLoadingOperation(QuantumAssignmentOperation):
29
+ kind: Literal["AmplitudeLoadingOperation"]
30
+
31
31
  _result_type: QuantumType = pydantic.PrivateAttr(default_factory=QuantumBit)
32
32
 
33
33
  @property
34
34
  def wiring_inouts(
35
35
  self,
36
- ) -> Mapping[
37
- str, Union[SlicedHandleBinding, SubscriptHandleBinding, HandleBinding]
38
- ]:
39
- if len(self.var_handles) == 0:
40
- return dict()
41
- return {AMPLITUDE_IO_NAME: self.var_handles[0]}
36
+ ) -> Mapping[str, ConcreteHandleBinding]:
37
+ inouts = {self.result_name(): self.result_var}
38
+ if len(self.var_handles) == 1:
39
+ inouts[AMPLITUDE_IO_NAME] = self.var_handles[0]
40
+ return inouts
41
+
42
+ @property
43
+ def readable_inouts(self) -> Sequence[HandleMetadata]:
44
+ inouts = [
45
+ HandleMetadata(
46
+ handle=self.result_var,
47
+ readable_location="on the left-hand side of an in-place assignment",
48
+ )
49
+ ]
50
+ if len(self.var_handles) == 1:
51
+ inouts.append(
52
+ HandleMetadata(
53
+ handle=self.var_handles[0],
54
+ readable_location="in an expression",
55
+ )
56
+ )
57
+ return inouts
58
+
59
+ @property
60
+ def wiring_outputs(self) -> Mapping[str, HandleBinding]:
61
+ return {}
42
62
 
43
63
  def initialize_var_types(
44
64
  self,
45
- var_types: Dict[str, QuantumType],
65
+ var_types: dict[str, QuantumType],
46
66
  machine_precision: int,
47
67
  ) -> None:
48
68
  if len(var_types) != 1:
49
69
  raise ClassiqValueError(MULTI_VARS_UNSUPPORTED_ERROR)
50
- var_type = var_types[self.var_handles[0].name]
51
- if not (
52
- isinstance(var_type, QuantumNumeric)
53
- and var_type.fraction_digits == var_type.size_in_bits
54
- ):
55
- raise ClassiqValueError(VAR_DOMAIN_ILLEGAL)
70
+ var_type = list(var_types.values())[0]
71
+ if not isinstance(var_type, QuantumNumeric):
72
+ raise ClassiqValueError(VAR_TYPE_ILLEGAL)
56
73
  super().initialize_var_types(var_types, machine_precision)
57
74
 
58
75
  @classmethod
@@ -1,30 +1,43 @@
1
- from typing import Dict, Mapping, Union
2
-
3
- import pydantic
1
+ from collections.abc import Mapping, Sequence
2
+ from typing import Literal
4
3
 
4
+ from classiq.interface.enum_utils import StrEnum
5
5
  from classiq.interface.generator.arith.arithmetic import (
6
6
  ARITHMETIC_EXPRESSION_RESULT_NAME,
7
7
  compute_arithmetic_result_type,
8
8
  )
9
9
  from classiq.interface.model.handle_binding import (
10
+ ConcreteHandleBinding,
10
11
  HandleBinding,
11
- SlicedHandleBinding,
12
- SubscriptHandleBinding,
13
12
  )
14
13
  from classiq.interface.model.quantum_expressions.quantum_expression import (
15
14
  QuantumAssignmentOperation,
16
15
  )
16
+ from classiq.interface.model.quantum_statement import HandleMetadata
17
17
  from classiq.interface.model.quantum_type import QuantumType
18
18
 
19
19
 
20
+ class ArithmeticOperationKind(StrEnum):
21
+ InplaceAdd = "inplace_add"
22
+ Assignment = "assignment"
23
+ InplaceXor = "inplace_xor"
24
+
25
+
20
26
  class ArithmeticOperation(QuantumAssignmentOperation):
21
- inplace_result: bool = pydantic.Field(
22
- description="Determines whether the result variable is initialized",
23
- )
27
+ kind: Literal["ArithmeticOperation"]
28
+
29
+ operation_kind: ArithmeticOperationKind
30
+
31
+ @property
32
+ def is_inplace(self) -> bool:
33
+ return self.operation_kind in (
34
+ ArithmeticOperationKind.InplaceXor,
35
+ ArithmeticOperationKind.InplaceAdd,
36
+ )
24
37
 
25
38
  def initialize_var_types(
26
39
  self,
27
- var_types: Dict[str, QuantumType],
40
+ var_types: dict[str, QuantumType],
28
41
  machine_precision: int,
29
42
  ) -> None:
30
43
  super().initialize_var_types(var_types, machine_precision)
@@ -35,20 +48,44 @@ class ArithmeticOperation(QuantumAssignmentOperation):
35
48
  @property
36
49
  def wiring_inouts(
37
50
  self,
38
- ) -> Mapping[
39
- str, Union[SlicedHandleBinding, SubscriptHandleBinding, HandleBinding]
40
- ]:
51
+ ) -> Mapping[str, ConcreteHandleBinding]:
41
52
  inouts = dict(super().wiring_inouts)
42
- if self.inplace_result:
53
+ if self.is_inplace:
43
54
  inouts[self.result_name()] = self.result_var
44
55
  return inouts
45
56
 
57
+ @property
58
+ def readable_inouts(self) -> Sequence[HandleMetadata]:
59
+ inouts = [
60
+ HandleMetadata(handle=handle, readable_location="in an expression")
61
+ for handle in self.var_handles
62
+ ]
63
+ if self.is_inplace:
64
+ inouts.append(
65
+ HandleMetadata(
66
+ handle=self.result_var,
67
+ readable_location="on the left-hand side of an in-place assignment",
68
+ )
69
+ )
70
+ return inouts
71
+
46
72
  @property
47
73
  def wiring_outputs(self) -> Mapping[str, HandleBinding]:
48
- if self.inplace_result:
74
+ if self.is_inplace:
49
75
  return {}
50
76
  return super().wiring_outputs
51
77
 
78
+ @property
79
+ def readable_outputs(self) -> Sequence[HandleMetadata]:
80
+ if self.is_inplace:
81
+ return []
82
+ return [
83
+ HandleMetadata(
84
+ handle=self.result_var,
85
+ readable_location="on the left-hand side of an assignment",
86
+ )
87
+ ]
88
+
52
89
  @classmethod
53
90
  def result_name(cls) -> str:
54
91
  return ARITHMETIC_EXPRESSION_RESULT_NAME