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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (516) hide show
  1. classiq/__init__.py +49 -34
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +3 -2
  3. classiq/_analyzer_extras/interactive_hardware.py +3 -3
  4. classiq/_internals/api_wrapper.py +241 -95
  5. classiq/_internals/async_utils.py +2 -77
  6. classiq/_internals/authentication/auth0.py +26 -10
  7. classiq/_internals/authentication/authentication.py +11 -0
  8. classiq/_internals/authentication/device.py +18 -8
  9. classiq/_internals/authentication/password_manager.py +40 -13
  10. classiq/_internals/authentication/token_manager.py +11 -6
  11. classiq/_internals/client.py +106 -37
  12. classiq/_internals/config.py +3 -4
  13. classiq/_internals/host_checker.py +38 -15
  14. classiq/_internals/jobs.py +56 -50
  15. classiq/_internals/type_validation.py +9 -9
  16. classiq/analyzer/__init__.py +1 -3
  17. classiq/analyzer/analyzer.py +50 -47
  18. classiq/analyzer/analyzer_utilities.py +15 -15
  19. classiq/analyzer/rb.py +19 -20
  20. classiq/analyzer/show_interactive_hack.py +30 -7
  21. classiq/analyzer/url_utils.py +2 -3
  22. classiq/applications/__init__.py +3 -12
  23. classiq/applications/chemistry/__init__.py +14 -10
  24. classiq/applications/chemistry/ansatz_parameters.py +4 -4
  25. classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +170 -170
  26. classiq/applications/chemistry/ground_state_problem.py +1 -1
  27. classiq/applications/combinatorial_helpers/allowed_constraints.py +23 -0
  28. classiq/applications/combinatorial_helpers/arithmetic/arithmetic_expression.py +35 -0
  29. classiq/applications/combinatorial_helpers/arithmetic/isolation.py +42 -0
  30. classiq/applications/combinatorial_helpers/combinatorial_problem_utils.py +166 -0
  31. classiq/applications/combinatorial_helpers/encoding_mapping.py +107 -0
  32. classiq/applications/combinatorial_helpers/encoding_utils.py +124 -0
  33. classiq/applications/combinatorial_helpers/memory.py +75 -0
  34. classiq/applications/combinatorial_helpers/optimization_model.py +193 -0
  35. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +31 -0
  36. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
  37. classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
  38. classiq/applications/combinatorial_helpers/sympy_utils.py +22 -0
  39. classiq/applications/combinatorial_helpers/transformations/encoding.py +189 -0
  40. classiq/applications/combinatorial_helpers/transformations/fixed_variables.py +143 -0
  41. classiq/applications/combinatorial_helpers/transformations/ising_converter.py +120 -0
  42. classiq/applications/combinatorial_helpers/transformations/penalty.py +31 -0
  43. classiq/applications/combinatorial_helpers/transformations/penalty_support.py +37 -0
  44. classiq/applications/combinatorial_helpers/transformations/sign_seperation.py +74 -0
  45. classiq/applications/combinatorial_helpers/transformations/slack_variables.py +87 -0
  46. classiq/applications/combinatorial_optimization/__init__.py +24 -5
  47. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
  48. classiq/applications/combinatorial_optimization/combinatorial_optimization_model_constructor.py +137 -0
  49. classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
  50. classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
  51. classiq/applications/finance/__init__.py +4 -5
  52. classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +50 -57
  53. classiq/applications/grover/__init__.py +9 -0
  54. classiq/applications/grover/grover_model_constructor.py +157 -0
  55. classiq/applications/hamiltonian/__init__.py +0 -0
  56. classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
  57. classiq/applications/libraries/__init__.py +0 -0
  58. classiq/applications/libraries/qmci_library.py +22 -0
  59. classiq/applications/qnn/__init__.py +2 -4
  60. classiq/applications/qnn/circuit_utils.py +8 -8
  61. classiq/applications/qnn/datasets/__init__.py +9 -11
  62. classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
  63. classiq/applications/qnn/datasets/dataset_not.py +2 -1
  64. classiq/applications/qnn/datasets/dataset_parity.py +2 -2
  65. classiq/applications/qnn/gradients/quantum_gradient.py +2 -2
  66. classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
  67. classiq/applications/qnn/qlayer.py +30 -10
  68. classiq/applications/qnn/torch_utils.py +4 -3
  69. classiq/applications/qnn/types.py +7 -7
  70. classiq/applications/qsvm/__init__.py +6 -4
  71. classiq/applications/qsvm/qsvm.py +4 -10
  72. classiq/applications/qsvm/qsvm_data_generation.py +5 -8
  73. classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
  74. classiq/execution/__init__.py +8 -3
  75. classiq/execution/all_hardware_devices.py +11 -0
  76. classiq/execution/execution_session.py +400 -0
  77. classiq/execution/iqcc.py +63 -0
  78. classiq/execution/jobs.py +197 -25
  79. classiq/execution/qnn.py +79 -0
  80. classiq/executor.py +23 -117
  81. classiq/interface/_version.py +1 -1
  82. classiq/interface/analyzer/analysis_params.py +49 -16
  83. classiq/interface/analyzer/cytoscape_graph.py +15 -9
  84. classiq/interface/analyzer/result.py +36 -32
  85. classiq/interface/applications/qsvm.py +28 -25
  86. classiq/interface/ast_node.py +16 -0
  87. classiq/interface/backend/backend_preferences.py +390 -119
  88. classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
  89. classiq/interface/backend/pydantic_backend.py +27 -22
  90. classiq/interface/backend/quantum_backend_providers.py +70 -16
  91. classiq/interface/chemistry/fermionic_operator.py +43 -32
  92. classiq/interface/chemistry/ground_state_problem.py +42 -24
  93. classiq/interface/chemistry/molecule.py +20 -14
  94. classiq/interface/chemistry/operator.py +75 -236
  95. classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
  96. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +2 -4
  97. classiq/interface/combinatorial_optimization/examples/greater_than_ilp.py +1 -1
  98. classiq/interface/combinatorial_optimization/examples/ilp.py +2 -1
  99. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  100. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  101. classiq/interface/combinatorial_optimization/examples/mds.py +2 -1
  102. classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
  103. classiq/interface/combinatorial_optimization/examples/mis.py +4 -1
  104. classiq/interface/combinatorial_optimization/examples/mvc.py +2 -1
  105. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  106. classiq/interface/combinatorial_optimization/examples/set_cover.py +3 -3
  107. classiq/interface/combinatorial_optimization/examples/tsp.py +4 -3
  108. classiq/interface/combinatorial_optimization/examples/tsp_digraph.py +6 -2
  109. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +14 -9
  110. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  111. classiq/interface/combinatorial_optimization/result.py +1 -3
  112. classiq/interface/combinatorial_optimization/solver_types.py +1 -1
  113. classiq/interface/debug_info/__init__.py +0 -0
  114. classiq/interface/debug_info/debug_info.py +86 -0
  115. classiq/interface/exceptions.py +201 -0
  116. classiq/interface/execution/iqcc.py +19 -0
  117. classiq/interface/execution/jobs.py +15 -12
  118. classiq/interface/execution/primitives.py +18 -0
  119. classiq/interface/executor/constants.py +1 -0
  120. classiq/interface/executor/estimation.py +2 -2
  121. classiq/interface/executor/execution_preferences.py +26 -143
  122. classiq/interface/executor/execution_request.py +36 -56
  123. classiq/interface/executor/execution_result.py +30 -8
  124. classiq/interface/executor/iqae_result.py +4 -6
  125. classiq/interface/executor/optimizer_preferences.py +34 -22
  126. classiq/interface/executor/{quantum_program.py → quantum_code.py} +44 -34
  127. classiq/interface/executor/quantum_instruction_set.py +3 -2
  128. classiq/interface/executor/register_initialization.py +12 -17
  129. classiq/interface/executor/result.py +122 -64
  130. classiq/interface/executor/vqe_result.py +11 -11
  131. classiq/interface/finance/function_input.py +42 -19
  132. classiq/interface/finance/gaussian_model_input.py +7 -5
  133. classiq/interface/finance/log_normal_model_input.py +6 -4
  134. classiq/interface/finance/model_input.py +6 -4
  135. classiq/interface/generator/adjacency.py +1 -3
  136. classiq/interface/generator/amplitude_loading.py +27 -14
  137. classiq/interface/generator/ansatz_library.py +5 -5
  138. classiq/interface/generator/application_apis/__init__.py +1 -0
  139. classiq/interface/generator/application_apis/arithmetic_declarations.py +17 -0
  140. classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
  141. classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
  142. classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
  143. classiq/interface/generator/application_apis/finance_declarations.py +48 -69
  144. classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
  145. classiq/interface/generator/arith/argument_utils.py +57 -6
  146. classiq/interface/generator/arith/arithmetic.py +37 -16
  147. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +15 -17
  148. classiq/interface/generator/arith/arithmetic_expression_abc.py +70 -26
  149. classiq/interface/generator/arith/arithmetic_expression_parser.py +18 -12
  150. classiq/interface/generator/arith/arithmetic_expression_validator.py +61 -43
  151. classiq/interface/generator/arith/arithmetic_operations.py +19 -16
  152. classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
  153. classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
  154. classiq/interface/generator/arith/ast_node_rewrite.py +4 -3
  155. classiq/interface/generator/arith/binary_ops.py +375 -139
  156. classiq/interface/generator/arith/endianness.py +1 -1
  157. classiq/interface/generator/arith/extremum_operations.py +96 -23
  158. classiq/interface/generator/arith/logical_ops.py +16 -12
  159. classiq/interface/generator/arith/machine_precision.py +3 -0
  160. classiq/interface/generator/arith/number_utils.py +44 -48
  161. classiq/interface/generator/arith/register_user_input.py +70 -27
  162. classiq/interface/generator/arith/unary_ops.py +57 -46
  163. classiq/interface/generator/arith/uncomputation_methods.py +1 -1
  164. classiq/interface/generator/builtin_api_builder.py +2 -9
  165. classiq/interface/generator/chemistry_function_params.py +5 -5
  166. classiq/interface/generator/circuit_code/circuit_code.py +7 -7
  167. classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
  168. classiq/interface/generator/commuting_pauli_exponentiation.py +8 -6
  169. classiq/interface/generator/compiler_keywords.py +8 -0
  170. classiq/interface/generator/complex_type.py +13 -25
  171. classiq/interface/generator/constant.py +3 -4
  172. classiq/interface/generator/control_state.py +35 -28
  173. classiq/interface/generator/copy.py +47 -0
  174. classiq/interface/generator/custom_ansatz.py +2 -5
  175. classiq/interface/generator/distance.py +3 -5
  176. classiq/interface/generator/excitations.py +3 -2
  177. classiq/interface/generator/expressions/atomic_expression_functions.py +26 -8
  178. classiq/interface/generator/expressions/enums/__init__.py +0 -10
  179. classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
  180. classiq/interface/generator/expressions/evaluated_expression.py +21 -7
  181. classiq/interface/generator/expressions/expression.py +27 -15
  182. classiq/interface/generator/expressions/expression_constants.py +9 -3
  183. classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
  184. classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
  185. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +59 -0
  186. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
  187. classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
  188. classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
  189. classiq/interface/generator/expressions/sympy_supported_expressions.py +20 -11
  190. classiq/interface/generator/finance.py +3 -3
  191. classiq/interface/generator/function_param_library.py +6 -6
  192. classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
  193. classiq/interface/generator/function_params.py +42 -69
  194. classiq/interface/generator/functions/__init__.py +0 -22
  195. classiq/interface/generator/functions/builtins/__init__.py +0 -0
  196. classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
  197. classiq/interface/generator/functions/classical_function_declaration.py +18 -9
  198. classiq/interface/generator/functions/classical_type.py +47 -166
  199. classiq/interface/generator/functions/concrete_types.py +55 -0
  200. classiq/interface/generator/functions/function_declaration.py +13 -14
  201. classiq/interface/generator/functions/port_declaration.py +1 -13
  202. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  203. classiq/interface/generator/functions/type_name.py +90 -0
  204. classiq/interface/generator/generated_circuit_data.py +155 -22
  205. classiq/interface/generator/grover_diffuser.py +32 -25
  206. classiq/interface/generator/grover_operator.py +34 -23
  207. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
  208. classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
  209. classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +12 -8
  210. classiq/interface/generator/hardware/hardware_data.py +76 -36
  211. classiq/interface/generator/hardware_efficient_ansatz.py +38 -17
  212. classiq/interface/generator/hartree_fock.py +14 -4
  213. classiq/interface/generator/identity.py +10 -6
  214. classiq/interface/generator/linear_pauli_rotations.py +33 -19
  215. classiq/interface/generator/mcmt_method.py +1 -1
  216. classiq/interface/generator/mcu.py +20 -16
  217. classiq/interface/generator/mcx.py +29 -20
  218. classiq/interface/generator/model/__init__.py +2 -5
  219. classiq/interface/generator/model/constraints.py +27 -8
  220. classiq/interface/generator/model/model.py +32 -203
  221. classiq/interface/generator/model/preferences/preferences.py +118 -43
  222. classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +27 -22
  223. classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
  224. classiq/interface/generator/oracles/custom_oracle.py +17 -13
  225. classiq/interface/generator/oracles/oracle_abc.py +9 -9
  226. classiq/interface/generator/partitioned_register.py +7 -7
  227. classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
  228. classiq/interface/generator/preferences/optimization.py +1 -2
  229. classiq/interface/generator/qpe.py +47 -34
  230. classiq/interface/generator/qsvm.py +13 -17
  231. classiq/interface/generator/quantum_function_call.py +107 -87
  232. classiq/interface/generator/{generated_circuit.py → quantum_program.py} +50 -37
  233. classiq/interface/generator/range_types.py +13 -12
  234. classiq/interface/generator/register_role.py +18 -6
  235. classiq/interface/generator/slice_parsing_utils.py +11 -6
  236. classiq/interface/generator/standard_gates/controlled_standard_gates.py +32 -39
  237. classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
  238. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  239. classiq/interface/generator/standard_gates/u_gate.py +7 -10
  240. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  241. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
  242. classiq/interface/generator/state_preparation/distributions.py +16 -15
  243. classiq/interface/generator/state_preparation/metrics.py +5 -7
  244. classiq/interface/generator/state_preparation/state_preparation.py +30 -23
  245. classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
  246. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
  247. classiq/interface/generator/transpiler_basis_gates.py +7 -3
  248. classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
  249. classiq/interface/generator/types/compilation_metadata.py +6 -0
  250. classiq/interface/generator/types/enum_declaration.py +54 -0
  251. classiq/interface/generator/types/qstruct_declaration.py +18 -0
  252. classiq/interface/generator/types/struct_declaration.py +15 -14
  253. classiq/interface/generator/ucc.py +9 -6
  254. classiq/interface/generator/unitary_gate.py +10 -6
  255. classiq/interface/generator/user_defined_function_params.py +4 -1
  256. classiq/interface/generator/validations/flow_graph.py +11 -9
  257. classiq/interface/generator/validations/validator_functions.py +8 -6
  258. classiq/interface/generator/visitor.py +23 -16
  259. classiq/interface/hardware.py +31 -10
  260. classiq/interface/helpers/classproperty.py +8 -0
  261. classiq/interface/helpers/custom_encoders.py +3 -0
  262. classiq/interface/helpers/custom_pydantic_types.py +40 -50
  263. classiq/interface/helpers/datastructures.py +26 -0
  264. classiq/interface/helpers/hashable_mixin.py +3 -2
  265. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  266. classiq/interface/helpers/pydantic_model_helpers.py +7 -11
  267. classiq/interface/helpers/validation_helpers.py +4 -21
  268. classiq/interface/helpers/versioned_model.py +1 -1
  269. classiq/interface/ide/ide_data.py +16 -20
  270. classiq/interface/ide/visual_model.py +130 -0
  271. classiq/interface/interface_version.py +1 -0
  272. classiq/interface/jobs.py +35 -6
  273. classiq/interface/model/allocate.py +16 -0
  274. classiq/interface/model/bind_operation.py +44 -14
  275. classiq/interface/model/classical_if.py +15 -0
  276. classiq/interface/model/classical_parameter_declaration.py +33 -3
  277. classiq/interface/model/control.py +45 -0
  278. classiq/interface/model/handle_binding.py +298 -20
  279. classiq/interface/model/inplace_binary_operation.py +31 -26
  280. classiq/interface/model/invert.py +12 -0
  281. classiq/interface/model/model.py +87 -73
  282. classiq/interface/model/native_function_definition.py +16 -21
  283. classiq/interface/model/parameter.py +13 -0
  284. classiq/interface/model/phase_operation.py +11 -0
  285. classiq/interface/model/port_declaration.py +27 -9
  286. classiq/interface/model/power.py +14 -0
  287. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +38 -21
  288. classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
  289. classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
  290. classiq/interface/model/quantum_function_call.py +146 -462
  291. classiq/interface/model/quantum_function_declaration.py +193 -152
  292. classiq/interface/model/quantum_lambda_function.py +65 -0
  293. classiq/interface/model/quantum_statement.py +71 -12
  294. classiq/interface/model/quantum_type.py +205 -67
  295. classiq/interface/model/quantum_variable_declaration.py +4 -26
  296. classiq/interface/model/repeat.py +15 -0
  297. classiq/interface/model/statement_block.py +58 -0
  298. classiq/interface/model/validation_handle.py +13 -6
  299. classiq/interface/model/variable_declaration_statement.py +3 -1
  300. classiq/interface/model/within_apply_operation.py +13 -0
  301. classiq/interface/pyomo_extension/pyomo_sympy_bimap.py +4 -1
  302. classiq/interface/server/global_versions.py +6 -7
  303. classiq/interface/server/routes.py +22 -21
  304. classiq/interface/source_reference.py +59 -0
  305. classiq/model_expansions/__init__.py +0 -0
  306. classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
  307. classiq/model_expansions/capturing/__init__.py +0 -0
  308. classiq/model_expansions/capturing/captured_vars.py +435 -0
  309. classiq/model_expansions/capturing/mangling_utils.py +56 -0
  310. classiq/model_expansions/closure.py +171 -0
  311. classiq/model_expansions/debug_flag.py +3 -0
  312. classiq/model_expansions/evaluators/__init__.py +0 -0
  313. classiq/model_expansions/evaluators/arg_type_match.py +158 -0
  314. classiq/model_expansions/evaluators/argument_types.py +42 -0
  315. classiq/model_expansions/evaluators/classical_expression.py +36 -0
  316. classiq/model_expansions/evaluators/control.py +144 -0
  317. classiq/model_expansions/evaluators/parameter_types.py +226 -0
  318. classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
  319. classiq/model_expansions/evaluators/type_type_match.py +90 -0
  320. classiq/model_expansions/expression_evaluator.py +135 -0
  321. classiq/model_expansions/expression_renamer.py +76 -0
  322. classiq/model_expansions/function_builder.py +247 -0
  323. classiq/model_expansions/generative_functions.py +158 -0
  324. classiq/model_expansions/interpreters/__init__.py +0 -0
  325. classiq/model_expansions/interpreters/base_interpreter.py +263 -0
  326. classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
  327. classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
  328. classiq/model_expansions/model_tables.py +18 -0
  329. classiq/model_expansions/quantum_operations/__init__.py +9 -0
  330. classiq/model_expansions/quantum_operations/bind.py +60 -0
  331. classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
  332. classiq/model_expansions/quantum_operations/classicalif.py +53 -0
  333. classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
  334. classiq/model_expansions/quantum_operations/emitter.py +181 -0
  335. classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
  336. classiq/model_expansions/quantum_operations/repeat.py +56 -0
  337. classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
  338. classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
  339. classiq/model_expansions/scope.py +240 -0
  340. classiq/model_expansions/scope_initialization.py +150 -0
  341. classiq/model_expansions/sympy_conversion/__init__.py +0 -0
  342. classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
  343. classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
  344. classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
  345. classiq/model_expansions/transformers/__init__.py +0 -0
  346. classiq/model_expansions/transformers/ast_renamer.py +26 -0
  347. classiq/model_expansions/transformers/var_splitter.py +299 -0
  348. classiq/model_expansions/utils/__init__.py +0 -0
  349. classiq/model_expansions/utils/counted_name_allocator.py +11 -0
  350. classiq/model_expansions/utils/handles_collector.py +33 -0
  351. classiq/model_expansions/visitors/__init__.py +0 -0
  352. classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
  353. classiq/model_expansions/visitors/variable_references.py +144 -0
  354. classiq/open_library/__init__.py +4 -0
  355. classiq/open_library/functions/__init__.py +130 -0
  356. classiq/open_library/functions/amplitude_estimation.py +30 -0
  357. classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
  358. classiq/open_library/functions/grover.py +157 -0
  359. classiq/open_library/functions/hea.py +115 -0
  360. classiq/open_library/functions/linear_pauli_rotation.py +82 -0
  361. classiq/open_library/functions/modular_exponentiation.py +201 -0
  362. classiq/open_library/functions/qaoa_penalty.py +117 -0
  363. classiq/open_library/functions/qft_functions.py +54 -0
  364. classiq/open_library/functions/qpe.py +46 -0
  365. classiq/open_library/functions/qsvt.py +331 -0
  366. classiq/open_library/functions/state_preparation.py +301 -0
  367. classiq/open_library/functions/swap_test.py +27 -0
  368. classiq/open_library/functions/utility_functions.py +81 -0
  369. classiq/open_library/functions/variational.py +52 -0
  370. classiq/qmod/__init__.py +17 -10
  371. classiq/qmod/builtins/__init__.py +19 -2
  372. classiq/qmod/builtins/classical_execution_primitives.py +60 -47
  373. classiq/qmod/builtins/classical_functions.py +44 -38
  374. classiq/qmod/builtins/constants.py +10 -0
  375. classiq/qmod/builtins/enums.py +208 -0
  376. classiq/qmod/builtins/functions/__init__.py +137 -0
  377. classiq/qmod/builtins/functions/allocation.py +150 -0
  378. classiq/qmod/builtins/functions/arithmetic.py +55 -0
  379. classiq/qmod/builtins/functions/benchmarking.py +8 -0
  380. classiq/qmod/builtins/functions/chemistry.py +91 -0
  381. classiq/qmod/builtins/functions/exponentiation.py +105 -0
  382. classiq/qmod/builtins/functions/finance.py +34 -0
  383. classiq/qmod/builtins/functions/operators.py +16 -0
  384. classiq/qmod/builtins/functions/qsvm.py +24 -0
  385. classiq/qmod/builtins/functions/standard_gates.py +651 -0
  386. classiq/qmod/builtins/operations.py +379 -57
  387. classiq/qmod/builtins/structs.py +103 -80
  388. classiq/qmod/cfunc.py +42 -0
  389. classiq/qmod/classical_function.py +8 -20
  390. classiq/qmod/cparam.py +64 -0
  391. classiq/qmod/create_model_function.py +56 -0
  392. classiq/qmod/declaration_inferrer.py +145 -112
  393. classiq/qmod/expression_query.py +39 -0
  394. classiq/qmod/generative.py +42 -0
  395. classiq/qmod/model_state_container.py +19 -5
  396. classiq/qmod/native/__init__.py +7 -0
  397. classiq/qmod/native/expression_to_qmod.py +194 -0
  398. classiq/qmod/native/pretty_printer.py +401 -0
  399. classiq/qmod/pretty_print/__init__.py +7 -0
  400. classiq/qmod/pretty_print/expression_to_python.py +222 -0
  401. classiq/qmod/pretty_print/pretty_printer.py +572 -0
  402. classiq/qmod/python_classical_type.py +67 -0
  403. classiq/qmod/qfunc.py +79 -0
  404. classiq/qmod/qmod_constant.py +143 -0
  405. classiq/qmod/qmod_parameter.py +84 -53
  406. classiq/qmod/qmod_variable.py +497 -100
  407. classiq/qmod/quantum_callable.py +17 -7
  408. classiq/qmod/quantum_expandable.py +278 -105
  409. classiq/qmod/quantum_function.py +232 -48
  410. classiq/qmod/semantics/__init__.py +0 -0
  411. classiq/qmod/semantics/annotation/__init__.py +0 -0
  412. classiq/qmod/semantics/annotation/call_annotation.py +92 -0
  413. classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
  414. classiq/qmod/semantics/error_manager.py +88 -0
  415. classiq/qmod/semantics/lambdas.py +25 -0
  416. classiq/qmod/semantics/static_semantics_visitor.py +384 -0
  417. classiq/qmod/semantics/validation/__init__.py +0 -0
  418. classiq/qmod/semantics/validation/constants_validation.py +16 -0
  419. classiq/qmod/semantics/validation/func_call_validation.py +99 -0
  420. classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
  421. classiq/qmod/semantics/validation/handle_validation.py +85 -0
  422. classiq/qmod/semantics/validation/main_validation.py +33 -0
  423. classiq/qmod/semantics/validation/types_validation.py +128 -0
  424. classiq/qmod/symbolic.py +178 -111
  425. classiq/qmod/symbolic_expr.py +36 -12
  426. classiq/qmod/symbolic_type.py +2 -5
  427. classiq/qmod/type_attribute_remover.py +32 -0
  428. classiq/qmod/utilities.py +108 -1
  429. classiq/qmod/write_qmod.py +53 -0
  430. classiq/synthesis.py +210 -22
  431. {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/METADATA +16 -8
  432. classiq-0.65.3.dist-info/RECORD +521 -0
  433. {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/WHEEL +1 -1
  434. classiq/_internals/_qfunc_ext.py +0 -6
  435. classiq/applications/benchmarking/__init__.py +0 -9
  436. classiq/applications/benchmarking/mirror_benchmarking.py +0 -67
  437. classiq/applications/numpy_utils.py +0 -37
  438. classiq/applications_model_constructors/__init__.py +0 -17
  439. classiq/applications_model_constructors/combinatorial_optimization_model_constructor.py +0 -178
  440. classiq/applications_model_constructors/grover_model_constructor.py +0 -227
  441. classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
  442. classiq/applications_model_constructors/libraries/qmci_library.py +0 -109
  443. classiq/builtin_functions/__init__.py +0 -43
  444. classiq/builtin_functions/amplitude_loading.py +0 -3
  445. classiq/builtin_functions/binary_ops.py +0 -1
  446. classiq/builtin_functions/exponentiation.py +0 -5
  447. classiq/builtin_functions/qpe.py +0 -4
  448. classiq/builtin_functions/qsvm.py +0 -7
  449. classiq/builtin_functions/range_types.py +0 -5
  450. classiq/builtin_functions/standard_gates.py +0 -1
  451. classiq/builtin_functions/state_preparation.py +0 -6
  452. classiq/builtin_functions/suzuki_trotter.py +0 -3
  453. classiq/exceptions.py +0 -131
  454. classiq/interface/executor/aws_execution_cost.py +0 -72
  455. classiq/interface/executor/error_mitigation.py +0 -6
  456. classiq/interface/generator/credit_risk_example/linear_gci.py +0 -115
  457. classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -59
  458. classiq/interface/generator/expressions/enums/chemistry.py +0 -28
  459. classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
  460. classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
  461. classiq/interface/generator/expressions/enums/optimizers.py +0 -9
  462. classiq/interface/generator/expressions/enums/pauli.py +0 -8
  463. classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
  464. classiq/interface/generator/expressions/qmod_qnum_proxy.py +0 -22
  465. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
  466. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
  467. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
  468. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -862
  469. classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -169
  470. classiq/interface/generator/functions/foreign_function_definition.py +0 -106
  471. classiq/interface/generator/functions/function_implementation.py +0 -103
  472. classiq/interface/generator/functions/native_function_definition.py +0 -153
  473. classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
  474. classiq/interface/generator/functions/register.py +0 -42
  475. classiq/interface/generator/functions/register_mapping_data.py +0 -102
  476. classiq/interface/generator/inequality_mixer.py +0 -51
  477. classiq/interface/generator/model/classical_main_validator.py +0 -106
  478. classiq/interface/generator/range_mixer.py +0 -56
  479. classiq/interface/generator/state_propagator.py +0 -63
  480. classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -2
  481. classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
  482. classiq/interface/generator/types/builtin_struct_declarations/qaoa_declarations.py +0 -23
  483. classiq/interface/generator/types/combinatorial_problem.py +0 -26
  484. classiq/interface/ide/show.py +0 -34
  485. classiq/interface/model/common_model_types.py +0 -23
  486. classiq/interface/model/numeric_reinterpretation.py +0 -25
  487. classiq/interface/model/operator_synthesis_data.py +0 -48
  488. classiq/interface/model/quantum_expressions/control_state.py +0 -38
  489. classiq/interface/model/quantum_if_operation.py +0 -95
  490. classiq/interface/model/resolvers/function_call_resolver.py +0 -43
  491. classiq/interface/model/validations/handle_validation_base.py +0 -55
  492. classiq/interface/model/validations/handles_validator.py +0 -154
  493. classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
  494. classiq/model/__init__.py +0 -14
  495. classiq/model/composite_function_generator.py +0 -33
  496. classiq/model/function_handler.py +0 -466
  497. classiq/model/function_handler.pyi +0 -152
  498. classiq/model/logic_flow.py +0 -149
  499. classiq/model/logic_flow_change_handler.py +0 -71
  500. classiq/model/model.py +0 -246
  501. classiq/qmod/builtins/functions.py +0 -896
  502. classiq/qmod/qmod_struct.py +0 -37
  503. classiq/quantum_functions/__init__.py +0 -17
  504. classiq/quantum_functions/annotation_parser.py +0 -207
  505. classiq/quantum_functions/decorators.py +0 -22
  506. classiq/quantum_functions/function_library.py +0 -181
  507. classiq/quantum_functions/function_parser.py +0 -74
  508. classiq/quantum_functions/quantum_function.py +0 -236
  509. classiq-0.37.1.dist-info/RECORD +0 -418
  510. /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers}/__init__.py +0 -0
  511. /classiq/{interface/generator/credit_risk_example → applications/combinatorial_helpers/arithmetic}/__init__.py +0 -0
  512. /classiq/{interface/generator/functions/core_lib_declarations → applications/combinatorial_helpers/pauli_helpers}/__init__.py +0 -0
  513. /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → applications/combinatorial_helpers/py.typed} +0 -0
  514. /classiq/{interface/model/resolvers → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
  515. /classiq/{interface/model/validations → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
  516. /classiq/{_internals → interface}/enum_utils.py +0 -0
@@ -1,117 +1,439 @@
1
- from typing import Callable, List, Union
1
+ import inspect
2
+ import sys
3
+ from collections.abc import Mapping
4
+ from types import FrameType
5
+ from typing import (
6
+ Any,
7
+ Callable,
8
+ Final,
9
+ Union,
10
+ overload,
11
+ )
2
12
 
13
+ from classiq.interface.exceptions import ClassiqValueError
3
14
  from classiq.interface.generator.expressions.expression import Expression
4
- from classiq.interface.generator.functions.core_lib_declarations.quantum_operators import (
5
- OPERAND_FIELD_NAME,
15
+ from classiq.interface.generator.functions.builtins.internal_operators import (
16
+ REPEAT_OPERATOR_NAME,
6
17
  )
18
+ from classiq.interface.generator.functions.classical_type import Integer
19
+ from classiq.interface.model.allocate import Allocate
7
20
  from classiq.interface.model.bind_operation import BindOperation
8
- from classiq.interface.model.inplace_binary_operation import (
9
- BinaryOperation,
10
- InplaceBinaryOperation,
21
+ from classiq.interface.model.classical_if import ClassicalIf
22
+ from classiq.interface.model.classical_parameter_declaration import (
23
+ ClassicalParameterDeclaration,
24
+ )
25
+ from classiq.interface.model.control import Control
26
+ from classiq.interface.model.invert import Invert
27
+ from classiq.interface.model.phase_operation import PhaseOperation
28
+ from classiq.interface.model.power import Power
29
+ from classiq.interface.model.quantum_expressions.amplitude_loading_operation import (
30
+ AmplitudeLoadingOperation,
11
31
  )
12
- from classiq.interface.model.numeric_reinterpretation import (
13
- NumericReinterpretationOperation,
32
+ from classiq.interface.model.quantum_expressions.arithmetic_operation import (
33
+ ArithmeticOperation,
34
+ ArithmeticOperationKind,
14
35
  )
36
+ from classiq.interface.model.quantum_function_call import QuantumFunctionCall
15
37
  from classiq.interface.model.quantum_function_declaration import (
16
38
  QuantumOperandDeclaration,
17
39
  )
18
- from classiq.interface.model.quantum_if_operation import QuantumIfOperation
40
+ from classiq.interface.model.quantum_lambda_function import QuantumLambdaFunction
41
+ from classiq.interface.model.repeat import Repeat
42
+ from classiq.interface.model.statement_block import StatementBlock
43
+ from classiq.interface.model.within_apply_operation import WithinApply
19
44
 
20
- from classiq.qmod.builtins.functions import (
21
- apply,
22
- compute as compute_operator,
23
- uncompute,
24
- )
25
- from classiq.qmod.qmod_parameter import QParam
26
- from classiq.qmod.qmod_variable import Input, Output, QNum, QVar
45
+ from classiq.qmod.generative import is_generative_mode
46
+ from classiq.qmod.qmod_constant import QConstant
47
+ from classiq.qmod.qmod_variable import Input, Output, QArray, QBit, QScalar, QVar
27
48
  from classiq.qmod.quantum_callable import QCallable
28
49
  from classiq.qmod.quantum_expandable import prepare_arg
29
50
  from classiq.qmod.symbolic_expr import SymbolicExpr
51
+ from classiq.qmod.utilities import get_source_ref
52
+
53
+ _MISSING_VALUE: Final[int] = -1
54
+
55
+
56
+ @overload
57
+ def allocate(num_qubits: Union[int, SymbolicExpr], out: Output[QVar]) -> None:
58
+ pass
30
59
 
31
60
 
32
- def bind(source: Input[QVar], destination: Output[QVar]) -> None:
61
+ @overload
62
+ def allocate(out: Output[QVar]) -> None:
63
+ pass
64
+
65
+
66
+ def allocate(*args: Any, **kwargs: Any) -> None:
67
+ """
68
+ Initialize a quantum variable.
69
+
70
+ If 'num_qubits' is specified, 'num_qubits' qubits will be allocated for variable
71
+ 'out'. Otherwise, the number of qubits will be inferred according to the type of
72
+ 'out'.
73
+
74
+ Args:
75
+ size: The number of qubits to be allocated (optional)
76
+ out: The target variable
77
+ """
33
78
  assert QCallable.CURRENT_EXPANDABLE is not None
79
+ source_ref = get_source_ref(sys._getframe(1))
80
+ if len(args) == 0:
81
+ size = kwargs.get("num_qubits", None)
82
+ target = kwargs["out"]
83
+ elif len(args) == 1:
84
+ if "out" in kwargs:
85
+ size = args[0]
86
+ target = kwargs["out"]
87
+ else:
88
+ size = None
89
+ target = args[0]
90
+ else:
91
+ size, target = args
92
+ if isinstance(size, QConstant):
93
+ size.add_to_model()
34
94
  QCallable.CURRENT_EXPANDABLE.append_statement_to_body(
35
- BindOperation(
36
- in_handle=source.get_handle_binding(),
37
- out_handle=destination.get_handle_binding(),
95
+ Allocate(
96
+ size=None if size is None else Expression(expr=str(size)),
97
+ target=target.get_handle_binding(),
98
+ source_ref=source_ref,
38
99
  )
39
100
  )
40
101
 
41
102
 
42
- def quantum_if(
43
- condition: SymbolicExpr, then: Union[QCallable, Callable[[], None]]
103
+ def bind(
104
+ source: Union[Input[QVar], list[Input[QVar]]],
105
+ destination: Union[Output[QVar], list[Output[QVar]]],
44
106
  ) -> None:
45
107
  assert QCallable.CURRENT_EXPANDABLE is not None
108
+ source_ref = get_source_ref(sys._getframe(1))
109
+ if not isinstance(source, list):
110
+ source = [source]
111
+ if not isinstance(destination, list):
112
+ destination = [destination]
46
113
  QCallable.CURRENT_EXPANDABLE.append_statement_to_body(
47
- QuantumIfOperation(
48
- expression=Expression(expr=str(condition)),
49
- then=prepare_arg(QuantumOperandDeclaration(name=OPERAND_FIELD_NAME), then),
114
+ BindOperation(
115
+ in_handles=[src_var.get_handle_binding() for src_var in source],
116
+ out_handles=[dst_var.get_handle_binding() for dst_var in destination],
117
+ source_ref=source_ref,
50
118
  )
51
119
  )
52
120
 
53
121
 
54
- def reinterpret_num(
55
- is_signed: Union[QParam[bool], bool],
56
- fraction_digits: Union[QParam[int], int],
57
- target: QNum,
122
+ def if_(
123
+ condition: Union[SymbolicExpr, bool],
124
+ then: Union[QCallable, Callable[[], None]],
125
+ else_: Union[QCallable, Callable[[], None], int] = _MISSING_VALUE,
126
+ ) -> None:
127
+ _validate_operand(then)
128
+ if else_ != _MISSING_VALUE:
129
+ _validate_operand(else_)
130
+ assert QCallable.CURRENT_EXPANDABLE is not None
131
+ source_ref = get_source_ref(sys._getframe(1))
132
+
133
+ if_stmt = ClassicalIf(
134
+ condition=Expression(expr=str(condition)),
135
+ then=_operand_to_body(then, "then"),
136
+ else_=_operand_to_body(else_, "else") if else_ != _MISSING_VALUE else [], # type: ignore[arg-type]
137
+ source_ref=source_ref,
138
+ )
139
+ if is_generative_mode():
140
+ if_stmt.set_generative_block("then", then)
141
+ if callable(else_):
142
+ if_stmt.set_generative_block("else", else_)
143
+ QCallable.CURRENT_EXPANDABLE.append_statement_to_body(if_stmt)
144
+
145
+
146
+ def control(
147
+ ctrl: Union[SymbolicExpr, QBit, QArray[QBit]],
148
+ stmt_block: Union[QCallable, Callable[[], None]],
149
+ else_block: Union[QCallable, Callable[[], None], None] = None,
58
150
  ) -> None:
151
+ _validate_operand(stmt_block)
59
152
  assert QCallable.CURRENT_EXPANDABLE is not None
153
+ source_ref = get_source_ref(sys._getframe(1))
154
+ control_stmt = Control(
155
+ expression=Expression(expr=str(ctrl)),
156
+ body=_operand_to_body(stmt_block, "stmt_block"),
157
+ else_block=_operand_to_body(else_block, "else_block") if else_block else None,
158
+ source_ref=source_ref,
159
+ )
160
+ if is_generative_mode():
161
+ control_stmt.set_generative_block("body", stmt_block)
162
+ if else_block is not None:
163
+ control_stmt.set_generative_block("else_block", else_block)
164
+ QCallable.CURRENT_EXPANDABLE.append_statement_to_body(control_stmt)
165
+
166
+
167
+ def assign(expression: SymbolicExpr, target_var: QScalar) -> None:
168
+ """
169
+ Initialize a scalar quantum variable using an arithmetic expression.
170
+ If specified, the variable numeric properties (size, signedness, and fraction
171
+ digits) must match the expression properties.
172
+
173
+ Equivalent to `<target_var> |= <expression>`.
174
+
175
+ Args:
176
+ expression: A classical or quantum arithmetic expression
177
+ target_var: An uninitialized scalar quantum variable
178
+ """
179
+ assert QCallable.CURRENT_EXPANDABLE is not None
180
+ source_ref = get_source_ref(sys._getframe(1))
60
181
  QCallable.CURRENT_EXPANDABLE.append_statement_to_body(
61
- NumericReinterpretationOperation(
62
- target=target.get_handle_binding(),
63
- is_signed=Expression(expr=str(is_signed)),
64
- fraction_digits=Expression(expr=str(fraction_digits)),
182
+ ArithmeticOperation(
183
+ expression=Expression(expr=str(expression)),
184
+ result_var=target_var.get_handle_binding(),
185
+ operation_kind=ArithmeticOperationKind.Assignment,
186
+ source_ref=source_ref,
65
187
  )
66
188
  )
67
189
 
68
190
 
69
- def inplace_add(
70
- value: QNum,
71
- target: QNum,
72
- ) -> None:
191
+ def assign_amplitude(expression: SymbolicExpr, target_var: QScalar) -> None:
192
+ """
193
+ Perform an amplitude-encoding assignment operation on a quantum variable and a
194
+ quantum expression.
195
+
196
+ Equivalent to `<target_var> *= <expression>`.
197
+
198
+ Args:
199
+ expression: A quantum arithmetic expression
200
+ target_var: A scalar quantum variable
201
+ """
73
202
  assert QCallable.CURRENT_EXPANDABLE is not None
203
+ source_ref = get_source_ref(sys._getframe(1))
74
204
  QCallable.CURRENT_EXPANDABLE.append_statement_to_body(
75
- InplaceBinaryOperation(
76
- target=target.get_handle_binding(),
77
- value=value.get_handle_binding(),
78
- operation=BinaryOperation.Addition,
205
+ AmplitudeLoadingOperation(
206
+ expression=Expression(expr=str(expression)),
207
+ result_var=target_var.get_handle_binding(),
208
+ source_ref=source_ref,
79
209
  )
80
210
  )
81
211
 
82
212
 
83
- def inplace_xor(
84
- value: QNum,
85
- target: QNum,
86
- ) -> None:
213
+ def inplace_add(expression: SymbolicExpr, target_var: QScalar) -> None:
214
+ """
215
+ Add an arithmetic expression to a quantum variable.
216
+
217
+ Equivalent to `<target_var> += <expression>`.
218
+
219
+ Args:
220
+ expression: A classical or quantum arithmetic expression
221
+ target_var: A scalar quantum variable
222
+ """
87
223
  assert QCallable.CURRENT_EXPANDABLE is not None
224
+ source_ref = get_source_ref(sys._getframe(1))
88
225
  QCallable.CURRENT_EXPANDABLE.append_statement_to_body(
89
- InplaceBinaryOperation(
90
- target=target.get_handle_binding(),
91
- value=value.get_handle_binding(),
92
- operation=BinaryOperation.Xor,
226
+ ArithmeticOperation(
227
+ expression=Expression(expr=str(expression)),
228
+ result_var=target_var.get_handle_binding(),
229
+ operation_kind=ArithmeticOperationKind.InplaceAdd,
230
+ source_ref=source_ref,
231
+ )
232
+ )
233
+
234
+
235
+ def inplace_xor(expression: SymbolicExpr, target_var: QScalar) -> None:
236
+ """
237
+ Bitwise-XOR a quantum variable with an arithmetic expression.
238
+
239
+ Equivalent to `<target_var> ^= <expression>`.
240
+
241
+ Args:
242
+ expression: A classical or quantum arithmetic expression
243
+ target_var: A scalar quantum variable
244
+ """
245
+ assert QCallable.CURRENT_EXPANDABLE is not None
246
+ source_ref = get_source_ref(sys._getframe(1))
247
+ QCallable.CURRENT_EXPANDABLE.append_statement_to_body(
248
+ ArithmeticOperation(
249
+ expression=Expression(expr=str(expression)),
250
+ result_var=target_var.get_handle_binding(),
251
+ operation_kind=ArithmeticOperationKind.InplaceXor,
252
+ source_ref=source_ref,
93
253
  )
94
254
  )
95
255
 
96
256
 
97
257
  def within_apply(
98
- compute: Callable[[], None],
99
- action: Callable[[], None],
258
+ within: Callable[[], None],
259
+ apply: Callable[[], None],
100
260
  ) -> None:
101
- compute_operator(compute)
102
- apply(action)
103
- uncompute(compute)
261
+ _validate_operand(within)
262
+ _validate_operand(apply)
263
+ assert QCallable.CURRENT_EXPANDABLE is not None
264
+ source_ref = get_source_ref(sys._getframe(1))
265
+ within_apply_stmt = WithinApply(
266
+ compute=_operand_to_body(within, "within"),
267
+ action=_operand_to_body(apply, "apply"),
268
+ source_ref=source_ref,
269
+ )
270
+ if is_generative_mode():
271
+ within_apply_stmt.set_generative_block("within", within)
272
+ within_apply_stmt.set_generative_block("apply", apply)
273
+ QCallable.CURRENT_EXPANDABLE.append_statement_to_body(within_apply_stmt)
274
+
275
+
276
+ def repeat(count: Union[SymbolicExpr, int], iteration: Callable[[int], None]) -> None:
277
+ _validate_operand(iteration)
278
+ assert QCallable.CURRENT_EXPANDABLE is not None
279
+ source_ref = get_source_ref(sys._getframe(1))
280
+ iteration_operand = prepare_arg(
281
+ QuantumOperandDeclaration(
282
+ name=REPEAT_OPERATOR_NAME,
283
+ positional_arg_declarations=[
284
+ ClassicalParameterDeclaration(name="index", classical_type=Integer()),
285
+ ],
286
+ ),
287
+ iteration,
288
+ repeat.__name__,
289
+ "iteration",
290
+ )
291
+ if not isinstance(iteration_operand, QuantumLambdaFunction):
292
+ raise ClassiqValueError(
293
+ "Argument 'iteration' to 'repeat' should be a callable that takes one integer argument."
294
+ )
295
+
296
+ repeat_stmt = Repeat(
297
+ iter_var=inspect.getfullargspec(iteration).args[0],
298
+ count=Expression(expr=str(count)),
299
+ body=iteration_operand.body,
300
+ source_ref=source_ref,
301
+ )
302
+ if is_generative_mode():
303
+ repeat_stmt.set_generative_block("body", iteration)
304
+ QCallable.CURRENT_EXPANDABLE.append_statement_to_body(repeat_stmt)
305
+
306
+
307
+ def power(
308
+ exponent: Union[SymbolicExpr, int],
309
+ stmt_block: Union[QCallable, Callable[[], None]],
310
+ ) -> None:
311
+ _validate_operand(stmt_block)
312
+ assert QCallable.CURRENT_EXPANDABLE is not None
313
+ source_ref = get_source_ref(sys._getframe(1))
314
+ power_stmt = Power(
315
+ power=Expression(expr=str(exponent)),
316
+ body=_operand_to_body(stmt_block, "stmt_block"),
317
+ source_ref=source_ref,
318
+ )
319
+ if is_generative_mode():
320
+ power_stmt.set_generative_block("body", stmt_block)
321
+ QCallable.CURRENT_EXPANDABLE.append_statement_to_body(power_stmt)
322
+
323
+
324
+ def invert(stmt_block: Union[QCallable, Callable[[], None]]) -> None:
325
+ _validate_operand(stmt_block)
326
+ assert QCallable.CURRENT_EXPANDABLE is not None
327
+ source_ref = get_source_ref(sys._getframe(1))
328
+ invert_stmt = Invert(
329
+ body=_operand_to_body(stmt_block, "stmt_block"), source_ref=source_ref
330
+ )
331
+ if is_generative_mode():
332
+ invert_stmt.set_generative_block("body", stmt_block)
333
+ QCallable.CURRENT_EXPANDABLE.append_statement_to_body(invert_stmt)
334
+
335
+
336
+ def phase(expr: SymbolicExpr, theta: float = 1.0) -> None:
337
+ assert QCallable.CURRENT_EXPANDABLE is not None
338
+ source_ref = get_source_ref(sys._getframe(1))
339
+ QCallable.CURRENT_EXPANDABLE.append_statement_to_body(
340
+ PhaseOperation(
341
+ expression=Expression(expr=str(expr)),
342
+ theta=Expression(expr=str(theta)),
343
+ source_ref=source_ref,
344
+ )
345
+ )
346
+
347
+
348
+ def _validate_operand(stmt_block: Any) -> None:
349
+ if stmt_block is not None:
350
+ return
351
+ currentframe: FrameType = inspect.currentframe() # type: ignore[assignment]
352
+ operation_frame: FrameType = currentframe.f_back # type: ignore[assignment]
353
+ operation_frame_info: inspect.Traceback = inspect.getframeinfo(operation_frame)
354
+ operation_name: str = operation_frame_info.function
355
+
356
+ context = operation_frame_info.code_context
357
+ assert context is not None
358
+ operand_arg_name = context[0].split("_validate_operand(")[1].split(")")[0]
359
+
360
+ error_message = (
361
+ f"{operation_name!r} is missing required argument for {operand_arg_name!r}."
362
+ )
363
+ error_message += _get_operand_hint(
364
+ operation_name=operation_name,
365
+ operand_arg_name=operand_arg_name,
366
+ params=inspect.signature(operation_frame.f_globals[operation_name]).parameters,
367
+ )
368
+ raise ClassiqValueError(error_message)
369
+
370
+
371
+ def _get_operand_hint_args(
372
+ params: Mapping[str, inspect.Parameter], operand_arg_name: str, operand_value: str
373
+ ) -> str:
374
+ return ", ".join(
375
+ [
376
+ (
377
+ f"{param.name}={operand_value}"
378
+ if param.name == operand_arg_name
379
+ else f"{param.name}=..."
380
+ )
381
+ for param in params.values()
382
+ if param.name != "operand" # FIXME: Remove compatibility (CAD-21932)
383
+ ]
384
+ )
385
+
386
+
387
+ def _get_operand_hint(
388
+ operation_name: str, operand_arg_name: str, params: Mapping[str, inspect.Parameter]
389
+ ) -> str:
390
+ return (
391
+ f"\nHint: To call a function under {operation_name!r} use a lambda function as in "
392
+ f"'{operation_name}({_get_operand_hint_args(params, operand_arg_name, 'lambda: f(q)')})' "
393
+ f"or pass the quantum function directly as in "
394
+ f"'{operation_name}({_get_operand_hint_args(params, operand_arg_name, 'f')})'."
395
+ )
396
+
397
+
398
+ def _operand_to_body(
399
+ callable_: Union[QCallable, Callable[[], None]], param_name: str
400
+ ) -> StatementBlock:
401
+ op_name = sys._getframe(1).f_code.co_name
402
+ if (
403
+ isinstance(callable_, QCallable)
404
+ and len(callable_.func_decl.positional_arg_declarations) > 0
405
+ ):
406
+ raise ClassiqValueError(
407
+ f"Callable argument {callable_.func_decl.name!r} to {op_name!r} should "
408
+ f"not accept arguments."
409
+ )
410
+ to_operand = prepare_arg(
411
+ QuantumOperandDeclaration(name=""), callable_, op_name, param_name
412
+ )
413
+ if isinstance(to_operand, str):
414
+ return [QuantumFunctionCall(function=to_operand)]
415
+ elif isinstance(to_operand, QuantumLambdaFunction):
416
+ return to_operand.body
417
+ else:
418
+ raise ValueError(f"Unexpected operand type: {type(to_operand)}")
104
419
 
105
420
 
106
421
  __all__ = [
422
+ "allocate",
423
+ "assign",
424
+ "assign_amplitude",
107
425
  "bind",
108
- "quantum_if",
109
- "reinterpret_num",
426
+ "control",
427
+ "if_",
110
428
  "inplace_add",
111
429
  "inplace_xor",
430
+ "invert",
431
+ "phase",
432
+ "power",
433
+ "repeat",
112
434
  "within_apply",
113
435
  ]
114
436
 
115
437
 
116
- def __dir__() -> List[str]:
438
+ def __dir__() -> list[str]:
117
439
  return __all__