classiq 0.38.0__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 (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.3.dist-info}/METADATA +16 -9
  414. classiq-0.65.3.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.3.dist-info}/WHEEL +0 -0
@@ -1,22 +1,19 @@
1
- from typing import Dict, Tuple
2
-
3
1
  from typing_extensions import TypeAlias
4
2
 
3
+ from classiq.interface.enum_utils import StrEnum
5
4
  from classiq.interface.executor.quantum_instruction_set import QuantumInstructionSet
6
5
  from classiq.interface.generator.model.preferences.preferences import QuantumFormat
7
6
  from classiq.interface.hardware import Provider
8
7
 
9
- from classiq._internals.enum_utils import StrEnum
10
-
11
8
  Code: TypeAlias = str
12
- CodeAndSyntax: TypeAlias = Tuple[Code, QuantumInstructionSet]
9
+ CodeAndSyntax: TypeAlias = tuple[Code, QuantumInstructionSet]
13
10
 
14
- INSTRUCTION_SET_TO_FORMAT: Dict[QuantumInstructionSet, QuantumFormat] = {
11
+ INSTRUCTION_SET_TO_FORMAT: dict[QuantumInstructionSet, QuantumFormat] = {
15
12
  QuantumInstructionSet.QASM: QuantumFormat.QASM,
16
13
  QuantumInstructionSet.QSHARP: QuantumFormat.QSHARP,
17
14
  QuantumInstructionSet.IONQ: QuantumFormat.IONQ,
18
15
  }
19
- VENDOR_TO_INSTRUCTION_SET: Dict[Provider, QuantumInstructionSet] = {
16
+ VENDOR_TO_INSTRUCTION_SET: dict[Provider, QuantumInstructionSet] = {
20
17
  Provider.CLASSIQ: QuantumInstructionSet.QASM,
21
18
  Provider.IONQ: QuantumInstructionSet.IONQ,
22
19
  Provider.AZURE_QUANTUM: QuantumInstructionSet.QSHARP,
@@ -2,15 +2,14 @@ import pydantic
2
2
 
3
3
  from classiq.interface.chemistry import operator
4
4
  from classiq.interface.chemistry.operator import PauliOperator
5
+ from classiq.interface.exceptions import ClassiqValueError
5
6
  from classiq.interface.generator.arith.register_user_input import RegisterUserInput
6
7
  from classiq.interface.generator.function_params import (
7
8
  DEFAULT_INPUT_NAME,
8
9
  DEFAULT_OUTPUT_NAME,
9
10
  FunctionParams,
11
+ FunctionParamsNumericParameter,
10
12
  )
11
- from classiq.interface.generator.parameters import ParameterFloatType
12
-
13
- from classiq.exceptions import ClassiqValueError
14
13
 
15
14
 
16
15
  class CommutingPauliExponentiation(FunctionParams):
@@ -21,17 +20,18 @@ class CommutingPauliExponentiation(FunctionParams):
21
20
  pauli_operator: PauliOperator = pydantic.Field(
22
21
  description="A weighted sum of Pauli strings."
23
22
  )
24
- evolution_coefficient: ParameterFloatType = pydantic.Field(
23
+ evolution_coefficient: FunctionParamsNumericParameter = pydantic.Field(
25
24
  default=1.0,
26
25
  description="A global coefficient multiplying the operator.",
27
- is_exec_param=True,
28
26
  )
29
27
 
30
- @pydantic.validator("pauli_operator")
28
+ @pydantic.field_validator("pauli_operator")
29
+ @classmethod
31
30
  def _validate_is_hermitian(cls, pauli_operator: PauliOperator) -> PauliOperator:
32
31
  return operator.validate_operator_is_hermitian(pauli_operator)
33
32
 
34
- @pydantic.validator("pauli_operator")
33
+ @pydantic.field_validator("pauli_operator")
34
+ @classmethod
35
35
  def _validate_paulis_commute(cls, pauli_operator: PauliOperator) -> PauliOperator:
36
36
  if not pauli_operator.is_commutative:
37
37
  raise ClassiqValueError("Pauli strings are not commutative")
@@ -1,4 +1,8 @@
1
1
  EXPANDED_KEYWORD = "expanded__"
2
2
  CAPTURE_SUFFIX = "_captured__"
3
3
  LAMBDA_KEYWORD = "lambda__"
4
- GENERAL_INPLACE_ARITHMETIC_AUXILIARY_VARIABLE = "result__temp__"
4
+ INPLACE_ARITH_AUX_VAR_PREFIX = "result__temp__"
5
+
6
+
7
+ def generate_original_function_name(name: str) -> str:
8
+ return name.split(f"_{EXPANDED_KEYWORD}")[0]
@@ -1,23 +1,18 @@
1
- from typing import Any, Callable, Dict, Iterator
1
+ from typing import Annotated, Union
2
2
 
3
- from typing_extensions import Self
3
+ from pydantic import PlainSerializer, PlainValidator
4
+ from pydantic.json_schema import WithJsonSchema
4
5
 
5
6
 
6
- # Use this class as a type for complex data from the json, e.g., in the state_propagator function.
7
- class Complex(complex):
8
- @classmethod
9
- def __get_validators__(cls) -> Iterator[Callable]:
10
- yield cls.validate
7
+ def validate_complex(v: Union[complex, str]) -> complex:
8
+ if isinstance(v, str):
9
+ v = "".join(v.split())
10
+ return complex(v)
11
11
 
12
- @classmethod
13
- def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None:
14
- field_schema.update(
15
- pattern=r"[+-]?\d+\.?\d* *[+-] *\d+\.?\d*j",
16
- )
17
12
 
18
- @classmethod
19
- def validate(cls, v: Any) -> Self:
20
- if isinstance(v, str):
21
- v = "".join(v.split())
22
-
23
- return cls(v)
13
+ Complex = Annotated[
14
+ complex,
15
+ PlainValidator(validate_complex),
16
+ PlainSerializer(lambda x: str(x)),
17
+ WithJsonSchema({"type": "string", "pattern": r"[+-]?\d+\.?\d* *[+-] *\d+\.?\d*j"}),
18
+ ]
@@ -1,10 +1,9 @@
1
- import pydantic
2
-
1
+ from classiq.interface.ast_node import ASTNode
3
2
  from classiq.interface.generator.expressions.expression import Expression
4
- from classiq.interface.generator.functions.classical_type import ConcreteClassicalType
3
+ from classiq.interface.generator.functions.concrete_types import ConcreteClassicalType
5
4
 
6
5
 
7
- class Constant(pydantic.BaseModel):
6
+ class Constant(ASTNode):
8
7
  name: str
9
8
  const_type: ConcreteClassicalType
10
9
  value: Expression
@@ -1,14 +1,13 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Any, Dict
3
+ from typing import Any
4
4
 
5
5
  import pydantic
6
- from pydantic import BaseModel
6
+ from pydantic import BaseModel, ConfigDict
7
7
 
8
+ from classiq.interface.exceptions import ClassiqValueError
8
9
  from classiq.interface.generator.arith.register_user_input import RegisterUserInput
9
10
 
10
- from classiq.exceptions import ClassiqValueError
11
-
12
11
  _DEFAULT_CONTROL_NAME: str = "ctrl"
13
12
  _DEFAULT_NUM_CONTROL_QUBITS = 1
14
13
  _INVALID_CONTROL_STATE = "invalid_control_state"
@@ -19,45 +18,52 @@ class ControlState(BaseModel):
19
18
  default=_DEFAULT_NUM_CONTROL_QUBITS, description="Number of control qubits"
20
19
  )
21
20
  ctrl_state: str = pydantic.Field(
22
- default=_INVALID_CONTROL_STATE, description="Control state string"
21
+ default=_INVALID_CONTROL_STATE,
22
+ description="Control state string",
23
+ validate_default=True,
24
+ )
25
+ name: str = pydantic.Field(
26
+ default=_DEFAULT_CONTROL_NAME, description="Control name"
23
27
  )
24
- name: str = pydantic.Field(default=None, description="Control name")
25
28
 
26
- @pydantic.root_validator()
27
- def _validate_control(cls, values: Dict[str, Any]) -> Dict[str, Any]:
28
- num_ctrl_qubits: int = values.get(
29
- "num_ctrl_qubits", _DEFAULT_NUM_CONTROL_QUBITS
30
- )
31
- ctrl_state: str = values.get("ctrl_state", _INVALID_CONTROL_STATE)
29
+ @pydantic.model_validator(mode="before")
30
+ @classmethod
31
+ def _validate_control(cls, values: Any) -> dict[str, Any]:
32
+ if isinstance(values, dict):
33
+ num_ctrl_qubits: int = (
34
+ values.get("num_ctrl_qubits", _DEFAULT_NUM_CONTROL_QUBITS) or 0
35
+ )
32
36
 
33
- if ctrl_state == _INVALID_CONTROL_STATE:
34
- ctrl_state = "1" * num_ctrl_qubits
35
- values["ctrl_state"] = ctrl_state
37
+ ctrl_state: str = values.get("ctrl_state") or _INVALID_CONTROL_STATE
36
38
 
37
- cls.validate_control_string(ctrl_state)
39
+ if ctrl_state == _INVALID_CONTROL_STATE:
40
+ ctrl_state = "1" * num_ctrl_qubits
41
+ values["ctrl_state"] = ctrl_state
38
42
 
39
- if num_ctrl_qubits == _DEFAULT_NUM_CONTROL_QUBITS:
40
- num_ctrl_qubits = len(ctrl_state)
41
- values["num_ctrl_qubits"] = num_ctrl_qubits
43
+ cls.validate_control_string(ctrl_state)
42
44
 
43
- if len(ctrl_state) != num_ctrl_qubits:
44
- raise ClassiqValueError(
45
- "Control state length should be equal to the number of control qubits"
46
- )
45
+ if num_ctrl_qubits == _DEFAULT_NUM_CONTROL_QUBITS:
46
+ num_ctrl_qubits = len(ctrl_state)
47
+ values["num_ctrl_qubits"] = num_ctrl_qubits
47
48
 
48
- if values.get("name") is None:
49
- values["name"] = f"{_DEFAULT_CONTROL_NAME}_{ctrl_state}"
49
+ if len(ctrl_state) != num_ctrl_qubits:
50
+ raise ClassiqValueError(
51
+ "Control state length should be equal to the number of control qubits"
52
+ )
53
+
54
+ if "name" not in values or values["name"] is None:
55
+ values["name"] = f"{_DEFAULT_CONTROL_NAME}_{ctrl_state}"
50
56
 
51
57
  return values
52
58
 
53
59
  @staticmethod
54
60
  def validate_control_string(ctrl_state: str) -> None:
61
+ if not ctrl_state:
62
+ raise ClassiqValueError("Control state cannot be empty")
55
63
  if not set(ctrl_state) <= {"1", "0"}:
56
64
  raise ClassiqValueError(
57
65
  f"Control state can only be constructed from 0 and 1, received: {ctrl_state}"
58
66
  )
59
- if not ctrl_state:
60
- raise ClassiqValueError("Control state cannot be empty")
61
67
 
62
68
  def __str__(self) -> str:
63
69
  return self.ctrl_state
@@ -72,5 +78,4 @@ class ControlState(BaseModel):
72
78
  def rename(self, name: str) -> ControlState:
73
79
  return ControlState(ctrl_state=self.ctrl_state, name=name)
74
80
 
75
- class Config:
76
- frozen = True
81
+ model_config = ConfigDict(frozen=True)
@@ -0,0 +1,47 @@
1
+ from typing import Optional
2
+
3
+ import pydantic
4
+
5
+ from classiq.interface.generator.arith import argument_utils
6
+ from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
7
+ from classiq.interface.generator.function_params import FunctionParams
8
+
9
+
10
+ class Copy(FunctionParams):
11
+ source: argument_utils.RegisterOrConst
12
+ target: RegisterArithmeticInfo
13
+ output_size: Optional[pydantic.PositiveInt] = pydantic.Field(default=None)
14
+
15
+ @property
16
+ def source_size(self) -> int:
17
+ return argument_utils.size(self.source)
18
+
19
+ @property
20
+ def source_reg_size(self) -> int:
21
+ return (
22
+ self.source.size if isinstance(self.source, RegisterArithmeticInfo) else 0
23
+ )
24
+
25
+ @property
26
+ def source_fraction_places(self) -> int:
27
+ return argument_utils.fraction_places(self.source)
28
+
29
+ @property
30
+ def offset(self) -> int:
31
+ return self.target.fraction_places - self.source_fraction_places
32
+
33
+ @property
34
+ def source_name(self) -> str:
35
+ return "source"
36
+
37
+ @property
38
+ def target_name(self) -> str:
39
+ return "target"
40
+
41
+ def _create_ios(self) -> None:
42
+ self._inputs = {
43
+ self.target_name: self.target,
44
+ }
45
+ if isinstance(self.source, RegisterArithmeticInfo):
46
+ self._inputs[self.source_name] = self.source
47
+ self._outputs = {**self._inputs}
@@ -1,7 +1,6 @@
1
- from typing import Dict, Type
2
-
3
1
  import pydantic
4
2
 
3
+ from classiq.interface.enum_utils import StrEnum
5
4
  from classiq.interface.generator.ansatz_library import (
6
5
  EntanglingLayersArgs,
7
6
  HypercubeArgs,
@@ -11,8 +10,6 @@ from classiq.interface.generator.ansatz_library import (
11
10
  TwoLocalArgs,
12
11
  )
13
12
 
14
- from classiq._internals.enum_utils import StrEnum
15
-
16
13
 
17
14
  class CustomAnsatzType(StrEnum):
18
15
  TwoLocal = "TwoLocal"
@@ -23,7 +20,7 @@ class CustomAnsatzType(StrEnum):
23
20
  RandomTwoQubitGates = "RandomTwoQubitGates"
24
21
 
25
22
 
26
- CUSTOM_ANSATZ_ARGS_MAPPING: Dict[CustomAnsatzType, Type[pydantic.BaseModel]] = {
23
+ CUSTOM_ANSATZ_ARGS_MAPPING: dict[CustomAnsatzType, type[pydantic.BaseModel]] = {
27
24
  CustomAnsatzType.TwoLocal: TwoLocalArgs,
28
25
  CustomAnsatzType.SeparateU3: SeparateU3Args,
29
26
  CustomAnsatzType.Hypercube: HypercubeArgs,
@@ -1,5 +1,3 @@
1
- from typing import List
2
-
3
1
  import numpy as np
4
2
 
5
3
  # Taken and modified from quantum_tsp_tutorials repository of mstechly in github.
@@ -10,7 +8,7 @@ def _distance_between_points(point_1: np.ndarray, point_2: np.ndarray) -> float:
10
8
  return float(np.linalg.norm(point_1 - point_2))
11
9
 
12
10
 
13
- def get_distance_matrix(cities: np.ndarray) -> List[List[float]]:
11
+ def get_distance_matrix(cities: np.ndarray) -> list[list[float]]:
14
12
  number_of_cities = len(cities)
15
13
  matrix = np.zeros((number_of_cities, number_of_cities))
16
14
  for i in range(number_of_cities):
@@ -20,14 +18,14 @@ def get_distance_matrix(cities: np.ndarray) -> List[List[float]]:
20
18
  return matrix.tolist()
21
19
 
22
20
 
23
- def get_rand_euclidean_distance_matrix(num_points: int) -> List[List[float]]:
21
+ def get_rand_euclidean_distance_matrix(num_points: int) -> list[list[float]]:
24
22
  _points_array_dim = 2
25
23
  points = np.random.rand(num_points, _points_array_dim)
26
24
  distance_matrix = get_distance_matrix(points)
27
25
  return distance_matrix
28
26
 
29
27
 
30
- def get_rand_distance_matrix(num_points: int) -> List[List[float]]:
28
+ def get_rand_distance_matrix(num_points: int) -> list[list[float]]:
31
29
  distance_matrix = np.random.rand(num_points, num_points)
32
30
  distance_matrix *= 0.5
33
31
  distance_matrix += distance_matrix.T
@@ -1,4 +1,5 @@
1
- from typing import Iterable, List, Union
1
+ from collections.abc import Iterable
2
+ from typing import Union
2
3
 
3
4
  EXCITATIONS_TYPE = Union[str, int, Iterable[int], Iterable[str]]
4
- EXCITATIONS_TYPE_EXACT = List[int]
5
+ EXCITATIONS_TYPE_EXACT = list[int]
@@ -1,6 +1,11 @@
1
- SUPPORTED_BUILTIN_FUNCTIONS = {"len", "sum", "print"}
1
+ from classiq.interface.generator.functions.classical_type import CLASSICAL_ATTRIBUTES
2
2
 
3
- SUPPORTED_ATOMIC_EXPRESSION_FUNCTIONS = {
3
+ SUPPORTED_PYTHON_BUILTIN_FUNCTIONS = {"len", "sum", "print"}
4
+
5
+ SUPPORTED_CLASSIQ_BUILTIN_FUNCTIONS = {
6
+ "do_div",
7
+ "do_slice",
8
+ "do_subscript",
4
9
  "hypercube_entangler_graph",
5
10
  "grid_entangler_graph",
6
11
  "qft_const_adder_phase",
@@ -9,14 +14,25 @@ SUPPORTED_ATOMIC_EXPRESSION_FUNCTIONS = {
9
14
  "get_type",
10
15
  "struct_literal",
11
16
  "get_field",
12
- "fraction_digits",
13
- "is_signed",
14
17
  "molecule_problem_to_hamiltonian",
15
18
  "fock_hamiltonian_problem_to_hamiltonian",
16
19
  "molecule_ground_state_solution_post_process",
20
+ }
21
+
22
+ SUPPORTED_CLASSIQ_SYMPY_WRAPPERS = {
17
23
  "BitwiseAnd",
18
24
  "BitwiseXor",
19
25
  "BitwiseNot",
20
26
  "BitwiseOr",
21
- *SUPPORTED_BUILTIN_FUNCTIONS,
27
+ "LogicalXor",
22
28
  }
29
+
30
+ SUPPORTED_ATOMIC_EXPRESSION_FUNCTIONS = {
31
+ *SUPPORTED_CLASSIQ_BUILTIN_FUNCTIONS,
32
+ *SUPPORTED_CLASSIQ_SYMPY_WRAPPERS,
33
+ *SUPPORTED_PYTHON_BUILTIN_FUNCTIONS,
34
+ }
35
+
36
+ SUPPORTED_ATOMIC_EXPRESSION_FUNCTIONS_QMOD = (
37
+ SUPPORTED_ATOMIC_EXPRESSION_FUNCTIONS - CLASSICAL_ATTRIBUTES
38
+ )
@@ -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,11 +1,13 @@
1
1
  import re
2
+ from collections.abc import Mapping
2
3
  from dataclasses import dataclass
3
- from typing import Any, Mapping, Optional, Type
4
+ from typing import Any, Optional
4
5
 
5
6
  from sympy import Expr
6
7
  from typing_extensions import get_args
7
8
 
8
9
  from classiq.interface.backend.pydantic_backend import EXECUTION_PARAMETER_PATTERN
10
+ from classiq.interface.exceptions import ClassiqValueError
9
11
  from classiq.interface.generator.expressions.expression_types import (
10
12
  ExpressionValue,
11
13
  QmodStructInstance,
@@ -13,14 +15,12 @@ from classiq.interface.generator.expressions.expression_types import (
13
15
  )
14
16
  from classiq.interface.generator.expressions.handle_identifier import HandleIdentifier
15
17
 
16
- from classiq.exceptions import ClassiqValueError
17
-
18
18
 
19
19
  @dataclass(frozen=True)
20
20
  class EvaluatedExpression:
21
21
  value: ExpressionValue
22
22
 
23
- def is_constant(self, constant_type: Optional[Type] = None) -> bool:
23
+ def is_constant(self, constant_type: Optional[type] = None) -> bool:
24
24
  if self.value is None:
25
25
  return False
26
26
 
@@ -29,7 +29,7 @@ class EvaluatedExpression:
29
29
  get_args(RuntimeConstant) if constant_type is None else constant_type,
30
30
  )
31
31
 
32
- def as_constant_type(self, constant_type: Type) -> Any:
32
+ def as_constant_type(self, constant_type: type) -> Any:
33
33
  if not self.is_constant():
34
34
  raise ClassiqValueError(
35
35
  f"Invalid access to expression {self.value!r} as {constant_type}"
@@ -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,6 +70,14 @@ 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)):
@@ -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
+ )