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
@@ -0,0 +1,128 @@
1
+ from collections.abc import Sequence
2
+ from typing import Union
3
+
4
+ from classiq.interface.generator.functions.type_name import TypeName
5
+ from classiq.interface.generator.types.enum_declaration import EnumDeclaration
6
+ from classiq.interface.generator.types.qstruct_declaration import QStructDeclaration
7
+ from classiq.interface.generator.types.struct_declaration import StructDeclaration
8
+ from classiq.interface.model.quantum_type import QuantumBitvector
9
+
10
+ from classiq.qmod.builtins.enums import BUILTIN_ENUM_DECLARATIONS
11
+ from classiq.qmod.builtins.structs import BUILTIN_STRUCT_DECLARATIONS
12
+ from classiq.qmod.model_state_container import QMODULE
13
+ from classiq.qmod.semantics.error_manager import ErrorManager
14
+
15
+
16
+ def check_duplicate_types(
17
+ types: Sequence[Union[EnumDeclaration, StructDeclaration, QStructDeclaration]]
18
+ ) -> None:
19
+ known_types = {type_.name for type_ in BUILTIN_ENUM_DECLARATIONS.values()}
20
+ known_types |= {type_.name for type_ in BUILTIN_STRUCT_DECLARATIONS.values()}
21
+ for type_ in types:
22
+ if type_.name in known_types:
23
+ with ErrorManager().node_context(type_):
24
+ ErrorManager().add_error(f"Type {type_.name!r} already exists")
25
+ else:
26
+ known_types.add(type_.name)
27
+
28
+
29
+ def check_qstruct_flexibility(qstruct: QStructDeclaration) -> None:
30
+ _check_qstruct_no_array_without_size_and_element_size(qstruct)
31
+ _check_qstruct_at_most_one_type_without_size(qstruct)
32
+
33
+
34
+ def _check_qstruct_no_array_without_size_and_element_size(
35
+ qstruct: QStructDeclaration,
36
+ ) -> None:
37
+ offending_array_fields = [
38
+ field_name
39
+ for field_name, field_type in qstruct.fields.items()
40
+ if isinstance(field_type, QuantumBitvector)
41
+ and not field_type.has_length
42
+ and not field_type.element_type.has_size_in_bits
43
+ ]
44
+ if len(offending_array_fields) > 0:
45
+ with ErrorManager().node_context(qstruct):
46
+ ErrorManager().add_error(
47
+ f"Quantum struct {qstruct.name} contains arrays whose neither length "
48
+ f"nor element size are constants. Offending fields: "
49
+ f"{', '.join(offending_array_fields)}"
50
+ )
51
+
52
+
53
+ def _check_qstruct_at_most_one_type_without_size(qstruct: QStructDeclaration) -> None:
54
+ fields_without_size = [
55
+ field_name
56
+ for field_name, field_type in qstruct.fields.items()
57
+ if not field_type.has_size_in_bits
58
+ ]
59
+ if len(fields_without_size) > 1:
60
+ with ErrorManager().node_context(qstruct):
61
+ ErrorManager().add_error(
62
+ f"Quantum struct {qstruct.name} has more than one field whose size is "
63
+ f"not constant. Offending fields: {', '.join(fields_without_size)}"
64
+ )
65
+
66
+
67
+ def check_qstruct_fields_are_defined(qstruct: QStructDeclaration) -> bool:
68
+ all_defined = True
69
+ for field_type in qstruct.fields.values():
70
+ if (
71
+ isinstance(field_type, TypeName)
72
+ and field_type.name not in QMODULE.qstruct_decls
73
+ ):
74
+ with ErrorManager().node_context(field_type):
75
+ ErrorManager().add_error(
76
+ f"Quantum struct {field_type.name!r} is not defined."
77
+ )
78
+ all_defined = False
79
+ return all_defined
80
+
81
+
82
+ def check_qstruct_has_fields(qstruct: QStructDeclaration) -> None:
83
+ if len(qstruct.fields) == 0:
84
+ with ErrorManager().node_context(qstruct):
85
+ ErrorManager().add_error(
86
+ f"Quantum struct {qstruct.name!r} must have at least one field."
87
+ )
88
+
89
+
90
+ def check_cstruct_has_fields(cstruct: StructDeclaration) -> None:
91
+ if len(cstruct.variables) == 0:
92
+ with ErrorManager().node_context(cstruct):
93
+ ErrorManager().add_error(
94
+ f"Classical struct {cstruct.name!r} must have at least one field."
95
+ )
96
+
97
+
98
+ def check_qstruct_is_not_recursive(qstruct: QStructDeclaration) -> bool:
99
+ non_recursive = True
100
+ for main_field_name, main_field in qstruct.fields.items():
101
+ if (
102
+ not isinstance(main_field, TypeName)
103
+ or main_field.name not in QMODULE.qstruct_decls
104
+ ):
105
+ continue
106
+ main_field_qstruct = QMODULE.qstruct_decls[main_field.name]
107
+ seen_qstructs = {qstruct.name}
108
+ stack = [main_field_qstruct]
109
+ while stack:
110
+ qstruct = stack.pop()
111
+ if qstruct.name in seen_qstructs:
112
+ with ErrorManager().node_context(qstruct):
113
+ ErrorManager().add_error(
114
+ f"Declaration of field {main_field_name!r} in quantum struct "
115
+ f"{qstruct.name!r} creates a recursive definition."
116
+ )
117
+ non_recursive = False
118
+ break
119
+ seen_qstructs.add(qstruct.name)
120
+ stack.extend(
121
+ [
122
+ QMODULE.qstruct_decls[field.name]
123
+ for field in qstruct.fields.values()
124
+ if isinstance(field, TypeName)
125
+ and field.name in QMODULE.qstruct_decls
126
+ ]
127
+ )
128
+ return non_recursive
classiq/qmod/symbolic.py CHANGED
@@ -1,34 +1,47 @@
1
1
  import sys
