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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (516) hide show
  1. classiq/__init__.py +49 -34
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +3 -2
  3. classiq/_analyzer_extras/interactive_hardware.py +3 -3
  4. classiq/_internals/api_wrapper.py +241 -95
  5. classiq/_internals/async_utils.py +2 -77
  6. classiq/_internals/authentication/auth0.py +26 -10
  7. classiq/_internals/authentication/authentication.py +11 -0
  8. classiq/_internals/authentication/device.py +18 -8
  9. classiq/_internals/authentication/password_manager.py +40 -13
  10. classiq/_internals/authentication/token_manager.py +11 -6
  11. classiq/_internals/client.py +106 -37
  12. classiq/_internals/config.py +3 -4
  13. classiq/_internals/host_checker.py +38 -15
  14. classiq/_internals/jobs.py +56 -50
  15. classiq/_internals/type_validation.py +9 -9
  16. classiq/analyzer/__init__.py +1 -3
  17. classiq/analyzer/analyzer.py +50 -47
  18. classiq/analyzer/analyzer_utilities.py +15 -15
  19. classiq/analyzer/rb.py +19 -20
  20. classiq/analyzer/show_interactive_hack.py +30 -7
  21. classiq/analyzer/url_utils.py +2 -3
  22. classiq/applications/__init__.py +3 -12
  23. classiq/applications/chemistry/__init__.py +14 -10
  24. classiq/applications/chemistry/ansatz_parameters.py +4 -4
  25. classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +170 -170
  26. classiq/applications/chemistry/ground_state_problem.py +1 -1
  27. classiq/applications/combinatorial_helpers/allowed_constraints.py +23 -0
  28. classiq/applications/combinatorial_helpers/arithmetic/arithmetic_expression.py +35 -0
  29. classiq/applications/combinatorial_helpers/arithmetic/isolation.py +42 -0
  30. classiq/applications/combinatorial_helpers/combinatorial_problem_utils.py +166 -0
  31. classiq/applications/combinatorial_helpers/encoding_mapping.py +107 -0
  32. classiq/applications/combinatorial_helpers/encoding_utils.py +124 -0
  33. classiq/applications/combinatorial_helpers/memory.py +75 -0
  34. classiq/applications/combinatorial_helpers/optimization_model.py +193 -0
  35. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +31 -0
  36. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
  37. classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
  38. classiq/applications/combinatorial_helpers/sympy_utils.py +22 -0
  39. classiq/applications/combinatorial_helpers/transformations/encoding.py +189 -0
  40. classiq/applications/combinatorial_helpers/transformations/fixed_variables.py +143 -0
  41. classiq/applications/combinatorial_helpers/transformations/ising_converter.py +120 -0
  42. classiq/applications/combinatorial_helpers/transformations/penalty.py +31 -0
  43. classiq/applications/combinatorial_helpers/transformations/penalty_support.py +37 -0
  44. classiq/applications/combinatorial_helpers/transformations/sign_seperation.py +74 -0
  45. classiq/applications/combinatorial_helpers/transformations/slack_variables.py +87 -0
  46. classiq/applications/combinatorial_optimization/__init__.py +24 -5
  47. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
  48. classiq/applications/combinatorial_optimization/combinatorial_optimization_model_constructor.py +137 -0
  49. classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
  50. classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
  51. classiq/applications/finance/__init__.py +4 -5
  52. classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +50 -57
  53. classiq/applications/grover/__init__.py +9 -0
  54. classiq/applications/grover/grover_model_constructor.py +157 -0
  55. classiq/applications/hamiltonian/__init__.py +0 -0
  56. classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
  57. classiq/applications/libraries/__init__.py +0 -0
  58. classiq/applications/libraries/qmci_library.py +22 -0
  59. classiq/applications/qnn/__init__.py +2 -4
  60. classiq/applications/qnn/circuit_utils.py +8 -8
  61. classiq/applications/qnn/datasets/__init__.py +9 -11
  62. classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
  63. classiq/applications/qnn/datasets/dataset_not.py +2 -1
  64. classiq/applications/qnn/datasets/dataset_parity.py +2 -2
  65. classiq/applications/qnn/gradients/quantum_gradient.py +2 -2
  66. classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
  67. classiq/applications/qnn/qlayer.py +30 -10
  68. classiq/applications/qnn/torch_utils.py +4 -3
  69. classiq/applications/qnn/types.py +7 -7
  70. classiq/applications/qsvm/__init__.py +6 -4
  71. classiq/applications/qsvm/qsvm.py +4 -10
  72. classiq/applications/qsvm/qsvm_data_generation.py +5 -8
  73. classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
  74. classiq/execution/__init__.py +8 -3
  75. classiq/execution/all_hardware_devices.py +11 -0
  76. classiq/execution/execution_session.py +400 -0
  77. classiq/execution/iqcc.py +63 -0
  78. classiq/execution/jobs.py +197 -25
  79. classiq/execution/qnn.py +79 -0
  80. classiq/executor.py +23 -117
  81. classiq/interface/_version.py +1 -1
  82. classiq/interface/analyzer/analysis_params.py +49 -16
  83. classiq/interface/analyzer/cytoscape_graph.py +15 -9
  84. classiq/interface/analyzer/result.py +36 -32
  85. classiq/interface/applications/qsvm.py +28 -25
  86. classiq/interface/ast_node.py +16 -0
  87. classiq/interface/backend/backend_preferences.py +390 -119
  88. classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
  89. classiq/interface/backend/pydantic_backend.py +27 -22
  90. classiq/interface/backend/quantum_backend_providers.py +70 -16
  91. classiq/interface/chemistry/fermionic_operator.py +43 -32
  92. classiq/interface/chemistry/ground_state_problem.py +42 -24
  93. classiq/interface/chemistry/molecule.py +20 -14
  94. classiq/interface/chemistry/operator.py +75 -236
  95. classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
  96. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +2 -4
  97. classiq/interface/combinatorial_optimization/examples/greater_than_ilp.py +1 -1
  98. classiq/interface/combinatorial_optimization/examples/ilp.py +2 -1
  99. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  100. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  101. classiq/interface/combinatorial_optimization/examples/mds.py +2 -1
  102. classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
  103. classiq/interface/combinatorial_optimization/examples/mis.py +4 -1
  104. classiq/interface/combinatorial_optimization/examples/mvc.py +2 -1
  105. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  106. classiq/interface/combinatorial_optimization/examples/set_cover.py +3 -3
  107. classiq/interface/combinatorial_optimization/examples/tsp.py +4 -3
  108. classiq/interface/combinatorial_optimization/examples/tsp_digraph.py +6 -2
  109. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +14 -9
  110. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  111. classiq/interface/combinatorial_optimization/result.py +1 -3
  112. classiq/interface/combinatorial_optimization/solver_types.py +1 -1
  113. classiq/interface/debug_info/__init__.py +0 -0
  114. classiq/interface/debug_info/debug_info.py +86 -0
  115. classiq/interface/exceptions.py +201 -0
  116. classiq/interface/execution/iqcc.py +19 -0
  117. classiq/interface/execution/jobs.py +15 -12
  118. classiq/interface/execution/primitives.py +18 -0
  119. classiq/interface/executor/constants.py +1 -0
  120. classiq/interface/executor/estimation.py +2 -2
  121. classiq/interface/executor/execution_preferences.py +26 -143
  122. classiq/interface/executor/execution_request.py +36 -56
  123. classiq/interface/executor/execution_result.py +30 -8
  124. classiq/interface/executor/iqae_result.py +4 -6
  125. classiq/interface/executor/optimizer_preferences.py +34 -22
  126. classiq/interface/executor/{quantum_program.py → quantum_code.py} +44 -34
  127. classiq/interface/executor/quantum_instruction_set.py +3 -2
  128. classiq/interface/executor/register_initialization.py +12 -17
  129. classiq/interface/executor/result.py +122 -64
  130. classiq/interface/executor/vqe_result.py +11 -11
  131. classiq/interface/finance/function_input.py +42 -19
  132. classiq/interface/finance/gaussian_model_input.py +7 -5
  133. classiq/interface/finance/log_normal_model_input.py +6 -4
  134. classiq/interface/finance/model_input.py +6 -4
  135. classiq/interface/generator/adjacency.py +1 -3
  136. classiq/interface/generator/amplitude_loading.py +27 -14
  137. classiq/interface/generator/ansatz_library.py +5 -5
  138. classiq/interface/generator/application_apis/__init__.py +1 -0
  139. classiq/interface/generator/application_apis/arithmetic_declarations.py +17 -0
  140. classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
  141. classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
  142. classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
  143. classiq/interface/generator/application_apis/finance_declarations.py +48 -69
  144. classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
  145. classiq/interface/generator/arith/argument_utils.py +57 -6
  146. classiq/interface/generator/arith/arithmetic.py +37 -16
  147. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +15 -17
  148. classiq/interface/generator/arith/arithmetic_expression_abc.py +70 -26
  149. classiq/interface/generator/arith/arithmetic_expression_parser.py +18 -12
  150. classiq/interface/generator/arith/arithmetic_expression_validator.py +61 -43
  151. classiq/interface/generator/arith/arithmetic_operations.py +19 -16
  152. classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
  153. classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
  154. classiq/interface/generator/arith/ast_node_rewrite.py +4 -3
  155. classiq/interface/generator/arith/binary_ops.py +375 -139
  156. classiq/interface/generator/arith/endianness.py +1 -1
  157. classiq/interface/generator/arith/extremum_operations.py +96 -23
  158. classiq/interface/generator/arith/logical_ops.py +16 -12
  159. classiq/interface/generator/arith/machine_precision.py +3 -0
  160. classiq/interface/generator/arith/number_utils.py +44 -48
  161. classiq/interface/generator/arith/register_user_input.py +70 -27
  162. classiq/interface/generator/arith/unary_ops.py +57 -46
  163. classiq/interface/generator/arith/uncomputation_methods.py +1 -1
  164. classiq/interface/generator/builtin_api_builder.py +2 -9
  165. classiq/interface/generator/chemistry_function_params.py +5 -5
  166. classiq/interface/generator/circuit_code/circuit_code.py +7 -7
  167. classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
  168. classiq/interface/generator/commuting_pauli_exponentiation.py +8 -6
  169. classiq/interface/generator/compiler_keywords.py +8 -0
  170. classiq/interface/generator/complex_type.py +13 -25
  171. classiq/interface/generator/constant.py +3 -4
  172. classiq/interface/generator/control_state.py +35 -28
  173. classiq/interface/generator/copy.py +47 -0
  174. classiq/interface/generator/custom_ansatz.py +2 -5
  175. classiq/interface/generator/distance.py +3 -5
  176. classiq/interface/generator/excitations.py +3 -2
  177. classiq/interface/generator/expressions/atomic_expression_functions.py +26 -8
  178. classiq/interface/generator/expressions/enums/__init__.py +0 -10
  179. classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
  180. classiq/interface/generator/expressions/evaluated_expression.py +21 -7
  181. classiq/interface/generator/expressions/expression.py +27 -15
  182. classiq/interface/generator/expressions/expression_constants.py +9 -3
  183. classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
  184. classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
  185. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +59 -0
  186. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
  187. classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
  188. classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
  189. classiq/interface/generator/expressions/sympy_supported_expressions.py +20 -11
  190. classiq/interface/generator/finance.py +3 -3
  191. classiq/interface/generator/function_param_library.py +6 -6
  192. classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
  193. classiq/interface/generator/function_params.py +42 -69
  194. classiq/interface/generator/functions/__init__.py +0 -22
  195. classiq/interface/generator/functions/builtins/__init__.py +0 -0
  196. classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
  197. classiq/interface/generator/functions/classical_function_declaration.py +18 -9
  198. classiq/interface/generator/functions/classical_type.py +47 -166
  199. classiq/interface/generator/functions/concrete_types.py +55 -0
  200. classiq/interface/generator/functions/function_declaration.py +13 -14
  201. classiq/interface/generator/functions/port_declaration.py +1 -13
  202. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  203. classiq/interface/generator/functions/type_name.py +90 -0
  204. classiq/interface/generator/generated_circuit_data.py +155 -22
  205. classiq/interface/generator/grover_diffuser.py +32 -25
  206. classiq/interface/generator/grover_operator.py +34 -23
  207. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
  208. classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
  209. classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +12 -8
  210. classiq/interface/generator/hardware/hardware_data.py +76 -36
  211. classiq/interface/generator/hardware_efficient_ansatz.py +38 -17
  212. classiq/interface/generator/hartree_fock.py +14 -4
  213. classiq/interface/generator/identity.py +10 -6
  214. classiq/interface/generator/linear_pauli_rotations.py +33 -19
  215. classiq/interface/generator/mcmt_method.py +1 -1
  216. classiq/interface/generator/mcu.py +20 -16
  217. classiq/interface/generator/mcx.py +29 -20
  218. classiq/interface/generator/model/__init__.py +2 -5
  219. classiq/interface/generator/model/constraints.py +27 -8
  220. classiq/interface/generator/model/model.py +32 -203
  221. classiq/interface/generator/model/preferences/preferences.py +118 -43
  222. classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +27 -22
  223. classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
  224. classiq/interface/generator/oracles/custom_oracle.py +17 -13
  225. classiq/interface/generator/oracles/oracle_abc.py +9 -9
  226. classiq/interface/generator/partitioned_register.py +7 -7
  227. classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
  228. classiq/interface/generator/preferences/optimization.py +1 -2
  229. classiq/interface/generator/qpe.py +47 -34
  230. classiq/interface/generator/qsvm.py +13 -17
  231. classiq/interface/generator/quantum_function_call.py +107 -87
  232. classiq/interface/generator/{generated_circuit.py → quantum_program.py} +50 -37
  233. classiq/interface/generator/range_types.py +13 -12
  234. classiq/interface/generator/register_role.py +18 -6
  235. classiq/interface/generator/slice_parsing_utils.py +11 -6
  236. classiq/interface/generator/standard_gates/controlled_standard_gates.py +32 -39
  237. classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
  238. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  239. classiq/interface/generator/standard_gates/u_gate.py +7 -10
  240. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  241. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
  242. classiq/interface/generator/state_preparation/distributions.py +16 -15
  243. classiq/interface/generator/state_preparation/metrics.py +5 -7
  244. classiq/interface/generator/state_preparation/state_preparation.py +30 -23
  245. classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
  246. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
  247. classiq/interface/generator/transpiler_basis_gates.py +7 -3
  248. classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
  249. classiq/interface/generator/types/compilation_metadata.py +6 -0
  250. classiq/interface/generator/types/enum_declaration.py +54 -0
  251. classiq/interface/generator/types/qstruct_declaration.py +18 -0
  252. classiq/interface/generator/types/struct_declaration.py +15 -14
  253. classiq/interface/generator/ucc.py +9 -6
  254. classiq/interface/generator/unitary_gate.py +10 -6
  255. classiq/interface/generator/user_defined_function_params.py +4 -1
  256. classiq/interface/generator/validations/flow_graph.py +11 -9
  257. classiq/interface/generator/validations/validator_functions.py +8 -6
  258. classiq/interface/generator/visitor.py +23 -16
  259. classiq/interface/hardware.py +31 -10
  260. classiq/interface/helpers/classproperty.py +8 -0
  261. classiq/interface/helpers/custom_encoders.py +3 -0
  262. classiq/interface/helpers/custom_pydantic_types.py +40 -50
  263. classiq/interface/helpers/datastructures.py +26 -0
  264. classiq/interface/helpers/hashable_mixin.py +3 -2
  265. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  266. classiq/interface/helpers/pydantic_model_helpers.py +7 -11
  267. classiq/interface/helpers/validation_helpers.py +4 -21
  268. classiq/interface/helpers/versioned_model.py +1 -1
  269. classiq/interface/ide/ide_data.py +16 -20
  270. classiq/interface/ide/visual_model.py +130 -0
  271. classiq/interface/interface_version.py +1 -0
  272. classiq/interface/jobs.py +35 -6
  273. classiq/interface/model/allocate.py +16 -0
  274. classiq/interface/model/bind_operation.py +44 -14
  275. classiq/interface/model/classical_if.py +15 -0
  276. classiq/interface/model/classical_parameter_declaration.py +33 -3
  277. classiq/interface/model/control.py +45 -0
  278. classiq/interface/model/handle_binding.py +298 -20
  279. classiq/interface/model/inplace_binary_operation.py +31 -26
  280. classiq/interface/model/invert.py +12 -0
  281. classiq/interface/model/model.py +87 -73
  282. classiq/interface/model/native_function_definition.py +16 -21
  283. classiq/interface/model/parameter.py +13 -0
  284. classiq/interface/model/phase_operation.py +11 -0
  285. classiq/interface/model/port_declaration.py +27 -9
  286. classiq/interface/model/power.py +14 -0
  287. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +38 -21
  288. classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
  289. classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
  290. classiq/interface/model/quantum_function_call.py +146 -462
  291. classiq/interface/model/quantum_function_declaration.py +193 -152
  292. classiq/interface/model/quantum_lambda_function.py +65 -0
  293. classiq/interface/model/quantum_statement.py +71 -12
  294. classiq/interface/model/quantum_type.py +205 -67
  295. classiq/interface/model/quantum_variable_declaration.py +4 -26
  296. classiq/interface/model/repeat.py +15 -0
  297. classiq/interface/model/statement_block.py +58 -0
  298. classiq/interface/model/validation_handle.py +13 -6
  299. classiq/interface/model/variable_declaration_statement.py +3 -1
  300. classiq/interface/model/within_apply_operation.py +13 -0
  301. classiq/interface/pyomo_extension/pyomo_sympy_bimap.py +4 -1
  302. classiq/interface/server/global_versions.py +6 -7
  303. classiq/interface/server/routes.py +22 -21
  304. classiq/interface/source_reference.py +59 -0
  305. classiq/model_expansions/__init__.py +0 -0
  306. classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
  307. classiq/model_expansions/capturing/__init__.py +0 -0
  308. classiq/model_expansions/capturing/captured_vars.py +435 -0
  309. classiq/model_expansions/capturing/mangling_utils.py +56 -0
  310. classiq/model_expansions/closure.py +171 -0
  311. classiq/model_expansions/debug_flag.py +3 -0
  312. classiq/model_expansions/evaluators/__init__.py +0 -0
  313. classiq/model_expansions/evaluators/arg_type_match.py +158 -0
  314. classiq/model_expansions/evaluators/argument_types.py +42 -0
  315. classiq/model_expansions/evaluators/classical_expression.py +36 -0
  316. classiq/model_expansions/evaluators/control.py +144 -0
  317. classiq/model_expansions/evaluators/parameter_types.py +226 -0
  318. classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
  319. classiq/model_expansions/evaluators/type_type_match.py +90 -0
  320. classiq/model_expansions/expression_evaluator.py +135 -0
  321. classiq/model_expansions/expression_renamer.py +76 -0
  322. classiq/model_expansions/function_builder.py +247 -0
  323. classiq/model_expansions/generative_functions.py +158 -0
  324. classiq/model_expansions/interpreters/__init__.py +0 -0
  325. classiq/model_expansions/interpreters/base_interpreter.py +263 -0
  326. classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
  327. classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
  328. classiq/model_expansions/model_tables.py +18 -0
  329. classiq/model_expansions/quantum_operations/__init__.py +9 -0
  330. classiq/model_expansions/quantum_operations/bind.py +60 -0
  331. classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
  332. classiq/model_expansions/quantum_operations/classicalif.py +53 -0
  333. classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
  334. classiq/model_expansions/quantum_operations/emitter.py +181 -0
  335. classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
  336. classiq/model_expansions/quantum_operations/repeat.py +56 -0
  337. classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
  338. classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
  339. classiq/model_expansions/scope.py +240 -0
  340. classiq/model_expansions/scope_initialization.py +150 -0
  341. classiq/model_expansions/sympy_conversion/__init__.py +0 -0
  342. classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
  343. classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
  344. classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
  345. classiq/model_expansions/transformers/__init__.py +0 -0
  346. classiq/model_expansions/transformers/ast_renamer.py +26 -0
  347. classiq/model_expansions/transformers/var_splitter.py +299 -0
  348. classiq/model_expansions/utils/__init__.py +0 -0
  349. classiq/model_expansions/utils/counted_name_allocator.py +11 -0
  350. classiq/model_expansions/utils/handles_collector.py +33 -0
  351. classiq/model_expansions/visitors/__init__.py +0 -0
  352. classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
  353. classiq/model_expansions/visitors/variable_references.py +144 -0
  354. classiq/open_library/__init__.py +4 -0
  355. classiq/open_library/functions/__init__.py +130 -0
  356. classiq/open_library/functions/amplitude_estimation.py +30 -0
  357. classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
  358. classiq/open_library/functions/grover.py +157 -0
  359. classiq/open_library/functions/hea.py +115 -0
  360. classiq/open_library/functions/linear_pauli_rotation.py +82 -0
  361. classiq/open_library/functions/modular_exponentiation.py +201 -0
  362. classiq/open_library/functions/qaoa_penalty.py +117 -0
  363. classiq/open_library/functions/qft_functions.py +54 -0
  364. classiq/open_library/functions/qpe.py +46 -0
  365. classiq/open_library/functions/qsvt.py +331 -0
  366. classiq/open_library/functions/state_preparation.py +301 -0
  367. classiq/open_library/functions/swap_test.py +27 -0
  368. classiq/open_library/functions/utility_functions.py +81 -0
  369. classiq/open_library/functions/variational.py +52 -0
  370. classiq/qmod/__init__.py +17 -10
  371. classiq/qmod/builtins/__init__.py +19 -2
  372. classiq/qmod/builtins/classical_execution_primitives.py +60 -47
  373. classiq/qmod/builtins/classical_functions.py +44 -38
  374. classiq/qmod/builtins/constants.py +10 -0
  375. classiq/qmod/builtins/enums.py +208 -0
  376. classiq/qmod/builtins/functions/__init__.py +137 -0
  377. classiq/qmod/builtins/functions/allocation.py +150 -0
  378. classiq/qmod/builtins/functions/arithmetic.py +55 -0
  379. classiq/qmod/builtins/functions/benchmarking.py +8 -0
  380. classiq/qmod/builtins/functions/chemistry.py +91 -0
  381. classiq/qmod/builtins/functions/exponentiation.py +105 -0
  382. classiq/qmod/builtins/functions/finance.py +34 -0
  383. classiq/qmod/builtins/functions/operators.py +16 -0
  384. classiq/qmod/builtins/functions/qsvm.py +24 -0
  385. classiq/qmod/builtins/functions/standard_gates.py +651 -0
  386. classiq/qmod/builtins/operations.py +379 -57
  387. classiq/qmod/builtins/structs.py +103 -80
  388. classiq/qmod/cfunc.py +42 -0
  389. classiq/qmod/classical_function.py +8 -20
  390. classiq/qmod/cparam.py +64 -0
  391. classiq/qmod/create_model_function.py +56 -0
  392. classiq/qmod/declaration_inferrer.py +145 -112
  393. classiq/qmod/expression_query.py +39 -0
  394. classiq/qmod/generative.py +42 -0
  395. classiq/qmod/model_state_container.py +19 -5
  396. classiq/qmod/native/__init__.py +7 -0
  397. classiq/qmod/native/expression_to_qmod.py +194 -0
  398. classiq/qmod/native/pretty_printer.py +401 -0
  399. classiq/qmod/pretty_print/__init__.py +7 -0
  400. classiq/qmod/pretty_print/expression_to_python.py +222 -0
  401. classiq/qmod/pretty_print/pretty_printer.py +572 -0
  402. classiq/qmod/python_classical_type.py +67 -0
  403. classiq/qmod/qfunc.py +79 -0
  404. classiq/qmod/qmod_constant.py +143 -0
  405. classiq/qmod/qmod_parameter.py +84 -53
  406. classiq/qmod/qmod_variable.py +497 -100
  407. classiq/qmod/quantum_callable.py +17 -7
  408. classiq/qmod/quantum_expandable.py +278 -105
  409. classiq/qmod/quantum_function.py +232 -48
  410. classiq/qmod/semantics/__init__.py +0 -0
  411. classiq/qmod/semantics/annotation/__init__.py +0 -0
  412. classiq/qmod/semantics/annotation/call_annotation.py +92 -0
  413. classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
  414. classiq/qmod/semantics/error_manager.py +88 -0
  415. classiq/qmod/semantics/lambdas.py +25 -0
  416. classiq/qmod/semantics/static_semantics_visitor.py +384 -0
  417. classiq/qmod/semantics/validation/__init__.py +0 -0
  418. classiq/qmod/semantics/validation/constants_validation.py +16 -0
  419. classiq/qmod/semantics/validation/func_call_validation.py +99 -0
  420. classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
  421. classiq/qmod/semantics/validation/handle_validation.py +85 -0
  422. classiq/qmod/semantics/validation/main_validation.py +33 -0
  423. classiq/qmod/semantics/validation/types_validation.py +128 -0
  424. classiq/qmod/symbolic.py +178 -111
  425. classiq/qmod/symbolic_expr.py +36 -12
  426. classiq/qmod/symbolic_type.py +2 -5
  427. classiq/qmod/type_attribute_remover.py +32 -0
  428. classiq/qmod/utilities.py +108 -1
  429. classiq/qmod/write_qmod.py +53 -0
  430. classiq/synthesis.py +210 -22
  431. {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/METADATA +16 -8
  432. classiq-0.65.3.dist-info/RECORD +521 -0
  433. {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/WHEEL +1 -1
  434. classiq/_internals/_qfunc_ext.py +0 -6
  435. classiq/applications/benchmarking/__init__.py +0 -9
  436. classiq/applications/benchmarking/mirror_benchmarking.py +0 -67
  437. classiq/applications/numpy_utils.py +0 -37
  438. classiq/applications_model_constructors/__init__.py +0 -17
  439. classiq/applications_model_constructors/combinatorial_optimization_model_constructor.py +0 -178
  440. classiq/applications_model_constructors/grover_model_constructor.py +0 -227
  441. classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
  442. classiq/applications_model_constructors/libraries/qmci_library.py +0 -109
  443. classiq/builtin_functions/__init__.py +0 -43
  444. classiq/builtin_functions/amplitude_loading.py +0 -3
  445. classiq/builtin_functions/binary_ops.py +0 -1
  446. classiq/builtin_functions/exponentiation.py +0 -5
  447. classiq/builtin_functions/qpe.py +0 -4
  448. classiq/builtin_functions/qsvm.py +0 -7
  449. classiq/builtin_functions/range_types.py +0 -5
  450. classiq/builtin_functions/standard_gates.py +0 -1
  451. classiq/builtin_functions/state_preparation.py +0 -6
  452. classiq/builtin_functions/suzuki_trotter.py +0 -3
  453. classiq/exceptions.py +0 -131
  454. classiq/interface/executor/aws_execution_cost.py +0 -72
  455. classiq/interface/executor/error_mitigation.py +0 -6
  456. classiq/interface/generator/credit_risk_example/linear_gci.py +0 -115
  457. classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -59
  458. classiq/interface/generator/expressions/enums/chemistry.py +0 -28
  459. classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
  460. classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
  461. classiq/interface/generator/expressions/enums/optimizers.py +0 -9
  462. classiq/interface/generator/expressions/enums/pauli.py +0 -8
  463. classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
  464. classiq/interface/generator/expressions/qmod_qnum_proxy.py +0 -22
  465. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
  466. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
  467. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
  468. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -862
  469. classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -169
  470. classiq/interface/generator/functions/foreign_function_definition.py +0 -106
  471. classiq/interface/generator/functions/function_implementation.py +0 -103
  472. classiq/interface/generator/functions/native_function_definition.py +0 -153
  473. classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
  474. classiq/interface/generator/functions/register.py +0 -42
  475. classiq/interface/generator/functions/register_mapping_data.py +0 -102
  476. classiq/interface/generator/inequality_mixer.py +0 -51
  477. classiq/interface/generator/model/classical_main_validator.py +0 -106
  478. classiq/interface/generator/range_mixer.py +0 -56
  479. classiq/interface/generator/state_propagator.py +0 -63
  480. classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -2
  481. classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
  482. classiq/interface/generator/types/builtin_struct_declarations/qaoa_declarations.py +0 -23
  483. classiq/interface/generator/types/combinatorial_problem.py +0 -26
  484. classiq/interface/ide/show.py +0 -34
  485. classiq/interface/model/common_model_types.py +0 -23
  486. classiq/interface/model/numeric_reinterpretation.py +0 -25
  487. classiq/interface/model/operator_synthesis_data.py +0 -48
  488. classiq/interface/model/quantum_expressions/control_state.py +0 -38
  489. classiq/interface/model/quantum_if_operation.py +0 -95
  490. classiq/interface/model/resolvers/function_call_resolver.py +0 -43
  491. classiq/interface/model/validations/handle_validation_base.py +0 -55
  492. classiq/interface/model/validations/handles_validator.py +0 -154
  493. classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
  494. classiq/model/__init__.py +0 -14
  495. classiq/model/composite_function_generator.py +0 -33
  496. classiq/model/function_handler.py +0 -466
  497. classiq/model/function_handler.pyi +0 -152
  498. classiq/model/logic_flow.py +0 -149
  499. classiq/model/logic_flow_change_handler.py +0 -71
  500. classiq/model/model.py +0 -246
  501. classiq/qmod/builtins/functions.py +0 -896
  502. classiq/qmod/qmod_struct.py +0 -37
  503. classiq/quantum_functions/__init__.py +0 -17
  504. classiq/quantum_functions/annotation_parser.py +0 -207
  505. classiq/quantum_functions/decorators.py +0 -22
  506. classiq/quantum_functions/function_library.py +0 -181
  507. classiq/quantum_functions/function_parser.py +0 -74
  508. classiq/quantum_functions/quantum_function.py +0 -236
  509. classiq-0.37.1.dist-info/RECORD +0 -418
  510. /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers}/__init__.py +0 -0
  511. /classiq/{interface/generator/credit_risk_example → applications/combinatorial_helpers/arithmetic}/__init__.py +0 -0
  512. /classiq/{interface/generator/functions/core_lib_declarations → applications/combinatorial_helpers/pauli_helpers}/__init__.py +0 -0
  513. /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → applications/combinatorial_helpers/py.typed} +0 -0
  514. /classiq/{interface/model/resolvers → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
  515. /classiq/{interface/model/validations → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
  516. /classiq/{_internals → interface}/enum_utils.py +0 -0
@@ -1,10 +0,0 @@
1
- from enum import EnumMeta
2
-
3
- from .chemistry import Element, FermionMapping
4
- from .finance_functions import FinanceFunctionType
5
- from .ladder_operator import LadderOperator
6
- from .optimizers import Optimizer
7
- from .pauli import Pauli
8
- from .qsvm_feature_map_entanglement import QSVMFeatureMapEntanglement
9
-
10
- BUILTIN_ENUMS = dict(filter(lambda pair: isinstance(pair[1], EnumMeta), vars().items()))
@@ -1,22 +1,12 @@
1
- from typing import Dict
2
-
3
- from classiq.interface.generator.expressions.enums.classical_enum import ClassicalEnum
4
-
5
-
6
- class FinanceFunctionType(ClassicalEnum):
7
- VAR = 0
8
- SHORTFALL = 1
9
- X_SQUARE = 2
10
- EUROPEAN_CALL_OPTION = 3
11
-
12
- @staticmethod
13
- def from_string(func_str: str) -> "FinanceFunctionType":
14
- return FINANCE_FUNCTION_STRING[func_str]
15
-
16
-
17
- FINANCE_FUNCTION_STRING: Dict[str, FinanceFunctionType] = {
18
- "var": FinanceFunctionType.VAR,
19
- "expected shortfall": FinanceFunctionType.SHORTFALL,
20
- "x**2": FinanceFunctionType.X_SQUARE,
21
- "european call option": FinanceFunctionType.EUROPEAN_CALL_OPTION,
22
- }
1
+ from classiq.interface.generator.types.builtin_enum_declarations import (
2
+ FinanceFunctionType,
3
+ )
4
+
5
+
6
+ def get_finance_function_dict() -> dict[str, "FinanceFunctionType"]:
7
+ return {
8
+ "var": FinanceFunctionType.VAR,
9
+ "expected shortfall": FinanceFunctionType.SHORTFALL,
10
+ "x**2": FinanceFunctionType.X_SQUARE,
11
+ "european call option": FinanceFunctionType.EUROPEAN_CALL_OPTION,
12
+ }
@@ -1,8 +1,13 @@
1
+ import re
2
+ from collections.abc import Mapping
1
3
  from dataclasses import dataclass
2
- from typing import Any, Mapping, Type
4
+ from typing import Any, Optional
3
5
 
6
+ from sympy import Expr
4
7
  from typing_extensions import get_args
5
8
 
9
+ from classiq.interface.backend.pydantic_backend import EXECUTION_PARAMETER_PATTERN
10
+ from classiq.interface.exceptions import ClassiqValueError
6
11
  from classiq.interface.generator.expressions.expression_types import (
7
12
  ExpressionValue,
8
13
  QmodStructInstance,
@@ -10,22 +15,25 @@ from classiq.interface.generator.expressions.expression_types import (
10
15
  )
11
16
  from classiq.interface.generator.expressions.handle_identifier import HandleIdentifier
12
17
 
13
- from classiq.exceptions import ClassiqValueError
14
-
15
18
 
16
19
  @dataclass(frozen=True)
17
20
  class EvaluatedExpression:
18
21
  value: ExpressionValue
19
22
 
20
- def is_constant(self) -> bool:
23
+ def is_constant(self, constant_type: Optional[type] = None) -> bool:
21
24
  if self.value is None:
22
25
  return False
23
26
 
24
- return isinstance(self.value, get_args(RuntimeConstant))
27
+ return isinstance(
28
+ self.value,
29
+ get_args(RuntimeConstant) if constant_type is None else constant_type,
30
+ )
25
31
 
26
- def as_constant_type(self, constant_type: Type) -> Any:
32
+ def as_constant_type(self, constant_type: type) -> Any:
27
33
  if not self.is_constant():
28
- raise ClassiqValueError(f"Invalid access to expression as {constant_type}")
34
+ raise ClassiqValueError(
35
+ f"Invalid access to expression {self.value!r} as {constant_type}"
36
+ )
29
37
 
30
38
  return constant_type(self.value)
31
39
 
@@ -62,3 +70,9 @@ class EvaluatedExpression:
62
70
  raise ClassiqValueError("Invalid access to unevaluated expression")
63
71
 
64
72
  return str(self.value)
73
+
74
+ def is_identifier(self) -> bool:
75
+ return (
76
+ isinstance(self.value, Expr)
77
+ and re.fullmatch(EXECUTION_PARAMETER_PATTERN, str(self.value)) is not None
78
+ )
@@ -1,14 +1,17 @@
1
1
  import ast
2
- from typing import Any, Mapping, Optional, Type
2
+ from collections.abc import Mapping
3
+ from typing import Any, Optional
3
4
 
4
5
  import pydantic
5
- from pydantic import PrivateAttr
6
+ from pydantic import ConfigDict, PrivateAttr
6
7
 
8
+ from classiq.interface.ast_node import HashableASTNode
9
+ from classiq.interface.exceptions import ClassiqError
7
10
  from classiq.interface.generator.arith.arithmetic_expression_validator import (
8
11
  DEFAULT_SUPPORTED_FUNC_NAMES,
9
12
  )
10
13
  from classiq.interface.generator.expressions.atomic_expression_functions import (
11
- SUPPORTED_ATOMIC_EXPRESSION_FUNCTIONS,
14
+ SUPPORTED_ATOMIC_EXPRESSION_FUNCTIONS_QMOD,
12
15
  )
13
16
  from classiq.interface.generator.expressions.evaluated_expression import (
14
17
  EvaluatedExpression,
@@ -17,14 +20,9 @@ from classiq.interface.generator.expressions.sympy_supported_expressions import
17
20
  SYMPY_SUPPORTED_EXPRESSIONS,
18
21
  )
19
22
  from classiq.interface.generator.function_params import validate_expression_str
20
- from classiq.interface.helpers.hashable_pydantic_base_model import (
21
- HashablePydanticBaseModel,
22
- )
23
-
24
- from classiq.exceptions import ClassiqError
25
23
 
26
24
 
27
- class Expression(HashablePydanticBaseModel):
25
+ class Expression(HashableASTNode):
28
26
  expr: str
29
27
  _evaluated_expr: Optional[EvaluatedExpression] = PrivateAttr(default=None)
30
28
 
@@ -33,20 +31,27 @@ class Expression(HashablePydanticBaseModel):
33
31
 
34
32
  self._try_to_immediate_evaluate()
35
33
 
36
- @pydantic.validator("expr")
34
+ @pydantic.field_validator("expr")
35
+ @classmethod
37
36
  def validate_expression(cls, expr: str) -> str:
38
37
  supported_functions = (
39
- SUPPORTED_ATOMIC_EXPRESSION_FUNCTIONS
38
+ SUPPORTED_ATOMIC_EXPRESSION_FUNCTIONS_QMOD
40
39
  | set(SYMPY_SUPPORTED_EXPRESSIONS)
41
40
  | set(DEFAULT_SUPPORTED_FUNC_NAMES)
42
41
  )
43
42
  validate_expression_str(expr, supported_functions=supported_functions)
44
43
  return expr
45
44
 
45
+ @pydantic.field_validator("expr")
46
+ @classmethod
47
+ def format_expression(cls, expr: str) -> str:
48
+ expr = ast.unparse(ast.parse(expr))
49
+ return expr
50
+
46
51
  def is_evaluated(self) -> bool:
47
52
  return self._evaluated_expr is not None
48
53
 
49
- def as_constant(self, constant_type: Type) -> Any:
54
+ def as_constant(self, constant_type: type) -> Any:
50
55
  return self.value.as_constant_type(constant_type)
51
56
 
52
57
  def to_int_value(self) -> int:
@@ -65,11 +70,19 @@ class Expression(HashablePydanticBaseModel):
65
70
  return self.as_constant(list)
66
71
 
67
72
  def _try_to_immediate_evaluate(self) -> None:
73
+ # FIXME remove special treatment (CAD-22999)
74
+ if self.expr == "SIGNED":
75
+ self._evaluated_expr = EvaluatedExpression(value=True)
76
+ return
77
+ if self.expr == "UNSIGNED":
78
+ self._evaluated_expr = EvaluatedExpression(value=False)
79
+ return
80
+
68
81
  try:
69
82
  result = ast.literal_eval(self.expr)
70
83
  if isinstance(result, (int, float, bool)):
71
84
  self._evaluated_expr = EvaluatedExpression(value=result)
72
- except Exception: # nosec B110
85
+ except Exception: # noqa: S110
73
86
  pass
74
87
 
75
88
  @property
@@ -85,8 +98,7 @@ class Expression(HashablePydanticBaseModel):
85
98
  def is_constant(self) -> bool:
86
99
  return self.value.is_constant()
87
100
 
88
- class Config:
89
- frozen = True
101
+ model_config = ConfigDict(frozen=True)
90
102
 
91
103
  def __str__(self) -> str:
92
104
  return self.expr
@@ -1,5 +1,5 @@
1
1
  import keyword
2
- from typing import Set
2
+ from typing import Final
3
3
 
4
4
  from classiq.interface.generator.arith.arithmetic_expression_parser import (
5
5
  DEFAULT_SUPPORTED_FUNC_NAMES,
@@ -11,9 +11,15 @@ from classiq.interface.generator.function_params import NAME_REGEX
11
11
 
12
12
  SUPPORTED_VAR_NAMES_REG = NAME_REGEX
13
13
 
14
- SUPPORTED_FUNC_NAMES: Set[str] = (
14
+ SUPPORTED_FUNC_NAMES: set[str] = (
15
15
  {"or", "and"}
16
16
  .union(DEFAULT_SUPPORTED_FUNC_NAMES)
17
17
  .union(set(SYMPY_SUPPORTED_EXPRESSIONS))
18
18
  )
19
- FORBIDDEN_LITERALS: Set[str] = set(keyword.kwlist) - SUPPORTED_FUNC_NAMES
19
+ BOOLEAN_LITERALS = {"True", "False"}
20
+ FORBIDDEN_LITERALS: set[str] = set(keyword.kwlist) - SUPPORTED_FUNC_NAMES
21
+ CPARAM_EXECUTION_SUFFIX: Final[str] = "_param"
22
+ RESERVED_EXPRESSIONS: frozenset[str] = frozenset({"i"})
23
+ CPARAM_EXECUTION_SUFFIX_PATTERN = (
24
+ rf"({CPARAM_EXECUTION_SUFFIX}|^({'|'.join(RESERVED_EXPRESSIONS)}))(_\d+)*$"
25
+ )
@@ -0,0 +1,119 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any, NoReturn
4
+
5
+ from classiq.interface.exceptions import ClassiqArithmeticError
6
+
7
+
8
+ class NonSymbolicExpr:
9
+ @property
10
+ def type_name(self) -> str:
11
+ raise NotImplementedError
12
+
13
+ @staticmethod
14
+ def _raise_error(type_name: str, op: str) -> NoReturn:
15
+ raise ClassiqArithmeticError(
16
+ f"Unsupported operand type for {op!r}: {type_name}"
17
+ )
18
+
19
+ def __add__(self, other: Any) -> NoReturn:
20
+ NonSymbolicExpr._raise_error(self.type_name, "+")
21
+
22
+ def __sub__(self, other: Any) -> NoReturn:
23
+ NonSymbolicExpr._raise_error(self.type_name, "-")
24
+
25
+ def __mul__(self, other: Any) -> NoReturn:
26
+ NonSymbolicExpr._raise_error(self.type_name, "*")
27
+
28
+ def __truediv__(self, other: Any) -> NoReturn:
29
+ NonSymbolicExpr._raise_error(self.type_name, "/")
30
+
31
+ def __floordiv__(self, other: Any) -> NoReturn:
32
+ NonSymbolicExpr._raise_error(self.type_name, "//")
33
+
34
+ def __mod__(self, other: Any) -> NoReturn:
35
+ NonSymbolicExpr._raise_error(self.type_name, "%")
36
+
37
+ def __pow__(self, other: Any) -> NoReturn:
38
+ NonSymbolicExpr._raise_error(self.type_name, "**")
39
+
40
+ def __lshift__(self, other: Any) -> NoReturn:
41
+ NonSymbolicExpr._raise_error(self.type_name, "<<")
42
+
43
+ def __rshift__(self, other: Any) -> NoReturn:
44
+ NonSymbolicExpr._raise_error(self.type_name, ">>")
45
+
46
+ def __and__(self, other: Any) -> NoReturn:
47
+ NonSymbolicExpr._raise_error(self.type_name, "&")
48
+
49
+ def __xor__(self, other: Any) -> NoReturn:
50
+ NonSymbolicExpr._raise_error(self.type_name, "^")
51
+
52
+ def __or__(self, other: Any) -> NoReturn:
53
+ NonSymbolicExpr._raise_error(self.type_name, "|")
54
+
55
+ def __radd__(self, other: Any) -> NoReturn:
56
+ NonSymbolicExpr._raise_error(self.type_name, "+")
57
+
58
+ def __rsub__(self, other: Any) -> NoReturn:
59
+ NonSymbolicExpr._raise_error(self.type_name, "-")
60
+
61
+ def __rmul__(self, other: Any) -> NoReturn:
62
+ NonSymbolicExpr._raise_error(self.type_name, "*")
63
+
64
+ def __rtruediv__(self, other: Any) -> NoReturn:
65
+ NonSymbolicExpr._raise_error(self.type_name, "/")
66
+
67
+ def __rfloordiv__(self, other: Any) -> NoReturn:
68
+ NonSymbolicExpr._raise_error(self.type_name, "//")
69
+
70
+ def __rmod__(self, other: Any) -> NoReturn:
71
+ NonSymbolicExpr._raise_error(self.type_name, "%")
72
+
73
+ def __rpow__(self, other: Any) -> NoReturn:
74
+ NonSymbolicExpr._raise_error(self.type_name, "**")
75
+
76
+ def __rlshift__(self, other: Any) -> NoReturn:
77
+ NonSymbolicExpr._raise_error(self.type_name, "<<")
78
+
79
+ def __rrshift__(self, other: Any) -> NoReturn:
80
+ NonSymbolicExpr._raise_error(self.type_name, ">>")
81
+
82
+ def __rand__(self, other: Any) -> NoReturn:
83
+ NonSymbolicExpr._raise_error(self.type_name, "&")
84
+
85
+ def __rxor__(self, other: Any) -> NoReturn:
86
+ NonSymbolicExpr._raise_error(self.type_name, "^")
87
+
88
+ def __ror__(self, other: Any) -> NoReturn:
89
+ NonSymbolicExpr._raise_error(self.type_name, "|")
90
+
91
+ def __lt__(self, other: Any) -> NoReturn:
92
+ NonSymbolicExpr._raise_error(self.type_name, "<")
93
+
94
+ def __le__(self, other: Any) -> NoReturn:
95
+ NonSymbolicExpr._raise_error(self.type_name, "<=")
96
+
97
+ def __eq__(self, other: Any) -> NoReturn:
98
+ NonSymbolicExpr._raise_error(self.type_name, "==")
99
+
100
+ def __ne__(self, other: Any) -> NoReturn:
101
+ NonSymbolicExpr._raise_error(self.type_name, "!=")
102
+
103
+ def __gt__(self, other: Any) -> NoReturn:
104
+ NonSymbolicExpr._raise_error(self.type_name, ">")
105
+
106
+ def __ge__(self, other: Any) -> NoReturn:
107
+ NonSymbolicExpr._raise_error(self.type_name, ">=")
108
+
109
+ def __neg__(self) -> NoReturn:
110
+ NonSymbolicExpr._raise_error(self.type_name, "-")
111
+
112
+ def __pos__(self) -> NoReturn:
113
+ NonSymbolicExpr._raise_error(self.type_name, "+")
114
+
115
+ def __abs__(self) -> NoReturn:
116
+ NonSymbolicExpr._raise_error(self.type_name, "abs")
117
+
118
+ def __invert__(self) -> NoReturn:
119
+ NonSymbolicExpr._raise_error(self.type_name, "~")
@@ -0,0 +1,99 @@
1
+ from collections.abc import Mapping
2
+ from typing import TYPE_CHECKING, Any, Union
3
+
4
+ from sympy import Integer
5
+
6
+ from classiq.interface.exceptions import (
7
+ ClassiqInternalExpansionError,
8
+ ClassiqValueError,
9
+ )
10
+ from classiq.interface.generator.expressions.expression import Expression
11
+ from classiq.interface.generator.expressions.non_symbolic_expr import NonSymbolicExpr
12
+ from classiq.interface.generator.expressions.qmod_sized_proxy import QmodSizedProxy
13
+ from classiq.interface.model.handle_binding import (
14
+ HandleBinding,
15
+ SlicedHandleBinding,
16
+ SubscriptHandleBinding,
17
+ )
18
+
19
+ if TYPE_CHECKING:
20
+ from classiq.interface.model.quantum_type import QuantumType
21
+
22
+
23
+ ILLEGAL_SLICING_STEP_MSG = "Slicing with a step of a quantum variable is not supported"
24
+ ILLEGAL_SLICE_MSG = "Quantum array slice must be of the form [<int-value>:<int-value>]."
25
+
26
+
27
+ class QmodQArrayProxy(NonSymbolicExpr, QmodSizedProxy):
28
+ def __init__(
29
+ self,
30
+ handle: HandleBinding,
31
+ element_type: "QuantumType",
32
+ element_size: int,
33
+ length: int,
34
+ ) -> None:
35
+ super().__init__(handle, element_size * length)
36
+ self._length = length
37
+ self._element_type = element_type
38
+ self._element_size = element_size
39
+
40
+ def __getitem__(self, key: Union[slice, int, Integer]) -> "QmodSizedProxy":
41
+ return (
42
+ self._get_slice(key) if isinstance(key, slice) else self._get_subscript(key)
43
+ )
44
+
45
+ def _get_subscript(self, index: Union[int, Integer]) -> "QmodSizedProxy":
46
+ if isinstance(index, Integer):
47
+ index = int(index)
48
+ if index < 0 or index >= self._length:
49
+ raise ClassiqInternalExpansionError
50
+
51
+ return self._element_type.get_proxy(
52
+ SubscriptHandleBinding(
53
+ base_handle=self.handle,
54
+ index=Expression(expr=str(index)),
55
+ )
56
+ )
57
+
58
+ def _get_slice(self, slice_: slice) -> "QmodSizedProxy":
59
+ if slice_.step is not None:
60
+ raise ClassiqValueError(ILLEGAL_SLICING_STEP_MSG)
61
+ if isinstance(slice_.start, Integer):
62
+ slice_ = slice(int(slice_.start), slice_.stop)
63
+ if isinstance(slice_.stop, Integer):
64
+ slice_ = slice(slice_.start, int(slice_.stop))
65
+ if not isinstance(slice_.start, int) or not isinstance(slice_.stop, int):
66
+ raise ClassiqValueError(ILLEGAL_SLICE_MSG)
67
+ if (
68
+ slice_.start >= slice_.stop
69
+ or slice_.start < 0
70
+ or slice_.stop > self._length
71
+ ):
72
+ raise ClassiqInternalExpansionError
73
+
74
+ return QmodQArrayProxy(
75
+ SlicedHandleBinding(
76
+ base_handle=self.handle,
77
+ start=Expression(expr=str(slice_.start)),
78
+ end=Expression(expr=str(slice_.stop)),
79
+ ),
80
+ self._element_type,
81
+ self._element_size,
82
+ slice_.stop - slice_.start,
83
+ )
84
+
85
+ @property
86
+ def type_name(self) -> str:
87
+ return "Quantum array"
88
+
89
+ @property
90
+ def len(self) -> int:
91
+ return self._length
92
+
93
+ @property
94
+ def fields(self) -> Mapping[str, Any]:
95
+ return {**super().fields, "len": self.len}
96
+
97
+ @property
98
+ def size(self) -> int:
99
+ return self.len * self._element_size
@@ -0,0 +1,59 @@
1
+ from collections.abc import Mapping
2
+ from typing import Any
3
+
4
+ from sympy import Symbol
5
+
6
+ from classiq.interface.exceptions import ClassiqValueError
7
+ from classiq.interface.generator.expressions.qmod_sized_proxy import QmodSizedProxy
8
+ from classiq.interface.model.handle_binding import HandleBinding
9
+
10
+
11
+ class QmodQScalarProxy(Symbol, QmodSizedProxy):
12
+ def __new__(cls, handle: HandleBinding, **assumptions: bool) -> "QmodQScalarProxy":
13
+ return super().__new__(cls, str(handle), **assumptions)
14
+
15
+ def __init__(self, handle: HandleBinding, size: int) -> None:
16
+ super().__init__(handle, size)
17
+
18
+
19
+ class QmodQBitProxy(QmodQScalarProxy):
20
+ def __init__(self, handle: HandleBinding) -> None:
21
+ super().__init__(handle, 1)
22
+
23
+ @property
24
+ def type_name(self) -> str:
25
+ return "Quantum bit"
26
+
27
+
28
+ class QmodQNumProxy(QmodQScalarProxy):
29
+ def __init__(
30
+ self, handle: HandleBinding, size: int, fraction_digits: int, is_signed: bool
31
+ ) -> None:
32
+ super().__init__(handle, size)
33
+ if fraction_digits > size:
34
+ raise ClassiqValueError(
35
+ f"Quantum numeric of size {size} cannot have {fraction_digits} "
36
+ f"fraction digits"
37
+ )
38
+ self._fraction_digits = fraction_digits
39
+ self._is_signed = is_signed
40
+
41
+ @property
42
+ def type_name(self) -> str:
43
+ return "Quantum numeric"
44
+
45
+ @property
46
+ def fraction_digits(self) -> int:
47
+ return self._fraction_digits
48
+
49
+ @property
50
+ def is_signed(self) -> bool:
51
+ return self._is_signed
52
+
53
+ @property
54
+ def fields(self) -> Mapping[str, Any]:
55
+ return {
56
+ **super().fields,
57
+ "is_signed": self.is_signed,
58
+ "fraction_digits": self.fraction_digits,
59
+ }
@@ -0,0 +1,36 @@
1
+ from collections.abc import Mapping
2
+ from typing import TYPE_CHECKING
3
+
4
+ from classiq.interface.generator.expressions.non_symbolic_expr import NonSymbolicExpr
5
+ from classiq.interface.generator.expressions.qmod_sized_proxy import QmodSizedProxy
6
+ from classiq.interface.model.handle_binding import (
7
+ FieldHandleBinding,
8
+ HandleBinding,
9
+ )
10
+
11
+ if TYPE_CHECKING:
12
+ from classiq.interface.model.quantum_type import QuantumType
13
+
14
+
15
+ class QmodQStructProxy(NonSymbolicExpr, QmodSizedProxy):
16
+ def __init__(
17
+ self,
18
+ handle: HandleBinding,
19
+ struct_name: str,
20
+ fields: Mapping[str, "QuantumType"],
21
+ ) -> None:
22
+ self._fields = {
23
+ name: type_.get_proxy(FieldHandleBinding(base_handle=handle, field=name))
24
+ for name, type_ in fields.items()
25
+ }
26
+ size = sum(proxy.size for proxy in self._fields.values())
27
+ super().__init__(handle, size)
28
+ self._struct_name = struct_name
29
+
30
+ @property
31
+ def type_name(self) -> str:
32
+ return self._struct_name
33
+
34
+ @property
35
+ def fields(self) -> Mapping[str, QmodSizedProxy]:
36
+ return {**super().fields, **self._fields}
@@ -1,6 +1,34 @@
1
+ from collections.abc import Mapping
2
+ from typing import TYPE_CHECKING, Any
3
+
4
+ if TYPE_CHECKING:
5
+ from classiq.interface.model.handle_binding import HandleBinding
6
+
7
+
1
8
  class QmodSizedProxy:
2
- def __init__(self, size: int) -> None:
9
+ def __init__(self, handle: "HandleBinding", size: int) -> None:
10
+ self._handle = handle
3
11
  self._size = size
4
12
 
5
- def __len__(self) -> int:
13
+ @property
14
+ def size(self) -> int:
6
15
  return self._size
16
+
17
+ def __str__(self) -> str:
18
+ return str(self.handle)
19
+
20
+ @property
21
+ def type_name(self) -> str:
22
+ raise NotImplementedError
23
+
24
+ @property
25
+ def handle(self) -> "HandleBinding":
26
+ return self._handle
27
+
28
+ @property
29
+ def len(self) -> int:
30
+ return self._size
31
+
32
+ @property
33
+ def fields(self) -> Mapping[str, Any]:
34
+ return {"size": self._size}
@@ -1,5 +1,6 @@
1
1
  import types
2
- from typing import TYPE_CHECKING, Any, Mapping
2
+ from collections.abc import Mapping
3
+ from typing import TYPE_CHECKING, Any
3
4
 
4
5
  if TYPE_CHECKING:
5
6
  from classiq.interface.generator.expressions.expression_types import ExpressionValue
@@ -16,9 +17,20 @@ class QmodStructInstance:
16
17
  self.struct_declaration = struct_declaration
17
18
  self._fields = fields
18
19
 
20
+ @property
21
+ def type_name(self) -> str:
22
+ return f"Struct {self.struct_declaration.name}"
23
+
19
24
  @property
20
25
  def fields(self) -> Mapping[str, Any]:
21
26
  return types.MappingProxyType(self._fields)
22
27
 
28
+ def __str__(self) -> str:
29
+ return repr(self)
30
+
23
31
  def __repr__(self) -> str:
24
- return repr(self._fields)
32
+ fields = ", ".join(
33
+ f"{field_name}={field_value}"
34
+ for field_name, field_value in self._fields.items()
35
+ )
36
+ return f"{self.struct_declaration.name}({fields})"
@@ -1,7 +1,5 @@
1
- from typing import List
2
-
3
- BASIC_ARITHMETIC_OPERATORS: List[str] = ["+", "-", "*", "/", "%"]
4
- MATHEMATICAL_FUNCTIONS: List[str] = [
1
+ BASIC_ARITHMETIC_OPERATORS: list[str] = ["+", "-", "*", "/", "%"]
2
+ MATHEMATICAL_FUNCTIONS: list[str] = [
5
3
  "sin",
6
4
  "cos",
7
5
  "tan",
@@ -34,8 +32,9 @@ MATHEMATICAL_FUNCTIONS: List[str] = [
34
32
  "ceiling",
35
33
  "Max",
36
34
  "Min",
35
+ "mod_inverse",
37
36
  ]
38
- SPECIAL_FUNCTIONS: List[str] = [
37
+ SPECIAL_FUNCTIONS: list[str] = [
39
38
  "erf",
40
39
  "erfc",
41
40
  "gamma",
@@ -56,10 +55,20 @@ SPECIAL_FUNCTIONS: List[str] = [
56
55
  "euler",
57
56
  "catalan",
58
57
  ]
59
- PIECEWISE_FUNCTIONS: List[str] = ["Piecewise", "Heaviside"]
60
- CONSTANTS: List[str] = ["pi", "E", "I", "GoldenRatio", "EulerGamma", "Catalan"]
61
- DATA_TYPES: List[str] = ["Matrix"]
62
- LOGIC_OPERATORS: List[str] = [
58
+ PIECEWISE_FUNCTIONS: list[str] = ["Piecewise", "Heaviside"]
59
+ NUMERIC_CONSTANTS: list[str] = [
60
+ "pi",
61
+ "E",
62
+ "I",
63
+ "GoldenRatio",
64
+ "EulerGamma",
65
+ "Catalan",
66
+ ]
67
+ BOOLEAN_CONSTANTS: list[str] = ["true", "false"]
68
+ CONSTANTS: list[str] = NUMERIC_CONSTANTS + BOOLEAN_CONSTANTS
69
+
70
+ DATA_TYPES: list[str] = ["Matrix"]
71
+ LOGIC_OPERATORS: list[str] = [
63
72
  "And",
64
73
  "Or",
65
74
  "Not",
@@ -69,9 +78,9 @@ LOGIC_OPERATORS: List[str] = [
69
78
  "Nand",
70
79
  "Nor",
71
80
  ]
72
- RELATIONAL_OPERATORS: List[str] = ["<", "<=", ">", ">=", "!=", "<>", "Eq"]
81
+ RELATIONAL_OPERATORS: list[str] = ["<", "<=", ">", ">=", "!=", "<>", "Eq", "Ne"]
73
82
 
74
- SYMPY_SUPPORTED_EXPRESSIONS: List[str] = (
83
+ SYMPY_SUPPORTED_EXPRESSIONS: list[str] = (
75
84
  BASIC_ARITHMETIC_OPERATORS
76
85
  + MATHEMATICAL_FUNCTIONS
77
86
  + SPECIAL_FUNCTIONS