classiq 0.38.0__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 (499) hide show
  1. classiq/__init__.py +47 -32
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +2 -1
  3. classiq/_internals/api_wrapper.py +235 -97
  4. classiq/_internals/async_utils.py +1 -3
  5. classiq/_internals/authentication/auth0.py +26 -10
  6. classiq/_internals/authentication/authentication.py +11 -0
  7. classiq/_internals/authentication/device.py +10 -5
  8. classiq/_internals/authentication/password_manager.py +18 -6
  9. classiq/_internals/authentication/token_manager.py +10 -5
  10. classiq/_internals/client.py +94 -33
  11. classiq/_internals/config.py +3 -4
  12. classiq/_internals/host_checker.py +38 -15
  13. classiq/_internals/jobs.py +60 -57
  14. classiq/_internals/type_validation.py +9 -9
  15. classiq/analyzer/__init__.py +1 -3
  16. classiq/analyzer/analyzer.py +24 -19
  17. classiq/analyzer/analyzer_utilities.py +10 -10
  18. classiq/analyzer/rb.py +15 -15
  19. classiq/analyzer/show_interactive_hack.py +27 -4
  20. classiq/analyzer/url_utils.py +2 -3
  21. classiq/applications/__init__.py +3 -12
  22. classiq/applications/chemistry/__init__.py +14 -10
  23. classiq/applications/chemistry/ansatz_parameters.py +4 -4
  24. classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +165 -158
  25. classiq/applications/chemistry/ground_state_problem.py +1 -1
  26. classiq/{applications_model_constructors → applications}/combinatorial_helpers/allowed_constraints.py +4 -1
  27. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/arithmetic_expression.py +1 -1
  28. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/isolation.py +1 -1
  29. classiq/{applications_model_constructors → applications}/combinatorial_helpers/combinatorial_problem_utils.py +51 -15
  30. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_mapping.py +12 -12
  31. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_utils.py +8 -6
  32. classiq/{applications_model_constructors → applications}/combinatorial_helpers/memory.py +7 -11
  33. classiq/{applications_model_constructors → applications}/combinatorial_helpers/optimization_model.py +67 -40
  34. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
  35. classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
  36. classiq/{applications_model_constructors → applications}/combinatorial_helpers/sympy_utils.py +2 -2
  37. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/encoding.py +15 -20
  38. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/fixed_variables.py +14 -15
  39. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/ising_converter.py +11 -15
  40. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty.py +1 -2
  41. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty_support.py +3 -7
  42. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/sign_seperation.py +2 -3
  43. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/slack_variables.py +5 -8
  44. classiq/applications/combinatorial_optimization/__init__.py +20 -6
  45. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
  46. classiq/{applications_model_constructors → applications/combinatorial_optimization}/combinatorial_optimization_model_constructor.py +35 -33
  47. classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
  48. classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
  49. classiq/applications/finance/__init__.py +4 -5
  50. classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +48 -42
  51. classiq/applications/grover/__init__.py +9 -0
  52. classiq/{applications_model_constructors → applications/grover}/grover_model_constructor.py +52 -51
  53. classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
  54. classiq/applications/libraries/qmci_library.py +22 -0
  55. classiq/applications/qnn/__init__.py +2 -4
  56. classiq/applications/qnn/circuit_utils.py +6 -6
  57. classiq/applications/qnn/datasets/__init__.py +9 -11
  58. classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
  59. classiq/applications/qnn/datasets/dataset_not.py +2 -1
  60. classiq/applications/qnn/datasets/dataset_parity.py +2 -2
  61. classiq/applications/qnn/gradients/quantum_gradient.py +1 -1
  62. classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
  63. classiq/applications/qnn/qlayer.py +30 -10
  64. classiq/applications/qnn/torch_utils.py +4 -3
  65. classiq/applications/qnn/types.py +5 -5
  66. classiq/applications/qsvm/__init__.py +6 -4
  67. classiq/applications/qsvm/qsvm.py +3 -6
  68. classiq/applications/qsvm/qsvm_data_generation.py +3 -3
  69. classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
  70. classiq/execution/__init__.py +8 -3
  71. classiq/execution/all_hardware_devices.py +11 -0
  72. classiq/execution/execution_session.py +400 -0
  73. classiq/execution/iqcc.py +63 -0
  74. classiq/execution/jobs.py +197 -25
  75. classiq/execution/qnn.py +79 -0
  76. classiq/executor.py +20 -115
  77. classiq/interface/_version.py +1 -1
  78. classiq/interface/analyzer/analysis_params.py +43 -13
  79. classiq/interface/analyzer/cytoscape_graph.py +15 -9
  80. classiq/interface/analyzer/result.py +28 -32
  81. classiq/interface/applications/qsvm.py +20 -29
  82. classiq/interface/ast_node.py +16 -0
  83. classiq/interface/backend/backend_preferences.py +390 -121
  84. classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
  85. classiq/interface/backend/pydantic_backend.py +25 -22
  86. classiq/interface/backend/quantum_backend_providers.py +69 -16
  87. classiq/interface/chemistry/fermionic_operator.py +30 -21
  88. classiq/interface/chemistry/ground_state_problem.py +28 -25
  89. classiq/interface/chemistry/molecule.py +14 -10
  90. classiq/interface/chemistry/operator.py +64 -231
  91. classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
  92. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +1 -3
  93. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  94. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  95. classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
  96. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  97. classiq/interface/combinatorial_optimization/examples/set_cover.py +1 -2
  98. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +8 -9
  99. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  100. classiq/interface/combinatorial_optimization/result.py +1 -3
  101. classiq/interface/combinatorial_optimization/solver_types.py +1 -1
  102. classiq/interface/debug_info/debug_info.py +86 -0
  103. classiq/{exceptions.py → interface/exceptions.py} +37 -9
  104. classiq/interface/execution/iqcc.py +19 -0
  105. classiq/interface/execution/jobs.py +15 -12
  106. classiq/interface/execution/primitives.py +18 -0
  107. classiq/interface/executor/constants.py +1 -0
  108. classiq/interface/executor/execution_preferences.py +26 -114
  109. classiq/interface/executor/execution_request.py +24 -46
  110. classiq/interface/executor/execution_result.py +30 -8
  111. classiq/interface/executor/iqae_result.py +4 -6
  112. classiq/interface/executor/optimizer_preferences.py +17 -14
  113. classiq/interface/executor/quantum_code.py +28 -24
  114. classiq/interface/executor/quantum_instruction_set.py +2 -2
  115. classiq/interface/executor/register_initialization.py +11 -14
  116. classiq/interface/executor/result.py +83 -56
  117. classiq/interface/executor/vqe_result.py +10 -10
  118. classiq/interface/finance/function_input.py +35 -25
  119. classiq/interface/finance/gaussian_model_input.py +5 -5
  120. classiq/interface/finance/log_normal_model_input.py +4 -4
  121. classiq/interface/finance/model_input.py +4 -4
  122. classiq/interface/generator/adjacency.py +1 -3
  123. classiq/interface/generator/amplitude_loading.py +22 -12
  124. classiq/interface/generator/ansatz_library.py +5 -5
  125. classiq/interface/generator/application_apis/arithmetic_declarations.py +8 -5
  126. classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
  127. classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
  128. classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
  129. classiq/interface/generator/application_apis/finance_declarations.py +48 -69
  130. classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
  131. classiq/interface/generator/arith/argument_utils.py +46 -5
  132. classiq/interface/generator/arith/arithmetic.py +35 -16
  133. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +6 -7
  134. classiq/interface/generator/arith/arithmetic_expression_abc.py +66 -25
  135. classiq/interface/generator/arith/arithmetic_expression_parser.py +11 -11
  136. classiq/interface/generator/arith/arithmetic_expression_validator.py +47 -43
  137. classiq/interface/generator/arith/arithmetic_operations.py +14 -6
  138. classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
  139. classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
  140. classiq/interface/generator/arith/ast_node_rewrite.py +3 -2
  141. classiq/interface/generator/arith/binary_ops.py +218 -130
  142. classiq/interface/generator/arith/endianness.py +1 -1
  143. classiq/interface/generator/arith/extremum_operations.py +96 -25
  144. classiq/interface/generator/arith/logical_ops.py +14 -12
  145. classiq/interface/generator/arith/number_utils.py +12 -6
  146. classiq/interface/generator/arith/register_user_input.py +60 -37
  147. classiq/interface/generator/arith/unary_ops.py +49 -29
  148. classiq/interface/generator/arith/uncomputation_methods.py +1 -1
  149. classiq/interface/generator/builtin_api_builder.py +2 -9
  150. classiq/interface/generator/chemistry_function_params.py +3 -3
  151. classiq/interface/generator/circuit_code/circuit_code.py +7 -7
  152. classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
  153. classiq/interface/generator/commuting_pauli_exponentiation.py +7 -7
  154. classiq/interface/generator/compiler_keywords.py +5 -1
  155. classiq/interface/generator/complex_type.py +13 -18
  156. classiq/interface/generator/constant.py +3 -4
  157. classiq/interface/generator/control_state.py +34 -29
  158. classiq/interface/generator/copy.py +47 -0
  159. classiq/interface/generator/custom_ansatz.py +2 -5
  160. classiq/interface/generator/distance.py +3 -5
  161. classiq/interface/generator/excitations.py +3 -2
  162. classiq/interface/generator/expressions/atomic_expression_functions.py +21 -5
  163. classiq/interface/generator/expressions/enums/__init__.py +0 -10
  164. classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
  165. classiq/interface/generator/expressions/evaluated_expression.py +5 -5
  166. classiq/interface/generator/expressions/expression.py +26 -14
  167. classiq/interface/generator/expressions/expression_constants.py +9 -3
  168. classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
  169. classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
  170. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +34 -8
  171. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
  172. classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
  173. classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
  174. classiq/interface/generator/expressions/sympy_supported_expressions.py +19 -11
  175. classiq/interface/generator/finance.py +2 -2
  176. classiq/interface/generator/function_param_library.py +6 -6
  177. classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
  178. classiq/interface/generator/function_params.py +36 -64
  179. classiq/interface/generator/functions/__init__.py +0 -22
  180. classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
  181. classiq/interface/generator/functions/classical_function_declaration.py +18 -9
  182. classiq/interface/generator/functions/classical_type.py +47 -166
  183. classiq/interface/generator/functions/concrete_types.py +55 -0
  184. classiq/interface/generator/functions/function_declaration.py +13 -14
  185. classiq/interface/generator/functions/port_declaration.py +1 -13
  186. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  187. classiq/interface/generator/functions/type_name.py +90 -0
  188. classiq/interface/generator/generated_circuit_data.py +153 -20
  189. classiq/interface/generator/grover_diffuser.py +32 -25
  190. classiq/interface/generator/grover_operator.py +34 -25
  191. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
  192. classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
  193. classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +9 -9
  194. classiq/interface/generator/hardware/hardware_data.py +72 -34
  195. classiq/interface/generator/hardware_efficient_ansatz.py +20 -16
  196. classiq/interface/generator/hartree_fock.py +13 -5
  197. classiq/interface/generator/identity.py +10 -6
  198. classiq/interface/generator/linear_pauli_rotations.py +32 -20
  199. classiq/interface/generator/mcmt_method.py +1 -1
  200. classiq/interface/generator/mcu.py +17 -15
  201. classiq/interface/generator/mcx.py +24 -17
  202. classiq/interface/generator/model/__init__.py +2 -5
  203. classiq/interface/generator/model/constraints.py +26 -8
  204. classiq/interface/generator/model/model.py +27 -190
  205. classiq/interface/generator/model/preferences/preferences.py +115 -41
  206. classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +14 -17
  207. classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
  208. classiq/interface/generator/oracles/custom_oracle.py +15 -13
  209. classiq/interface/generator/oracles/oracle_abc.py +7 -7
  210. classiq/interface/generator/partitioned_register.py +7 -7
  211. classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
  212. classiq/interface/generator/preferences/optimization.py +1 -2
  213. classiq/interface/generator/qpe.py +41 -30
  214. classiq/interface/generator/qsvm.py +9 -10
  215. classiq/interface/generator/quantum_function_call.py +88 -73
  216. classiq/interface/generator/quantum_program.py +41 -24
  217. classiq/interface/generator/range_types.py +11 -12
  218. classiq/interface/generator/register_role.py +18 -6
  219. classiq/interface/generator/slice_parsing_utils.py +5 -5
  220. classiq/interface/generator/standard_gates/controlled_standard_gates.py +30 -39
  221. classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
  222. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  223. classiq/interface/generator/standard_gates/u_gate.py +7 -10
  224. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  225. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
  226. classiq/interface/generator/state_preparation/distributions.py +16 -15
  227. classiq/interface/generator/state_preparation/metrics.py +4 -7
  228. classiq/interface/generator/state_preparation/state_preparation.py +25 -20
  229. classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
  230. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
  231. classiq/interface/generator/transpiler_basis_gates.py +7 -3
  232. classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
  233. classiq/interface/generator/types/compilation_metadata.py +6 -0
  234. classiq/interface/generator/types/enum_declaration.py +54 -0
  235. classiq/interface/generator/types/qstruct_declaration.py +18 -0
  236. classiq/interface/generator/types/struct_declaration.py +7 -11
  237. classiq/interface/generator/ucc.py +5 -4
  238. classiq/interface/generator/unitary_gate.py +5 -5
  239. classiq/interface/generator/user_defined_function_params.py +4 -1
  240. classiq/interface/generator/validations/flow_graph.py +7 -7
  241. classiq/interface/generator/validations/validator_functions.py +4 -4
  242. classiq/interface/generator/visitor.py +23 -16
  243. classiq/interface/hardware.py +29 -8
  244. classiq/interface/helpers/classproperty.py +8 -0
  245. classiq/interface/helpers/custom_encoders.py +2 -2
  246. classiq/interface/helpers/custom_pydantic_types.py +40 -50
  247. classiq/interface/helpers/datastructures.py +26 -0
  248. classiq/interface/helpers/hashable_mixin.py +3 -2
  249. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  250. classiq/interface/helpers/pydantic_model_helpers.py +7 -5
  251. classiq/interface/helpers/validation_helpers.py +3 -20
  252. classiq/interface/helpers/versioned_model.py +1 -4
  253. classiq/interface/ide/ide_data.py +16 -20
  254. classiq/interface/ide/visual_model.py +130 -0
  255. classiq/interface/interface_version.py +1 -0
  256. classiq/interface/jobs.py +29 -69
  257. classiq/interface/model/allocate.py +16 -0
  258. classiq/interface/model/bind_operation.py +32 -9
  259. classiq/interface/model/classical_if.py +15 -0
  260. classiq/interface/model/classical_parameter_declaration.py +33 -3
  261. classiq/interface/model/control.py +45 -0
  262. classiq/interface/model/handle_binding.py +298 -20
  263. classiq/interface/model/inplace_binary_operation.py +29 -24
  264. classiq/interface/model/invert.py +12 -0
  265. classiq/interface/model/model.py +69 -61
  266. classiq/interface/model/native_function_definition.py +17 -20
  267. classiq/interface/model/parameter.py +13 -0
  268. classiq/interface/model/phase_operation.py +11 -0
  269. classiq/interface/model/port_declaration.py +27 -9
  270. classiq/interface/model/power.py +14 -0
  271. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +30 -18
  272. classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
  273. classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
  274. classiq/interface/model/quantum_function_call.py +141 -343
  275. classiq/interface/model/quantum_function_declaration.py +190 -157
  276. classiq/interface/model/quantum_lambda_function.py +33 -32
  277. classiq/interface/model/quantum_statement.py +71 -12
  278. classiq/interface/model/quantum_type.py +177 -40
  279. classiq/interface/model/quantum_variable_declaration.py +3 -25
  280. classiq/interface/model/repeat.py +15 -0
  281. classiq/interface/model/statement_block.py +40 -14
  282. classiq/interface/model/validation_handle.py +13 -6
  283. classiq/interface/model/variable_declaration_statement.py +3 -1
  284. classiq/interface/model/within_apply_operation.py +7 -5
  285. classiq/interface/server/global_versions.py +6 -7
  286. classiq/interface/server/routes.py +17 -21
  287. classiq/interface/source_reference.py +59 -0
  288. classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
  289. classiq/model_expansions/capturing/__init__.py +0 -0
  290. classiq/model_expansions/capturing/captured_vars.py +435 -0
  291. classiq/model_expansions/capturing/mangling_utils.py +56 -0
  292. classiq/model_expansions/closure.py +171 -0
  293. classiq/model_expansions/debug_flag.py +3 -0
  294. classiq/model_expansions/evaluators/__init__.py +0 -0
  295. classiq/model_expansions/evaluators/arg_type_match.py +158 -0
  296. classiq/model_expansions/evaluators/argument_types.py +42 -0
  297. classiq/model_expansions/evaluators/classical_expression.py +36 -0
  298. classiq/model_expansions/evaluators/control.py +144 -0
  299. classiq/model_expansions/evaluators/parameter_types.py +226 -0
  300. classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
  301. classiq/model_expansions/evaluators/type_type_match.py +90 -0
  302. classiq/model_expansions/expression_evaluator.py +135 -0
  303. classiq/model_expansions/expression_renamer.py +76 -0
  304. classiq/model_expansions/function_builder.py +247 -0
  305. classiq/model_expansions/generative_functions.py +158 -0
  306. classiq/model_expansions/interpreters/__init__.py +0 -0
  307. classiq/model_expansions/interpreters/base_interpreter.py +263 -0
  308. classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
  309. classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
  310. classiq/model_expansions/model_tables.py +18 -0
  311. classiq/model_expansions/quantum_operations/__init__.py +9 -0
  312. classiq/model_expansions/quantum_operations/bind.py +60 -0
  313. classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
  314. classiq/model_expansions/quantum_operations/classicalif.py +53 -0
  315. classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
  316. classiq/model_expansions/quantum_operations/emitter.py +181 -0
  317. classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
  318. classiq/model_expansions/quantum_operations/repeat.py +56 -0
  319. classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
  320. classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
  321. classiq/model_expansions/scope.py +240 -0
  322. classiq/model_expansions/scope_initialization.py +150 -0
  323. classiq/model_expansions/sympy_conversion/__init__.py +0 -0
  324. classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
  325. classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
  326. classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
  327. classiq/model_expansions/transformers/__init__.py +0 -0
  328. classiq/model_expansions/transformers/ast_renamer.py +26 -0
  329. classiq/model_expansions/transformers/var_splitter.py +299 -0
  330. classiq/model_expansions/utils/__init__.py +0 -0
  331. classiq/model_expansions/utils/counted_name_allocator.py +11 -0
  332. classiq/model_expansions/utils/handles_collector.py +33 -0
  333. classiq/model_expansions/visitors/__init__.py +0 -0
  334. classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
  335. classiq/model_expansions/visitors/variable_references.py +144 -0
  336. classiq/open_library/__init__.py +4 -0
  337. classiq/open_library/functions/__init__.py +130 -0
  338. classiq/open_library/functions/amplitude_estimation.py +30 -0
  339. classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
  340. classiq/open_library/functions/grover.py +157 -0
  341. classiq/open_library/functions/hea.py +115 -0
  342. classiq/open_library/functions/linear_pauli_rotation.py +82 -0
  343. classiq/open_library/functions/modular_exponentiation.py +201 -0
  344. classiq/open_library/functions/qaoa_penalty.py +117 -0
  345. classiq/open_library/functions/qft_functions.py +54 -0
  346. classiq/open_library/functions/qpe.py +46 -0
  347. classiq/open_library/functions/qsvt.py +331 -0
  348. classiq/open_library/functions/state_preparation.py +301 -0
  349. classiq/open_library/functions/swap_test.py +27 -0
  350. classiq/open_library/functions/utility_functions.py +81 -0
  351. classiq/open_library/functions/variational.py +52 -0
  352. classiq/qmod/__init__.py +10 -10
  353. classiq/qmod/builtins/__init__.py +19 -2
  354. classiq/qmod/builtins/classical_execution_primitives.py +36 -14
  355. classiq/qmod/builtins/classical_functions.py +39 -43
  356. classiq/qmod/builtins/constants.py +10 -0
  357. classiq/qmod/builtins/enums.py +208 -0
  358. classiq/qmod/builtins/functions/__init__.py +137 -0
  359. classiq/qmod/builtins/functions/allocation.py +150 -0
  360. classiq/qmod/builtins/functions/arithmetic.py +55 -0
  361. classiq/qmod/builtins/functions/benchmarking.py +8 -0
  362. classiq/qmod/builtins/functions/chemistry.py +91 -0
  363. classiq/qmod/builtins/functions/exponentiation.py +105 -0
  364. classiq/qmod/builtins/functions/finance.py +34 -0
  365. classiq/qmod/builtins/functions/operators.py +16 -0
  366. classiq/qmod/builtins/functions/qsvm.py +24 -0
  367. classiq/qmod/builtins/functions/standard_gates.py +651 -0
  368. classiq/qmod/builtins/operations.py +373 -40
  369. classiq/qmod/builtins/structs.py +103 -80
  370. classiq/qmod/cfunc.py +2 -2
  371. classiq/qmod/classical_function.py +4 -8
  372. classiq/qmod/cparam.py +64 -0
  373. classiq/qmod/create_model_function.py +56 -0
  374. classiq/qmod/declaration_inferrer.py +143 -101
  375. classiq/qmod/expression_query.py +20 -4
  376. classiq/qmod/generative.py +42 -0
  377. classiq/qmod/model_state_container.py +18 -6
  378. classiq/qmod/native/__init__.py +7 -0
  379. classiq/qmod/native/expression_to_qmod.py +16 -11
  380. classiq/qmod/native/pretty_printer.py +187 -97
  381. classiq/qmod/pretty_print/__init__.py +7 -0
  382. classiq/qmod/pretty_print/expression_to_python.py +222 -0
  383. classiq/qmod/pretty_print/pretty_printer.py +572 -0
  384. classiq/qmod/python_classical_type.py +67 -0
  385. classiq/qmod/qfunc.py +60 -8
  386. classiq/qmod/qmod_constant.py +93 -26
  387. classiq/qmod/qmod_parameter.py +68 -59
  388. classiq/qmod/qmod_variable.py +468 -155
  389. classiq/qmod/quantum_callable.py +17 -7
  390. classiq/qmod/quantum_expandable.py +269 -96
  391. classiq/qmod/quantum_function.py +196 -41
  392. classiq/qmod/semantics/__init__.py +0 -0
  393. classiq/qmod/semantics/annotation/__init__.py +0 -0
  394. classiq/qmod/semantics/annotation/call_annotation.py +92 -0
  395. classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
  396. classiq/qmod/semantics/error_manager.py +88 -0
  397. classiq/qmod/semantics/lambdas.py +25 -0
  398. classiq/qmod/semantics/static_semantics_visitor.py +384 -0
  399. classiq/qmod/semantics/validation/__init__.py +0 -0
  400. classiq/qmod/semantics/validation/constants_validation.py +16 -0
  401. classiq/qmod/semantics/validation/func_call_validation.py +99 -0
  402. classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
  403. classiq/qmod/semantics/validation/handle_validation.py +85 -0
  404. classiq/qmod/semantics/validation/main_validation.py +33 -0
  405. classiq/qmod/semantics/validation/types_validation.py +128 -0
  406. classiq/qmod/symbolic.py +147 -123
  407. classiq/qmod/symbolic_expr.py +27 -12
  408. classiq/qmod/symbolic_type.py +2 -5
  409. classiq/qmod/type_attribute_remover.py +32 -0
  410. classiq/qmod/utilities.py +98 -4
  411. classiq/qmod/write_qmod.py +17 -3
  412. classiq/synthesis.py +210 -22
  413. {classiq-0.38.0.dist-info → classiq-0.65.3.dist-info}/METADATA +16 -9
  414. classiq-0.65.3.dist-info/RECORD +521 -0
  415. classiq/_internals/_qfunc_ext.py +0 -6
  416. classiq/applications/benchmarking/__init__.py +0 -9
  417. classiq/applications/benchmarking/mirror_benchmarking.py +0 -70
  418. classiq/applications/numpy_utils.py +0 -37
  419. classiq/applications_model_constructors/__init__.py +0 -25
  420. classiq/applications_model_constructors/combinatorial_helpers/multiple_comp_basis_sp.py +0 -34
  421. classiq/applications_model_constructors/combinatorial_helpers/pauli_helpers/pauli_utils.py +0 -65
  422. classiq/applications_model_constructors/combinatorial_helpers/pyomo_utils.py +0 -243
  423. classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
  424. classiq/applications_model_constructors/libraries/qmci_library.py +0 -107
  425. classiq/builtin_functions/__init__.py +0 -43
  426. classiq/builtin_functions/amplitude_loading.py +0 -3
  427. classiq/builtin_functions/binary_ops.py +0 -1
  428. classiq/builtin_functions/exponentiation.py +0 -5
  429. classiq/builtin_functions/qpe.py +0 -4
  430. classiq/builtin_functions/qsvm.py +0 -7
  431. classiq/builtin_functions/range_types.py +0 -5
  432. classiq/builtin_functions/standard_gates.py +0 -1
  433. classiq/builtin_functions/state_preparation.py +0 -6
  434. classiq/builtin_functions/suzuki_trotter.py +0 -3
  435. classiq/interface/executor/aws_execution_cost.py +0 -73
  436. classiq/interface/executor/error_mitigation.py +0 -6
  437. classiq/interface/generator/credit_risk_example/linear_gci.py +0 -122
  438. classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -69
  439. classiq/interface/generator/expressions/enums/chemistry.py +0 -28
  440. classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
  441. classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
  442. classiq/interface/generator/expressions/enums/optimizers.py +0 -9
  443. classiq/interface/generator/expressions/enums/pauli.py +0 -8
  444. classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
  445. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
  446. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
  447. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
  448. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -1229
  449. classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -95
  450. classiq/interface/generator/functions/foreign_function_definition.py +0 -114
  451. classiq/interface/generator/functions/function_implementation.py +0 -107
  452. classiq/interface/generator/functions/native_function_definition.py +0 -155
  453. classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
  454. classiq/interface/generator/functions/register.py +0 -44
  455. classiq/interface/generator/functions/register_mapping_data.py +0 -106
  456. classiq/interface/generator/inequality_mixer.py +0 -51
  457. classiq/interface/generator/model/classical_main_validator.py +0 -106
  458. classiq/interface/generator/range_mixer.py +0 -56
  459. classiq/interface/generator/state_propagator.py +0 -74
  460. classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -1
  461. classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
  462. classiq/interface/ide/show.py +0 -34
  463. classiq/interface/model/call_synthesis_data.py +0 -68
  464. classiq/interface/model/common_model_types.py +0 -23
  465. classiq/interface/model/quantum_expressions/control_state.py +0 -38
  466. classiq/interface/model/quantum_if_operation.py +0 -94
  467. classiq/interface/model/resolvers/function_call_resolver.py +0 -43
  468. classiq/interface/model/validations/handle_validation_base.py +0 -55
  469. classiq/interface/model/validations/handles_validator.py +0 -156
  470. classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
  471. classiq/model/__init__.py +0 -14
  472. classiq/model/composite_function_generator.py +0 -33
  473. classiq/model/function_handler.py +0 -462
  474. classiq/model/logic_flow.py +0 -149
  475. classiq/model/logic_flow_change_handler.py +0 -71
  476. classiq/model/model.py +0 -229
  477. classiq/qmod/builtins/functions.py +0 -913
  478. classiq/qmod/qmod_struct.py +0 -37
  479. classiq/quantum_functions/__init__.py +0 -17
  480. classiq/quantum_functions/annotation_parser.py +0 -205
  481. classiq/quantum_functions/decorators.py +0 -22
  482. classiq/quantum_functions/function_library.py +0 -181
  483. classiq/quantum_functions/function_parser.py +0 -74
  484. classiq/quantum_functions/quantum_function.py +0 -236
  485. classiq-0.38.0.dist-info/RECORD +0 -454
  486. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/__init__.py +0 -0
  487. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/__init__.py +0 -0
  488. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/__init__.py +0 -0
  489. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +0 -0
  490. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/py.typed +0 -0
  491. /classiq/{applications_model_constructors/combinatorial_helpers/transformations → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
  492. /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
  493. /classiq/{interface/generator/credit_risk_example → applications/hamiltonian}/__init__.py +0 -0
  494. /classiq/{interface/generator/functions/core_lib_declarations → applications/libraries}/__init__.py +0 -0
  495. /classiq/interface/{model/resolvers → debug_info}/__init__.py +0 -0
  496. /classiq/{_internals → interface}/enum_utils.py +0 -0
  497. /classiq/interface/{model/validations → generator/functions/builtins}/__init__.py +0 -0
  498. /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → model_expansions/__init__.py} +0 -0
  499. {classiq-0.38.0.dist-info → classiq-0.65.3.dist-info}/WHEEL +0 -0