2
- from typing import Optional, Tuple, Type, get_args, get_origin, overload
2
+ from typing import (
3
+ TYPE_CHECKING,
4
+ Any,
5
+ Optional,
6
+ TypeVar,
7
+ Union,
8
+ overload,
9
+ )
10
+
11
+ from classiq.interface.exceptions import ClassiqValueError
3
12
 
4
- from classiq.exceptions import ClassiqValueError
5
13
  from classiq.qmod import model_state_container
6
14
  from classiq.qmod.declaration_inferrer import python_type_to_qmod
7
- from classiq.qmod.qmod_parameter import QParam, QParamScalar, create_param
15
+ from classiq.qmod.qmod_parameter import (
16
+ CArray,
17
+ CParam,
18
+ CParamScalar,
19
+ CReal,
20
+ create_param,
21
+ )
22
+ from classiq.qmod.qmod_variable import QNum
8
23
  from classiq.qmod.symbolic_expr import SymbolicExpr
9
24
  from classiq.qmod.symbolic_type import SymbolicTypes
10
25
 
11
- pi = SymbolicExpr("pi")
12
- E = SymbolicExpr("E")
13
- I = SymbolicExpr("I") # noqa: E741
14
- GoldenRatio = SymbolicExpr("GoldenRatio")
15
- EulerGamma = SymbolicExpr("EulerGamma")
16
- Catalan = SymbolicExpr("Catalan")
26
+ pi = SymbolicExpr("pi", False)
27
+ E = SymbolicExpr("E", False)
28
+ I = SymbolicExpr("I", False) # noqa: E741
29
+ GoldenRatio = SymbolicExpr("GoldenRatio", False)
30
+ EulerGamma = SymbolicExpr("EulerGamma", False)
31
+ Catalan = SymbolicExpr("Catalan", False)
32
+
33
+ T = TypeVar("T", bound=CParam)
17
34
 
18
35
 
19
36
  @overload
20
- def symbolic_function(
21
- *args: SymbolicTypes, return_type: None = None
22
- ) -> QParamScalar: ...
37
+ def symbolic_function(*args: Any, return_type: None = None) -> CParamScalar: ...
23
38
 
24
39
 
25
40
  @overload
26
- def symbolic_function(*args: SymbolicTypes, return_type: Type[QParam]) -> QParam: ...
41
+ def symbolic_function(*args: Any, return_type: type[T]) -> T: ...
27
42
 
28
43
 
