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
@@ -0,0 +1,76 @@
1
+ import ast
2
+ from collections.abc import Sequence
3
+
4
+ from classiq.interface.generator.expressions.expression import Expression
5
+ from classiq.interface.generator.expressions.expression_constants import (
6
+ RESERVED_EXPRESSIONS,
7
+ )
8
+ from classiq.interface.generator.visitor import Transformer
9
+ from classiq.interface.model.quantum_function_call import QuantumFunctionCall
10
+ from classiq.interface.model.quantum_function_declaration import (
11
+ ClassicalParameterDeclaration,
12
+ PositionalArg,
13
+ )
14
+
15
+ from classiq.model_expansions.visitors.variable_references import VarRefTransformer
16
+
17
+
18
+ class ExpressionRenamer(Transformer):
19
+
20
+ def __init__(self, var_mapping: dict[str, str]) -> None:
21
+ self.var_ref_transformer = VarRefTransformer(var_mapping)
22
+
23
+ @property
24
+ def var_mapping(self) -> dict[str, str]:
25
+ return self.var_ref_transformer.var_mapping
26
+
27
+ def visit_QuantumFunctionCall(
28
+ self, node: QuantumFunctionCall
29
+ ) -> QuantumFunctionCall:
30
+ update_dict = dict(
31
+ positional_args=[self.visit(arg) for arg in node.positional_args],
32
+ )
33
+ return node.model_copy(update=update_dict)
34
+
35
+ def visit_Expression(self, expression: Expression) -> Expression:
36
+ parsed_expr = ast.parse(expression.expr)
37
+ renamed_expr = self.var_ref_transformer.visit(parsed_expr)
38
+ return Expression(expr=ast.unparse(renamed_expr))
39
+
40
+ def rename_string(self, name: str) -> str:
41
+ return self.var_mapping.get(name, name)
42
+
43
+ def rename_expression_dict(
44
+ self, expr_dict: dict[str, Expression]
45
+ ) -> dict[str, Expression]:
46
+ return {
47
+ self.rename_string(key): self.visit(val) for key, val in expr_dict.items()
48
+ }
49
+
50
+ @classmethod
51
+ def from_positional_arg_declarations(
52
+ cls, positional_arg_declarations: Sequence[PositionalArg], suffix: str
53
+ ) -> "ExpressionRenamer":
54
+ var_mapping: dict[str, str] = dict()
55
+ for arg in positional_arg_declarations:
56
+ if not isinstance(arg, ClassicalParameterDeclaration):
57
+ continue
58
+ if arg.name in RESERVED_EXPRESSIONS:
59
+ continue
60
+ new_name = arg.name + suffix
61
+ var_mapping[arg.name] = new_name
62
+
63
+ return cls(var_mapping)
64
+
65
+ def rename_positional_arg_declarations(
66
+ self, positional_arg_declarations: Sequence[PositionalArg]
67
+ ) -> Sequence[PositionalArg]:
68
+ return tuple(
69
+ (
70
+ arg.rename(self.var_mapping[arg.name])
71
+ if isinstance(arg, ClassicalParameterDeclaration)
72
+ and arg.name in self.var_mapping
73
+ else arg
74
+ )
75
+ for arg in positional_arg_declarations
76
+ )
@@ -0,0 +1,247 @@
1
+ from collections.abc import Iterator, Sequence
2
+ from contextlib import contextmanager
3
+ from dataclasses import dataclass, field
4
+ from typing import Generic, Optional, TypeVar
5
+
6
+ from classiq.interface.exceptions import ClassiqInternalExpansionError
7
+ from classiq.interface.generator.compiler_keywords import (
8
+ EXPANDED_KEYWORD,
9
+ LAMBDA_KEYWORD,
10
+ )
11
+ from classiq.interface.generator.functions.builtins.internal_operators import (
12
+ WITHIN_APPLY_NAME,
13
+ )
14
+ from classiq.interface.model.model import MAIN_FUNCTION_NAME
15
+ from classiq.interface.model.native_function_definition import (
16
+ NativeFunctionDefinition,
17
+ )
18
+ from classiq.interface.model.port_declaration import PortDeclaration
19
+ from classiq.interface.model.quantum_function_declaration import (
20
+ PositionalArg,
21
+ )
22
+ from classiq.interface.model.quantum_statement import QuantumStatement
23
+ from classiq.interface.model.variable_declaration_statement import (
24
+ VariableDeclarationStatement,
25
+ )
26
+ from classiq.interface.source_reference import SourceReference
27
+
28
+ from classiq.model_expansions.capturing.captured_vars import (
29
+ CapturedVars,
30
+ validate_captured_directions,
31
+ )
32
+ from classiq.model_expansions.closure import (
33
+ Closure,
34
+ FunctionClosure,
35
+ GenerativeFunctionClosure,
36
+ )
37
+ from classiq.model_expansions.evaluators.quantum_type_utils import (
38
+ is_signature_monomorphic,
39
+ )
40
+ from classiq.model_expansions.scope import Scope
41
+ from classiq.model_expansions.utils.counted_name_allocator import CountedNameAllocator
42
+
43
+ ClosureType = TypeVar("ClosureType", bound=Closure)
44
+
45
+
46
+ @dataclass
47
+ class Block:
48
+ statements: list[QuantumStatement] = field(default_factory=list)
49
+ captured_vars: CapturedVars = field(default_factory=CapturedVars)
50
+
51
+ @property
52
+ def variable_declarations(self) -> list[VariableDeclarationStatement]:
53
+ return [
54
+ stmt
55
+ for stmt in self.statements
56
+ if isinstance(stmt, VariableDeclarationStatement)
57
+ ]
58
+
59
+
60
+ @dataclass
61
+ class OperationContext(Generic[ClosureType]):
62
+ closure: ClosureType
63
+ blocks: dict[str, Block] = field(default_factory=dict)
64
+
65
+ @property
66
+ def name(self) -> str:
67
+ return self.closure.name
68
+
69
+ @property
70
+ def positional_arg_declarations(self) -> Sequence[PositionalArg]:
71
+ return self.closure.positional_arg_declarations
72
+
73
+ def statements(self, block_name: str) -> list[QuantumStatement]:
74
+ return self.blocks[block_name].statements
75
+
76
+
77
+ @dataclass
78
+ class FunctionContext(OperationContext[FunctionClosure]):
79
+ @classmethod
80
+ def create(cls, original_function: FunctionClosure) -> "FunctionContext":
81
+ return cls(original_function, {"body": Block()})
82
+
83
+ @property
84
+ def body(self) -> list[QuantumStatement]:
85
+ return self.statements("body")
86
+
87
+ @property
88
+ def is_lambda(self) -> bool:
89
+ return self.closure.is_lambda
90
+
91
+
92
+ class OperationBuilder:
93
+ def __init__(
94
+ self, functions_scope: Scope, counted_name_allocator: CountedNameAllocator
95
+ ) -> None:
96
+ self._operations: list[OperationContext] = []
97
+ self._blocks: list[str] = []
98
+ self._functions_scope = functions_scope
99
+ self._current_source_ref: Optional[SourceReference] = None
100
+ self._counted_name_allocator = counted_name_allocator
101
+
102
+ @property
103
+ def current_operation(self) -> Closure:
104
+ return self._operations[-1].closure
105
+
106
+ @property
107
+ def current_scope(self) -> Scope:
108
+ return self.current_operation.scope
109
+
110
+ @property
111
+ def current_function(self) -> FunctionClosure:
112
+ return self._get_last_function(self._operations)
113
+
114
+ @property
115
+ def parent_function(self) -> FunctionClosure:
116
+ return self._get_last_function(self._operations[:-1])
117
+
118
+ @staticmethod
119
+ def _get_last_function(operations: list[OperationContext]) -> FunctionClosure:
120
+ for operation in reversed(operations):
121
+ if isinstance(operation.closure, FunctionClosure):
122
+ return operation.closure
123
+ raise ClassiqInternalExpansionError("No function found")
124
+
125
+ @property
126
+ def current_block(self) -> Block:
127
+ return self._operations[-1].blocks[self._blocks[-1]]
128
+
129
+ @property
130
+ def _current_statements(self) -> list[QuantumStatement]:
131
+ return self.current_block.statements
132
+
133
+ def emit_statement(self, statement: QuantumStatement) -> None:
134
+ if self._current_source_ref is not None:
135
+ statement.source_ref = self._current_source_ref
136
+ self._current_statements.append(statement)
137
+
138
+ @property
139
+ def current_statement(self) -> QuantumStatement:
140
+ return self._current_statements[-1]
141
+
142
+ @contextmanager
143
+ def block_context(self, block_name: str) -> Iterator[None]:
144
+ self._blocks.append(block_name)
145
+ self._operations[-1].blocks[block_name] = Block()
146
+ yield
147
+ captured_vars = self.current_block.captured_vars
148
+ if (
149
+ not isinstance(self.current_operation, FunctionClosure)
150
+ and self.current_operation.name != WITHIN_APPLY_NAME
151
+ ):
152
+ validate_captured_directions(
153
+ captured_vars.filter_vars(
154
+ self.current_function, self.current_block.variable_declarations
155
+ ),
156
+ report_outin=False,
157
+ )
158
+ self.current_operation.captured_vars.update(
159
+ captured_vars.filter_vars(self.current_function)
160
+ )
161
+ self._blocks.pop()
162
+
163
+ @contextmanager
164
+ def operation_context(
165
+ self, original_operation: Closure
166
+ ) -> Iterator[OperationContext]:
167
+ context: OperationContext
168
+ if isinstance(original_operation, FunctionClosure):
169
+ context = FunctionContext.create(original_operation)
170
+ else:
171
+ context = OperationContext(closure=original_operation)
172
+ self._operations.append(context)
173
+ yield context
174
+ self._finalize_within_apply()
175
+ self._propagate_captured_vars()
176
+ self._operations.pop()
177
+
178
+ def _finalize_within_apply(self) -> None:
179
+ if self.current_operation.name != WITHIN_APPLY_NAME:
180
+ return
181
+ within_captured_vars = self._operations[-1].blocks["within"].captured_vars
182
+ self.current_operation.captured_vars.update(
183
+ within_captured_vars.filter_vars(self.current_function).negate()
184
+ )
185
+
186
+ def _propagate_captured_vars(self) -> None:
187
+ captured_vars = self.current_operation.captured_vars
188
+ if isinstance(self.current_operation, FunctionClosure):
189
+ captured_vars = captured_vars.set_propagated()
190
+ validate_captured_directions(captured_vars)
191
+ if len(self._operations) < 2:
192
+ return
193
+ parent_block = self._operations[-2].blocks[self._blocks[-1]]
194
+ parent_block.captured_vars.update(
195
+ captured_vars.filter_vars(self.parent_function)
196
+ )
197
+
198
+ @contextmanager
199
+ def source_ref_context(
200
+ self, source_ref: Optional[SourceReference]
201
+ ) -> Iterator[None]:
202
+ previous_source_ref = self._current_source_ref
203
+ self._current_source_ref = source_ref
204
+ yield
205
+ self._current_source_ref = previous_source_ref
206
+
207
+ def create_definition(
208
+ self, function_context: FunctionContext
209
+ ) -> NativeFunctionDefinition:
210
+ name = self._get_expanded_function_name(function_context)
211
+ new_parameters: list[PortDeclaration] = [
212
+ param
213
+ for param in function_context.positional_arg_declarations
214
+ if isinstance(param, PortDeclaration)
215
+ ]
216
+
217
+ return NativeFunctionDefinition(
218
+ name=name,
219
+ body=function_context.body,
220
+ positional_arg_declarations=new_parameters,
221
+ )
222
+
223
+ def _get_expanded_function_name(self, function_context: FunctionContext) -> str:
224
+ name = function_context.name
225
+
226
+ if name == MAIN_FUNCTION_NAME:
227
+ return name
228
+
229
+ if name in self.current_scope:
230
+ orig_func = self.current_scope[name].value
231
+ if (
232
+ isinstance(orig_func, FunctionClosure)
233
+ and not isinstance(orig_func, GenerativeFunctionClosure)
234
+ and is_signature_monomorphic(orig_func.positional_arg_declarations)
235
+ ):
236
+ return name
237
+
238
+ for _ in self.current_scope:
239
+ name = self._counted_name_allocator.allocate(
240
+ f"{name}_{LAMBDA_KEYWORD + '_0_0_' if function_context.is_lambda else ''}{EXPANDED_KEYWORD}"
241
+ )
242
+ if name not in self.current_scope:
243
+ break
244
+ else:
245
+ raise ClassiqInternalExpansionError("Could not allocate function name")
246
+
247
+ return name
@@ -0,0 +1,158 @@
1
+ from collections.abc import Mapping
2
+ from typing import TYPE_CHECKING, Any
3
+
4
+ from classiq.interface.generator.expressions.qmod_struct_instance import (
5
+ QmodStructInstance,
6
+ )
7
+ from classiq.interface.generator.functions.type_name import Struct
8
+ from classiq.interface.helpers.pydantic_model_helpers import nameables_to_dict
9
+ from classiq.interface.model.native_function_definition import NativeFunctionDefinition
10
+ from classiq.interface.model.port_declaration import PortDeclaration
11
+ from classiq.interface.model.quantum_function_declaration import (
12
+ PositionalArg,
13
+ QuantumFunctionDeclaration,
14
+ QuantumOperandDeclaration,
15
+ )
16
+ from classiq.interface.model.quantum_statement import QuantumStatement
17
+
18
+ from classiq.model_expansions.closure import (
19
+ FunctionClosure,
20
+ GenerativeClosure,
21
+ )
22
+ from classiq.model_expansions.scope import Evaluated, QuantumSymbol
23
+ from classiq.qmod.generative import generative_mode_context, set_frontend_interpreter
24
+ from classiq.qmod.model_state_container import QMODULE
25
+ from classiq.qmod.qmod_parameter import CParamStruct
26
+ from classiq.qmod.qmod_variable import QNum, _create_qvar_for_qtype
27
+ from classiq.qmod.quantum_callable import QCallable
28
+ from classiq.qmod.quantum_expandable import (
29
+ QExpandable,
30
+ QTerminalCallable,
31
+ )
32
+ from classiq.qmod.quantum_function import QFunc
33
+ from classiq.qmod.semantics.annotation.call_annotation import resolve_function_calls
34
+ from classiq.qmod.symbolic_expr import SymbolicExpr
35
+
36
+ if TYPE_CHECKING:
37
+ from classiq.model_expansions.interpreters.generative_interpreter import (
38
+ GenerativeInterpreter,
39
+ )
40
+
41
+
42
+ class LenList(list):
43
+ @property
44
+ def len(self) -> int:
45
+ return len(self)
46
+
47
+ def __getitem__(self, item: Any) -> Any:
48
+ if isinstance(item, QNum):
49
+ return SymbolicExpr(f"{self}[{item}]", True)
50
+ return super().__getitem__(item)
51
+
52
+ @classmethod
53
+ def wrap(cls, obj: Any) -> Any:
54
+ if not isinstance(obj, list):
55
+ return obj
56
+ return LenList([cls.wrap(item) for item in obj])
57
+
58
+
59
+ def translate_ast_arg_to_python_qmod(param: PositionalArg, evaluated: Evaluated) -> Any:
60
+ if isinstance(param, PortDeclaration):
61
+ quantum_symbol = evaluated.as_type(QuantumSymbol)
62
+ return _create_qvar_for_qtype(
63
+ quantum_symbol.quantum_type, quantum_symbol.handle
64
+ )
65
+ if isinstance(param, QuantumOperandDeclaration):
66
+ if param.is_list:
67
+ func_list: list[FunctionClosure] = evaluated.as_type(list)
68
+ return LenList(
69
+ [
70
+ QTerminalCallable(
71
+ QuantumOperandDeclaration(
72
+ name=param.name,
73
+ positional_arg_declarations=param.positional_arg_declarations,
74
+ ),
75
+ index_=idx,
76
+ )
77
+ for idx in range(len(func_list))
78
+ ]
79
+ )
80
+ else:
81
+ func = evaluated.as_type(FunctionClosure)
82
+ return QTerminalCallable(
83
+ QuantumFunctionDeclaration(
84
+ name=param.name if func.is_lambda else func.name,
85
+ positional_arg_declarations=func.positional_arg_declarations,
86
+ ),
87
+ )
88
+ classical_value = evaluated.value
89
+ if isinstance(classical_value, QmodStructInstance):
90
+ return CParamStruct(
91
+ expr=param.name,
92
+ struct_type=Struct(name=classical_value.struct_declaration.name),
93
+ qmodule=QMODULE,
94
+ )
95
+ return LenList.wrap(classical_value)
96
+
97
+
98
+ class _InterpreterExpandable(QFunc):
99
+ def __init__(self, interpreter: "GenerativeInterpreter"):
100
+ super().__init__(lambda: None)
101
+ self._interpreter = interpreter
102
+
103
+ def append_statement_to_body(self, stmt: QuantumStatement) -> None:
104
+ current_operation = self._interpreter._builder._operations[-1]
105
+ dummy_function = NativeFunctionDefinition(
106
+ name=current_operation.name,
107
+ positional_arg_declarations=current_operation.positional_arg_declarations,
108
+ body=self._interpreter._builder._current_statements + [stmt],
109
+ )
110
+ declarative_functions = {
111
+ name: func
112
+ for name, func in self._qmodule.native_defs.items()
113
+ if name not in self._interpreter._top_level_scope
114
+ }
115
+ self._interpreter.update_declarative_functions(
116
+ declarative_functions, self._qmodule
117
+ )
118
+ self._interpreter.update_generative_functions(
119
+ self._qmodule.generative_functions
120
+ )
121
+ func_decls = self._get_function_declarations()
122
+ for dec_func in declarative_functions.values():
123
+ resolve_function_calls(dec_func, func_decls)
124
+ resolve_function_calls(dummy_function, func_decls)
125
+ stmt = dummy_function.body[-1]
126
+ with generative_mode_context(False):
127
+ self._interpreter.emit_statement(stmt)
128
+
129
+ def _get_function_declarations(self) -> Mapping[str, QuantumFunctionDeclaration]:
130
+ return {
131
+ name: QuantumFunctionDeclaration(
132
+ name=name,
133
+ positional_arg_declarations=evaluated.value.positional_arg_declarations,
134
+ )
135
+ for name, evaluated in self._interpreter._builder.current_scope.items()
136
+ if isinstance(evaluated, Evaluated)
137
+ and isinstance(evaluated.value, FunctionClosure)
138
+ } | nameables_to_dict(self._interpreter._get_function_declarations())
139
+
140
+
141
+ def emit_generative_statements(
142
+ interpreter: "GenerativeInterpreter",
143
+ operation: GenerativeClosure,
144
+ args: list[Evaluated],
145
+ ) -> None:
146
+ python_qmod_args = [
147
+ translate_ast_arg_to_python_qmod(param, arg)
148
+ for param, arg in zip(operation.positional_arg_declarations, args)
149
+ ]
150
+ interpreter_expandable = _InterpreterExpandable(interpreter)
151
+ QExpandable.STACK.append(interpreter_expandable)
152
+ QCallable.CURRENT_EXPANDABLE = interpreter_expandable
153
+ set_frontend_interpreter(interpreter)
154
+ for block_name, generative_function in operation.generative_blocks.items():
155
+ with interpreter._builder.block_context(block_name), generative_mode_context(
156
+ True
157
+ ):
158
+ generative_function._py_callable(*python_qmod_args)
File without changes