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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. classiq/__init__.py +47 -32
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +2 -1
  3. classiq/_internals/api_wrapper.py +235 -97
  4. classiq/_internals/async_utils.py +1 -3
  5. classiq/_internals/authentication/auth0.py +26 -10
  6. classiq/_internals/authentication/authentication.py +11 -0
  7. classiq/_internals/authentication/device.py +10 -5
  8. classiq/_internals/authentication/password_manager.py +18 -6
  9. classiq/_internals/authentication/token_manager.py +10 -5
  10. classiq/_internals/client.py +94 -33
  11. classiq/_internals/config.py +3 -4
  12. classiq/_internals/host_checker.py +38 -15
  13. classiq/_internals/jobs.py +60 -57
  14. classiq/_internals/type_validation.py +9 -9
  15. classiq/analyzer/__init__.py +1 -3
  16. classiq/analyzer/analyzer.py +24 -19
  17. classiq/analyzer/analyzer_utilities.py +10 -10
  18. classiq/analyzer/rb.py +15 -15
  19. classiq/analyzer/show_interactive_hack.py +27 -4
  20. classiq/analyzer/url_utils.py +2 -3
  21. classiq/applications/__init__.py +3 -12
  22. classiq/applications/chemistry/__init__.py +14 -10
  23. classiq/applications/chemistry/ansatz_parameters.py +4 -4
  24. classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +165 -158
  25. classiq/applications/chemistry/ground_state_problem.py +1 -1
  26. classiq/{applications_model_constructors → applications}/combinatorial_helpers/allowed_constraints.py +4 -1
  27. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/arithmetic_expression.py +1 -1
  28. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/isolation.py +1 -1
  29. classiq/{applications_model_constructors → applications}/combinatorial_helpers/combinatorial_problem_utils.py +51 -15
  30. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_mapping.py +12 -12
  31. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_utils.py +8 -6
  32. classiq/{applications_model_constructors → applications}/combinatorial_helpers/memory.py +7 -11
  33. classiq/{applications_model_constructors → applications}/combinatorial_helpers/optimization_model.py +67 -40
  34. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
  35. classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
  36. classiq/{applications_model_constructors → applications}/combinatorial_helpers/sympy_utils.py +2 -2
  37. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/encoding.py +15 -20
  38. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/fixed_variables.py +14 -15
  39. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/ising_converter.py +11 -15
  40. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty.py +1 -2
  41. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty_support.py +3 -7
  42. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/sign_seperation.py +2 -3
  43. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/slack_variables.py +5 -8
  44. classiq/applications/combinatorial_optimization/__init__.py +20 -6
  45. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
  46. classiq/{applications_model_constructors → applications/combinatorial_optimization}/combinatorial_optimization_model_constructor.py +35 -33
  47. classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
  48. classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
  49. classiq/applications/finance/__init__.py +4 -5
  50. classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +48 -42
  51. classiq/applications/grover/__init__.py +9 -0
  52. classiq/{applications_model_constructors → applications/grover}/grover_model_constructor.py +52 -51
  53. classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
  54. classiq/applications/libraries/qmci_library.py +22 -0
  55. classiq/applications/qnn/__init__.py +2 -4
  56. classiq/applications/qnn/circuit_utils.py +6 -6
  57. classiq/applications/qnn/datasets/__init__.py +9 -11
  58. classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
  59. classiq/applications/qnn/datasets/dataset_not.py +2 -1
  60. classiq/applications/qnn/datasets/dataset_parity.py +2 -2
  61. classiq/applications/qnn/gradients/quantum_gradient.py +1 -1
  62. classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
  63. classiq/applications/qnn/qlayer.py +30 -10
  64. classiq/applications/qnn/torch_utils.py +4 -3
  65. classiq/applications/qnn/types.py +5 -5
  66. classiq/applications/qsvm/__init__.py +6 -4
  67. classiq/applications/qsvm/qsvm.py +3 -6
  68. classiq/applications/qsvm/qsvm_data_generation.py +3 -3
  69. classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
  70. classiq/execution/__init__.py +8 -3
  71. classiq/execution/all_hardware_devices.py +11 -0
  72. classiq/execution/execution_session.py +400 -0
  73. classiq/execution/iqcc.py +63 -0
  74. classiq/execution/jobs.py +197 -25
  75. classiq/execution/qnn.py +79 -0
  76. classiq/executor.py +20 -115
  77. classiq/interface/_version.py +1 -1
  78. classiq/interface/analyzer/analysis_params.py +43 -13
  79. classiq/interface/analyzer/cytoscape_graph.py +15 -9
  80. classiq/interface/analyzer/result.py +28 -32
  81. classiq/interface/applications/qsvm.py +20 -29
  82. classiq/interface/ast_node.py +16 -0
  83. classiq/interface/backend/backend_preferences.py +390 -121
  84. classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
  85. classiq/interface/backend/pydantic_backend.py +25 -22
  86. classiq/interface/backend/quantum_backend_providers.py +69 -16
  87. classiq/interface/chemistry/fermionic_operator.py +30 -21
  88. classiq/interface/chemistry/ground_state_problem.py +28 -25
  89. classiq/interface/chemistry/molecule.py +14 -10
  90. classiq/interface/chemistry/operator.py +64 -231
  91. classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
  92. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +1 -3
  93. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  94. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  95. classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
  96. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  97. classiq/interface/combinatorial_optimization/examples/set_cover.py +1 -2
  98. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +8 -9
  99. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  100. classiq/interface/combinatorial_optimization/result.py +1 -3
  101. classiq/interface/combinatorial_optimization/solver_types.py +1 -1
  102. classiq/interface/debug_info/debug_info.py +86 -0
  103. classiq/{exceptions.py → interface/exceptions.py} +37 -9
  104. classiq/interface/execution/iqcc.py +19 -0
  105. classiq/interface/execution/jobs.py +15 -12
  106. classiq/interface/execution/primitives.py +18 -0
  107. classiq/interface/executor/constants.py +1 -0
  108. classiq/interface/executor/execution_preferences.py +26 -114
  109. classiq/interface/executor/execution_request.py +24 -46
  110. classiq/interface/executor/execution_result.py +30 -8
  111. classiq/interface/executor/iqae_result.py +4 -6
  112. classiq/interface/executor/optimizer_preferences.py +17 -14
  113. classiq/interface/executor/quantum_code.py +28 -24
  114. classiq/interface/executor/quantum_instruction_set.py +2 -2
  115. classiq/interface/executor/register_initialization.py +11 -14
  116. classiq/interface/executor/result.py +83 -56
  117. classiq/interface/executor/vqe_result.py +10 -10
  118. classiq/interface/finance/function_input.py +35 -25
  119. classiq/interface/finance/gaussian_model_input.py +5 -5
  120. classiq/interface/finance/log_normal_model_input.py +4 -4
  121. classiq/interface/finance/model_input.py +4 -4
  122. classiq/interface/generator/adjacency.py +1 -3
  123. classiq/interface/generator/amplitude_loading.py +22 -12
  124. classiq/interface/generator/ansatz_library.py +5 -5
  125. classiq/interface/generator/application_apis/arithmetic_declarations.py +8 -5
  126. classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
  127. classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
  128. classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
  129. classiq/interface/generator/application_apis/finance_declarations.py +48 -69
  130. classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
  131. classiq/interface/generator/arith/argument_utils.py +46 -5
  132. classiq/interface/generator/arith/arithmetic.py +35 -16
  133. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +6 -7
  134. classiq/interface/generator/arith/arithmetic_expression_abc.py +66 -25
  135. classiq/interface/generator/arith/arithmetic_expression_parser.py +11 -11
  136. classiq/interface/generator/arith/arithmetic_expression_validator.py +47 -43
  137. classiq/interface/generator/arith/arithmetic_operations.py +14 -6
  138. classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
  139. classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
  140. classiq/interface/generator/arith/ast_node_rewrite.py +3 -2
  141. classiq/interface/generator/arith/binary_ops.py +218 -130
  142. classiq/interface/generator/arith/endianness.py +1 -1
  143. classiq/interface/generator/arith/extremum_operations.py +96 -25
  144. classiq/interface/generator/arith/logical_ops.py +14 -12
  145. classiq/interface/generator/arith/number_utils.py +12 -6
  146. classiq/interface/generator/arith/register_user_input.py +60 -37
  147. classiq/interface/generator/arith/unary_ops.py +49 -29
  148. classiq/interface/generator/arith/uncomputation_methods.py +1 -1
  149. classiq/interface/generator/builtin_api_builder.py +2 -9
  150. classiq/interface/generator/chemistry_function_params.py +3 -3
  151. classiq/interface/generator/circuit_code/circuit_code.py +7 -7
  152. classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
  153. classiq/interface/generator/commuting_pauli_exponentiation.py +7 -7
  154. classiq/interface/generator/compiler_keywords.py +5 -1
  155. classiq/interface/generator/complex_type.py +13 -18
  156. classiq/interface/generator/constant.py +3 -4
  157. classiq/interface/generator/control_state.py +34 -29
  158. classiq/interface/generator/copy.py +47 -0
  159. classiq/interface/generator/custom_ansatz.py +2 -5
  160. classiq/interface/generator/distance.py +3 -5
  161. classiq/interface/generator/excitations.py +3 -2
  162. classiq/interface/generator/expressions/atomic_expression_functions.py +21 -5
  163. classiq/interface/generator/expressions/enums/__init__.py +0 -10
  164. classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
  165. classiq/interface/generator/expressions/evaluated_expression.py +5 -5
  166. classiq/interface/generator/expressions/expression.py +26 -14
  167. classiq/interface/generator/expressions/expression_constants.py +9 -3
  168. classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
  169. classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
  170. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +34 -8
  171. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
  172. classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
  173. classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
  174. classiq/interface/generator/expressions/sympy_supported_expressions.py +19 -11
  175. classiq/interface/generator/finance.py +2 -2
  176. classiq/interface/generator/function_param_library.py +6 -6
  177. classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
  178. classiq/interface/generator/function_params.py +36 -64
  179. classiq/interface/generator/functions/__init__.py +0 -22
  180. classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
  181. classiq/interface/generator/functions/classical_function_declaration.py +18 -9
  182. classiq/interface/generator/functions/classical_type.py +47 -166
  183. classiq/interface/generator/functions/concrete_types.py +55 -0
  184. classiq/interface/generator/functions/function_declaration.py +13 -14
  185. classiq/interface/generator/functions/port_declaration.py +1 -13
  186. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  187. classiq/interface/generator/functions/type_name.py +90 -0
  188. classiq/interface/generator/generated_circuit_data.py +153 -20
  189. classiq/interface/generator/grover_diffuser.py +32 -25
  190. classiq/interface/generator/grover_operator.py +34 -25
  191. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
  192. classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
  193. classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +9 -9
  194. classiq/interface/generator/hardware/hardware_data.py +72 -34
  195. classiq/interface/generator/hardware_efficient_ansatz.py +20 -16
  196. classiq/interface/generator/hartree_fock.py +13 -5
  197. classiq/interface/generator/identity.py +10 -6
  198. classiq/interface/generator/linear_pauli_rotations.py +32 -20
  199. classiq/interface/generator/mcmt_method.py +1 -1
  200. classiq/interface/generator/mcu.py +17 -15
  201. classiq/interface/generator/mcx.py +24 -17
  202. classiq/interface/generator/model/__init__.py +2 -5
  203. classiq/interface/generator/model/constraints.py +26 -8
  204. classiq/interface/generator/model/model.py +27 -190
  205. classiq/interface/generator/model/preferences/preferences.py +115 -41
  206. classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +14 -17
  207. classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
  208. classiq/interface/generator/oracles/custom_oracle.py +15 -13
  209. classiq/interface/generator/oracles/oracle_abc.py +7 -7
  210. classiq/interface/generator/partitioned_register.py +7 -7
  211. classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
  212. classiq/interface/generator/preferences/optimization.py +1 -2
  213. classiq/interface/generator/qpe.py +41 -30
  214. classiq/interface/generator/qsvm.py +9 -10
  215. classiq/interface/generator/quantum_function_call.py +88 -73
  216. classiq/interface/generator/quantum_program.py +41 -24
  217. classiq/interface/generator/range_types.py +11 -12
  218. classiq/interface/generator/register_role.py +18 -6
  219. classiq/interface/generator/slice_parsing_utils.py +5 -5
  220. classiq/interface/generator/standard_gates/controlled_standard_gates.py +30 -39
  221. classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
  222. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  223. classiq/interface/generator/standard_gates/u_gate.py +7 -10
  224. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  225. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
  226. classiq/interface/generator/state_preparation/distributions.py +16 -15
  227. classiq/interface/generator/state_preparation/metrics.py +4 -7
  228. classiq/interface/generator/state_preparation/state_preparation.py +25 -20
  229. classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
  230. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
  231. classiq/interface/generator/transpiler_basis_gates.py +7 -3
  232. classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
  233. classiq/interface/generator/types/compilation_metadata.py +6 -0
  234. classiq/interface/generator/types/enum_declaration.py +54 -0
  235. classiq/interface/generator/types/qstruct_declaration.py +18 -0
  236. classiq/interface/generator/types/struct_declaration.py +7 -11
  237. classiq/interface/generator/ucc.py +5 -4
  238. classiq/interface/generator/unitary_gate.py +5 -5
  239. classiq/interface/generator/user_defined_function_params.py +4 -1
  240. classiq/interface/generator/validations/flow_graph.py +7 -7
  241. classiq/interface/generator/validations/validator_functions.py +4 -4
  242. classiq/interface/generator/visitor.py +23 -16
  243. classiq/interface/hardware.py +29 -8
  244. classiq/interface/helpers/classproperty.py +8 -0
  245. classiq/interface/helpers/custom_encoders.py +2 -2
  246. classiq/interface/helpers/custom_pydantic_types.py +40 -50
  247. classiq/interface/helpers/datastructures.py +26 -0
  248. classiq/interface/helpers/hashable_mixin.py +3 -2
  249. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  250. classiq/interface/helpers/pydantic_model_helpers.py +7 -5
  251. classiq/interface/helpers/validation_helpers.py +3 -20
  252. classiq/interface/helpers/versioned_model.py +1 -4
  253. classiq/interface/ide/ide_data.py +16 -20
  254. classiq/interface/ide/visual_model.py +130 -0
  255. classiq/interface/interface_version.py +1 -0
  256. classiq/interface/jobs.py +29 -69
  257. classiq/interface/model/allocate.py +16 -0
  258. classiq/interface/model/bind_operation.py +32 -9
  259. classiq/interface/model/classical_if.py +15 -0
  260. classiq/interface/model/classical_parameter_declaration.py +33 -3
  261. classiq/interface/model/control.py +45 -0
  262. classiq/interface/model/handle_binding.py +298 -20
  263. classiq/interface/model/inplace_binary_operation.py +29 -24
  264. classiq/interface/model/invert.py +12 -0
  265. classiq/interface/model/model.py +69 -61
  266. classiq/interface/model/native_function_definition.py +17 -20
  267. classiq/interface/model/parameter.py +13 -0
  268. classiq/interface/model/phase_operation.py +11 -0
  269. classiq/interface/model/port_declaration.py +27 -9
  270. classiq/interface/model/power.py +14 -0
  271. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +30 -18
  272. classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
  273. classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
  274. classiq/interface/model/quantum_function_call.py +141 -343
  275. classiq/interface/model/quantum_function_declaration.py +190 -157
  276. classiq/interface/model/quantum_lambda_function.py +33 -32
  277. classiq/interface/model/quantum_statement.py +71 -12
  278. classiq/interface/model/quantum_type.py +177 -40
  279. classiq/interface/model/quantum_variable_declaration.py +3 -25
  280. classiq/interface/model/repeat.py +15 -0
  281. classiq/interface/model/statement_block.py +40 -14
  282. classiq/interface/model/validation_handle.py +13 -6
  283. classiq/interface/model/variable_declaration_statement.py +3 -1
  284. classiq/interface/model/within_apply_operation.py +7 -5
  285. classiq/interface/server/global_versions.py +6 -7
  286. classiq/interface/server/routes.py +17 -21
  287. classiq/interface/source_reference.py +59 -0
  288. classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
  289. classiq/model_expansions/capturing/__init__.py +0 -0
  290. classiq/model_expansions/capturing/captured_vars.py +435 -0
  291. classiq/model_expansions/capturing/mangling_utils.py +56 -0
  292. classiq/model_expansions/closure.py +171 -0
  293. classiq/model_expansions/debug_flag.py +3 -0
  294. classiq/model_expansions/evaluators/__init__.py +0 -0
  295. classiq/model_expansions/evaluators/arg_type_match.py +158 -0
  296. classiq/model_expansions/evaluators/argument_types.py +42 -0
  297. classiq/model_expansions/evaluators/classical_expression.py +36 -0
  298. classiq/model_expansions/evaluators/control.py +144 -0
  299. classiq/model_expansions/evaluators/parameter_types.py +226 -0
  300. classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
  301. classiq/model_expansions/evaluators/type_type_match.py +90 -0
  302. classiq/model_expansions/expression_evaluator.py +135 -0
  303. classiq/model_expansions/expression_renamer.py +76 -0
  304. classiq/model_expansions/function_builder.py +247 -0
  305. classiq/model_expansions/generative_functions.py +158 -0
  306. classiq/model_expansions/interpreters/__init__.py +0 -0
  307. classiq/model_expansions/interpreters/base_interpreter.py +263 -0
  308. classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
  309. classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
  310. classiq/model_expansions/model_tables.py +18 -0
  311. classiq/model_expansions/quantum_operations/__init__.py +9 -0
  312. classiq/model_expansions/quantum_operations/bind.py +60 -0
  313. classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
  314. classiq/model_expansions/quantum_operations/classicalif.py +53 -0
  315. classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
  316. classiq/model_expansions/quantum_operations/emitter.py +181 -0
  317. classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
  318. classiq/model_expansions/quantum_operations/repeat.py +56 -0
  319. classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
  320. classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
  321. classiq/model_expansions/scope.py +240 -0
  322. classiq/model_expansions/scope_initialization.py +150 -0
  323. classiq/model_expansions/sympy_conversion/__init__.py +0 -0
  324. classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
  325. classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
  326. classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
  327. classiq/model_expansions/transformers/__init__.py +0 -0
  328. classiq/model_expansions/transformers/ast_renamer.py +26 -0
  329. classiq/model_expansions/transformers/var_splitter.py +299 -0
  330. classiq/model_expansions/utils/__init__.py +0 -0
  331. classiq/model_expansions/utils/counted_name_allocator.py +11 -0
  332. classiq/model_expansions/utils/handles_collector.py +33 -0
  333. classiq/model_expansions/visitors/__init__.py +0 -0
  334. classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
  335. classiq/model_expansions/visitors/variable_references.py +144 -0
  336. classiq/open_library/__init__.py +4 -0
  337. classiq/open_library/functions/__init__.py +130 -0
  338. classiq/open_library/functions/amplitude_estimation.py +30 -0
  339. classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
  340. classiq/open_library/functions/grover.py +157 -0
  341. classiq/open_library/functions/hea.py +115 -0
  342. classiq/open_library/functions/linear_pauli_rotation.py +82 -0
  343. classiq/open_library/functions/modular_exponentiation.py +201 -0
  344. classiq/open_library/functions/qaoa_penalty.py +117 -0
  345. classiq/open_library/functions/qft_functions.py +54 -0
  346. classiq/open_library/functions/qpe.py +46 -0
  347. classiq/open_library/functions/qsvt.py +331 -0
  348. classiq/open_library/functions/state_preparation.py +301 -0
  349. classiq/open_library/functions/swap_test.py +27 -0
  350. classiq/open_library/functions/utility_functions.py +81 -0
  351. classiq/open_library/functions/variational.py +52 -0
  352. classiq/qmod/__init__.py +10 -10
  353. classiq/qmod/builtins/__init__.py +19 -2
  354. classiq/qmod/builtins/classical_execution_primitives.py +36 -14
  355. classiq/qmod/builtins/classical_functions.py +39 -43
  356. classiq/qmod/builtins/constants.py +10 -0
  357. classiq/qmod/builtins/enums.py +208 -0
  358. classiq/qmod/builtins/functions/__init__.py +137 -0
  359. classiq/qmod/builtins/functions/allocation.py +150 -0
  360. classiq/qmod/builtins/functions/arithmetic.py +55 -0
  361. classiq/qmod/builtins/functions/benchmarking.py +8 -0
  362. classiq/qmod/builtins/functions/chemistry.py +91 -0
  363. classiq/qmod/builtins/functions/exponentiation.py +105 -0
  364. classiq/qmod/builtins/functions/finance.py +34 -0
  365. classiq/qmod/builtins/functions/operators.py +16 -0
  366. classiq/qmod/builtins/functions/qsvm.py +24 -0
  367. classiq/qmod/builtins/functions/standard_gates.py +651 -0
  368. classiq/qmod/builtins/operations.py +373 -40
  369. classiq/qmod/builtins/structs.py +103 -80
  370. classiq/qmod/cfunc.py +2 -2
  371. classiq/qmod/classical_function.py +4 -8
  372. classiq/qmod/cparam.py +64 -0
  373. classiq/qmod/create_model_function.py +56 -0
  374. classiq/qmod/declaration_inferrer.py +143 -101
  375. classiq/qmod/expression_query.py +20 -4
  376. classiq/qmod/generative.py +42 -0
  377. classiq/qmod/model_state_container.py +18 -6
  378. classiq/qmod/native/__init__.py +7 -0
  379. classiq/qmod/native/expression_to_qmod.py +16 -11
  380. classiq/qmod/native/pretty_printer.py +187 -97
  381. classiq/qmod/pretty_print/__init__.py +7 -0
  382. classiq/qmod/pretty_print/expression_to_python.py +222 -0
  383. classiq/qmod/pretty_print/pretty_printer.py +572 -0
  384. classiq/qmod/python_classical_type.py +67 -0
  385. classiq/qmod/qfunc.py +60 -8
  386. classiq/qmod/qmod_constant.py +93 -26
  387. classiq/qmod/qmod_parameter.py +68 -59
  388. classiq/qmod/qmod_variable.py +468 -155
  389. classiq/qmod/quantum_callable.py +17 -7
  390. classiq/qmod/quantum_expandable.py +269 -96
  391. classiq/qmod/quantum_function.py +196 -41
  392. classiq/qmod/semantics/__init__.py +0 -0
  393. classiq/qmod/semantics/annotation/__init__.py +0 -0
  394. classiq/qmod/semantics/annotation/call_annotation.py +92 -0
  395. classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
  396. classiq/qmod/semantics/error_manager.py +88 -0
  397. classiq/qmod/semantics/lambdas.py +25 -0
  398. classiq/qmod/semantics/static_semantics_visitor.py +384 -0
  399. classiq/qmod/semantics/validation/__init__.py +0 -0
  400. classiq/qmod/semantics/validation/constants_validation.py +16 -0
  401. classiq/qmod/semantics/validation/func_call_validation.py +99 -0
  402. classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
  403. classiq/qmod/semantics/validation/handle_validation.py +85 -0
  404. classiq/qmod/semantics/validation/main_validation.py +33 -0
  405. classiq/qmod/semantics/validation/types_validation.py +128 -0
  406. classiq/qmod/symbolic.py +147 -123
  407. classiq/qmod/symbolic_expr.py +27 -12
  408. classiq/qmod/symbolic_type.py +2 -5
  409. classiq/qmod/type_attribute_remover.py +32 -0
  410. classiq/qmod/utilities.py +98 -4
  411. classiq/qmod/write_qmod.py +17 -3
  412. classiq/synthesis.py +210 -22
  413. {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/METADATA +16 -9
  414. classiq-0.65.4.dist-info/RECORD +521 -0
  415. classiq/_internals/_qfunc_ext.py +0 -6
  416. classiq/applications/benchmarking/__init__.py +0 -9
  417. classiq/applications/benchmarking/mirror_benchmarking.py +0 -70
  418. classiq/applications/numpy_utils.py +0 -37
  419. classiq/applications_model_constructors/__init__.py +0 -25
  420. classiq/applications_model_constructors/combinatorial_helpers/multiple_comp_basis_sp.py +0 -34
  421. classiq/applications_model_constructors/combinatorial_helpers/pauli_helpers/pauli_utils.py +0 -65
  422. classiq/applications_model_constructors/combinatorial_helpers/pyomo_utils.py +0 -243
  423. classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
  424. classiq/applications_model_constructors/libraries/qmci_library.py +0 -107
  425. classiq/builtin_functions/__init__.py +0 -43
  426. classiq/builtin_functions/amplitude_loading.py +0 -3
  427. classiq/builtin_functions/binary_ops.py +0 -1
  428. classiq/builtin_functions/exponentiation.py +0 -5
  429. classiq/builtin_functions/qpe.py +0 -4
  430. classiq/builtin_functions/qsvm.py +0 -7
  431. classiq/builtin_functions/range_types.py +0 -5
  432. classiq/builtin_functions/standard_gates.py +0 -1
  433. classiq/builtin_functions/state_preparation.py +0 -6
  434. classiq/builtin_functions/suzuki_trotter.py +0 -3
  435. classiq/interface/executor/aws_execution_cost.py +0 -73
  436. classiq/interface/executor/error_mitigation.py +0 -6
  437. classiq/interface/generator/credit_risk_example/linear_gci.py +0 -122
  438. classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -69
  439. classiq/interface/generator/expressions/enums/chemistry.py +0 -28
  440. classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
  441. classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
  442. classiq/interface/generator/expressions/enums/optimizers.py +0 -9
  443. classiq/interface/generator/expressions/enums/pauli.py +0 -8
  444. classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
  445. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
  446. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
  447. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
  448. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -1229
  449. classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -95
  450. classiq/interface/generator/functions/foreign_function_definition.py +0 -114
  451. classiq/interface/generator/functions/function_implementation.py +0 -107
  452. classiq/interface/generator/functions/native_function_definition.py +0 -155
  453. classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
  454. classiq/interface/generator/functions/register.py +0 -44
  455. classiq/interface/generator/functions/register_mapping_data.py +0 -106
  456. classiq/interface/generator/inequality_mixer.py +0 -51
  457. classiq/interface/generator/model/classical_main_validator.py +0 -106
  458. classiq/interface/generator/range_mixer.py +0 -56
  459. classiq/interface/generator/state_propagator.py +0 -74
  460. classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -1
  461. classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
  462. classiq/interface/ide/show.py +0 -34
  463. classiq/interface/model/call_synthesis_data.py +0 -68
  464. classiq/interface/model/common_model_types.py +0 -23
  465. classiq/interface/model/quantum_expressions/control_state.py +0 -38
  466. classiq/interface/model/quantum_if_operation.py +0 -94
  467. classiq/interface/model/resolvers/function_call_resolver.py +0 -43
  468. classiq/interface/model/validations/handle_validation_base.py +0 -55
  469. classiq/interface/model/validations/handles_validator.py +0 -156
  470. classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
  471. classiq/model/__init__.py +0 -14
  472. classiq/model/composite_function_generator.py +0 -33
  473. classiq/model/function_handler.py +0 -462
  474. classiq/model/logic_flow.py +0 -149
  475. classiq/model/logic_flow_change_handler.py +0 -71
  476. classiq/model/model.py +0 -229
  477. classiq/qmod/builtins/functions.py +0 -913
  478. classiq/qmod/qmod_struct.py +0 -37
  479. classiq/quantum_functions/__init__.py +0 -17
  480. classiq/quantum_functions/annotation_parser.py +0 -205
  481. classiq/quantum_functions/decorators.py +0 -22
  482. classiq/quantum_functions/function_library.py +0 -181
  483. classiq/quantum_functions/function_parser.py +0 -74
  484. classiq/quantum_functions/quantum_function.py +0 -236
  485. classiq-0.38.0.dist-info/RECORD +0 -454
  486. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/__init__.py +0 -0
  487. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/__init__.py +0 -0
  488. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/__init__.py +0 -0
  489. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +0 -0
  490. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/py.typed +0 -0
  491. /classiq/{applications_model_constructors/combinatorial_helpers/transformations → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
  492. /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
  493. /classiq/{interface/generator/credit_risk_example → applications/hamiltonian}/__init__.py +0 -0
  494. /classiq/{interface/generator/functions/core_lib_declarations → applications/libraries}/__init__.py +0 -0
  495. /classiq/interface/{model/resolvers → debug_info}/__init__.py +0 -0
  496. /classiq/{_internals → interface}/enum_utils.py +0 -0
  497. /classiq/interface/{model/validations → generator/functions/builtins}/__init__.py +0 -0
  498. /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → model_expansions/__init__.py} +0 -0
  499. {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/WHEEL +0 -0
@@ -1,9 +1,11 @@
1
1
  import ast
2
2
  from _ast import AST
3
- from typing import Collection, List, Optional, Set, Tuple, Type, Union, cast
3
+ from collections.abc import Collection
4
+ from typing import Optional, Union, cast
4
5
 
5
6
  import networkx as nx
6
7
 
8
+ from classiq.interface.exceptions import ClassiqArithmeticError
7
9
  from classiq.interface.generator.arith.arithmetic_expression_validator import (
8
10
  DEFAULT_EXPRESSION_TYPE,
9
11
  DEFAULT_SUPPORTED_FUNC_NAMES,
@@ -16,11 +18,9 @@ from classiq.interface.generator.arith.ast_node_rewrite import (
16
18
  AstNodeRewrite,
17
19
  )
18
20
 
19
- from classiq.exceptions import ClassiqArithmeticError
20
-
21
- _MULTIPLE_RESULTS_ERROR_MESSAGE: str = "Expression cannot contain multiple result"
21
+ _MULTIPLE_RESULTS_ERROR_MESSAGE: str = "Expression cannot contain multiple results"
22
22
  _UNEXPECTED_ARITHMETIC_ERROR_MESSAGE: str = (
23
- "Unexpected arithmetic error: trivial expression. Please contact support."
23
+ "Quantum expressions that evaluate to a classical value are not supported"
24
24
  )
25
25
  _ALLOWED_MULTI_ARGUMENT_FUNCTIONS = ("min", "max")
26
26
  Node = Union[str, float, int]
@@ -29,9 +29,9 @@ Node = Union[str, float, int]
29
29
  class ExpressionVisitor(ExpressionValidator):
30
30
  def __init__(
31
31
  self,
32
- supported_nodes: Tuple[Type[AST], ...],
32
+ supported_nodes: tuple[type[AST], ...],
33
33
  expression_type: str = DEFAULT_EXPRESSION_TYPE,
34
- supported_functions: Optional[Set[str]] = None,
34
+ supported_functions: Optional[set[str]] = None,
35
35
  ) -> None:
36
36
  super().__init__(supported_nodes, expression_type, supported_functions)
37
37
  self.graph = nx.DiGraph()
@@ -91,8 +91,8 @@ class ExpressionVisitor(ExpressionValidator):
91
91
  class InDegreeLimiter:
92
92
  @staticmethod
93
93
  def _sort_in_edges(
94
- in_edges: Collection[Tuple[Node, str]]
95
- ) -> List[Tuple[Node, str]]:
94
+ in_edges: Collection[tuple[Node, str]]
95
+ ) -> list[tuple[Node, str]]:
96
96
  return sorted(
97
97
  in_edges,
98
98
  key=lambda edge_tuple: isinstance(edge_tuple[0], str), # vars before consts
@@ -135,9 +135,9 @@ class InDegreeLimiter:
135
135
  def parse_expression(
136
136
  expression: str,
137
137
  *,
138
- supported_nodes: Tuple[Type[AST], ...] = DEFAULT_SUPPORTED_NODE_TYPES,
138
+ supported_nodes: tuple[type[AST], ...] = DEFAULT_SUPPORTED_NODE_TYPES,
139
139
  expression_type: str = DEFAULT_EXPRESSION_TYPE,
140
- supported_functions: Optional[Set[str]] = None,
140
+ supported_functions: Optional[set[str]] = None,
141
141
  ) -> nx.DiGraph:
142
142
  supported_functions = supported_functions or DEFAULT_SUPPORTED_FUNC_NAMES
143
143
 
@@ -1,26 +1,23 @@
1
1
  import ast
2
- import builtins
3
2
  import re
4
3
  from _ast import AST
5
- from typing import Any, Optional, Set, Tuple, Type, Union
4
+ from typing import Any, Optional, Union
6
5
 
7
- from typing_extensions import get_args
6
+ from sympy import Expr
7
+ from typing_extensions import TypeAlias, get_args
8
8
 
9
+ from classiq.interface.exceptions import ClassiqArithmeticError, ClassiqValueError
9
10
  from classiq.interface.generator.arith.ast_node_rewrite import AstNodeRewrite
10
11
  from classiq.interface.generator.expressions.sympy_supported_expressions import (
11
12
  SYMPY_SUPPORTED_EXPRESSIONS,
12
13
  )
13
14
 
14
- from classiq.exceptions import ClassiqArithmeticError, ClassiqValueError
15
-
16
- DEFAULT_SUPPORTED_FUNC_NAMES: Set[str] = {"CLShift", "CRShift", "min", "max"}
15
+ DEFAULT_SUPPORTED_FUNC_NAMES: set[str] = {"CLShift", "CRShift", "min", "max"}
17
16
 
18
17
  DEFAULT_EXPRESSION_TYPE = "arithmetic"
19
18
  IDENITIFIER_REGEX = re.compile(r"[a-zA-Z_][a-zA-Z0-9_]*")
20
19
 
21
- _REPEATED_VARIABLES_ERROR_MESSAGE: str = (
22
- "Repeated variables in the beginning of an arithmetic expression are not allowed."
23
- )
20
+ ValidKeyValuePairs: TypeAlias = dict[str, set[str]]
24
21
 
25
22
  SupportedNodesTypes = Union[
26
23
  ast.Expression,
@@ -58,20 +55,26 @@ SupportedNodesTypes = Union[
58
55
  DEFAULT_SUPPORTED_NODE_TYPES = get_args(SupportedNodesTypes)
59
56
 
60
57
 
58
+ def is_constant(expr: Union[str, Expr]) -> bool:
59
+ try:
60
+ float(expr)
61
+ return True
62
+ except (ValueError, TypeError):
63
+ return False
64
+
65
+
61
66
  class ExpressionValidator(ast.NodeVisitor):
62
67
  def __init__(
63
68
  self,
64
- supported_nodes: Tuple[Type[AST], ...],
69
+ supported_nodes: tuple[type[AST], ...],
65
70
  expression_type: str = DEFAULT_EXPRESSION_TYPE,
66
- supported_functions: Optional[Set[str]] = None,
67
- supported_attr_values: Optional[Set[str]] = None,
71
+ supported_functions: Optional[set[str]] = None,
68
72
  mode: str = "eval",
69
73
  ) -> None:
70
74
  super().__init__()
71
75
  self.supported_nodes = supported_nodes
72
76
  self._expression_type = expression_type
73
77
  self._supported_functions = supported_functions or DEFAULT_SUPPORTED_FUNC_NAMES
74
- self._supported_attr_values = supported_attr_values or set()
75
78
  self._mode = mode
76
79
  self._ast_obj: Optional[ast.AST] = None
77
80
 
@@ -92,7 +95,7 @@ class ExpressionValidator(ast.NodeVisitor):
92
95
  @staticmethod
93
96
  def _get_adjusted_expression(expression: str) -> str:
94
97
  # This works around the simplification of the trivial expressions such as a + 0, 1 * a, etc.
95
- if IDENITIFIER_REGEX.fullmatch(expression):
98
+ if IDENITIFIER_REGEX.fullmatch(expression) or is_constant(expression):
96
99
  return f"0 + {expression}"
97
100
  return expression
98
101
 
@@ -102,13 +105,25 @@ class ExpressionValidator(ast.NodeVisitor):
102
105
  raise ClassiqArithmeticError("Must call `validate` before getting ast_obj")
103
106
  return self._ast_obj
104
107
 
105
- @staticmethod
106
- def _check_repeated_variables(variables: Tuple[Any, Any]) -> None:
108
+ def _check_repeated_variables(
109
+ self, variables: tuple[Any, Any], expr: ast.AST, error_suffix: str
110
+ ) -> None:
111
+ if (
112
+ isinstance(expr, ast.BinOp)
113
+ and isinstance(expr.op, ast.Pow)
114
+ and ast.Pow not in self.supported_nodes
115
+ ):
116
+ raise ClassiqValueError(
117
+ "Raising to a power (<var> ** <exp>) and multiplying a variable by "
118
+ "itself (<var> * <var>) are not supported"
119
+ )
107
120
  if (
108
121
  all(isinstance(var, ast.Name) for var in variables)
109
122
  and variables[0].id == variables[1].id
110
123
  ):
111
- raise ClassiqValueError(_REPEATED_VARIABLES_ERROR_MESSAGE)
124
+ raise ClassiqValueError(
125
+ f"Expression {ast.unparse(expr)!r} is not supported ({error_suffix})"
126
+ )
112
127
 
113
128
  @staticmethod
114
129
  def _check_multiple_comparators(node: ast.Compare) -> None:
@@ -130,7 +145,11 @@ class ExpressionValidator(ast.NodeVisitor):
130
145
  )
131
146
 
132
147
  def validate_Compare(self, node: ast.Compare) -> None: # noqa: N802
133
- self._check_repeated_variables((node.left, node.comparators[0]))
148
+ self._check_repeated_variables(
149
+ (node.left, node.comparators[0]),
150
+ node,
151
+ "both sides of the comparison are identical",
152
+ )
134
153
  self._check_multiple_comparators(node)
135
154
 
136
155
  def visit_Compare(self, node: ast.Compare) -> None:
@@ -138,7 +157,9 @@ class ExpressionValidator(ast.NodeVisitor):
138
157
  self.generic_visit(node)
139
158
 
140
159
  def validate_BinOp(self, node: ast.BinOp) -> None: # noqa: N802
141
- self._check_repeated_variables((node.left, node.right))
160
+ self._check_repeated_variables(
161
+ (node.left, node.right), node, "both sides of the operation are identical"
162
+ )
142
163
 
143
164
  def visit_BinOp(self, node: ast.BinOp) -> None:
144
165
  self.validate_BinOp(node)
@@ -146,7 +167,11 @@ class ExpressionValidator(ast.NodeVisitor):
146
167
 
147
168
  def validate_Call(self, node: ast.Call) -> None: # noqa: N802
148
169
  if len(node.args) >= 2:
149
- self._check_repeated_variables((node.args[0], node.args[1]))
170
+ self._check_repeated_variables(
171
+ (node.args[0], node.args[1]),
172
+ node,
173
+ "the first two call arguments are identical",
174
+ )
150
175
  node_id = AstNodeRewrite().extract_node_id(node)
151
176
  if node_id not in self._supported_functions:
152
177
  raise ClassiqValueError(f"{node_id} not in supported functions")
@@ -170,26 +195,7 @@ class ExpressionValidator(ast.NodeVisitor):
170
195
  self.validate_Constant(node)
171
196
  self.generic_visit(node)
172
197
 
173
- def validate_Attribute(self, node: ast.Attribute) -> None: # noqa: N802
174
- if not (
175
- isinstance(node.value, ast.Name)
176
- and node.value.id in self._supported_attr_values
177
- ):
178
- raise ClassiqValueError(
179
- f"Attribute is not supported for value {node.value}"
180
- )
181
-
182
198
  def visit_Attribute(self, node: ast.Attribute) -> None:
183
- self.validate_Attribute(node)
184
- self.generic_visit(node)
185
-
186
- def visit_FunctionDef(self, node: ast.FunctionDef) -> Any:
187
- if self._mode == "exec":
188
- if hasattr(builtins, node.name):
189
- raise ClassiqValueError(
190
- f"Defining a function named {node.name} is forbidden"
191
- )
192
- self._supported_functions.add(node.name)
193
199
  self.generic_visit(node)
194
200
 
195
201
  @classmethod
@@ -200,10 +206,9 @@ class ExpressionValidator(ast.NodeVisitor):
200
206
  def validate_expression(
201
207
  expression: str,
202
208
  *,
203
- supported_nodes: Tuple[Type[AST], ...] = DEFAULT_SUPPORTED_NODE_TYPES,
209
+ supported_nodes: tuple[type[AST], ...] = DEFAULT_SUPPORTED_NODE_TYPES,
204
210
  expression_type: str = DEFAULT_EXPRESSION_TYPE,
205
- supported_functions: Optional[Set[str]] = None,
206
- supported_attr_values: Optional[Set[str]] = None,
211
+ supported_functions: Optional[set[str]] = None,
207
212
  mode: str = "eval",
208
213
  ) -> ast.AST:
209
214
  supported_functions = supported_functions or set(SYMPY_SUPPORTED_EXPRESSIONS).union(
@@ -213,7 +218,6 @@ def validate_expression(
213
218
  supported_nodes,
214
219
  expression_type,
215
220
  supported_functions,
216
- supported_attr_values,
217
221
  mode,
218
222
  )
219
223
  validator.validate(expression)
@@ -1,5 +1,6 @@
1
1
  import abc
2
- from typing import ClassVar, Iterable, Optional, Tuple
2
+ from collections.abc import Iterable
3
+ from typing import ClassVar, Final, Optional
3
4
 
4
5
  import pydantic
5
6
 
@@ -9,11 +10,15 @@ from classiq.interface.generator.arith.machine_precision import (
9
10
  from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
10
11
  from classiq.interface.generator.function_params import FunctionParams
11
12
 
12
- DEFAULT_GARBAGE_OUT_NAME: str = "extra_qubits"
13
+ IMPLICIT_OUTPUTS: Final[str] = "implicit_outputs"
14
+ DEFAULT_GARBAGE_OUT_NAME: Final[str] = "extra_qubits"
15
+ MODULO_WITH_FRACTION_PLACES_ERROR_MSG: Final[str] = (
16
+ "Modulo with fraction places not supported"
17
+ )
13
18
 
14
19
 
15
20
  class ArithmeticOperationParams(FunctionParams):
16
- output_size: Optional[pydantic.PositiveInt]
21
+ output_size: Optional[pydantic.PositiveInt] = pydantic.Field(default=None)
17
22
  machine_precision: pydantic.PositiveInt = DEFAULT_MACHINE_PRECISION
18
23
  output_name: ClassVar[str]
19
24
  garbage_output_name: ClassVar[str] = DEFAULT_GARBAGE_OUT_NAME
@@ -40,9 +45,12 @@ class ArithmeticOperationParams(FunctionParams):
40
45
  return self.output_size is None
41
46
 
42
47
  def _legal_bounds(
43
- self, suggested_bounds: Tuple[float, float]
44
- ) -> Optional[Tuple[float, float]]:
45
- if self._include_sign or min(suggested_bounds) >= 0:
48
+ self, suggested_bounds: tuple[float, float], max_bounds: tuple[float, float]
49
+ ) -> Optional[tuple[float, float]]:
50
+ if self.output_size is None or (
51
+ suggested_bounds[0] >= max_bounds[0]
52
+ and suggested_bounds[1] <= max_bounds[1]
53
+ ):
46
54
  return suggested_bounds
47
55
  return None
48
56
 
@@ -1,5 +1,6 @@
1
- from typing import Callable, Dict, FrozenSet, List, Optional
1
+ from typing import Callable, Optional
2
2
 
3
+ from classiq.interface.exceptions import ClassiqArithmeticError
3
4
  from classiq.interface.generator.arith.argument_utils import (
4
5
  RegisterOrConst as RegisterOrFloat,
5
6
  )
@@ -35,12 +36,10 @@ from classiq.interface.generator.arith.logical_ops import LogicalAnd, LogicalOr
35
36
  from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
36
37
  from classiq.interface.generator.arith.unary_ops import BitwiseInvert, Negation
37
38
 
38
- from classiq.exceptions import ClassiqArithmeticError
39
-
40
39
  ParamsGetter = Callable[..., ArithmeticOperationParams] # Argument vary
41
40
 
42
41
  _TARGET_ERROR_MESSAGE: str = "Target unavailable for the requested operation"
43
- _OPERATIONS_ALLOWING_TARGET: FrozenSet = frozenset(
42
+ _OPERATIONS_ALLOWING_TARGET: frozenset = frozenset(
44
43
  {"And", "Or", "Eq", "NotEq", "Lt", "Gt", "LtE", "GtE"}
45
44
  )
46
45
 
@@ -56,7 +55,7 @@ def operation_allows_target(operation: str) -> bool:
56
55
  def get_params(
57
56
  *,
58
57
  node_id: str,
59
- args: List[RegisterOrFloat],
58
+ args: list[RegisterOrFloat],
60
59
  machine_precision: int,
61
60
  output_size: Optional[int] = None,
62
61
  inplace_arg: Optional[str] = None,
@@ -331,7 +330,7 @@ def less_equal_params_getter(
331
330
 
332
331
 
333
332
  def logical_and_params_getter(
334
- *arg: List[RegisterOrFloat],
333
+ *arg: list[RegisterOrFloat],
335
334
  machine_precision: int,
336
335
  output_size: Optional[int] = None,
337
336
  inplace_arg: Optional[str] = None,
@@ -341,7 +340,7 @@ def logical_and_params_getter(
341
340
 
342
341
 
343
342
  def logical_or_params_getter(
344
- *arg: List[RegisterOrFloat],
343
+ *arg: list[RegisterOrFloat],
345
344
  machine_precision: int,
346
345
  output_size: Optional[int] = None,
347
346
  inplace_arg: Optional[str] = None,
@@ -435,7 +434,7 @@ def modulo_params_getter(
435
434
  )
436
435
 
437
436
 
438
- params_getter_map: Dict[str, ParamsGetter] = dict(
437
+ params_getter_map: dict[str, ParamsGetter] = dict(
439
438
  BitOr=or_params_getter,
440
439
  BitAnd=and_params_getter,
441
440
  BitXor=xor_params_getter,
@@ -1,15 +1,14 @@
1
- from typing import Any, Dict, List, Optional, Set
1
+ from typing import Any, Optional
2
2
 
3
3
  import networkx as nx
4
4
 
5
+ from classiq.interface.exceptions import ClassiqArithmeticError
5
6
  from classiq.interface.generator.arith import arithmetic_param_getters, number_utils
6
7
  from classiq.interface.generator.arith.argument_utils import RegisterOrConst
7
8
  from classiq.interface.generator.arith.ast_node_rewrite import OUTPUT_SIZE
8
9
  from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
9
10
 
10
- from classiq.exceptions import ClassiqArithmeticError
11
-
12
- ArithmeticDefinitions = Dict[str, RegisterOrConst]
11
+ ArithmeticDefinitions = dict[str, RegisterOrConst]
13
12
 
14
13
 
15
14
  class ArithmeticResultBuilder:
@@ -20,7 +19,7 @@ class ArithmeticResultBuilder:
20
19
  definitions: ArithmeticDefinitions,
21
20
  machine_precision: int,
22
21
  ) -> None:
23
- self.result = self._fill_operation_results(
22
+ self.result, self.garbage = self._fill_operation_results(
24
23
  graph=graph,
25
24
  result_definitions=definitions,
26
25
  machine_precision=machine_precision,
@@ -44,10 +43,10 @@ class ArithmeticResultBuilder:
44
43
  def _compute_inputs_data(
45
44
  cls,
46
45
  *,
47
- inputs_node_set: Set[Any],
46
+ inputs_node_set: set[Any],
48
47
  result_definitions: ArithmeticDefinitions,
49
48
  machine_precision: int,
50
- ) -> Dict[str, RegisterOrConst]:
49
+ ) -> dict[str, RegisterOrConst]:
51
50
  return {
52
51
  cls._convert_int_to_float_str(node): cls.convert_result_definition(
53
52
  node, result_definitions.get(node), machine_precision
@@ -62,11 +61,11 @@ class ArithmeticResultBuilder:
62
61
  graph: nx.DiGraph,
63
62
  result_definitions: ArithmeticDefinitions,
64
63
  machine_precision: int,
65
- ) -> RegisterArithmeticInfo:
66
- inputs_node_set: Set[str] = {
64
+ ) -> tuple[RegisterArithmeticInfo, Optional[RegisterArithmeticInfo]]:
65
+ inputs_node_set: set[str] = {
67
66
  vertex for vertex, deg in graph.in_degree if deg == 0
68
67
  }
69
- node_results: Dict[str, RegisterOrConst] = cls._compute_inputs_data(
68
+ node_results: dict[str, RegisterOrConst] = cls._compute_inputs_data(
70
69
  inputs_node_set=inputs_node_set,
71
70
  result_definitions=result_definitions,
72
71
  machine_precision=machine_precision,
@@ -80,29 +79,34 @@ class ArithmeticResultBuilder:
80
79
  for predecessor_node in graph.predecessors(node)
81
80
  ]
82
81
  if graph.out_degree(node) == 0:
83
- return cls._get_node_result(
82
+ return cls._get_node_result_and_garbage(
84
83
  graph, args, node, machine_precision=machine_precision
85
84
  )
86
- node_results[node] = cls._get_node_result(
85
+ node_results[node], _ = cls._get_node_result_and_garbage(
87
86
  graph, args, node, machine_precision=machine_precision
88
87
  )
89
88
  raise ClassiqArithmeticError("Expression has no result")
90
89
 
91
90
  @classmethod
92
- def _get_node_result(
91
+ def _get_node_result_and_garbage(
93
92
  cls,
94
93
  graph: nx.DiGraph,
95
- args: List[RegisterOrConst],
94
+ args: list[RegisterOrConst],
96
95
  node: str,
97
96
  *,
98
97
  machine_precision: int,
99
- ) -> RegisterArithmeticInfo:
100
- return arithmetic_param_getters.get_params(
98
+ ) -> tuple[RegisterArithmeticInfo, Optional[RegisterArithmeticInfo]]:
99
+ node_params = arithmetic_param_getters.get_params(
101
100
  node_id=node,
102
101
  args=args,
103
102
  output_size=graph.nodes[node].get(OUTPUT_SIZE, None),
104
103
  machine_precision=machine_precision,
105
- ).result_register
104
+ )
105
+
106
+ return (
107
+ node_params.outputs[node_params.output_name],
108
+ node_params.outputs.get(node_params.garbage_output_name),
109
+ )
106
110
 
107
111
  @staticmethod
108
112
  def _convert_int_to_float_str(node: Any) -> str:
@@ -1,8 +1,9 @@
1
1
  import ast
2
2
  import itertools
3
- from typing import Any, Iterator, Optional, Union, cast
3
+ from collections.abc import Iterator
4
+ from typing import Any, Optional, Union, cast
4
5
 
5
- from classiq.exceptions import ClassiqArithmeticError
6
+ from classiq.interface.exceptions import ClassiqArithmeticError
6
7
 
7
8
  SEPARATOR: str = "_"
8
9
  OUTPUT_SIZE: str = "output_size"