@@ -1,8 +1,12 @@
1
1
  from collections import Counter
2
- from typing import Any, Dict, List, Literal, NewType, Optional, Set
2
+ from collections.abc import Mapping
3
+ from typing import Any, Literal, NewType
3
4
 
4
5
  import pydantic
5
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
6
10
  from classiq.interface.executor.execution_preferences import ExecutionPreferences
7
11
  from classiq.interface.generator.constant import Constant
8
12
  from classiq.interface.generator.functions.port_declaration import (
@@ -11,20 +15,20 @@ from classiq.interface.generator.functions.port_declaration import (
11
15
  from classiq.interface.generator.model.constraints import Constraints
12
16
  from classiq.interface.generator.model.preferences.preferences import Preferences
13
17
  from classiq.interface.generator.quantum_function_call import SUFFIX_RANDOMIZER
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
14
21
  from classiq.interface.generator.types.struct_declaration import StructDeclaration
15
22
  from classiq.interface.helpers.pydantic_model_helpers import nameables_to_dict
16
23
  from classiq.interface.helpers.versioned_model import VersionedModel
17
- from classiq.interface.model.native_function_definition import NativeFunctionDefinition
18
- from classiq.interface.model.quantum_function_declaration import (
19
- QuantumFunctionDeclaration,
24
+ from classiq.interface.model.native_function_definition import (
25
+ NativeFunctionDefinition,
20
26
  )
21
- from classiq.interface.model.resolvers.function_call_resolver import (
22
- resolve_function_calls,
27
+ from classiq.interface.model.quantum_function_declaration import (
28
+ NamedParamsQuantumFunctionDeclaration,
23
29
  )
24
30
  from classiq.interface.model.statement_block import StatementBlock
25
31
 
26
- from classiq.exceptions import ClassiqValueError
27
-
28
32
  USER_MODEL_MARKER = "user"
29
33
 
30
34
  MAIN_FUNCTION_NAME = "main"
@@ -51,29 +55,37 @@ class VersionedSerializedModel(VersionedModel):
51
55
  model: SerializedModel
52
56
 
53
57
 
54
- class Model(VersionedModel):
55
- """
56
- All the relevant data for generating quantum circuit in one place.
57
- """
58
+ class Model(VersionedModel, ASTNode):
58
59
 
59
60
  kind: Literal["user"] = pydantic.Field(default=USER_MODEL_MARKER)
60
61
 
61
62
  # Must be validated before logic_flow
62
- functions: List[NativeFunctionDefinition] = pydantic.Field(
63
+ functions: list[NativeFunctionDefinition] = pydantic.Field(
63
64
  default_factory=list,
64
65
  description="The user-defined custom type library.",
66
+ validate_default=True,
67
+ )
68
+
69
+ enums: list[EnumDeclaration] = pydantic.Field(
70
+ default_factory=list,
71
+ description="user-defined enums",
65
72
  )
66
73
 
67
- types: List[StructDeclaration] = pydantic.Field(
74
+ types: list[StructDeclaration] = pydantic.Field(
68
75
  default_factory=list,
69
- description="The user-defined custom function library.",
76
+ description="user-defined structs",
77
+ )
78
+
79
+ qstructs: list[QStructDeclaration] = pydantic.Field(
80
+ default_factory=list,
81
+ description="user-defined quantum structs",
70
82
  )
71
83
 
72
84
  classical_execution_code: str = pydantic.Field(
73
85
  description="The classical execution code of the model", default=""
74
86
  )
75
87
 
76
- constants: List[Constant] = pydantic.Field(
88
+ constants: list[Constant] = pydantic.Field(
77
89
  default_factory=list,
78
90
  )
79
91
 
@@ -84,6 +96,13 @@ class Model(VersionedModel):
84
96
  )
85
97
  preferences: Preferences = pydantic.Field(default_factory=Preferences)
86
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
+
87
106
  @property
88
107
  def main_func(self) -> NativeFunctionDefinition:
89
108
  return self.function_dict[MAIN_FUNCTION_NAME] # type:ignore[return-value]
@@ -92,9 +111,17 @@ class Model(VersionedModel):
92
111
  def body(self) -> StatementBlock:
93
112
  return self.main_func.body
94
113
 
95
- @pydantic.validator("preferences", always=True)
96
- def _seed_suffix_randomizer(cls, preferences: Preferences) -> Preferences:
97
- 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
+ )
98
125
  return preferences
99
126
 
100
127
  def _get_qualified_direction(
@@ -105,69 +132,41 @@ class Model(VersionedModel):
105
132
  return direction
106
133
 
107
134
  @property
108
- def function_dict(self) -> Dict[str, QuantumFunctionDeclaration]:
135
+ def function_dict(self) -> Mapping[str, NamedParamsQuantumFunctionDeclaration]:
109
136
  return nameables_to_dict(self.functions)
110
137
 
111
- @pydantic.validator("functions", always=True)
138
+ @pydantic.field_validator("functions")
139
+ @classmethod
112
140
  def _add_empty_main(
113
- cls, functions: List[NativeFunctionDefinition]
114
- ) -> List[NativeFunctionDefinition]:
141
+ cls, functions: list[NativeFunctionDefinition]
142
+ ) -> list[NativeFunctionDefinition]:
115
143
  function_dict = nameables_to_dict(functions)
116
144
  if MAIN_FUNCTION_NAME not in function_dict:
117
145
  functions.append(_create_empty_main_function())
118
146
  return functions
119
147
 
120
- @pydantic.root_validator()
121
- def validate_static_correctness(cls, values: Dict[str, Any]) -> Dict[str, Any]:
122
- functions: Optional[List[QuantumFunctionDeclaration]] = values.get("functions")
123
- if functions is None:
124
- return values
125
-
126
- resolve_function_calls(
127
- values,
128
- nameables_to_dict(functions),
129
- )
130
- for func_def in functions:
131
- if isinstance(func_def, NativeFunctionDefinition):
132
- func_def.validate_body()
133
- return values
134
-
135
- @pydantic.validator("types")
136
- def types_validator(cls, types: List[StructDeclaration]) -> List[StructDeclaration]:
137
- user_defined_types: Set[str] = set()
138
- for ctype in types:
139
- if ctype.name in StructDeclaration.BUILTIN_STRUCT_DECLARATIONS:
140
- raise ClassiqValueError(
141
- TYPE_NAME_CONFLICT_BUILTIN.format(name=ctype.name)
142
- )
143
- if ctype.name in user_defined_types:
144
- raise ClassiqValueError(TYPE_NAME_CONFLICT_USER.format(name=ctype.name))
145
- user_defined_types.add(ctype.name)
146
-
147
- return types
148
-
149
148
  def get_model(self) -> SerializedModel:
150
- return SerializedModel(
151
- self.json(exclude_defaults=True, exclude_unset=True, indent=2)
152
- )
149
+ return SerializedModel(self.model_dump_json(indent=2))
153
150
 
154
- @pydantic.validator("functions")
151
+ @pydantic.field_validator("functions")
152
+ @classmethod
155
153
  def _validate_entry_point(
156
- cls, functions: List[NativeFunctionDefinition]
157
- ) -> List[NativeFunctionDefinition]:
154
+ cls, functions: list[NativeFunctionDefinition]
155
+ ) -> list[NativeFunctionDefinition]:
158
156
  function_dict = nameables_to_dict(functions)
159
157
  if MAIN_FUNCTION_NAME not in function_dict:
160
158
  raise ClassiqValueError("The model must contain a `main` function")
161
159
  if any(
162
160
  pd.direction != PortDeclarationDirection.Output
163
- for pd in function_dict[MAIN_FUNCTION_NAME].port_declarations.values()
161
+ for pd in function_dict[MAIN_FUNCTION_NAME].port_declarations
164
162
  ):
165
163
  raise ClassiqValueError("Function 'main' cannot declare quantum inputs")
166
164
 
167
165
  return functions
168
166
 
169
- @pydantic.validator("constants")
170
- def _validate_constants(cls, constants: List[Constant]) -> List[Constant]:
167
+ @pydantic.field_validator("constants")
168
+ @classmethod
169
+ def _validate_constants(cls, constants: list[Constant]) -> list[Constant]:
171
170
  constant_definition_counts = Counter(
172
171
  [constant.name for constant in constants]
173
172
  ).items()
@@ -180,3 +179,12 @@ class Model(VersionedModel):
180
179
  f"{multiply_defined_constants}"
181
180
  )
182
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,18 +1,23 @@
1
+ from typing import TYPE_CHECKING
2
+
1
3
  import pydantic
2
4
 
3
5
  from classiq.interface.model.quantum_function_declaration import (
4
- QuantumFunctionDeclaration,
5
- )
6
- from classiq.interface.model.statement_block import StatementBlock
7
- from classiq.interface.model.validations.handles_validator import HandleValidator
8
- from classiq.interface.model.variable_declaration_statement import (
9
- VariableDeclarationStatement,
6
+ NamedParamsQuantumFunctionDeclaration,
10
7
  )
11
8
 
12
- 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
+ )
13
18
 
14
19
 
15
- class NativeFunctionDefinition(QuantumFunctionDeclaration):
20
+ class NativeFunctionDefinition(NamedParamsQuantumFunctionDeclaration):
16
21
  """
17
22
  Facilitates the creation of a user-defined composite function
18
23
 
@@ -20,17 +25,9 @@ class NativeFunctionDefinition(QuantumFunctionDeclaration):
20
25
  objects from other classes.
21
26
  """
22
27
 
23
- body: StatementBlock = pydantic.Field(
28
+ body: "StatementBlock" = pydantic.Field(
24
29
  default_factory=list, description="List of function calls to perform."
25
30
  )
26
-
27
- def validate_body(self) -> None:
28
- handle_validator = HandleValidator(self.port_declarations)
29
-
30
- for statement in self.body:
31
- if isinstance(statement, VariableDeclarationStatement):
32
- handle_validator.handle_variable_declaration(statement)
33
- else:
34
- handle_validator.handle_operation(statement)
35
-
36
- 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,63 +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
- ]:
36
+ ) -> Mapping[str, ConcreteHandleBinding]:
39
37
  inouts = {self.result_name(): self.result_var}
40
38
  if len(self.var_handles) == 1:
41
39
  inouts[AMPLITUDE_IO_NAME] = self.var_handles[0]
42
40
  return inouts
43
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
+
44
59
  @property
45
60
  def wiring_outputs(self) -> Mapping[str, HandleBinding]:
46
61
  return {}
47
62
 
48
63
  def initialize_var_types(
49
64
  self,
50
- var_types: Dict[str, QuantumType],
65
+ var_types: dict[str, QuantumType],
51
66
  machine_precision: int,
52
67
  ) -> None:
53
68
  if len(var_types) != 1:
54
69
  raise ClassiqValueError(MULTI_VARS_UNSUPPORTED_ERROR)
55
- var_type = var_types[self.var_handles[0].name]
56
- if not (
57
- isinstance(var_type, QuantumNumeric)
58
- and var_type.fraction_digits_value == var_type.size_in_bits
59
- ):
60
- 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)
61
73
  super().initialize_var_types(var_types, machine_precision)
