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,18 +1,27 @@
1
1
  # flake8: noqa
2
2
 
3
- from typing import Dict, List, Mapping, Optional, Type
3
+ from typing import Optional, cast
4
+ from collections.abc import Mapping
4
5
 
5
6
  from classiq.interface.chemistry.fermionic_operator import (
6
7
  FermionicOperator,
7
8
  SummedFermionicOperator,
8
9
  )
10
+ from classiq.interface.model.allocate import Allocate
11
+ from classiq.interface.model.quantum_statement import QuantumStatement
12
+ from classiq.qmod.builtins.structs import (
13
+ MoleculeProblem as QmodMoleculeProblem,
14
+ Molecule as QmodMolecule,
15
+ ChemistryAtom as QmodChemistryAtom,
16
+ Position as QmodPosition,
17
+ )
9
18
  from classiq.interface.chemistry.ground_state_problem import (
10
19
  CHEMISTRY_PROBLEMS_TYPE,
11
20
  HamiltonianProblem,
12
21
  MoleculeProblem,
13
22
  )
14
23
  from classiq.interface.chemistry.molecule import Atom
15
- from classiq.interface.generator.expressions.enums.chemistry import (
24
+ from classiq.qmod.builtins.enums import (
16
25
  Element,
17
26
  FermionMapping,
18
27
  )
@@ -20,20 +29,20 @@ from classiq.interface.generator.expressions.expression import Expression
20
29
  from classiq.interface.generator.function_params import IOName
21
30
  from classiq.interface.generator.functions.classical_type import (
22
31
  ClassicalArray,
23
- ClassicalType,
24
32
  Real,
25
33
  )
26
34
  from classiq.interface.generator.functions.port_declaration import (
27
35
  PortDeclarationDirection,
28
36
  )
37
+ from classiq.interface.model.classical_parameter_declaration import (
38
+ ClassicalParameterDeclaration,
39
+ )
29
40
  from classiq.interface.model.handle_binding import HandleBinding
30
41
  from classiq.interface.model.model import Model, SerializedModel
31
42
  from classiq.interface.model.native_function_definition import NativeFunctionDefinition
32
43
  from classiq.interface.model.port_declaration import PortDeclaration
33
- from classiq.interface.model.quantum_function_call import (
34
- QuantumFunctionCall,
35
- QuantumLambdaFunction,
36
- )
44
+ from classiq.interface.model.quantum_function_call import QuantumFunctionCall
45
+ from classiq.interface.model.quantum_lambda_function import QuantumLambdaFunction
37
46
 
38
47
  from classiq.applications.chemistry.ansatz_parameters import (
39
48
  AnsatzParameters,
@@ -44,19 +53,21 @@ from classiq.applications.chemistry.ansatz_parameters import (
44
53
  from classiq.applications.chemistry.chemistry_execution_parameters import (
45
54
  ChemistryExecutionParameters,
46
55
  )
47
- from classiq.exceptions import ClassiqError
56
+ from classiq.interface.exceptions import ClassiqError
57
+ from classiq.qmod.utilities import qmod_val_to_expr_str
58
+ from classiq.open_library.functions.hea import full_hea
48
59
 
49
- _LADDER_OPERATOR_TYPE_INDICATOR_TO_QMOD_MAPPING: Dict[str, str] = {
60
+ _LADDER_OPERATOR_TYPE_INDICATOR_TO_QMOD_MAPPING: dict[str, str] = {
50
61
  "+": "PLUS",
51
62
  "-": "MINUS",
52
63
  }
53
64
 
54
- _CHEMISTRY_PROBLEM_PREFIX_MAPPING: Dict[Type[CHEMISTRY_PROBLEMS_TYPE], str] = {
65
+ _CHEMISTRY_PROBLEM_PREFIX_MAPPING: dict[type[CHEMISTRY_PROBLEMS_TYPE], str] = {
55
66
  MoleculeProblem: "molecule",
56
67
  HamiltonianProblem: "fock_hamiltonian",
57
68
  }
58
69
 
59
- _ANSATZ_PARAMETERS_FUNCTION_NAME_MAPPING: Dict[Type[AnsatzParameters], str] = {
70
+ _ANSATZ_PARAMETERS_FUNCTION_NAME_MAPPING: dict[type[AnsatzParameters], str] = {
60
71
  UCCParameters: "ucc",
61
72
  HVAParameters: "hva",
62
73
  }
@@ -64,180 +75,158 @@ _ANSATZ_PARAMETERS_FUNCTION_NAME_MAPPING: Dict[Type[AnsatzParameters], str] = {
64
75
  _EXECUTION_RESULT = "vqe_result"
65
76
  _MOLECULE_PROBLEM_RESULT = "molecule_result"
66
77
 
67
- _HAE_GATE_MAPPING: Dict[str, QuantumFunctionCall] = {
78
+ _HAE_GATE_MAPPING: dict[str, QuantumFunctionCall] = {
68
79
  "h": QuantumFunctionCall(
69
80
  function="H",
70
- inouts={"target": HandleBinding(name="q")},
81
+ positional_args=[HandleBinding(name="q")],
71
82
  ),
72
83
  "x": QuantumFunctionCall(
73
84
  function="X",
74
- inouts={"target": HandleBinding(name="q")},
85
+ positional_args=[HandleBinding(name="q")],
75
86
  ),
76
87
  "y": QuantumFunctionCall(
77
88
  function="Y",
78
- inouts={"target": HandleBinding(name="q")},
89
+ positional_args=[HandleBinding(name="q")],
79
90
  ),
80
91
  "z": QuantumFunctionCall(
81
92
  function="Z",
82
- inouts={"target": HandleBinding(name="q")},
93
+ positional_args=[HandleBinding(name="q")],
83
94
  ),
84
95
  "i": QuantumFunctionCall(
85
96
  function="I",
86
- inouts={"target": HandleBinding(name="q")},
97
+ positional_args=[HandleBinding(name="q")],
87
98
  ),
88
99
  "s": QuantumFunctionCall(
89
100
  function="S",
90
- inouts={"target": HandleBinding(name="q")},
101
+ positional_args=[HandleBinding(name="q")],
91
102
  ),
92
103
  "t": QuantumFunctionCall(
93
104
  function="T",
94
- inouts={"target": HandleBinding(name="q")},
105
+ positional_args=[HandleBinding(name="q")],
95
106
  ),
96
107
  "sdg": QuantumFunctionCall(
97
108
  function="SDG",
98
- inouts={"target": HandleBinding(name="q")},
109
+ positional_args=[HandleBinding(name="q")],
99
110
  ),
100
111
  "tdg": QuantumFunctionCall(
101
112
  function="TDG",
102
- inouts={"target": HandleBinding(name="q")},
113
+ positional_args=[HandleBinding(name="q")],
103
114
  ),
104
115
  "p": QuantumFunctionCall(
105
116
  function="PHASE",
106
- inouts={"target": HandleBinding(name="q")},
117
+ positional_args=[HandleBinding(name="q")],
107
118
  ),
108
119
  "rx": QuantumFunctionCall(
109
120
  function="RX",
110
- params={"theta": Expression(expr="angle")},
111
- inouts={"target": HandleBinding(name="q")},
121
+ positional_args=[Expression(expr="angle"), HandleBinding(name="q")],
112
122
  ),
113
123
  "ry": QuantumFunctionCall(
114
124
  function="RY",
115
- params={"theta": Expression(expr="angle")},
116
- inouts={"target": HandleBinding(name="q")},
125
+ positional_args=[Expression(expr="angle"), HandleBinding(name="q")],
117
126
  ),
118
127
  "rz": QuantumFunctionCall(
119
128
  function="RZ",
120
- params={"theta": Expression(expr="angle")},
121
- inouts={"target": HandleBinding(name="q")},
129
+ positional_args=[Expression(expr="angle"), HandleBinding(name="q")],
122
130
  ),
123
131
  "rxx": QuantumFunctionCall(
124
132
  function="RXX",
125
- params={"theta": Expression(expr="angle")},
126
- inouts={"target": HandleBinding(name="q")},
133
+ positional_args=[Expression(expr="angle"), HandleBinding(name="q")],
127
134
  ),
128
135
  "ryy": QuantumFunctionCall(
129
136
  function="RYY",
130
- params={"theta": Expression(expr="angle")},
131
- inouts={"target": HandleBinding(name="q")},
137
+ positional_args=[Expression(expr="angle"), HandleBinding(name="q")],
132
138
  ),
133
139
  "rzz": QuantumFunctionCall(
134
140
  function="RZZ",
135
- params={"theta": Expression(expr="angle")},
136
- inouts={"target": HandleBinding(name="q")},
141
+ positional_args=[Expression(expr="angle"), HandleBinding(name="q")],
137
142
  ),
138
143
  "ch": QuantumFunctionCall(
139
144
  function="CH",
140
- inouts={
141
- "target": HandleBinding(name="q1"),
142
- "control": HandleBinding(name="q2"),
143
- },
145
+ positional_args=[HandleBinding(name="q1"), HandleBinding(name="q2")],
144
146
  ),
145
147
  "cx": QuantumFunctionCall(
146
148
  function="CX",
147
- inouts={
148
- "target": HandleBinding(name="q1"),
149
- "control": HandleBinding(name="q2"),
150
- },
149
+ positional_args=[HandleBinding(name="q1"), HandleBinding(name="q2")],
151
150
  ),
152
151
  "cy": QuantumFunctionCall(
153
152
  function="CY",
154
- inouts={
155
- "target": HandleBinding(name="q1"),
156
- "control": HandleBinding(name="q2"),
157
- },
153
+ positional_args=[HandleBinding(name="q1"), HandleBinding(name="q2")],
158
154
  ),
159
155
  "cz": QuantumFunctionCall(
160
156
  function="CZ",
161
- inouts={
162
- "target": HandleBinding(name="q1"),
163
- "control": HandleBinding(name="q2"),
164
- },
157
+ positional_args=[HandleBinding(name="q1"), HandleBinding(name="q2")],
165
158
  ),
166
159
  "crx": QuantumFunctionCall(
167
160
  function="CRX",
168
- params={"theta": Expression(expr="angle")},
169
- inouts={
170
- "target": HandleBinding(name="q1"),
171
- "control": HandleBinding(name="q2"),
172
- },
161
+ positional_args=[
162
+ Expression(expr="angle"),
163
+ HandleBinding(name="q1"),
164
+ HandleBinding(name="q2"),
165
+ ],
173
166
  ),
174
167
  "cry": QuantumFunctionCall(
175
168
  function="CRY",
176
- params={"theta": Expression(expr="angle")},
177
- inouts={
178
- "target": HandleBinding(name="q1"),
179
- "control": HandleBinding(name="q2"),
180
- },
169
+ positional_args=[
170
+ Expression(expr="angle"),
171
+ HandleBinding(name="q1"),
172
+ HandleBinding(name="q2"),
173
+ ],
181
174
  ),
182
175
  "crz": QuantumFunctionCall(
183
176
  function="CRZ",
184
- params={"theta": Expression(expr="angle")},
185
- inouts={
186
- "target": HandleBinding(name="q1"),
187
- "control": HandleBinding(name="q2"),
188
- },
177
+ positional_args=[
178
+ Expression(expr="angle"),
179
+ HandleBinding(name="q1"),
180
+ HandleBinding(name="q2"),
181
+ ],
189
182
  ),
190
183
  "cp": QuantumFunctionCall(
191
184
  function="CPHASE",
192
- params={"theta": Expression(expr="angle")},
193
- inouts={
194
- "target": HandleBinding(name="q1"),
195
- "control": HandleBinding(name="q2"),
196
- },
185
+ positional_args=[
186
+ Expression(expr="angle"),
187
+ HandleBinding(name="q1"),
188
+ HandleBinding(name="q2"),
189
+ ],
197
190
  ),
198
191
  "swap": QuantumFunctionCall(
199
192
  function="SWAP",
200
- inouts={"qbit0": HandleBinding(name="q1"), "qbit1": HandleBinding(name="q2")},
193
+ positional_args=[HandleBinding(name="q1"), HandleBinding(name="q2")],
201
194
  ),
202
195
  }
203
196
 
204
197
 
205
- def _atoms_to_qmod_atoms(atoms: List[Atom]) -> str:
206
- # fmt: off
207
- atom_struct_literals = [
208
- "struct_literal(ChemistryAtom,"
209
- f"element={Element[atom.symbol]},"
210
- "position=struct_literal(Position,"
211
- f"x={atom.x},"
212
- f"y={atom.y},"
213
- f"z={atom.z}"
214
- ")"
215
- ")"
198
+ def _atoms_to_qmod_atoms(atoms: list[Atom]) -> list[QmodChemistryAtom]:
199
+ return [
200
+ QmodChemistryAtom(
201
+ element=Element[atom.symbol], # type:ignore[arg-type]
202
+ position=QmodPosition(
203
+ x=atom.x, # type:ignore[arg-type]
204
+ y=atom.y, # type:ignore[arg-type]
205
+ z=atom.z, # type:ignore[arg-type]
206
+ ),
207
+ )
216
208
  for atom in atoms
217
209
  ]
218
- # fmt: on
219
- return ",".join(atom_struct_literals)
220
210
 
221
211
 
222
- def _molecule_problem_to_qmod_molecule_problem(
212
+ def molecule_problem_to_qmod(
223
213
  molecule_problem: MoleculeProblem,
224
- ) -> str:
225
- # fmt: off
226
- return (
227
- "struct_literal("
228
- "MoleculeProblem,"
229
- f"mapping={FermionMapping[molecule_problem.mapping.value.upper()]},"
230
- f"z2_symmetries={molecule_problem.z2_symmetries},"
231
- "molecule=struct_literal("
232
- "Molecule,"
233
- f"atoms=[{_atoms_to_qmod_atoms(molecule_problem.molecule.atoms)}],"
234
- f"spin={molecule_problem.molecule.spin},"
235
- f"charge={molecule_problem.molecule.charge}"
236
- "),"
237
- f"freeze_core={molecule_problem.freeze_core},"
238
- f"remove_orbitals={molecule_problem.remove_orbitals}"
239
- ")")
240
- # fmt: on
214
+ ) -> QmodMoleculeProblem:
215
+ return QmodMoleculeProblem(
216
+ mapping=FermionMapping[ # type:ignore[arg-type]
217
+ molecule_problem.mapping.value.upper()
218
+ ],
219
+ z2_symmetries=molecule_problem.z2_symmetries, # type:ignore[arg-type]
220
+ molecule=QmodMolecule(
221
+ atoms=_atoms_to_qmod_atoms(
222
+ molecule_problem.molecule.atoms
223
+ ), # type:ignore[arg-type]
224
+ spin=molecule_problem.molecule.spin, # type:ignore[arg-type]
225
+ charge=molecule_problem.molecule.charge, # type:ignore[arg-type]
226
+ ),
227
+ freeze_core=molecule_problem.freeze_core, # type:ignore[arg-type]
228
+ remove_orbitals=molecule_problem.remove_orbitals, # type:ignore[arg-type]
229
+ )
241
230
 
242
231
 
243
232
  def _fermionic_operator_to_qmod_ladder_ops(
@@ -273,11 +262,12 @@ def _summed_fermionic_operator_to_qmod_lader_terms(
273
262
  def _hamiltonian_problem_to_qmod_fock_hamiltonian_problem(
274
263
  hamiltonian_problem: HamiltonianProblem,
275
264
  ) -> str:
265
+ mapping = FermionMapping[hamiltonian_problem.mapping.value.upper()]
276
266
  return (
277
267
  # fmt: off
278
268
  "struct_literal("
279
269
  "FockHamiltonianProblem,"
280
- f"mapping={FermionMapping[hamiltonian_problem.mapping.value.upper()]},"
270
+ f"mapping={qmod_val_to_expr_str(mapping)},"
281
271
  f"z2_symmetries={hamiltonian_problem.z2_symmetries},"
282
272
  f"terms=[{_summed_fermionic_operator_to_qmod_lader_terms(hamiltonian_problem.hamiltonian)}],"
283
273
  f"num_particles={hamiltonian_problem.num_particles}"
@@ -288,7 +278,7 @@ def _hamiltonian_problem_to_qmod_fock_hamiltonian_problem(
288
278
 
289
279
  def _convert_library_problem_to_qmod_problem(problem: CHEMISTRY_PROBLEMS_TYPE) -> str:
290
280
  if isinstance(problem, MoleculeProblem):
291
- return _molecule_problem_to_qmod_molecule_problem(problem)
281
+ return qmod_val_to_expr_str(molecule_problem_to_qmod(problem))
292
282
  elif isinstance(problem, HamiltonianProblem):
293
283
  return _hamiltonian_problem_to_qmod_fock_hamiltonian_problem(problem)
294
284
  else:
@@ -299,18 +289,18 @@ def _get_chemistry_function(
299
289
  chemistry_problem: CHEMISTRY_PROBLEMS_TYPE,
300
290
  chemistry_function_name: str,
301
291
  inouts: Mapping[IOName, HandleBinding],
302
- ansatz_parameters_expressions: Optional[Dict[str, Expression]] = None,
292
+ ansatz_parameters_expressions: Optional[list[Expression]] = None,
303
293
  ) -> QuantumFunctionCall:
304
294
  problem_prefix = _CHEMISTRY_PROBLEM_PREFIX_MAPPING[type(chemistry_problem)]
305
295
  return QuantumFunctionCall(
306
296
  function=f"{problem_prefix}_{chemistry_function_name}",
307
- params={
308
- **(ansatz_parameters_expressions or dict()),
309
- f"{problem_prefix}_problem": Expression(
297
+ positional_args=[
298
+ Expression(
310
299
  expr=_convert_library_problem_to_qmod_problem(chemistry_problem)
311
300
  ),
312
- },
313
- inouts=inouts,
301
+ *(ansatz_parameters_expressions or []),
302
+ *inouts.values(),
303
+ ],
314
304
  )
315
305
 
316
306
 
@@ -327,28 +317,32 @@ def _get_hartree_fock(
327
317
  def _get_hea_function(hea_parameters: HEAParameters) -> QuantumFunctionCall:
328
318
  return QuantumFunctionCall(
329
319
  function="full_hea",
330
- params={
331
- "num_qubits": Expression(expr=f"{hea_parameters.num_qubits}"),
332
- "is_parametrized": Expression(
320
+ positional_args=[
321
+ Expression(expr=f"{hea_parameters.num_qubits}"),
322
+ Expression(
333
323
  expr=f"{[int(_is_parametric_gate(_HAE_GATE_MAPPING[gate])) for gate in hea_parameters.one_qubit_gates+hea_parameters.two_qubit_gates]}"
334
324
  ),
335
- "connectivity_map": Expression(
325
+ Expression(expr="t"),
326
+ Expression(
336
327
  expr=f"{[list(connectivity_pair) for connectivity_pair in hea_parameters.connectivity_map]}"
337
328
  ),
338
- "reps": Expression(expr=f"{hea_parameters.reps}"),
339
- "angle_params": Expression(expr="t"),
340
- },
341
- operands={
342
- "operands_1qubit": [
343
- QuantumLambdaFunction(body=[_HAE_GATE_MAPPING[gate]])
329
+ Expression(expr=f"{hea_parameters.reps}"),
330
+ [
331
+ QuantumLambdaFunction(
332
+ pos_rename_params=["angle", "q"],
333
+ body=[_HAE_GATE_MAPPING[gate]],
334
+ )
344
335
  for gate in hea_parameters.one_qubit_gates
345
336
  ],
346
- "operands_2qubit": [
347
- QuantumLambdaFunction(body=[_HAE_GATE_MAPPING[gate]])
337
+ [
338
+ QuantumLambdaFunction(
339
+ pos_rename_params=["angle", "q1", "q2"],
340
+ body=[_HAE_GATE_MAPPING[gate]],
341
+ )
348
342
  for gate in hea_parameters.two_qubit_gates
349
343
  ],
350
- },
351
- inouts={"x": HandleBinding(name="qbv")},
344
+ HandleBinding(name="qbv"),
345
+ ],
352
346
  )
353
347
 
354
348
 
@@ -362,10 +356,10 @@ def _get_ansatz(
362
356
  chemistry_problem,
363
357
  _ANSATZ_PARAMETERS_FUNCTION_NAME_MAPPING[type(ansatz_parameters)],
364
358
  {"qbv": HandleBinding(name="qbv")},
365
- {
366
- param_name: Expression(expr=str(param_value))
359
+ [
360
+ Expression(expr=str(param_value))
367
361
  for param_name, param_value in ansatz_parameters.__dict__.items()
368
- },
362
+ ],
369
363
  )
370
364
 
371
365
 
@@ -387,19 +381,16 @@ def _get_molecule_problem_execution_post_processing(
387
381
  molecule_problem: MoleculeProblem,
388
382
  ) -> str:
389
383
  return f"""
390
- {_MOLECULE_PROBLEM_RESULT} = molecule_ground_state_solution_post_process({_molecule_problem_to_qmod_molecule_problem(molecule_problem)},{_EXECUTION_RESULT})
384
+ {_MOLECULE_PROBLEM_RESULT} = molecule_ground_state_solution_post_process({qmod_val_to_expr_str(molecule_problem_to_qmod(molecule_problem))},{_EXECUTION_RESULT})
391
385
  save({{{_MOLECULE_PROBLEM_RESULT!r}: {_MOLECULE_PROBLEM_RESULT}}})
392
386
  """
393
387
 
394
388
 
395
- def _get_fock_hamiltonian_problem_execution_post_processing(
396
- hamiltonian_problem: HamiltonianProblem,
397
- ) -> str:
398
- return f"save({{{_EXECUTION_RESULT!r}: {_EXECUTION_RESULT}}})"
399
-
400
-
401
389
  def _is_parametric_gate(call: QuantumFunctionCall) -> bool:
402
- return len(call.params) > 0
390
+ # FIXME: call call.params instead (CAD-21568)
391
+ return any(
392
+ arg for arg in call.positional_args if isinstance(arg, Expression)
393
+ ) or any(isinstance(arg, Expression) for arg in call.positional_args)
403
394
 
404
395
 
405
396
  def _get_execution_result_post_processing_statements(
@@ -408,12 +399,12 @@ def _get_execution_result_post_processing_statements(
408
399
  if isinstance(problem, MoleculeProblem):
409
400
  return _get_molecule_problem_execution_post_processing(problem)
410
401
  elif isinstance(problem, HamiltonianProblem):
411
- return _get_fock_hamiltonian_problem_execution_post_processing(problem)
402
+ return ""
412
403
  else:
413
404
  raise ClassiqError(f"Invalid problem type: {problem}")
414
405
 
415
406
 
416
- def _count_parametric_gates(gates: List[str]) -> int:
407
+ def _count_parametric_gates(gates: list[str]) -> int:
417
408
  return sum(_is_parametric_gate(_HAE_GATE_MAPPING[gate]) for gate in gates)
418
409
 
419
410
 
@@ -428,14 +419,18 @@ def _get_hea_port_size(hea_parameters: HEAParameters) -> int:
428
419
 
429
420
  def _get_chemistry_quantum_main_params(
430
421
  ansatz_parameters: AnsatzParameters,
431
- ) -> Dict[str, ClassicalType]:
422
+ ) -> list[ClassicalParameterDeclaration]:
432
423
  if not isinstance(ansatz_parameters, HEAParameters):
433
- return dict()
434
- return {
435
- "t": ClassicalArray(
436
- element_type=Real(), size=_get_hea_port_size(ansatz_parameters)
437
- )
438
- }
424
+ return []
425
+ return [
426
+ ClassicalParameterDeclaration(
427
+ name="t",
428
+ classical_type=ClassicalArray(
429
+ element_type=Real(),
430
+ size=_get_hea_port_size(ansatz_parameters),
431
+ ),
432
+ ),
433
+ ]
439
434
 
440
435
 
441
436
  def _get_problem_to_hamiltonian_name(chemistry_problem: CHEMISTRY_PROBLEMS_TYPE) -> str:
@@ -448,16 +443,13 @@ def _get_chemistry_quantum_main(
448
443
  use_hartree_fock: bool,
449
444
  ansatz_parameters: AnsatzParameters,
450
445
  ) -> NativeFunctionDefinition:
451
- body = []
446
+ body: list[QuantumStatement] = []
452
447
  body.append(
453
- QuantumFunctionCall(
454
- function="allocate",
455
- positional_args=[
456
- Expression(
457
- expr=f"len(get_field({_get_problem_to_hamiltonian_name(chemistry_problem)}({_convert_library_problem_to_qmod_problem(chemistry_problem)})[0], 'pauli'))"
458
- ),
459
- HandleBinding(name="qbv"),
460
- ],
448
+ Allocate(
449
+ size=Expression(
450
+ expr=f"get_field(get_field({_get_problem_to_hamiltonian_name(chemistry_problem)}({_convert_library_problem_to_qmod_problem(chemistry_problem)})[0], 'pauli'), 'len')"
451
+ ),
452
+ target=HandleBinding(name="qbv"),
461
453
  ),
462
454
  )
463
455
  if use_hartree_fock:
@@ -467,14 +459,10 @@ def _get_chemistry_quantum_main(
467
459
 
468
460
  return NativeFunctionDefinition(
469
461
  name="main",
470
- param_decls=_get_chemistry_quantum_main_params(ansatz_parameters),
471
- port_declarations=(
472
- {
473
- "qbv": PortDeclaration(
474
- name="qbv", direction=PortDeclarationDirection.Output
475
- )
476
- }
477
- ),
462
+ positional_arg_declarations=_get_chemistry_quantum_main_params(
463
+ ansatz_parameters
464
+ )
465
+ + [PortDeclaration(name="qbv", direction=PortDeclarationDirection.Output)],
478
466
  body=body,
479
467
  )
480
468
 
@@ -484,13 +472,15 @@ def _get_chemistry_classical_code(
484
472
  execution_parameters: ChemistryExecutionParameters,
485
473
  ) -> str:
486
474
  qmod_problem = _convert_library_problem_to_qmod_problem(chemistry_problem)
487
- return f"""
475
+ return (
476
+ f"""
488
477
  {_EXECUTION_RESULT} = vqe(
489
478
  hamiltonian={_get_problem_to_hamiltonian_name(chemistry_problem)}({qmod_problem}), {_get_chemistry_vqe_additional_params(execution_parameters)}
490
479
  )
491
- """ + _get_execution_result_post_processing_statements(
492
- chemistry_problem
493
- )
480
+ save({{{_EXECUTION_RESULT!r}: {_EXECUTION_RESULT}}})
481
+ """
482
+ + _get_execution_result_post_processing_statements(chemistry_problem)
483
+ ).strip()
494
484
 
495
485
 
496
486
  def construct_chemistry_model(
@@ -499,12 +489,22 @@ def construct_chemistry_model(
499
489
  ansatz_parameters: AnsatzParameters,
500
490
  execution_parameters: ChemistryExecutionParameters,
501
491
  ) -> SerializedModel:
492
+ chemistry_functions = [
493
+ _get_chemistry_quantum_main(
494
+ chemistry_problem,
495
+ use_hartree_fock,
496
+ ansatz_parameters,
497
+ )
498
+ ]
499
+ if isinstance(ansatz_parameters, HEAParameters):
500
+ chemistry_functions.append(
501
+ cast(
502
+ NativeFunctionDefinition,
503
+ full_hea.create_model().function_dict["full_hea"],
504
+ )
505
+ )
502
506
  model = Model(
503
- functions=[
504
- _get_chemistry_quantum_main(
505
- chemistry_problem, use_hartree_fock, ansatz_parameters
506
- ),
507
- ],
507
+ functions=chemistry_functions,
508
508
  classical_execution_code=_get_chemistry_classical_code(
509
509
  chemistry_problem, execution_parameters
510
510
  ),
@@ -33,7 +33,7 @@ async def update_problem_async(
33
33
  ) -> CHEMISTRY_PROBLEMS_TYPE:
34
34
  if num_qubits is None:
35
35
  num_qubits = await _get_num_qubits(problem)
36
- return problem.copy(update={"num_qubits": num_qubits})
36
+ return problem.model_copy(update={"num_qubits": num_qubits})
37
37
 
38
38
 
39
39
  ground_state_problem.GroundStateProblem.update_problem = async_utils.syncify_function( # type: ignore[attr-defined]
@@ -0,0 +1,23 @@
1
+ from typing import Optional
2
+
3
+ from sympy import Add, Expr, LessThan, Symbol
4
+
5
+ from classiq.interface.combinatorial_optimization.encoding_types import EncodingType
6
+
7
+ _INEQUALITY_UPPER_LIMIT = 1
8
+
9
+
10
+ def is_constraint_sum_less_than_one(
11
+ expression: Expr, encoding_type: Optional[EncodingType] = None
12
+ ) -> bool:
13
+ # tests the case: x_1 + ... + x_n <= 1
14
+ return (
15
+ isinstance(expression, LessThan)
16
+ and isinstance(expression.args[0], Add)
17
+ and all(isinstance(arg, Symbol) for arg in expression.args[0].args)
18
+ and (
19
+ expression.args[1] == _INEQUALITY_UPPER_LIMIT
20
+ or expression.args[1] == float(_INEQUALITY_UPPER_LIMIT)
21
+ )
22
+ and encoding_type is None
23
+ )
@@ -0,0 +1,35 @@
1
+ from typing import Any
2
+
3
+ import sympy
4
+ from pyomo.core.expr.sympy_tools import PyomoSympyBimap
5
+ from scipy.optimize import differential_evolution
6
+ from sympy import Expr
7
+
8
+ from classiq.applications.combinatorial_helpers import encoding_utils
9
+
10
+
11
+ def sympy_lambdify(*args: Any, **kwargs: Any) -> Any:
12
+ new_kwargs = kwargs
13
+ new_kwargs["modules"] = ["sympy"]
14
+ return sympy.lambdify(*args, **new_kwargs)
15
+
16
+
17
+ def multivariate_extremum(
18
+ expr: Expr, symbols_map: PyomoSympyBimap, is_min: bool
19
+ ) -> float:
20
+ if expr.is_number:
21
+ return float(expr)
22
+
23
+ free_symbols = tuple(expr.free_symbols)
24
+ bounds = [
25
+ (0, encoding_utils.get_var_span(symbols_map.sympy2pyomo[sym]))
26
+ for sym in free_symbols
27
+ ]
28
+
29
+ # differential_evolution finds the global minimum, where we looking for the minimum or the maximum
30
+ extremum_type_coeff = 1 if is_min else -1
31
+
32
+ # Should be used only with sanitized imports due to use could be a potential risk to exec function https://docs.sympy.org/latest/modules/utilities/lambdify.html
33
+ func = sympy_lambdify([free_symbols], expr=extremum_type_coeff * expr)
34
+ result = differential_evolution(func, bounds)
35
+ return result.fun * extremum_type_coeff