classiq 0.38.0__py3-none-any.whl → 0.65.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. classiq/__init__.py +47 -32
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +2 -1
  3. classiq/_internals/api_wrapper.py +235 -97
  4. classiq/_internals/async_utils.py +1 -3
  5. classiq/_internals/authentication/auth0.py +26 -10
  6. classiq/_internals/authentication/authentication.py +11 -0
  7. classiq/_internals/authentication/device.py +10 -5
  8. classiq/_internals/authentication/password_manager.py +18 -6
  9. classiq/_internals/authentication/token_manager.py +10 -5
  10. classiq/_internals/client.py +94 -33
  11. classiq/_internals/config.py +3 -4
  12. classiq/_internals/host_checker.py +38 -15
  13. classiq/_internals/jobs.py +60 -57
  14. classiq/_internals/type_validation.py +9 -9
  15. classiq/analyzer/__init__.py +1 -3
  16. classiq/analyzer/analyzer.py +24 -19
  17. classiq/analyzer/analyzer_utilities.py +10 -10
  18. classiq/analyzer/rb.py +15 -15
  19. classiq/analyzer/show_interactive_hack.py +27 -4
  20. classiq/analyzer/url_utils.py +2 -3
  21. classiq/applications/__init__.py +3 -12
  22. classiq/applications/chemistry/__init__.py +14 -10
  23. classiq/applications/chemistry/ansatz_parameters.py +4 -4
  24. classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +165 -158
  25. classiq/applications/chemistry/ground_state_problem.py +1 -1
  26. classiq/{applications_model_constructors → applications}/combinatorial_helpers/allowed_constraints.py +4 -1
  27. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/arithmetic_expression.py +1 -1
  28. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/isolation.py +1 -1
  29. classiq/{applications_model_constructors → applications}/combinatorial_helpers/combinatorial_problem_utils.py +51 -15
  30. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_mapping.py +12 -12
  31. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_utils.py +8 -6
  32. classiq/{applications_model_constructors → applications}/combinatorial_helpers/memory.py +7 -11
  33. classiq/{applications_model_constructors → applications}/combinatorial_helpers/optimization_model.py +67 -40
  34. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
  35. classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
  36. classiq/{applications_model_constructors → applications}/combinatorial_helpers/sympy_utils.py +2 -2
  37. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/encoding.py +15 -20
  38. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/fixed_variables.py +14 -15
  39. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/ising_converter.py +11 -15
  40. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty.py +1 -2
  41. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty_support.py +3 -7
  42. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/sign_seperation.py +2 -3
  43. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/slack_variables.py +5 -8
  44. classiq/applications/combinatorial_optimization/__init__.py +20 -6
  45. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
  46. classiq/{applications_model_constructors → applications/combinatorial_optimization}/combinatorial_optimization_model_constructor.py +35 -33
  47. classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
  48. classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
  49. classiq/applications/finance/__init__.py +4 -5
  50. classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +48 -42
  51. classiq/applications/grover/__init__.py +9 -0
  52. classiq/{applications_model_constructors → applications/grover}/grover_model_constructor.py +52 -51
  53. classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
  54. classiq/applications/libraries/qmci_library.py +22 -0
  55. classiq/applications/qnn/__init__.py +2 -4
  56. classiq/applications/qnn/circuit_utils.py +6 -6
  57. classiq/applications/qnn/datasets/__init__.py +9 -11
  58. classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
  59. classiq/applications/qnn/datasets/dataset_not.py +2 -1
  60. classiq/applications/qnn/datasets/dataset_parity.py +2 -2
  61. classiq/applications/qnn/gradients/quantum_gradient.py +1 -1
  62. classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
  63. classiq/applications/qnn/qlayer.py +30 -10
  64. classiq/applications/qnn/torch_utils.py +4 -3
  65. classiq/applications/qnn/types.py +5 -5
  66. classiq/applications/qsvm/__init__.py +6 -4
  67. classiq/applications/qsvm/qsvm.py +3 -6
  68. classiq/applications/qsvm/qsvm_data_generation.py +3 -3
  69. classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
  70. classiq/execution/__init__.py +8 -3
  71. classiq/execution/all_hardware_devices.py +11 -0
  72. classiq/execution/execution_session.py +400 -0
  73. classiq/execution/iqcc.py +63 -0
  74. classiq/execution/jobs.py +197 -25
  75. classiq/execution/qnn.py +79 -0
  76. classiq/executor.py +20 -115
  77. classiq/interface/_version.py +1 -1
  78. classiq/interface/analyzer/analysis_params.py +43 -13
  79. classiq/interface/analyzer/cytoscape_graph.py +15 -9
  80. classiq/interface/analyzer/result.py +28 -32
  81. classiq/interface/applications/qsvm.py +20 -29
  82. classiq/interface/ast_node.py +16 -0
  83. classiq/interface/backend/backend_preferences.py +390 -121
  84. classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
  85. classiq/interface/backend/pydantic_backend.py +25 -22
  86. classiq/interface/backend/quantum_backend_providers.py +69 -16
  87. classiq/interface/chemistry/fermionic_operator.py +30 -21
  88. classiq/interface/chemistry/ground_state_problem.py +28 -25
  89. classiq/interface/chemistry/molecule.py +14 -10
  90. classiq/interface/chemistry/operator.py +64 -231
  91. classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
  92. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +1 -3
  93. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  94. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  95. classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
  96. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  97. classiq/interface/combinatorial_optimization/examples/set_cover.py +1 -2
  98. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +8 -9
  99. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  100. classiq/interface/combinatorial_optimization/result.py +1 -3
  101. classiq/interface/combinatorial_optimization/solver_types.py +1 -1
  102. classiq/interface/debug_info/debug_info.py +86 -0
  103. classiq/{exceptions.py → interface/exceptions.py} +37 -9
  104. classiq/interface/execution/iqcc.py +19 -0
  105. classiq/interface/execution/jobs.py +15 -12
  106. classiq/interface/execution/primitives.py +18 -0
  107. classiq/interface/executor/constants.py +1 -0
  108. classiq/interface/executor/execution_preferences.py +26 -114
  109. classiq/interface/executor/execution_request.py +24 -46
  110. classiq/interface/executor/execution_result.py +30 -8
  111. classiq/interface/executor/iqae_result.py +4 -6
  112. classiq/interface/executor/optimizer_preferences.py +17 -14
  113. classiq/interface/executor/quantum_code.py +28 -24
  114. classiq/interface/executor/quantum_instruction_set.py +2 -2
  115. classiq/interface/executor/register_initialization.py +11 -14
  116. classiq/interface/executor/result.py +83 -56
  117. classiq/interface/executor/vqe_result.py +10 -10
  118. classiq/interface/finance/function_input.py +35 -25
  119. classiq/interface/finance/gaussian_model_input.py +5 -5
  120. classiq/interface/finance/log_normal_model_input.py +4 -4
  121. classiq/interface/finance/model_input.py +4 -4
  122. classiq/interface/generator/adjacency.py +1 -3
  123. classiq/interface/generator/amplitude_loading.py +22 -12
  124. classiq/interface/generator/ansatz_library.py +5 -5
  125. classiq/interface/generator/application_apis/arithmetic_declarations.py +8 -5
  126. classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
  127. classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
  128. classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
  129. classiq/interface/generator/application_apis/finance_declarations.py +48 -69
  130. classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
  131. classiq/interface/generator/arith/argument_utils.py +46 -5
  132. classiq/interface/generator/arith/arithmetic.py +35 -16
  133. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +6 -7
  134. classiq/interface/generator/arith/arithmetic_expression_abc.py +66 -25
  135. classiq/interface/generator/arith/arithmetic_expression_parser.py +11 -11
  136. classiq/interface/generator/arith/arithmetic_expression_validator.py +47 -43
  137. classiq/interface/generator/arith/arithmetic_operations.py +14 -6
  138. classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
  139. classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
  140. classiq/interface/generator/arith/ast_node_rewrite.py +3 -2
  141. classiq/interface/generator/arith/binary_ops.py +218 -130
  142. classiq/interface/generator/arith/endianness.py +1 -1
  143. classiq/interface/generator/arith/extremum_operations.py +96 -25
  144. classiq/interface/generator/arith/logical_ops.py +14 -12
  145. classiq/interface/generator/arith/number_utils.py +12 -6
  146. classiq/interface/generator/arith/register_user_input.py +60 -37
  147. classiq/interface/generator/arith/unary_ops.py +49 -29
  148. classiq/interface/generator/arith/uncomputation_methods.py +1 -1
  149. classiq/interface/generator/builtin_api_builder.py +2 -9
  150. classiq/interface/generator/chemistry_function_params.py +3 -3
  151. classiq/interface/generator/circuit_code/circuit_code.py +7 -7
  152. classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
  153. classiq/interface/generator/commuting_pauli_exponentiation.py +7 -7
  154. classiq/interface/generator/compiler_keywords.py +5 -1
  155. classiq/interface/generator/complex_type.py +13 -18
  156. classiq/interface/generator/constant.py +3 -4
  157. classiq/interface/generator/control_state.py +34 -29
  158. classiq/interface/generator/copy.py +47 -0
  159. classiq/interface/generator/custom_ansatz.py +2 -5
  160. classiq/interface/generator/distance.py +3 -5
  161. classiq/interface/generator/excitations.py +3 -2
  162. classiq/interface/generator/expressions/atomic_expression_functions.py +21 -5
  163. classiq/interface/generator/expressions/enums/__init__.py +0 -10
  164. classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
  165. classiq/interface/generator/expressions/evaluated_expression.py +5 -5
  166. classiq/interface/generator/expressions/expression.py +26 -14
  167. classiq/interface/generator/expressions/expression_constants.py +9 -3
  168. classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
  169. classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
  170. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +34 -8
  171. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
  172. classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
  173. classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
  174. classiq/interface/generator/expressions/sympy_supported_expressions.py +19 -11
  175. classiq/interface/generator/finance.py +2 -2
  176. classiq/interface/generator/function_param_library.py +6 -6
  177. classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
  178. classiq/interface/generator/function_params.py +36 -64
  179. classiq/interface/generator/functions/__init__.py +0 -22
  180. classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
  181. classiq/interface/generator/functions/classical_function_declaration.py +18 -9
  182. classiq/interface/generator/functions/classical_type.py +47 -166
  183. classiq/interface/generator/functions/concrete_types.py +55 -0
  184. classiq/interface/generator/functions/function_declaration.py +13 -14
  185. classiq/interface/generator/functions/port_declaration.py +1 -13
  186. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  187. classiq/interface/generator/functions/type_name.py +90 -0
  188. classiq/interface/generator/generated_circuit_data.py +153 -20
  189. classiq/interface/generator/grover_diffuser.py +32 -25
  190. classiq/interface/generator/grover_operator.py +34 -25
  191. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
  192. classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
  193. classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +9 -9
  194. classiq/interface/generator/hardware/hardware_data.py +72 -34
  195. classiq/interface/generator/hardware_efficient_ansatz.py +20 -16
  196. classiq/interface/generator/hartree_fock.py +13 -5
  197. classiq/interface/generator/identity.py +10 -6
  198. classiq/interface/generator/linear_pauli_rotations.py +32 -20
  199. classiq/interface/generator/mcmt_method.py +1 -1
  200. classiq/interface/generator/mcu.py +17 -15
  201. classiq/interface/generator/mcx.py +24 -17
  202. classiq/interface/generator/model/__init__.py +2 -5
  203. classiq/interface/generator/model/constraints.py +26 -8
  204. classiq/interface/generator/model/model.py +27 -190
  205. classiq/interface/generator/model/preferences/preferences.py +115 -41
  206. classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +14 -17
  207. classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
  208. classiq/interface/generator/oracles/custom_oracle.py +15 -13
  209. classiq/interface/generator/oracles/oracle_abc.py +7 -7
  210. classiq/interface/generator/partitioned_register.py +7 -7
  211. classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
  212. classiq/interface/generator/preferences/optimization.py +1 -2
  213. classiq/interface/generator/qpe.py +41 -30
  214. classiq/interface/generator/qsvm.py +9 -10
  215. classiq/interface/generator/quantum_function_call.py +88 -73
  216. classiq/interface/generator/quantum_program.py +41 -24
  217. classiq/interface/generator/range_types.py +11 -12
  218. classiq/interface/generator/register_role.py +18 -6
  219. classiq/interface/generator/slice_parsing_utils.py +5 -5
  220. classiq/interface/generator/standard_gates/controlled_standard_gates.py +30 -39
  221. classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
  222. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  223. classiq/interface/generator/standard_gates/u_gate.py +7 -10
  224. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  225. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
  226. classiq/interface/generator/state_preparation/distributions.py +16 -15
  227. classiq/interface/generator/state_preparation/metrics.py +4 -7
  228. classiq/interface/generator/state_preparation/state_preparation.py +25 -20
  229. classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
  230. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
  231. classiq/interface/generator/transpiler_basis_gates.py +7 -3
  232. classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
  233. classiq/interface/generator/types/compilation_metadata.py +6 -0
  234. classiq/interface/generator/types/enum_declaration.py +54 -0
  235. classiq/interface/generator/types/qstruct_declaration.py +18 -0
  236. classiq/interface/generator/types/struct_declaration.py +7 -11
  237. classiq/interface/generator/ucc.py +5 -4
  238. classiq/interface/generator/unitary_gate.py +5 -5
  239. classiq/interface/generator/user_defined_function_params.py +4 -1
  240. classiq/interface/generator/validations/flow_graph.py +7 -7
  241. classiq/interface/generator/validations/validator_functions.py +4 -4
  242. classiq/interface/generator/visitor.py +23 -16
  243. classiq/interface/hardware.py +29 -8
  244. classiq/interface/helpers/classproperty.py +8 -0
  245. classiq/interface/helpers/custom_encoders.py +2 -2
  246. classiq/interface/helpers/custom_pydantic_types.py +40 -50
  247. classiq/interface/helpers/datastructures.py +26 -0
  248. classiq/interface/helpers/hashable_mixin.py +3 -2
  249. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  250. classiq/interface/helpers/pydantic_model_helpers.py +7 -5
  251. classiq/interface/helpers/validation_helpers.py +3 -20
  252. classiq/interface/helpers/versioned_model.py +1 -4
  253. classiq/interface/ide/ide_data.py +16 -20
  254. classiq/interface/ide/visual_model.py +130 -0
  255. classiq/interface/interface_version.py +1 -0
  256. classiq/interface/jobs.py +29 -69
  257. classiq/interface/model/allocate.py +16 -0
  258. classiq/interface/model/bind_operation.py +32 -9
  259. classiq/interface/model/classical_if.py +15 -0
  260. classiq/interface/model/classical_parameter_declaration.py +33 -3
  261. classiq/interface/model/control.py +45 -0
  262. classiq/interface/model/handle_binding.py +298 -20
  263. classiq/interface/model/inplace_binary_operation.py +29 -24
  264. classiq/interface/model/invert.py +12 -0
  265. classiq/interface/model/model.py +69 -61
  266. classiq/interface/model/native_function_definition.py +17 -20
  267. classiq/interface/model/parameter.py +13 -0
  268. classiq/interface/model/phase_operation.py +11 -0
  269. classiq/interface/model/port_declaration.py +27 -9
  270. classiq/interface/model/power.py +14 -0
  271. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +30 -18
  272. classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
  273. classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
  274. classiq/interface/model/quantum_function_call.py +141 -343
  275. classiq/interface/model/quantum_function_declaration.py +190 -157
  276. classiq/interface/model/quantum_lambda_function.py +33 -32
  277. classiq/interface/model/quantum_statement.py +71 -12
  278. classiq/interface/model/quantum_type.py +177 -40
  279. classiq/interface/model/quantum_variable_declaration.py +3 -25
  280. classiq/interface/model/repeat.py +15 -0
  281. classiq/interface/model/statement_block.py +40 -14
  282. classiq/interface/model/validation_handle.py +13 -6
  283. classiq/interface/model/variable_declaration_statement.py +3 -1
  284. classiq/interface/model/within_apply_operation.py +7 -5
  285. classiq/interface/server/global_versions.py +6 -7
  286. classiq/interface/server/routes.py +17 -21
  287. classiq/interface/source_reference.py +59 -0
  288. classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
  289. classiq/model_expansions/capturing/__init__.py +0 -0
  290. classiq/model_expansions/capturing/captured_vars.py +435 -0
  291. classiq/model_expansions/capturing/mangling_utils.py +56 -0
  292. classiq/model_expansions/closure.py +171 -0
  293. classiq/model_expansions/debug_flag.py +3 -0
  294. classiq/model_expansions/evaluators/__init__.py +0 -0
  295. classiq/model_expansions/evaluators/arg_type_match.py +158 -0
  296. classiq/model_expansions/evaluators/argument_types.py +42 -0
  297. classiq/model_expansions/evaluators/classical_expression.py +36 -0
  298. classiq/model_expansions/evaluators/control.py +144 -0
  299. classiq/model_expansions/evaluators/parameter_types.py +226 -0
  300. classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
  301. classiq/model_expansions/evaluators/type_type_match.py +90 -0
  302. classiq/model_expansions/expression_evaluator.py +135 -0
  303. classiq/model_expansions/expression_renamer.py +76 -0
  304. classiq/model_expansions/function_builder.py +247 -0
  305. classiq/model_expansions/generative_functions.py +158 -0
  306. classiq/model_expansions/interpreters/__init__.py +0 -0
  307. classiq/model_expansions/interpreters/base_interpreter.py +263 -0
  308. classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
  309. classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
  310. classiq/model_expansions/model_tables.py +18 -0
  311. classiq/model_expansions/quantum_operations/__init__.py +9 -0
  312. classiq/model_expansions/quantum_operations/bind.py +60 -0
  313. classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
  314. classiq/model_expansions/quantum_operations/classicalif.py +53 -0
  315. classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
  316. classiq/model_expansions/quantum_operations/emitter.py +181 -0
  317. classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
  318. classiq/model_expansions/quantum_operations/repeat.py +56 -0
  319. classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
  320. classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
  321. classiq/model_expansions/scope.py +240 -0
  322. classiq/model_expansions/scope_initialization.py +150 -0
  323. classiq/model_expansions/sympy_conversion/__init__.py +0 -0
  324. classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
  325. classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
  326. classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
  327. classiq/model_expansions/transformers/__init__.py +0 -0
  328. classiq/model_expansions/transformers/ast_renamer.py +26 -0
  329. classiq/model_expansions/transformers/var_splitter.py +299 -0
  330. classiq/model_expansions/utils/__init__.py +0 -0
  331. classiq/model_expansions/utils/counted_name_allocator.py +11 -0
  332. classiq/model_expansions/utils/handles_collector.py +33 -0
  333. classiq/model_expansions/visitors/__init__.py +0 -0
  334. classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
  335. classiq/model_expansions/visitors/variable_references.py +144 -0
  336. classiq/open_library/__init__.py +4 -0
  337. classiq/open_library/functions/__init__.py +130 -0
  338. classiq/open_library/functions/amplitude_estimation.py +30 -0
  339. classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
  340. classiq/open_library/functions/grover.py +157 -0
  341. classiq/open_library/functions/hea.py +115 -0
  342. classiq/open_library/functions/linear_pauli_rotation.py +82 -0
  343. classiq/open_library/functions/modular_exponentiation.py +201 -0
  344. classiq/open_library/functions/qaoa_penalty.py +117 -0
  345. classiq/open_library/functions/qft_functions.py +54 -0
  346. classiq/open_library/functions/qpe.py +46 -0
  347. classiq/open_library/functions/qsvt.py +331 -0
  348. classiq/open_library/functions/state_preparation.py +301 -0
  349. classiq/open_library/functions/swap_test.py +27 -0
  350. classiq/open_library/functions/utility_functions.py +81 -0
  351. classiq/open_library/functions/variational.py +52 -0
  352. classiq/qmod/__init__.py +10 -10
  353. classiq/qmod/builtins/__init__.py +19 -2
  354. classiq/qmod/builtins/classical_execution_primitives.py +36 -14
  355. classiq/qmod/builtins/classical_functions.py +39 -43
  356. classiq/qmod/builtins/constants.py +10 -0
  357. classiq/qmod/builtins/enums.py +208 -0
  358. classiq/qmod/builtins/functions/__init__.py +137 -0
  359. classiq/qmod/builtins/functions/allocation.py +150 -0
  360. classiq/qmod/builtins/functions/arithmetic.py +55 -0
  361. classiq/qmod/builtins/functions/benchmarking.py +8 -0
  362. classiq/qmod/builtins/functions/chemistry.py +91 -0
  363. classiq/qmod/builtins/functions/exponentiation.py +105 -0
  364. classiq/qmod/builtins/functions/finance.py +34 -0
  365. classiq/qmod/builtins/functions/operators.py +16 -0
  366. classiq/qmod/builtins/functions/qsvm.py +24 -0
  367. classiq/qmod/builtins/functions/standard_gates.py +651 -0
  368. classiq/qmod/builtins/operations.py +373 -40
  369. classiq/qmod/builtins/structs.py +103 -80
  370. classiq/qmod/cfunc.py +2 -2
  371. classiq/qmod/classical_function.py +4 -8
  372. classiq/qmod/cparam.py +64 -0
  373. classiq/qmod/create_model_function.py +56 -0
  374. classiq/qmod/declaration_inferrer.py +143 -101
  375. classiq/qmod/expression_query.py +20 -4
  376. classiq/qmod/generative.py +42 -0
  377. classiq/qmod/model_state_container.py +18 -6
  378. classiq/qmod/native/__init__.py +7 -0
  379. classiq/qmod/native/expression_to_qmod.py +16 -11
  380. classiq/qmod/native/pretty_printer.py +187 -97
  381. classiq/qmod/pretty_print/__init__.py +7 -0
  382. classiq/qmod/pretty_print/expression_to_python.py +222 -0
  383. classiq/qmod/pretty_print/pretty_printer.py +572 -0
  384. classiq/qmod/python_classical_type.py +67 -0
  385. classiq/qmod/qfunc.py +60 -8
  386. classiq/qmod/qmod_constant.py +93 -26
  387. classiq/qmod/qmod_parameter.py +68 -59
  388. classiq/qmod/qmod_variable.py +468 -155
  389. classiq/qmod/quantum_callable.py +17 -7
  390. classiq/qmod/quantum_expandable.py +269 -96
  391. classiq/qmod/quantum_function.py +196 -41
  392. classiq/qmod/semantics/__init__.py +0 -0
  393. classiq/qmod/semantics/annotation/__init__.py +0 -0
  394. classiq/qmod/semantics/annotation/call_annotation.py +92 -0
  395. classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
  396. classiq/qmod/semantics/error_manager.py +88 -0
  397. classiq/qmod/semantics/lambdas.py +25 -0
  398. classiq/qmod/semantics/static_semantics_visitor.py +384 -0
  399. classiq/qmod/semantics/validation/__init__.py +0 -0
  400. classiq/qmod/semantics/validation/constants_validation.py +16 -0
  401. classiq/qmod/semantics/validation/func_call_validation.py +99 -0
  402. classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
  403. classiq/qmod/semantics/validation/handle_validation.py +85 -0
  404. classiq/qmod/semantics/validation/main_validation.py +33 -0
  405. classiq/qmod/semantics/validation/types_validation.py +128 -0
  406. classiq/qmod/symbolic.py +147 -123
  407. classiq/qmod/symbolic_expr.py +27 -12
  408. classiq/qmod/symbolic_type.py +2 -5
  409. classiq/qmod/type_attribute_remover.py +32 -0
  410. classiq/qmod/utilities.py +98 -4
  411. classiq/qmod/write_qmod.py +17 -3
  412. classiq/synthesis.py +210 -22
  413. {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/METADATA +16 -9
  414. classiq-0.65.4.dist-info/RECORD +521 -0
  415. classiq/_internals/_qfunc_ext.py +0 -6
  416. classiq/applications/benchmarking/__init__.py +0 -9
  417. classiq/applications/benchmarking/mirror_benchmarking.py +0 -70
  418. classiq/applications/numpy_utils.py +0 -37
  419. classiq/applications_model_constructors/__init__.py +0 -25
  420. classiq/applications_model_constructors/combinatorial_helpers/multiple_comp_basis_sp.py +0 -34
  421. classiq/applications_model_constructors/combinatorial_helpers/pauli_helpers/pauli_utils.py +0 -65
  422. classiq/applications_model_constructors/combinatorial_helpers/pyomo_utils.py +0 -243
  423. classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
  424. classiq/applications_model_constructors/libraries/qmci_library.py +0 -107
  425. classiq/builtin_functions/__init__.py +0 -43
  426. classiq/builtin_functions/amplitude_loading.py +0 -3
  427. classiq/builtin_functions/binary_ops.py +0 -1
  428. classiq/builtin_functions/exponentiation.py +0 -5
  429. classiq/builtin_functions/qpe.py +0 -4
  430. classiq/builtin_functions/qsvm.py +0 -7
  431. classiq/builtin_functions/range_types.py +0 -5
  432. classiq/builtin_functions/standard_gates.py +0 -1
  433. classiq/builtin_functions/state_preparation.py +0 -6
  434. classiq/builtin_functions/suzuki_trotter.py +0 -3
  435. classiq/interface/executor/aws_execution_cost.py +0 -73
  436. classiq/interface/executor/error_mitigation.py +0 -6
  437. classiq/interface/generator/credit_risk_example/linear_gci.py +0 -122
  438. classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -69
  439. classiq/interface/generator/expressions/enums/chemistry.py +0 -28
  440. classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
  441. classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
  442. classiq/interface/generator/expressions/enums/optimizers.py +0 -9
  443. classiq/interface/generator/expressions/enums/pauli.py +0 -8
  444. classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
  445. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
  446. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
  447. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
  448. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -1229
  449. classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -95
  450. classiq/interface/generator/functions/foreign_function_definition.py +0 -114
  451. classiq/interface/generator/functions/function_implementation.py +0 -107
  452. classiq/interface/generator/functions/native_function_definition.py +0 -155
  453. classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
  454. classiq/interface/generator/functions/register.py +0 -44
  455. classiq/interface/generator/functions/register_mapping_data.py +0 -106
  456. classiq/interface/generator/inequality_mixer.py +0 -51
  457. classiq/interface/generator/model/classical_main_validator.py +0 -106
  458. classiq/interface/generator/range_mixer.py +0 -56
  459. classiq/interface/generator/state_propagator.py +0 -74
  460. classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -1
  461. classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
  462. classiq/interface/ide/show.py +0 -34
  463. classiq/interface/model/call_synthesis_data.py +0 -68
  464. classiq/interface/model/common_model_types.py +0 -23
  465. classiq/interface/model/quantum_expressions/control_state.py +0 -38
  466. classiq/interface/model/quantum_if_operation.py +0 -94
  467. classiq/interface/model/resolvers/function_call_resolver.py +0 -43
  468. classiq/interface/model/validations/handle_validation_base.py +0 -55
  469. classiq/interface/model/validations/handles_validator.py +0 -156
  470. classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
  471. classiq/model/__init__.py +0 -14
  472. classiq/model/composite_function_generator.py +0 -33
  473. classiq/model/function_handler.py +0 -462
  474. classiq/model/logic_flow.py +0 -149
  475. classiq/model/logic_flow_change_handler.py +0 -71
  476. classiq/model/model.py +0 -229
  477. classiq/qmod/builtins/functions.py +0 -913
  478. classiq/qmod/qmod_struct.py +0 -37
  479. classiq/quantum_functions/__init__.py +0 -17
  480. classiq/quantum_functions/annotation_parser.py +0 -205
  481. classiq/quantum_functions/decorators.py +0 -22
  482. classiq/quantum_functions/function_library.py +0 -181
  483. classiq/quantum_functions/function_parser.py +0 -74
  484. classiq/quantum_functions/quantum_function.py +0 -236
  485. classiq-0.38.0.dist-info/RECORD +0 -454
  486. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/__init__.py +0 -0
  487. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/__init__.py +0 -0
  488. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/__init__.py +0 -0
  489. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +0 -0
  490. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/py.typed +0 -0
  491. /classiq/{applications_model_constructors/combinatorial_helpers/transformations → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
  492. /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
  493. /classiq/{interface/generator/credit_risk_example → applications/hamiltonian}/__init__.py +0 -0
  494. /classiq/{interface/generator/functions/core_lib_declarations → applications/libraries}/__init__.py +0 -0
  495. /classiq/interface/{model/resolvers → debug_info}/__init__.py +0 -0
  496. /classiq/{_internals → interface}/enum_utils.py +0 -0
  497. /classiq/interface/{model/validations → generator/functions/builtins}/__init__.py +0 -0
  498. /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → model_expansions/__init__.py} +0 -0
  499. {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/WHEEL +0 -0
@@ -1,44 +1,69 @@
1
- from typing import Dict, List
1
+ from collections.abc import Mapping
2
+ from typing import Optional, Union
2
3
 
3
4
  from classiq.interface.generator.constant import Constant
4
5
  from classiq.interface.generator.expressions.expression import Expression
5
6
  from classiq.interface.generator.functions.classical_type import (
7
+ Bool,
6
8
  ClassicalArray,
9
+ ClassicalList,
10
+ Integer,
11
+ Real,
12
+ )
13
+ from classiq.interface.generator.functions.concrete_types import (
7
14
  ConcreteClassicalType,
15
+ ConcreteQuantumType,
8
16
  )
9
17
  from classiq.interface.generator.functions.port_declaration import (
10
18
  PortDeclarationDirection,
11
19
  )
20
+ from classiq.interface.generator.functions.type_name import TypeName
21
+ from classiq.interface.generator.types.enum_declaration import EnumDeclaration
22
+ from classiq.interface.generator.types.qstruct_declaration import QStructDeclaration
23
+ from classiq.interface.generator.types.struct_declaration import StructDeclaration
12
24
  from classiq.interface.generator.visitor import NodeType, Visitor
25
+ from classiq.interface.model.allocate import Allocate
13
26
  from classiq.interface.model.bind_operation import BindOperation
27
+ from classiq.interface.model.classical_if import ClassicalIf
14
28
  from classiq.interface.model.classical_parameter_declaration import (
15
- ClassicalParameterDeclaration,
29
+ AnonClassicalParameterDeclaration,
16
30
  )
31
+ from classiq.interface.model.control import Control
17
32
  from classiq.interface.model.handle_binding import (
33
+ FieldHandleBinding,
18
34
  HandleBinding,
19
35
  SlicedHandleBinding,
20
36
  SubscriptHandleBinding,
21
37
  )
22
38
  from classiq.interface.model.inplace_binary_operation import InplaceBinaryOperation
39
+ from classiq.interface.model.invert import Invert
23
40
  from classiq.interface.model.model import Model
24
41
  from classiq.interface.model.native_function_definition import NativeFunctionDefinition
25
- from classiq.interface.model.port_declaration import PortDeclaration
42
+ from classiq.interface.model.phase_operation import PhaseOperation
43
+ from classiq.interface.model.port_declaration import (
44
+ AnonPortDeclaration,
45
+ )
46
+ from classiq.interface.model.power import Power
26
47
  from classiq.interface.model.quantum_expressions.amplitude_loading_operation import (
27
48
  AmplitudeLoadingOperation,
28
49
  )
29
50
  from classiq.interface.model.quantum_expressions.arithmetic_operation import (
30
51
  ArithmeticOperation,
52
+ ArithmeticOperationKind,
31
53
  )
32
54
  from classiq.interface.model.quantum_function_call import (
33
- OperandIdentifier,
34
55
  QuantumFunctionCall,
35
56
  )
36
57
  from classiq.interface.model.quantum_function_declaration import (
58
+ AnonQuantumFunctionDeclaration,
59
+ AnonQuantumOperandDeclaration,
37
60
  QuantumFunctionDeclaration,
38
61
  QuantumOperandDeclaration,
39
62
  )
40
- from classiq.interface.model.quantum_if_operation import QuantumIfOperation
41
- from classiq.interface.model.quantum_lambda_function import QuantumLambdaFunction
63
+ from classiq.interface.model.quantum_lambda_function import (
64
+ OperandIdentifier,
65
+ QuantumLambdaFunction,
66
+ )
42
67
  from classiq.interface.model.quantum_type import (
43
68
  QuantumBit,
44
69
  QuantumBitvector,
@@ -47,21 +72,28 @@ from classiq.interface.model.quantum_type import (
47
72
  from classiq.interface.model.quantum_variable_declaration import (
48
73
  QuantumVariableDeclaration,
49
74
  )
75
+ from classiq.interface.model.repeat import Repeat
50
76
  from classiq.interface.model.statement_block import StatementBlock
51
77
  from classiq.interface.model.variable_declaration_statement import (
52
78
  VariableDeclarationStatement,
53
79
  )
54
- from classiq.interface.model.within_apply_operation import WithinApplyOperation
80
+ from classiq.interface.model.within_apply_operation import WithinApply
55
81
 
56
- from classiq import Bool, ClassicalList, Integer, Pauli, Real, Struct, StructDeclaration
82
+ from classiq.open_library.functions import OPEN_LIBRARY_FUNCTIONS
57
83
  from classiq.qmod.native.expression_to_qmod import transform_expression
84
+ from classiq.qmod.semantics.annotation.call_annotation import resolve_function_calls
58
85
  from classiq.qmod.utilities import DEFAULT_DECIMAL_PRECISION
59
86
 
60
87
 
61
88
  class DSLPrettyPrinter(Visitor):
62
- def __init__(self, decimal_precision: int = DEFAULT_DECIMAL_PRECISION) -> None:
89
+ def __init__(
90
+ self,
91
+ decimal_precision: Optional[int] = DEFAULT_DECIMAL_PRECISION,
92
+ emit_open_lib_functions: bool = False,
93
+ ) -> None:
63
94
  self._level = 0
64
95
  self._decimal_precision = decimal_precision
96
+ self._emit_open_lib_functions = emit_open_lib_functions
65
97
 
66
98
  def visit(self, node: NodeType) -> str:
67
99
  res = super().visit(node)
@@ -70,42 +102,64 @@ class DSLPrettyPrinter(Visitor):
70
102
  return res
71
103
 
72
104
  def visit_Model(self, model: Model) -> str:
105
+ # FIXME - CAD-20149: Remove this line once the froggies are removed, and the visit of lambdas can be done without accessing the func_decl property (with rename_params values only).
106
+ resolve_function_calls(model, model.function_dict)
107
+ enum_decls = [self.visit(enum_decl) for enum_decl in model.enums]
73
108
  struct_decls = [self.visit(struct_decl) for struct_decl in model.types]
109
+ qstruct_decls = [self.visit(qstruct_decl) for qstruct_decl in model.qstructs]
74
110
  func_defs = [self.visit(func_def) for func_def in model.functions]
75
111
  constants = [self.visit(constant) for constant in model.constants]
76
112
  classical_code = (
77
- f"cscope ```\n{model.classical_execution_code}\n```"
113
+ [f"cscope ```\n{model.classical_execution_code}\n```\n"]
78
114
  if model.classical_execution_code
79
- else ""
115
+ else []
80
116
  )
81
- return "\n".join([*constants, *struct_decls, *func_defs, classical_code])
117
+
118
+ items = [
119
+ *constants,
120
+ *enum_decls,
121
+ *struct_decls,
122
+ *qstruct_decls,
123
+ *func_defs,
124
+ *classical_code,
125
+ ]
126
+ return "\n".join([item for item in items if item != ""])
82
127
 
83
128
  def visit_Constant(self, constant: Constant) -> str:
84
129
  return f"{self._indent}{self.visit(constant.name)}: {self.visit(constant.const_type)} = {self.visit(constant.value)};\n"
85
130
 
86
- def _visit_arg_decls(self, func_def: QuantumFunctionDeclaration) -> str:
87
- gen_time_args = ", ".join(
88
- self.visit(arg_decl)
89
- for arg_decl in func_def.get_positional_arg_decls()
90
- if not isinstance(arg_decl, PortDeclaration)
91
- )
92
- quantum_args = ", ".join(
93
- self.visit(arg_decl)
94
- for arg_decl in func_def.get_positional_arg_decls()
95
- if isinstance(arg_decl, PortDeclaration)
131
+ def _visit_arg_decls(self, func_def: AnonQuantumFunctionDeclaration) -> str:
132
+ positional_args = ", ".join(
133
+ self.visit(arg_decl) for arg_decl in func_def.positional_arg_declarations
96
134
  )
97
- gen_time_arg_list = f"<{gen_time_args}>" if gen_time_args else ""
98
- return f"{gen_time_arg_list}({quantum_args})"
135
+ return f"({positional_args})"
99
136
 
100
137
  def visit_QuantumFunctionDeclaration(
101
138
  self, func_decl: QuantumFunctionDeclaration
102
139
  ) -> str:
103
140
  return f"qfunc {func_decl.name}{self._visit_arg_decls(func_decl)}"
104
141
 
142
+ def visit_EnumDeclaration(self, enum_decl: EnumDeclaration) -> str:
143
+ return f"enum {enum_decl.name} {{\n{self._visit_members(enum_decl.members)}}}\n"
144
+
145
+ def _visit_members(self, members: dict[str, int]) -> str:
146
+ self._level += 1
147
+ members_str = "".join(
148
+ f"{self._indent}{self.visit(member_name)} = {member_value};\n"
149
+ for member_name, member_value in members.items()
150
+ )
151
+ self._level -= 1
152
+ return members_str
153
+
105
154
  def visit_StructDeclaration(self, struct_decl: StructDeclaration) -> str:
106
155
  return f"struct {struct_decl.name} {{\n{self._visit_variables(struct_decl.variables)}}}\n"
107
156
 
108
- def _visit_variables(self, variables: Dict[str, ConcreteClassicalType]) -> str:
157
+ def visit_QStructDeclaration(self, qstruct_decl: QStructDeclaration) -> str:
158
+ return f"qstruct {qstruct_decl.name} {{\n{self._visit_variables(qstruct_decl.fields)}}}\n"
159
+
160
+ def _visit_variables(
161
+ self, variables: Mapping[str, Union[ConcreteClassicalType, ConcreteQuantumType]]
162
+ ) -> str:
109
163
  self._level += 1
110
164
  variables_str = "".join(
111
165
  f"{self._indent}{self.visit(field_name)}: {self.visit(var_decl)};\n"
@@ -119,43 +173,42 @@ class DSLPrettyPrinter(Visitor):
119
173
  ) -> str:
120
174
  return f"{var_decl.name}: {self.visit(var_decl.quantum_type)}"
121
175
 
122
- def visit_PortDeclaration(self, port_decl: PortDeclaration) -> str:
176
+ def visit_AnonPortDeclaration(self, port_decl: AnonPortDeclaration) -> str:
123
177
  dir_str = (
124
178
  f"{port_decl.direction} "
125
179
  if port_decl.direction != PortDeclarationDirection.Inout
126
180
  else ""
127
181
  )
128
- return f"{dir_str}{self.visit_QuantumVariableDeclaration(port_decl)}"
182
+ param_name = f"{port_decl.name}: " if port_decl.name is not None else ""
183
+ return f"{dir_str}{param_name}{self.visit(port_decl.quantum_type)}"
129
184
 
130
185
  def visit_QuantumBit(self, qtype: QuantumBit) -> str:
131
186
  return "qbit"
132
187
 
133
188
  def visit_QuantumBitvector(self, qtype: QuantumBitvector) -> str:
189
+ element_type = self.visit(qtype.element_type)
134
190
  if qtype.length is not None:
135
- if qtype.length.is_evaluated() and qtype.length.to_int_value() == 1:
136
- return "qbit"
137
- return f"qbit[{self.visit(qtype.length)}]"
138
- return "qbit[]"
191
+ return f"{element_type}[{self.visit(qtype.length)}]"
192
+ return f"{element_type}[]"
139
193
 
140
194
  def visit_QuantumNumeric(self, qtype: QuantumNumeric) -> str:
141
195
  params = ""
142
196
  if qtype.size is not None:
143
- assert qtype.is_signed is not None
144
- assert qtype.fraction_digits is not None
145
-
146
197
  params = "<{}>".format(
147
198
  ", ".join(
148
199
  self.visit(param)
149
200
  for param in [qtype.size, qtype.is_signed, qtype.fraction_digits]
201
+ if param is not None
150
202
  )
151
203
  )
152
204
 
153
205
  return f"qnum{params}"
154
206
 
155
- def visit_ClassicalParameterDeclaration(
156
- self, cparam: ClassicalParameterDeclaration
207
+ def visit_AnonClassicalParameterDeclaration(
208
+ self, cparam: AnonClassicalParameterDeclaration
157
209
  ) -> str:
158
- return f"{cparam.name}: {self.visit(cparam.classical_type)}"
210
+ param_name = f"{cparam.name}: " if cparam.name is not None else ""
211
+ return f"{param_name}{self.visit(cparam.classical_type)}"
159
212
 
160
213
  def visit_Integer(self, ctint: Integer) -> str:
161
214
  return "int"
@@ -166,75 +219,109 @@ class DSLPrettyPrinter(Visitor):
166
219
  def visit_Bool(self, ctbool: Bool) -> str:
167
220
  return "bool"
168
221
 
169
- def visit_Pauli(self, ctbool: Pauli) -> str:
170
- return "Pauli"
171
-
172
222
  def visit_ClassicalList(self, ctlist: ClassicalList) -> str:
173
223
  return f"{self.visit(ctlist.element_type)}[]"
174
224
 
175
225
  def visit_ClassicalArray(self, ctarray: ClassicalArray) -> str:
176
226
  return f"{self.visit(ctarray.element_type)}[{ctarray.size}]"
177
227
 
178
- def visit_Struct(self, struct: Struct) -> str:
179
- return struct.name
228
+ def visit_TypeName(self, type_: TypeName) -> str:
229
+ return type_.name
180
230
 
181
231
  def visit_VariableDeclarationStatement(
182
232
  self, local_decl: VariableDeclarationStatement
183
233
  ) -> str:
184
234
  return f"{self._indent}{self.visit_QuantumVariableDeclaration(local_decl)};\n"
185
235
 
236
+ def visit_AnonQuantumOperandDeclaration(
237
+ self, op_decl: AnonQuantumOperandDeclaration
238
+ ) -> str:
239
+ param_name = f"{op_decl.name}: " if op_decl.name is not None else ""
240
+ return f"{param_name}qfunc{[] if op_decl.is_list else ''} {self._visit_arg_decls(op_decl)}"
241
+
186
242
  def visit_QuantumOperandDeclaration(
187
243
  self, op_decl: QuantumOperandDeclaration
188
244
  ) -> str:
189
- return f"{op_decl.name}: qfunc{[] if op_decl.is_list else ''} {self._visit_arg_decls(op_decl)}"
245
+ return self.visit_AnonQuantumOperandDeclaration(op_decl)
190
246
 
191
247
  def visit_NativeFunctionDefinition(self, func_def: NativeFunctionDefinition) -> str:
248
+ if not self._emit_open_lib_functions and func_def.name in [
249
+ qfunc_.func_decl.name for qfunc_ in OPEN_LIBRARY_FUNCTIONS
250
+ ]:
251
+ return ""
192
252
  self._level += 1
193
253
  body = "".join(self.visit(qvar_decl) for qvar_decl in func_def.body)
194
254
  self._level -= 1
195
255
  return f"{self.visit_QuantumFunctionDeclaration(func_def)} {{\n{body}}}\n"
196
256
 
257
+ def visit_Allocate(self, allocate: Allocate) -> str:
258
+ if allocate.size is not None:
259
+ size = f"{self.visit(allocate.size)}, "
260
+ else:
261
+ size = ""
262
+ return f"{self._indent}allocate({size}{self.visit(allocate.target)});\n"
263
+
197
264
  def visit_QuantumFunctionCall(self, func_call: QuantumFunctionCall) -> str:
198
- gen_time_args = ", ".join(
199
- self.visit(arg_decl)
200
- for arg_decl in func_call.get_positional_args()
201
- if not isinstance(arg_decl, HandleBinding)
265
+ positional_args = ", ".join(
266
+ self.visit(arg_decl) for arg_decl in func_call.positional_args
202
267
  )
203
- gen_time_arg_list = f"<{gen_time_args}>" if gen_time_args else ""
204
- quantum_args = ", ".join(
205
- self.visit(arg_decl)
206
- for arg_decl in func_call.get_positional_args()
207
- if isinstance(arg_decl, HandleBinding)
208
- )
209
- return f"{self._indent}{func_call.func_name}{f'[{self.visit(func_call.function.index)}]' if isinstance(func_call.function, OperandIdentifier) else ''}{gen_time_arg_list}({quantum_args});\n"
210
-
211
- def visit_QuantumIfOperation(self, op: QuantumIfOperation) -> str:
212
- quantum_if = f"{self._indent}quantum_if ({self.visit(op.expression)}) {{\n"
213
- operand = op.then
214
- if not isinstance(operand, QuantumLambdaFunction):
215
- raise AssertionError(
216
- "Expected quantum_if to be implemented using a lambda function"
217
- )
218
- quantum_if += self._visit_body(operand.body)
219
- quantum_if += f"{self._indent}}}\n"
220
- return quantum_if
221
-
222
- def visit_WithinApplyOperation(self, op: WithinApplyOperation) -> str:
223
- action = op.action
224
- compute = op.compute
225
- if not isinstance(action, QuantumLambdaFunction) or not isinstance(
226
- compute, QuantumLambdaFunction
227
- ):
228
- raise AssertionError(
229
- "Expected within-apply to be implemented using a lambda functions"
230
- )
268
+ return f"{self._indent}{func_call.func_name}{f'[{self.visit(func_call.function.index)}]' if isinstance(func_call.function, OperandIdentifier) else ''}({positional_args});\n"
269
+
270
+ def visit_Control(self, op: Control) -> str:
271
+ control = f"{self._indent}control ({self.visit(op.expression)}) {{\n"
272
+ control += self._visit_body(op.body)
273
+ control += f"{self._indent}}}"
274
+ if op.else_block is not None:
275
+ control += " else {\n"
276
+ control += self._visit_body(op.else_block)
277
+ control += f"{self._indent}}}"
278
+ control += "\n"
279
+ return control
280
+
281
+ def visit_PhaseOperation(self, op: PhaseOperation) -> str:
282
+ theta = f", {self.visit(op.theta)}" if op.theta else ""
283
+ phase = f"{self._indent}phase ({self.visit(op.expression)}{theta});\n"
284
+ return phase
285
+
286
+ def visit_ClassicalIf(self, op: ClassicalIf) -> str:
287
+ classical_if = f"{self._indent}if ({self.visit(op.condition)}) {{\n"
288
+ if not op.then:
289
+ raise AssertionError('Expected non empty "then" block')
290
+ classical_if += self._visit_body(op.then)
291
+
292
+ if op.else_:
293
+ classical_if += f"{self._indent}}} else {{\n"
294
+ classical_if += self._visit_body(op.else_)
295
+
296
+ classical_if += f"{self._indent}}}\n"
297
+ return classical_if
298
+
299
+ def visit_WithinApply(self, op: WithinApply) -> str:
231
300
  within_apply_code = f"{self._indent}within {{\n"
232
- within_apply_code += self._visit_body(compute.body)
301
+ within_apply_code += self._visit_body(op.compute)
233
302
  within_apply_code += f"{self._indent}}} apply {{\n"
234
- within_apply_code += self._visit_body(action.body)
303
+ within_apply_code += self._visit_body(op.action)
235
304
  within_apply_code += f"{self._indent}}}\n"
236
305
  return within_apply_code
237
306
 
307
+ def visit_Repeat(self, repeat: Repeat) -> str:
308
+ repeat_code = f"{self._indent}repeat ({self.visit(repeat.iter_var)}: {self.visit(repeat.count)}) {{\n"
309
+ repeat_code += self._visit_body(repeat.body)
310
+ repeat_code += f"{self._indent}}}\n"
311
+ return repeat_code
312
+
313
+ def visit_Power(self, power: Power) -> str:
314
+ power_code = f"{self._indent}power ({self.visit(power.power)}) {{\n"
315
+ power_code += self._visit_body(power.body)
316
+ power_code += f"{self._indent}}}\n"
317
+ return power_code
318
+
319
+ def visit_Invert(self, invert: Invert) -> str:
320
+ invert_code = f"{self._indent}invert {{\n"
321
+ invert_code += self._visit_body(invert.body)
322
+ invert_code += f"{self._indent}}}\n"
323
+ return invert_code
324
+
238
325
  def _visit_body(self, body: StatementBlock) -> str:
239
326
  code = ""
240
327
  self._level += 1
@@ -244,11 +331,9 @@ class DSLPrettyPrinter(Visitor):
244
331
  return code
245
332
 
246
333
  def visit_InplaceBinaryOperation(self, op: InplaceBinaryOperation) -> str:
247
- return (
248
- f"{self._indent}{op.operation.value}({op.value.name}, {op.target.name});\n"
249
- )
334
+ return f"{self._indent}{op.operation.value}({self.visit(op.value)}, {self.visit(op.target)});\n"
250
335
 
251
- def _visit_pack_expr(self, vars: List[HandleBinding]) -> str:
336
+ def _visit_pack_expr(self, vars: list[HandleBinding]) -> str:
252
337
  if len(vars) == 1:
253
338
  return self.visit(vars[0])
254
339
 
@@ -261,32 +346,34 @@ class DSLPrettyPrinter(Visitor):
261
346
  )
262
347
 
263
348
  def visit_QuantumLambdaFunction(self, qlambda: QuantumLambdaFunction) -> str:
264
- assert qlambda.func_decl is not None
265
- gen_time_args = ", ".join(
266
- qlambda.rename_params.get(arg_decl.name, arg_decl.name)
267
- for arg_decl in qlambda.func_decl.get_positional_arg_decls()
268
- if not isinstance(arg_decl, PortDeclaration)
269
- )
270
- quantum_args = ", ".join(
271
- arg_decl.name
272
- for arg_decl in qlambda.func_decl.get_positional_arg_decls()
273
- if isinstance(arg_decl, PortDeclaration)
349
+ positional_args = ", ".join(
350
+ qlambda.pos_rename_params[idx]
351
+ for idx, arg_decl in enumerate(
352
+ qlambda.func_decl.positional_arg_declarations
353
+ )
274
354
  )
275
- gen_time_arg_list = f"<{gen_time_args}>" if gen_time_args else ""
276
355
  body = self._visit_body(qlambda.body)
277
- return f"lambda{gen_time_arg_list}({quantum_args}) {{\n{body}{self._indent}}}"
356
+ return f"lambda({positional_args}) {{\n{body}{self._indent}}}"
278
357
 
279
358
  def visit_HandleBinding(self, var_ref: HandleBinding) -> str:
280
359
  return var_ref.name
281
360
 
282
361
  def visit_SlicedHandleBinding(self, var_ref: SlicedHandleBinding) -> str:
283
- return str(var_ref)
362
+ return f"{self.visit(var_ref.base_handle)}[{self.visit(var_ref.start)}:{self.visit(var_ref.end)}]"
284
363
 
285
364
  def visit_SubscriptHandleBinding(self, var_ref: SubscriptHandleBinding) -> str:
286
- return str(var_ref)
365
+ return f"{self.visit(var_ref.base_handle)}[{self.visit(var_ref.index)}]"
366
+
367
+ def visit_FieldHandleBinding(self, var_ref: FieldHandleBinding) -> str:
368
+ return f"{self.visit(var_ref.base_handle)}.{self.visit(var_ref.field)}"
287
369
 
288
370
  def visit_ArithmeticOperation(self, arith_op: ArithmeticOperation) -> str:
289
- op = "^=" if arith_op.inplace_result else "="
371
+ if arith_op.operation_kind == ArithmeticOperationKind.Assignment:
372
+ op = "="
373
+ elif arith_op.operation_kind == ArithmeticOperationKind.InplaceXor:
374
+ op = "^="
375
+ else:
376
+ op = "+="
290
377
  return f"{self._indent}{self.visit(arith_op.result_var)} {op} {self.visit(arith_op.expression)};\n"
291
378
 
292
379
  def visit_AmplitudeLoadingOperation(
@@ -294,7 +381,7 @@ class DSLPrettyPrinter(Visitor):
294
381
  ) -> str:
295
382
  return f"{self._indent}{self.visit(amplitude_loading_op.result_var)} *= {self.visit(amplitude_loading_op.expression)};\n"
296
383
 
297
- def _print_bind_handles(self, handles: List[HandleBinding]) -> str:
384
+ def _print_bind_handles(self, handles: list[HandleBinding]) -> str:
298
385
  if len(handles) == 1:
299
386
  return self.visit(handles[0])
300
387
 
@@ -306,6 +393,9 @@ class DSLPrettyPrinter(Visitor):
306
393
  def visit_list(self, node: list) -> str:
307
394
  return "[" + ", ".join(self.visit(elem) for elem in node) + "]"
308
395
 
396
+ def visit_OperandIdentifier(self, op: OperandIdentifier) -> str:
397
+ return str(op)
398
+
309
399
  @property
310
400
  def _indent(self) -> str:
311
401
  return " " * self._level
@@ -0,0 +1,7 @@
1
+ from .pretty_printer import PythonPrettyPrinter
2
+
3
+ __all__ = ["PythonPrettyPrinter"]
4
+
5
+
6
+ def __dir__() -> list[str]:
7
+ return __all__