62
74
 
63
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
@@ -1,77 +1,54 @@
1
1
  import abc
2
- import ast
3
- from typing import Dict, List, Mapping, Optional, Set, Union
2
+ from collections.abc import Mapping
3
+ from typing import Optional
4
4
 
5
5
  import pydantic
6
6
 
7
- from classiq.interface.generator.arith.arithmetic_expression_validator import (
8
- DEFAULT_SUPPORTED_FUNC_NAMES,
9
- )
10
7
  from classiq.interface.generator.expressions.expression import Expression
11
- from classiq.interface.generator.expressions.sympy_supported_expressions import (
12
- SYMPY_SUPPORTED_EXPRESSIONS,
13
- )
14
8
  from classiq.interface.helpers.pydantic_model_helpers import nameables_to_dict
15
9
  from classiq.interface.model.handle_binding import (
10
+ ConcreteHandleBinding,
16
11
  HandleBinding,
17
- SlicedHandleBinding,
18
- SubscriptHandleBinding,
19
12
  )
20
13
  from classiq.interface.model.quantum_statement import QuantumOperation
21
14
  from classiq.interface.model.quantum_type import QuantumType
22
15
 
23
16
 
24
- class VarRefCollector(ast.NodeVisitor):
25
- def __init__(self) -> None:
26
- self.var_names: Set[str] = set()
27
-
28
- def generic_visit(self, node: ast.AST) -> None:
29
- if isinstance(node, ast.Name) and node.id not in set(
30
- SYMPY_SUPPORTED_EXPRESSIONS
31
- ) | set(DEFAULT_SUPPORTED_FUNC_NAMES):
32
- self.var_names.add(node.id)
33
- super().generic_visit(node)
34
-
35
-
36
17
  class QuantumExpressionOperation(QuantumOperation):