29
- def symbolic_function(
30
- *args: SymbolicTypes, return_type: Optional[Type[QParam]] = None
31
- ) -> QParam:
44
+ def symbolic_function(*args: Any, return_type: Optional[type[T]] = None) -> CParam:
32
45
  qmodule = (
33
46
  model_state_container.QMODULE
34
47
  ) # FIXME: https://classiq.atlassian.net/browse/CAD-15126
@@ -36,14 +49,12 @@ def symbolic_function(
36
49
  expr = f"{sys._getframe(1).f_code.co_name}({','.join(str_args)})"
37
50
 
38
51
  if return_type is None:
39
- return QParamScalar(expr)
52
+ return CParamScalar(expr)
40
53
 
41
- if get_origin(return_type) is not QParam:
42
- raise ClassiqValueError(
43
- f"Unsupported return type for symbolic function: {return_type}"
44
- )
54
+ if TYPE_CHECKING:
55
+ assert return_type is not None
45
56
 
46
- qmod_type = python_type_to_qmod(get_args(return_type)[0], qmodule=qmodule)
57
+ qmod_type = python_type_to_qmod(return_type, qmodule=qmodule)
47
58
  if qmod_type is None:
48
59
  raise ClassiqValueError(
49
60
  f"Unsupported return type for symbolic function: {return_type}"
@@ -56,211 +67,211 @@ def symbolic_function(
56
67
  )
57
68
 
58
69
 
59
- def sin(x: SymbolicTypes) -> QParamScalar:
70
+ def sin(x: SymbolicTypes) -> CParamScalar:
60
71
  return symbolic_function(x)
61
72
 
62
73
 
63
- def cos(x: SymbolicTypes) -> QParamScalar:
74
+ def cos(x: SymbolicTypes) -> CParamScalar:
64
75
  return symbolic_function(x)
65
76
 
66
77
 
67
- def tan(x: SymbolicTypes) -> QParamScalar:
78
+ def tan(x: SymbolicTypes) -> CParamScalar:
68
79
  return symbolic_function(x)
69
80
 
70
81
 
71
- def cot(x: SymbolicTypes) -> QParamScalar:
82
+ def cot(x: SymbolicTypes) -> CParamScalar:
72
83
  return symbolic_function(x)
73
84
 
74
85
 
75
- def sec(x: SymbolicTypes) -> QParamScalar:
86
+ def sec(x: SymbolicTypes) -> CParamScalar:
76
87
  return symbolic_function(x)
77
88
 
78
89
 
79
- def csc(x: SymbolicTypes) -> QParamScalar:
90
+ def csc(x: SymbolicTypes) -> CParamScalar:
80
91
  return symbolic_function(x)
81
92
 
82
93
 
83
- def asin(x: SymbolicTypes) -> QParamScalar:
94
+ def asin(x: SymbolicTypes) -> CParamScalar:
84
95
  return symbolic_function(x)
85
96
 
86
97
 
87
- def acos(x: SymbolicTypes) -> QParamScalar:
98
+ def acos(x: SymbolicTypes) -> CParamScalar:
88
99
  return symbolic_function(x)
89
100
 
90
101
 
91
- def atan(x: SymbolicTypes) -> QParamScalar:
102
+ def atan(x: SymbolicTypes) -> CParamScalar:
92
103
  return symbolic_function(x)
93
104
 
94
105
 
95
- def acot(x: SymbolicTypes) -> QParamScalar:
106
+ def acot(x: SymbolicTypes) -> CParamScalar:
96
107
  return symbolic_function(x)
97
108
 
98
109
 
99
- def asec(x: SymbolicTypes) -> QParamScalar:
110
+ def asec(x: SymbolicTypes) -> CParamScalar:
100
111
  return symbolic_function(x)
101
112
 
102
113
 
103
- def acsc(x: SymbolicTypes) -> QParamScalar:
114
+ def acsc(x: SymbolicTypes) -> CParamScalar:
104
115
  return symbolic_function(x)
105
116
 
106
117
 
107
- def sinh(x: SymbolicTypes) -> QParamScalar:
118
+ def sinh(x: SymbolicTypes) -> CParamScalar:
108
119
  return symbolic_function(x)
109
120
 
110
121
 
111
- def cosh(x: SymbolicTypes) -> QParamScalar:
122
+ def cosh(x: SymbolicTypes) -> CParamScalar:
112
123
  return symbolic_function(x)
113
124
 
114
125
 
115
- def tanh(x: SymbolicTypes) -> QParamScalar:
126
+ def tanh(x: SymbolicTypes) -> CParamScalar:
116
127
  return symbolic_function(x)
117
128
 
118
129
 
119
- def coth(x: SymbolicTypes) -> QParamScalar:
130
+ def coth(x: SymbolicTypes) -> CParamScalar:
120
131
  return symbolic_function(x)
121
132
 
122
133
 
123
- def sech(x: SymbolicTypes) -> QParamScalar:
134
+ def sech(x: SymbolicTypes) -> CParamScalar:
124
135
  return symbolic_function(x)
125
136
 
126
137
 
127
- def csch(x: SymbolicTypes) -> QParamScalar:
138
+ def csch(x: SymbolicTypes) -> CParamScalar:
128
139
  return symbolic_function(x)
129
140
 
130
141
 
131
- def asinh(x: SymbolicTypes) -> QParamScalar:
142
+ def asinh(x: SymbolicTypes) -> CParamScalar:
132
143
  return symbolic_function(x)
133
144
 
134
145
 
135
- def acosh(x: SymbolicTypes) -> QParamScalar:
146
+ def acosh(x: SymbolicTypes) -> CParamScalar:
136
147
  return symbolic_function(x)
137
148
 
138
149
 
139
- def atanh(x: SymbolicTypes) -> QParamScalar:
150
+ def atanh(x: SymbolicTypes) -> CParamScalar:
140
151
  return symbolic_function(x)
141
152
 
142
153
 
143
- def acoth(x: SymbolicTypes) -> QParamScalar:
154
+ def acoth(x: SymbolicTypes) -> CParamScalar:
144
155
  return symbolic_function(x)
145
156
 
146
157
 
147
- def asech(x: SymbolicTypes) -> QParamScalar:
158
+ def asech(x: SymbolicTypes) -> CParamScalar:
148
159
  return symbolic_function(x)
149
160
 
150
161
 
151
- def exp(x: SymbolicTypes) -> QParamScalar:
162
+ def exp(x: SymbolicTypes) -> CParamScalar:
152
163
  return symbolic_function(x)
153
164
 
154
165
 
155
- def log(x: SymbolicTypes, base: SymbolicTypes = E) -> QParamScalar:
166
+ def log(x: SymbolicTypes, base: SymbolicTypes = E) -> CParamScalar:
156
167
  return symbolic_function(x, base)
157
168
 
158
169
 
159
- def ln(x: SymbolicTypes) -> QParamScalar:
170
+ def ln(x: SymbolicTypes) -> CParamScalar:
160
171
  return symbolic_function(x)
161
172
 
162
173
 
163
- def sqrt(x: SymbolicTypes) -> QParamScalar:
174
+ def sqrt(x: SymbolicTypes) -> CParamScalar:
164
175
  return symbolic_function(x)
165
176
 
166
177
 
167
- def abs(x: SymbolicTypes) -> QParamScalar:
178
+ def abs(x: SymbolicTypes) -> CParamScalar:
168
179
  return symbolic_function(x)
169
180
 
170
181
 
171
- def floor(x: SymbolicTypes) -> QParamScalar:
182
+ def floor(x: SymbolicTypes) -> CParamScalar:
172
183
  return symbolic_function(x)
173
184
 
174
185
 
175
- def ceiling(x: SymbolicTypes) -> QParamScalar:
186
+ def ceiling(x: SymbolicTypes) -> CParamScalar:
176
187
  return symbolic_function(x)
177
188
 
178
189
 
179
- def erf(x: SymbolicTypes) -> QParamScalar:
190
+ def erf(x: SymbolicTypes) -> CParamScalar:
180
191
  return symbolic_function(x)
181
192
 
182
193
 
183
- def erfc(x: SymbolicTypes) -> QParamScalar:
194
+ def erfc(x: SymbolicTypes) -> CParamScalar:
184
195
  return symbolic_function(x)
185
196
 
186
197
 
187
- def gamma(x: SymbolicTypes) -> QParamScalar:
198
+ def gamma(x: SymbolicTypes) -> CParamScalar:
188
199
  return symbolic_function(x)
189
200
 
190
201
 
191
- def beta(x: SymbolicTypes) -> QParamScalar:
202
+ def beta(x: SymbolicTypes) -> CParamScalar:
192
203
  return symbolic_function(x)
193
204
 
194
205
 
195
- def besselj(x: SymbolicTypes) -> QParamScalar:
206
+ def besselj(x: SymbolicTypes) -> CParamScalar:
196
207
  return symbolic_function(x)
197
208
 
198
209
 
199
- def bessely(x: SymbolicTypes) -> QParamScalar:
210
+ def bessely(x: SymbolicTypes) -> CParamScalar:
200
211
  return symbolic_function(x)
201
212
 
202
213
 
203
- def besseli(x: SymbolicTypes) -> QParamScalar:
214
+ def besseli(x: SymbolicTypes) -> CParamScalar:
204
215
  return symbolic_function(x)
205
216
 
206
217
 
207
- def besselk(x: SymbolicTypes) -> QParamScalar:
218
+ def besselk(x: SymbolicTypes) -> CParamScalar:
208
219
  return symbolic_function(x)
209
220
 
210
221
 
211
- def dirichlet_eta(x: SymbolicTypes) -> QParamScalar:
222
+ def dirichlet_eta(x: SymbolicTypes) -> CParamScalar:
212
223
  return symbolic_function(x)
213
224
 
214
225
 
215
- def polygamma(x: SymbolicTypes) -> QParamScalar:
226
+ def polygamma(x: SymbolicTypes) -> CParamScalar:
216
227
  return symbolic_function(x)
217
228
 
218
229
 
219
- def loggamma(x: SymbolicTypes) -> QParamScalar:
230
+ def loggamma(x: SymbolicTypes) -> CParamScalar:
220
231
  return symbolic_function(x)
221
232
 
222
233
 
223
- def factorial(x: SymbolicTypes) -> QParamScalar:
234
+ def factorial(x: SymbolicTypes) -> CParamScalar:
224
235
  return symbolic_function(x)
225
236
 
226
237
 
227
- def binomial(x: SymbolicTypes) -> QParamScalar:
238
+ def binomial(x: SymbolicTypes) -> CParamScalar:
228
239
  return symbolic_function(x)
229
240
 
230
241
 
231
- def subfactorial(x: SymbolicTypes) -> QParamScalar:
242
+ def subfactorial(x: SymbolicTypes) -> CParamScalar:
232
243
  return symbolic_function(x)
233
244
 
234
245
 
235
- def primorial(x: SymbolicTypes) -> QParamScalar:
246
+ def primorial(x: SymbolicTypes) -> CParamScalar:
236
247
  return symbolic_function(x)
237
248
 
238
249
 
239
- def bell(x: SymbolicTypes) -> QParamScalar:
250
+ def bell(x: SymbolicTypes) -> CParamScalar:
240
251
  return symbolic_function(x)
241
252
 
242
253
 
243
- def bernoulli(x: SymbolicTypes) -> QParamScalar:
254
+ def bernoulli(x: SymbolicTypes) -> CParamScalar:
244
255
  return symbolic_function(x)
245
256
 
246
257
 
247
- def euler(x: SymbolicTypes) -> QParamScalar:
258
+ def euler(x: SymbolicTypes) -> CParamScalar:
248
259
  return symbolic_function(x)
249
260
 
250
261
 
251
- def catalan(x: SymbolicTypes) -> QParamScalar:
262
+ def catalan(x: SymbolicTypes) -> CParamScalar:
252
263
  return symbolic_function(x)
253
264
 
254
265
 
255
- def Piecewise(*args: Tuple[SymbolicTypes, SymbolicTypes]) -> QParamScalar: # noqa: N802
266
+ def Piecewise(*args: tuple[SymbolicTypes, SymbolicTypes]) -> CParamScalar: # noqa: N802
256
267
  return symbolic_function(*args)
257
268
 
258
269
 
259
- def max(x: SymbolicTypes, y: SymbolicTypes) -> QParamScalar:
270
+ def max(x: SymbolicTypes, y: SymbolicTypes) -> CParamScalar:
260
271
  return symbolic_function(x, y)
261
272
 
262
273
 
263
- def min(x: SymbolicTypes, y: SymbolicTypes) -> QParamScalar:
274
+ def min(x: SymbolicTypes, y: SymbolicTypes) -> CParamScalar:
264
275
  return symbolic_function(x, y)
265
276
 
266
277
 
@@ -276,75 +287,88 @@ def logical_not(x: SymbolicTypes) -> SymbolicExpr:
276
287
  return SymbolicExpr._unary_op(x, "not")
277
288
 
278
289
 
279
- def mod_inverse(a: SymbolicTypes, m: SymbolicTypes) -> QParamScalar:
290
+ def mod_inverse(a: SymbolicTypes, m: SymbolicTypes) -> CParamScalar:
280
291
  return symbolic_function(a, m)
281
292
 
282
293
 
294
+ def sum(arr: SymbolicTypes) -> CParamScalar:
295
+ return symbolic_function(arr)
296
+
297
+
298
+ def subscript(
299
+ amplitudes: Union[list[float], list[CReal], list[CParamScalar], CArray[CReal]],
300
+ index: QNum,
301
+ ) -> CParamScalar:
302
+ return CParamScalar(expr=f"{amplitudes}[{index}]")
303
+
304
+
283
305
  __all__ = [
284
- "pi",
306
+ "Catalan",
285
307
  "E",
286
- "I",
287
- "GoldenRatio",
288
308
  "EulerGamma",
289
- "Catalan",
290
- "sin",
291
- "cos",
292
- "tan",
293
- "cot",
294
- "sec",
295
- "csc",
296
- "asin",
309
+ "GoldenRatio",
310
+ "I",
311
+ "Piecewise",
312
+ "abs",
297
313
  "acos",
298
- "atan",
314
+ "acosh",
299
315
  "acot",
300
- "asec",
316
+ "acoth",
301
317
  "acsc",
302
- "sinh",
303
- "cosh",
304
- "tanh",
305
- "coth",
306
- "sech",
307
- "csch",
318
+ "asec",
319
+ "asech",
320
+ "asin",
308
321
  "asinh",
309
- "acosh",
322
+ "atan",
310
323
  "atanh",
311
- "acoth",
312
- "asech",
313
- "exp",
314
- "log",
315
- "ln",
316
- "sqrt",
317
- "abs",
318
- "floor",
324
+ "bell",
325
+ "bernoulli",
326
+ "besseli",
327
+ "besselj",
328
+ "besselk",
329
+ "bessely",
330
+ "beta",
331
+ "binomial",
332
+ "catalan",
319
333
  "ceiling",
334
+ "cos",
335
+ "cosh",
336
+ "cot",
337
+ "coth",
338
+ "csc",
339
+ "csch",
340
+ "dirichlet_eta",
320
341
  "erf",
321
342
  "erfc",
343
+ "euler",
344
+ "exp",
345
+ "factorial",
346
+ "floor",
322
347
  "gamma",
323
- "beta",
324
- "besselj",
325
- "bessely",
326
- "besseli",
327
- "besselk",
328
- "dirichlet_eta",
329
- "polygamma",
348
+ "ln",
349
+ "log",
330
350
  "loggamma",
331
- "factorial",
332
- "binomial",
333
- "subfactorial",
334
- "primorial",
335
- "bell",
336
- "bernoulli",
337
- "euler",
338
- "catalan",
339
- "Piecewise",
340
- "max",
341
- "min",
342
351
  "logical_and",
343
- "logical_or",
344
352
  "logical_not",
353
+ "logical_or",
354
+ "max",
355
+ "min",
345
356
  "mod_inverse",
357
+ "pi",
358
+ "polygamma",
359
+ "primorial",
360
+ "sec",
361
+ "sech",
362
+ "sin",
363
+ "sinh",
364
+ "sqrt",
365
+ "subfactorial",
366
+ "subscript",
367
+ "sum",
368
+ "tan",
369
+ "tanh",
346
370
  ]
347
371
 
348
372
 
349
- def __dir__():
373
+ def __dir__() -> list[str]:
350
374
  return __all__
@@ -1,18 +1,22 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import ast
4
+ from enum import Enum as PythonEnum
4
5
  from typing import Any
5
6
 
7
+ from classiq.qmod.utilities import qmod_val_to_expr_str
8
+
6
9
 
7
10
  class Symbolic:
8
- def __init__(self, expr: str) -> None:
11
+ def __init__(self, expr: str, is_quantum: bool) -> None:
9
12
  self._expr = expr
13
+ self.is_quantum = is_quantum
10
14
 
11
15
  def __str__(self) -> str:
12
16
  return self._expr
13
17
 
14
18
  def __repr__(self) -> str:
15
- return self._expr
19
+ return self.__str__()
16
20
 
17
21
  def __bool__(self) -> bool:
18
22
  try:
@@ -24,28 +28,39 @@ class Symbolic:
24
28
 
25
29
 
26
30
  class SymbolicExpr(Symbolic):
27
- def __init__(self, expr: str) -> None:
28
- super().__init__(expr)
31
+ def __init__(self, expr: str, is_quantum: bool) -> None:
32
+ super().__init__(expr, is_quantum)
29
33
 
30
34
  @staticmethod
31
35
  def _binary_op(lhs: Any, rhs: Any, op: str) -> SymbolicExpr:
32
- if not isinstance(lhs, (SymbolicExpr, int, float, bool)):
36
+ if not isinstance(lhs, (SymbolicExpr, int, float, bool, PythonEnum)):
33
37
  raise TypeError(f"Invalid lhs argument {lhs!r} for binary operation {op!r}")
34
38
 
35
- if not isinstance(rhs, (SymbolicExpr, int, float, bool)):
39
+ if not isinstance(rhs, (SymbolicExpr, int, float, bool, PythonEnum)):
36
40
  raise TypeError(f"Invalid lhs argument {rhs!r} for binary operation {op!r}")
37
41
 
38
- lhs_str = str(lhs) if isinstance(lhs, (int, float, bool)) else f"({lhs})"
39
- rhs_str = str(rhs) if isinstance(rhs, (int, float, bool)) else f"({rhs})"
42
+ lhs_str = qmod_val_to_expr_str(lhs)
43
+ if not isinstance(lhs, (int, float, bool, PythonEnum)):
44
+ lhs_str = f"({lhs_str})"
45
+ rhs_str = qmod_val_to_expr_str(rhs)
46
+ if not isinstance(rhs, (int, float, bool, PythonEnum)):
47
+ rhs_str = f"({rhs_str})"
40
48
 
41
- return SymbolicExpr(f"{lhs_str} {op} {rhs_str}")
49
+ lhs_is_quantum = isinstance(lhs, SymbolicExpr) and lhs.is_quantum
50
+ rhs_is_quantum = isinstance(rhs, SymbolicExpr) and rhs.is_quantum
51
+
52
+ return SymbolicExpr(
53
+ f"{lhs_str} {op} {rhs_str}", lhs_is_quantum or rhs_is_quantum
54
+ )
42
55
 
43
56
  @staticmethod
44
57
  def _unary_op(arg: Any, op: str) -> SymbolicExpr:
45
58
  if not isinstance(arg, (SymbolicExpr, int, float, bool)):
46
59
  raise TypeError(f"Invalid argument {arg!r} for unary operation {op!r}")
47
60
 
48
- return SymbolicExpr(f"{op}({arg})")
61
+ arg_is_quantum = isinstance(arg, SymbolicExpr) and arg.is_quantum
62
+
63
+ return SymbolicExpr(f"{op}({arg})", arg_is_quantum)
49
64
 
50
65
  def __add__(self, other: Any) -> SymbolicExpr:
51
66
  return SymbolicExpr._binary_op(self, other, "+")
@@ -152,7 +167,7 @@ class SymbolicExpr(Symbolic):
152
167
 
153
168
  class SymbolicEquality(SymbolicExpr):
154
169
  def __init__(self, lhs: Any, rhs: Any) -> None:
155
- expr = SymbolicExpr._binary_op(lhs, rhs, "==")._expr
156
- super().__init__(expr)
170
+ sym_expr = SymbolicExpr._binary_op(lhs, rhs, "==")
171
+ super().__init__(sym_expr._expr, sym_expr.is_quantum)
157
172
  self.lhs = lhs
158
173
  self.rhs = rhs