37
18
  expression: Expression = pydantic.Field()
38
- _var_handles: List[HandleBinding] = pydantic.PrivateAttr(
19
+ _var_handles: list[HandleBinding] = pydantic.PrivateAttr(
39
20
  default_factory=list,
40
21
  )
41
- _var_types: Dict[str, QuantumType] = pydantic.PrivateAttr(
22
+ _var_types: dict[str, QuantumType] = pydantic.PrivateAttr(
42
23
  default_factory=dict,
43
24
  )
44
25
 
45
26
  @property
46
- def var_handles(self) -> List[HandleBinding]:
27
+ def var_handles(self) -> list[HandleBinding]:
47
28
  return self._var_handles
48
29
 
49
- def set_var_handles(self, var_handles: List[HandleBinding]) -> None:
30
+ def set_var_handles(self, var_handles: list[HandleBinding]) -> None:
50
31
  self._var_handles = var_handles
51
32
 
52
33
  @property
53
- def var_types(self) -> Dict[str, QuantumType]:
34
+ def var_types(self) -> dict[str, QuantumType]:
54
35
  return self._var_types
55
36
 
56
37
  def initialize_var_types(
57
38
  self,
58
- var_types: Dict[str, QuantumType],
39
+ var_types: dict[str, QuantumType],
59
40
  machine_precision: int,
60
41
  ) -> None:
61
- assert len(var_types) == len(self.var_handles)
42
+ assert len(var_types) == len(self.var_handles) or len(self.var_handles) == 0
62
43
  self._var_types = var_types
63
44
 
64
45
  @property
65
- def wiring_inouts(
66
- self,
67
- ) -> Mapping[
68
- str, Union[SlicedHandleBinding, SubscriptHandleBinding, HandleBinding]
69
- ]:
46
+ def wiring_inouts(self) -> Mapping[str, ConcreteHandleBinding]:
70
47
  return nameables_to_dict(self.var_handles)
71
48
 
72
49
 
73
50
  class QuantumAssignmentOperation(QuantumExpressionOperation):
74
- result_var: HandleBinding = pydantic.Field(
51
+ result_var: ConcreteHandleBinding = pydantic.Field(
75
52
  description="The variable storing the expression result"
76
53
  )
77
54
  _result_type: Optional[QuantumType] = pydantic.PrivateAttr(