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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. classiq/__init__.py +47 -32
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +2 -1
  3. classiq/_internals/api_wrapper.py +235 -97
  4. classiq/_internals/async_utils.py +1 -3
  5. classiq/_internals/authentication/auth0.py +26 -10
  6. classiq/_internals/authentication/authentication.py +11 -0
  7. classiq/_internals/authentication/device.py +10 -5
  8. classiq/_internals/authentication/password_manager.py +18 -6
  9. classiq/_internals/authentication/token_manager.py +10 -5
  10. classiq/_internals/client.py +94 -33
  11. classiq/_internals/config.py +3 -4
  12. classiq/_internals/host_checker.py +38 -15
  13. classiq/_internals/jobs.py +60 -57
  14. classiq/_internals/type_validation.py +9 -9
  15. classiq/analyzer/__init__.py +1 -3
  16. classiq/analyzer/analyzer.py +24 -19
  17. classiq/analyzer/analyzer_utilities.py +10 -10
  18. classiq/analyzer/rb.py +15 -15
  19. classiq/analyzer/show_interactive_hack.py +27 -4
  20. classiq/analyzer/url_utils.py +2 -3
  21. classiq/applications/__init__.py +3 -12
  22. classiq/applications/chemistry/__init__.py +14 -10
  23. classiq/applications/chemistry/ansatz_parameters.py +4 -4
  24. classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +165 -158
  25. classiq/applications/chemistry/ground_state_problem.py +1 -1
  26. classiq/{applications_model_constructors → applications}/combinatorial_helpers/allowed_constraints.py +4 -1
  27. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/arithmetic_expression.py +1 -1
  28. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/isolation.py +1 -1
  29. classiq/{applications_model_constructors → applications}/combinatorial_helpers/combinatorial_problem_utils.py +51 -15
  30. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_mapping.py +12 -12
  31. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_utils.py +8 -6
  32. classiq/{applications_model_constructors → applications}/combinatorial_helpers/memory.py +7 -11
  33. classiq/{applications_model_constructors → applications}/combinatorial_helpers/optimization_model.py +67 -40
  34. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
  35. classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
  36. classiq/{applications_model_constructors → applications}/combinatorial_helpers/sympy_utils.py +2 -2
  37. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/encoding.py +15 -20
  38. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/fixed_variables.py +14 -15
  39. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/ising_converter.py +11 -15
  40. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty.py +1 -2
  41. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty_support.py +3 -7
  42. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/sign_seperation.py +2 -3
  43. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/slack_variables.py +5 -8
  44. classiq/applications/combinatorial_optimization/__init__.py +20 -6
  45. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
  46. classiq/{applications_model_constructors → applications/combinatorial_optimization}/combinatorial_optimization_model_constructor.py +35 -33
  47. classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
  48. classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
  49. classiq/applications/finance/__init__.py +4 -5
  50. classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +48 -42
  51. classiq/applications/grover/__init__.py +9 -0
  52. classiq/{applications_model_constructors → applications/grover}/grover_model_constructor.py +52 -51
  53. classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
  54. classiq/applications/libraries/qmci_library.py +22 -0
  55. classiq/applications/qnn/__init__.py +2 -4
  56. classiq/applications/qnn/circuit_utils.py +6 -6
  57. classiq/applications/qnn/datasets/__init__.py +9 -11
  58. classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
  59. classiq/applications/qnn/datasets/dataset_not.py +2 -1
  60. classiq/applications/qnn/datasets/dataset_parity.py +2 -2
  61. classiq/applications/qnn/gradients/quantum_gradient.py +1 -1
  62. classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
  63. classiq/applications/qnn/qlayer.py +30 -10
  64. classiq/applications/qnn/torch_utils.py +4 -3
  65. classiq/applications/qnn/types.py +5 -5
  66. classiq/applications/qsvm/__init__.py +6 -4
  67. classiq/applications/qsvm/qsvm.py +3 -6
  68. classiq/applications/qsvm/qsvm_data_generation.py +3 -3
  69. classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
  70. classiq/execution/__init__.py +8 -3
  71. classiq/execution/all_hardware_devices.py +11 -0
  72. classiq/execution/execution_session.py +400 -0
  73. classiq/execution/iqcc.py +63 -0
  74. classiq/execution/jobs.py +197 -25
  75. classiq/execution/qnn.py +79 -0
  76. classiq/executor.py +20 -115
  77. classiq/interface/_version.py +1 -1
  78. classiq/interface/analyzer/analysis_params.py +43 -13
  79. classiq/interface/analyzer/cytoscape_graph.py +15 -9
  80. classiq/interface/analyzer/result.py +28 -32
  81. classiq/interface/applications/qsvm.py +20 -29
  82. classiq/interface/ast_node.py +16 -0
  83. classiq/interface/backend/backend_preferences.py +390 -121
  84. classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
  85. classiq/interface/backend/pydantic_backend.py +25 -22
  86. classiq/interface/backend/quantum_backend_providers.py +69 -16
  87. classiq/interface/chemistry/fermionic_operator.py +30 -21
  88. classiq/interface/chemistry/ground_state_problem.py +28 -25
  89. classiq/interface/chemistry/molecule.py +14 -10
  90. classiq/interface/chemistry/operator.py +64 -231
  91. classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
  92. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +1 -3
  93. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  94. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  95. classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
  96. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  97. classiq/interface/combinatorial_optimization/examples/set_cover.py +1 -2
  98. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +8 -9
  99. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  100. classiq/interface/combinatorial_optimization/result.py +1 -3
  101. classiq/interface/combinatorial_optimization/solver_types.py +1 -1
  102. classiq/interface/debug_info/debug_info.py +86 -0
  103. classiq/{exceptions.py → interface/exceptions.py} +37 -9
  104. classiq/interface/execution/iqcc.py +19 -0
  105. classiq/interface/execution/jobs.py +15 -12
  106. classiq/interface/execution/primitives.py +18 -0
  107. classiq/interface/executor/constants.py +1 -0
  108. classiq/interface/executor/execution_preferences.py +26 -114
  109. classiq/interface/executor/execution_request.py +24 -46
  110. classiq/interface/executor/execution_result.py +30 -8
  111. classiq/interface/executor/iqae_result.py +4 -6
  112. classiq/interface/executor/optimizer_preferences.py +17 -14
  113. classiq/interface/executor/quantum_code.py +28 -24
  114. classiq/interface/executor/quantum_instruction_set.py +2 -2
  115. classiq/interface/executor/register_initialization.py +11 -14
  116. classiq/interface/executor/result.py +83 -56
  117. classiq/interface/executor/vqe_result.py +10 -10
  118. classiq/interface/finance/function_input.py +35 -25
  119. classiq/interface/finance/gaussian_model_input.py +5 -5
  120. classiq/interface/finance/log_normal_model_input.py +4 -4
  121. classiq/interface/finance/model_input.py +4 -4
  122. classiq/interface/generator/adjacency.py +1 -3
  123. classiq/interface/generator/amplitude_loading.py +22 -12
  124. classiq/interface/generator/ansatz_library.py +5 -5
  125. classiq/interface/generator/application_apis/arithmetic_declarations.py +8 -5
  126. classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
  127. classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
  128. classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
  129. classiq/interface/generator/application_apis/finance_declarations.py +48 -69
  130. classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
  131. classiq/interface/generator/arith/argument_utils.py +46 -5
  132. classiq/interface/generator/arith/arithmetic.py +35 -16
  133. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +6 -7
  134. classiq/interface/generator/arith/arithmetic_expression_abc.py +66 -25
  135. classiq/interface/generator/arith/arithmetic_expression_parser.py +11 -11
  136. classiq/interface/generator/arith/arithmetic_expression_validator.py +47 -43
  137. classiq/interface/generator/arith/arithmetic_operations.py +14 -6
  138. classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
  139. classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
  140. classiq/interface/generator/arith/ast_node_rewrite.py +3 -2
  141. classiq/interface/generator/arith/binary_ops.py +218 -130
  142. classiq/interface/generator/arith/endianness.py +1 -1
  143. classiq/interface/generator/arith/extremum_operations.py +96 -25
  144. classiq/interface/generator/arith/logical_ops.py +14 -12
  145. classiq/interface/generator/arith/number_utils.py +12 -6
  146. classiq/interface/generator/arith/register_user_input.py +60 -37
  147. classiq/interface/generator/arith/unary_ops.py +49 -29
  148. classiq/interface/generator/arith/uncomputation_methods.py +1 -1
  149. classiq/interface/generator/builtin_api_builder.py +2 -9
  150. classiq/interface/generator/chemistry_function_params.py +3 -3
  151. classiq/interface/generator/circuit_code/circuit_code.py +7 -7
  152. classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
  153. classiq/interface/generator/commuting_pauli_exponentiation.py +7 -7
  154. classiq/interface/generator/compiler_keywords.py +5 -1
  155. classiq/interface/generator/complex_type.py +13 -18
  156. classiq/interface/generator/constant.py +3 -4
  157. classiq/interface/generator/control_state.py +34 -29
  158. classiq/interface/generator/copy.py +47 -0
  159. classiq/interface/generator/custom_ansatz.py +2 -5
  160. classiq/interface/generator/distance.py +3 -5
  161. classiq/interface/generator/excitations.py +3 -2
  162. classiq/interface/generator/expressions/atomic_expression_functions.py +21 -5
  163. classiq/interface/generator/expressions/enums/__init__.py +0 -10
  164. classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
  165. classiq/interface/generator/expressions/evaluated_expression.py +5 -5
  166. classiq/interface/generator/expressions/expression.py +26 -14
  167. classiq/interface/generator/expressions/expression_constants.py +9 -3
  168. classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
  169. classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
  170. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +34 -8
  171. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
  172. classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
  173. classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
  174. classiq/interface/generator/expressions/sympy_supported_expressions.py +19 -11
  175. classiq/interface/generator/finance.py +2 -2
  176. classiq/interface/generator/function_param_library.py +6 -6
  177. classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
  178. classiq/interface/generator/function_params.py +36 -64
  179. classiq/interface/generator/functions/__init__.py +0 -22
  180. classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
  181. classiq/interface/generator/functions/classical_function_declaration.py +18 -9
  182. classiq/interface/generator/functions/classical_type.py +47 -166
  183. classiq/interface/generator/functions/concrete_types.py +55 -0
  184. classiq/interface/generator/functions/function_declaration.py +13 -14
  185. classiq/interface/generator/functions/port_declaration.py +1 -13
  186. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  187. classiq/interface/generator/functions/type_name.py +90 -0
  188. classiq/interface/generator/generated_circuit_data.py +153 -20
  189. classiq/interface/generator/grover_diffuser.py +32 -25
  190. classiq/interface/generator/grover_operator.py +34 -25
  191. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
  192. classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
  193. classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +9 -9
  194. classiq/interface/generator/hardware/hardware_data.py +72 -34
  195. classiq/interface/generator/hardware_efficient_ansatz.py +20 -16
  196. classiq/interface/generator/hartree_fock.py +13 -5
  197. classiq/interface/generator/identity.py +10 -6
  198. classiq/interface/generator/linear_pauli_rotations.py +32 -20
  199. classiq/interface/generator/mcmt_method.py +1 -1
  200. classiq/interface/generator/mcu.py +17 -15
  201. classiq/interface/generator/mcx.py +24 -17
  202. classiq/interface/generator/model/__init__.py +2 -5
  203. classiq/interface/generator/model/constraints.py +26 -8
  204. classiq/interface/generator/model/model.py +27 -190
  205. classiq/interface/generator/model/preferences/preferences.py +115 -41
  206. classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +14 -17
  207. classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
  208. classiq/interface/generator/oracles/custom_oracle.py +15 -13
  209. classiq/interface/generator/oracles/oracle_abc.py +7 -7
  210. classiq/interface/generator/partitioned_register.py +7 -7
  211. classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
  212. classiq/interface/generator/preferences/optimization.py +1 -2
  213. classiq/interface/generator/qpe.py +41 -30
  214. classiq/interface/generator/qsvm.py +9 -10
  215. classiq/interface/generator/quantum_function_call.py +88 -73
  216. classiq/interface/generator/quantum_program.py +41 -24
  217. classiq/interface/generator/range_types.py +11 -12
  218. classiq/interface/generator/register_role.py +18 -6
  219. classiq/interface/generator/slice_parsing_utils.py +5 -5
  220. classiq/interface/generator/standard_gates/controlled_standard_gates.py +30 -39
  221. classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
  222. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  223. classiq/interface/generator/standard_gates/u_gate.py +7 -10
  224. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  225. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
  226. classiq/interface/generator/state_preparation/distributions.py +16 -15
  227. classiq/interface/generator/state_preparation/metrics.py +4 -7
  228. classiq/interface/generator/state_preparation/state_preparation.py +25 -20
  229. classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
  230. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
  231. classiq/interface/generator/transpiler_basis_gates.py +7 -3
  232. classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
  233. classiq/interface/generator/types/compilation_metadata.py +6 -0
  234. classiq/interface/generator/types/enum_declaration.py +54 -0
  235. classiq/interface/generator/types/qstruct_declaration.py +18 -0
  236. classiq/interface/generator/types/struct_declaration.py +7 -11
  237. classiq/interface/generator/ucc.py +5 -4
  238. classiq/interface/generator/unitary_gate.py +5 -5
  239. classiq/interface/generator/user_defined_function_params.py +4 -1
  240. classiq/interface/generator/validations/flow_graph.py +7 -7
  241. classiq/interface/generator/validations/validator_functions.py +4 -4
  242. classiq/interface/generator/visitor.py +23 -16
  243. classiq/interface/hardware.py +29 -8
  244. classiq/interface/helpers/classproperty.py +8 -0
  245. classiq/interface/helpers/custom_encoders.py +2 -2
  246. classiq/interface/helpers/custom_pydantic_types.py +40 -50
  247. classiq/interface/helpers/datastructures.py +26 -0
  248. classiq/interface/helpers/hashable_mixin.py +3 -2
  249. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  250. classiq/interface/helpers/pydantic_model_helpers.py +7 -5
  251. classiq/interface/helpers/validation_helpers.py +3 -20
  252. classiq/interface/helpers/versioned_model.py +1 -4
  253. classiq/interface/ide/ide_data.py +16 -20
  254. classiq/interface/ide/visual_model.py +130 -0
  255. classiq/interface/interface_version.py +1 -0
  256. classiq/interface/jobs.py +29 -69
  257. classiq/interface/model/allocate.py +16 -0
  258. classiq/interface/model/bind_operation.py +32 -9
  259. classiq/interface/model/classical_if.py +15 -0
  260. classiq/interface/model/classical_parameter_declaration.py +33 -3
  261. classiq/interface/model/control.py +45 -0
  262. classiq/interface/model/handle_binding.py +298 -20
  263. classiq/interface/model/inplace_binary_operation.py +29 -24
  264. classiq/interface/model/invert.py +12 -0
  265. classiq/interface/model/model.py +69 -61
  266. classiq/interface/model/native_function_definition.py +17 -20
  267. classiq/interface/model/parameter.py +13 -0
  268. classiq/interface/model/phase_operation.py +11 -0
  269. classiq/interface/model/port_declaration.py +27 -9
  270. classiq/interface/model/power.py +14 -0
  271. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +30 -18
  272. classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
  273. classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
  274. classiq/interface/model/quantum_function_call.py +141 -343
  275. classiq/interface/model/quantum_function_declaration.py +190 -157
  276. classiq/interface/model/quantum_lambda_function.py +33 -32
  277. classiq/interface/model/quantum_statement.py +71 -12
  278. classiq/interface/model/quantum_type.py +177 -40
  279. classiq/interface/model/quantum_variable_declaration.py +3 -25
  280. classiq/interface/model/repeat.py +15 -0
  281. classiq/interface/model/statement_block.py +40 -14
  282. classiq/interface/model/validation_handle.py +13 -6
  283. classiq/interface/model/variable_declaration_statement.py +3 -1
  284. classiq/interface/model/within_apply_operation.py +7 -5
  285. classiq/interface/server/global_versions.py +6 -7
  286. classiq/interface/server/routes.py +17 -21
  287. classiq/interface/source_reference.py +59 -0
  288. classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
  289. classiq/model_expansions/capturing/__init__.py +0 -0
  290. classiq/model_expansions/capturing/captured_vars.py +435 -0
  291. classiq/model_expansions/capturing/mangling_utils.py +56 -0
  292. classiq/model_expansions/closure.py +171 -0
  293. classiq/model_expansions/debug_flag.py +3 -0
  294. classiq/model_expansions/evaluators/__init__.py +0 -0
  295. classiq/model_expansions/evaluators/arg_type_match.py +158 -0
  296. classiq/model_expansions/evaluators/argument_types.py +42 -0
  297. classiq/model_expansions/evaluators/classical_expression.py +36 -0
  298. classiq/model_expansions/evaluators/control.py +144 -0
  299. classiq/model_expansions/evaluators/parameter_types.py +226 -0
  300. classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
  301. classiq/model_expansions/evaluators/type_type_match.py +90 -0
  302. classiq/model_expansions/expression_evaluator.py +135 -0
  303. classiq/model_expansions/expression_renamer.py +76 -0
  304. classiq/model_expansions/function_builder.py +247 -0
  305. classiq/model_expansions/generative_functions.py +158 -0
  306. classiq/model_expansions/interpreters/__init__.py +0 -0
  307. classiq/model_expansions/interpreters/base_interpreter.py +263 -0
  308. classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
  309. classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
  310. classiq/model_expansions/model_tables.py +18 -0
  311. classiq/model_expansions/quantum_operations/__init__.py +9 -0
  312. classiq/model_expansions/quantum_operations/bind.py +60 -0
  313. classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
  314. classiq/model_expansions/quantum_operations/classicalif.py +53 -0
  315. classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
  316. classiq/model_expansions/quantum_operations/emitter.py +181 -0
  317. classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
  318. classiq/model_expansions/quantum_operations/repeat.py +56 -0
  319. classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
  320. classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
  321. classiq/model_expansions/scope.py +240 -0
  322. classiq/model_expansions/scope_initialization.py +150 -0
  323. classiq/model_expansions/sympy_conversion/__init__.py +0 -0
  324. classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
  325. classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
  326. classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
  327. classiq/model_expansions/transformers/__init__.py +0 -0
  328. classiq/model_expansions/transformers/ast_renamer.py +26 -0
  329. classiq/model_expansions/transformers/var_splitter.py +299 -0
  330. classiq/model_expansions/utils/__init__.py +0 -0
  331. classiq/model_expansions/utils/counted_name_allocator.py +11 -0
  332. classiq/model_expansions/utils/handles_collector.py +33 -0
  333. classiq/model_expansions/visitors/__init__.py +0 -0
  334. classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
  335. classiq/model_expansions/visitors/variable_references.py +144 -0
  336. classiq/open_library/__init__.py +4 -0
  337. classiq/open_library/functions/__init__.py +130 -0
  338. classiq/open_library/functions/amplitude_estimation.py +30 -0
  339. classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
  340. classiq/open_library/functions/grover.py +157 -0
  341. classiq/open_library/functions/hea.py +115 -0
  342. classiq/open_library/functions/linear_pauli_rotation.py +82 -0
  343. classiq/open_library/functions/modular_exponentiation.py +201 -0
  344. classiq/open_library/functions/qaoa_penalty.py +117 -0
  345. classiq/open_library/functions/qft_functions.py +54 -0
  346. classiq/open_library/functions/qpe.py +46 -0
  347. classiq/open_library/functions/qsvt.py +331 -0
  348. classiq/open_library/functions/state_preparation.py +301 -0
  349. classiq/open_library/functions/swap_test.py +27 -0
  350. classiq/open_library/functions/utility_functions.py +81 -0
  351. classiq/open_library/functions/variational.py +52 -0
  352. classiq/qmod/__init__.py +10 -10
  353. classiq/qmod/builtins/__init__.py +19 -2
  354. classiq/qmod/builtins/classical_execution_primitives.py +36 -14
  355. classiq/qmod/builtins/classical_functions.py +39 -43
  356. classiq/qmod/builtins/constants.py +10 -0
  357. classiq/qmod/builtins/enums.py +208 -0
  358. classiq/qmod/builtins/functions/__init__.py +137 -0
  359. classiq/qmod/builtins/functions/allocation.py +150 -0
  360. classiq/qmod/builtins/functions/arithmetic.py +55 -0
  361. classiq/qmod/builtins/functions/benchmarking.py +8 -0
  362. classiq/qmod/builtins/functions/chemistry.py +91 -0
  363. classiq/qmod/builtins/functions/exponentiation.py +105 -0
  364. classiq/qmod/builtins/functions/finance.py +34 -0
  365. classiq/qmod/builtins/functions/operators.py +16 -0
  366. classiq/qmod/builtins/functions/qsvm.py +24 -0
  367. classiq/qmod/builtins/functions/standard_gates.py +651 -0
  368. classiq/qmod/builtins/operations.py +373 -40
  369. classiq/qmod/builtins/structs.py +103 -80
  370. classiq/qmod/cfunc.py +2 -2
  371. classiq/qmod/classical_function.py +4 -8
  372. classiq/qmod/cparam.py +64 -0
  373. classiq/qmod/create_model_function.py +56 -0
  374. classiq/qmod/declaration_inferrer.py +143 -101
  375. classiq/qmod/expression_query.py +20 -4
  376. classiq/qmod/generative.py +42 -0
  377. classiq/qmod/model_state_container.py +18 -6
  378. classiq/qmod/native/__init__.py +7 -0
  379. classiq/qmod/native/expression_to_qmod.py +16 -11
  380. classiq/qmod/native/pretty_printer.py +187 -97
  381. classiq/qmod/pretty_print/__init__.py +7 -0
  382. classiq/qmod/pretty_print/expression_to_python.py +222 -0
  383. classiq/qmod/pretty_print/pretty_printer.py +572 -0
  384. classiq/qmod/python_classical_type.py +67 -0
  385. classiq/qmod/qfunc.py +60 -8
  386. classiq/qmod/qmod_constant.py +93 -26
  387. classiq/qmod/qmod_parameter.py +68 -59
  388. classiq/qmod/qmod_variable.py +468 -155
  389. classiq/qmod/quantum_callable.py +17 -7
  390. classiq/qmod/quantum_expandable.py +269 -96
  391. classiq/qmod/quantum_function.py +196 -41
  392. classiq/qmod/semantics/__init__.py +0 -0
  393. classiq/qmod/semantics/annotation/__init__.py +0 -0
  394. classiq/qmod/semantics/annotation/call_annotation.py +92 -0
  395. classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
  396. classiq/qmod/semantics/error_manager.py +88 -0
  397. classiq/qmod/semantics/lambdas.py +25 -0
  398. classiq/qmod/semantics/static_semantics_visitor.py +384 -0
  399. classiq/qmod/semantics/validation/__init__.py +0 -0
  400. classiq/qmod/semantics/validation/constants_validation.py +16 -0
  401. classiq/qmod/semantics/validation/func_call_validation.py +99 -0
  402. classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
  403. classiq/qmod/semantics/validation/handle_validation.py +85 -0
  404. classiq/qmod/semantics/validation/main_validation.py +33 -0
  405. classiq/qmod/semantics/validation/types_validation.py +128 -0
  406. classiq/qmod/symbolic.py +147 -123
  407. classiq/qmod/symbolic_expr.py +27 -12
  408. classiq/qmod/symbolic_type.py +2 -5
  409. classiq/qmod/type_attribute_remover.py +32 -0
  410. classiq/qmod/utilities.py +98 -4
  411. classiq/qmod/write_qmod.py +17 -3
  412. classiq/synthesis.py +210 -22
  413. {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/METADATA +16 -9
  414. classiq-0.65.4.dist-info/RECORD +521 -0
  415. classiq/_internals/_qfunc_ext.py +0 -6
  416. classiq/applications/benchmarking/__init__.py +0 -9
  417. classiq/applications/benchmarking/mirror_benchmarking.py +0 -70
  418. classiq/applications/numpy_utils.py +0 -37
  419. classiq/applications_model_constructors/__init__.py +0 -25
  420. classiq/applications_model_constructors/combinatorial_helpers/multiple_comp_basis_sp.py +0 -34
  421. classiq/applications_model_constructors/combinatorial_helpers/pauli_helpers/pauli_utils.py +0 -65
  422. classiq/applications_model_constructors/combinatorial_helpers/pyomo_utils.py +0 -243
  423. classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
  424. classiq/applications_model_constructors/libraries/qmci_library.py +0 -107
  425. classiq/builtin_functions/__init__.py +0 -43
  426. classiq/builtin_functions/amplitude_loading.py +0 -3
  427. classiq/builtin_functions/binary_ops.py +0 -1
  428. classiq/builtin_functions/exponentiation.py +0 -5
  429. classiq/builtin_functions/qpe.py +0 -4
  430. classiq/builtin_functions/qsvm.py +0 -7
  431. classiq/builtin_functions/range_types.py +0 -5
  432. classiq/builtin_functions/standard_gates.py +0 -1
  433. classiq/builtin_functions/state_preparation.py +0 -6
  434. classiq/builtin_functions/suzuki_trotter.py +0 -3
  435. classiq/interface/executor/aws_execution_cost.py +0 -73
  436. classiq/interface/executor/error_mitigation.py +0 -6
  437. classiq/interface/generator/credit_risk_example/linear_gci.py +0 -122
  438. classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -69
  439. classiq/interface/generator/expressions/enums/chemistry.py +0 -28
  440. classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
  441. classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
  442. classiq/interface/generator/expressions/enums/optimizers.py +0 -9
  443. classiq/interface/generator/expressions/enums/pauli.py +0 -8
  444. classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
  445. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
  446. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
  447. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
  448. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -1229
  449. classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -95
  450. classiq/interface/generator/functions/foreign_function_definition.py +0 -114
  451. classiq/interface/generator/functions/function_implementation.py +0 -107
  452. classiq/interface/generator/functions/native_function_definition.py +0 -155
  453. classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
  454. classiq/interface/generator/functions/register.py +0 -44
  455. classiq/interface/generator/functions/register_mapping_data.py +0 -106
  456. classiq/interface/generator/inequality_mixer.py +0 -51
  457. classiq/interface/generator/model/classical_main_validator.py +0 -106
  458. classiq/interface/generator/range_mixer.py +0 -56
  459. classiq/interface/generator/state_propagator.py +0 -74
  460. classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -1
  461. classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
  462. classiq/interface/ide/show.py +0 -34
  463. classiq/interface/model/call_synthesis_data.py +0 -68
  464. classiq/interface/model/common_model_types.py +0 -23
  465. classiq/interface/model/quantum_expressions/control_state.py +0 -38
  466. classiq/interface/model/quantum_if_operation.py +0 -94
  467. classiq/interface/model/resolvers/function_call_resolver.py +0 -43
  468. classiq/interface/model/validations/handle_validation_base.py +0 -55
  469. classiq/interface/model/validations/handles_validator.py +0 -156
  470. classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
  471. classiq/model/__init__.py +0 -14
  472. classiq/model/composite_function_generator.py +0 -33
  473. classiq/model/function_handler.py +0 -462
  474. classiq/model/logic_flow.py +0 -149
  475. classiq/model/logic_flow_change_handler.py +0 -71
  476. classiq/model/model.py +0 -229
  477. classiq/qmod/builtins/functions.py +0 -913
  478. classiq/qmod/qmod_struct.py +0 -37
  479. classiq/quantum_functions/__init__.py +0 -17
  480. classiq/quantum_functions/annotation_parser.py +0 -205
  481. classiq/quantum_functions/decorators.py +0 -22
  482. classiq/quantum_functions/function_library.py +0 -181
  483. classiq/quantum_functions/function_parser.py +0 -74
  484. classiq/quantum_functions/quantum_function.py +0 -236
  485. classiq-0.38.0.dist-info/RECORD +0 -454
  486. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/__init__.py +0 -0
  487. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/__init__.py +0 -0
  488. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/__init__.py +0 -0
  489. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +0 -0
  490. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/py.typed +0 -0
  491. /classiq/{applications_model_constructors/combinatorial_helpers/transformations → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
  492. /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
  493. /classiq/{interface/generator/credit_risk_example → applications/hamiltonian}/__init__.py +0 -0
  494. /classiq/{interface/generator/functions/core_lib_declarations → applications/libraries}/__init__.py +0 -0
  495. /classiq/interface/{model/resolvers → debug_info}/__init__.py +0 -0
  496. /classiq/{_internals → interface}/enum_utils.py +0 -0
  497. /classiq/interface/{model/validations → generator/functions/builtins}/__init__.py +0 -0
  498. /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → model_expansions/__init__.py} +0 -0
  499. {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/WHEEL +0 -0
@@ -1,5 +1,3 @@
1
- from typing import List
2
-
3
1
  from classiq.interface.chemistry.fermionic_operator import (
4
2
  FermionicOperator,
5
3
  SummedFermionicOperator,
@@ -15,22 +13,28 @@ from classiq.interface.chemistry.operator import PauliOperator, PauliOperators
15
13
  from . import ground_state_problem
16
14
  from .ansatz_parameters import HEAParameters, HVAParameters, UCCParameters
17
15
  from .chemistry_execution_parameters import ChemistryExecutionParameters
16
+ from .chemistry_model_constructor import (
17
+ construct_chemistry_model,
18
+ molecule_problem_to_qmod,
19
+ )
18
20
 
19
21
  __all__ = [
20
- "Molecule",
21
- "MoleculeProblem",
22
+ "ChemistryExecutionParameters",
23
+ "FermionicOperator",
22
24
  "GroundStateProblem",
25
+ "HEAParameters",
26
+ "HVAParameters",
23
27
  "HamiltonianProblem",
24
- "PauliOperators",
28
+ "Molecule",
29
+ "MoleculeProblem",
25
30
  "PauliOperator",
26
- "FermionicOperator",
31
+ "PauliOperators",
27
32
  "SummedFermionicOperator",
28
33
  "UCCParameters",
29
- "HVAParameters",
30
- "HEAParameters",
31
- "ChemistryExecutionParameters",
34
+ "construct_chemistry_model",
35
+ "molecule_problem_to_qmod",
32
36
  ]
33
37
 
34
38
 
35
- def __dir__() -> List[str]:
39
+ def __dir__() -> list[str]:
36
40
  return __all__
@@ -1,5 +1,5 @@
1
1
  import dataclasses
2
- from typing import List, Tuple, Union
2
+ from typing import Union
3
3
 
4
4
  from classiq.interface.generator.excitations import EXCITATIONS_TYPE_EXACT
5
5
  from classiq.interface.generator.ucc import default_excitation_factory
@@ -21,9 +21,9 @@ class HVAParameters:
21
21
  class HEAParameters:
22
22
  reps: int
23
23
  num_qubits: int
24
- connectivity_map: List[Tuple[int, int]]
25
- one_qubit_gates: List[str]
26
- two_qubit_gates: List[str]
24
+ connectivity_map: list[tuple[int, int]]
25
+ one_qubit_gates: list[str]
26
+ two_qubit_gates: list[str]
27
27
 
28
28
 
29
29
  AnsatzParameters = Union[UCCParameters, HVAParameters, HEAParameters]
@@ -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,12 +29,14 @@ 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
@@ -42,19 +53,21 @@ from classiq.applications.chemistry.ansatz_parameters import (
42
53
  from classiq.applications.chemistry.chemistry_execution_parameters import (
43
54
  ChemistryExecutionParameters,
44
55
  )
45
- 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
46
59
 
47
- _LADDER_OPERATOR_TYPE_INDICATOR_TO_QMOD_MAPPING: Dict[str, str] = {
60
+ _LADDER_OPERATOR_TYPE_INDICATOR_TO_QMOD_MAPPING: dict[str, str] = {
48
61
  "+": "PLUS",
49
62
  "-": "MINUS",
50
63
  }
51
64
 
52
- _CHEMISTRY_PROBLEM_PREFIX_MAPPING: Dict[Type[CHEMISTRY_PROBLEMS_TYPE], str] = {
65
+ _CHEMISTRY_PROBLEM_PREFIX_MAPPING: dict[type[CHEMISTRY_PROBLEMS_TYPE], str] = {
53
66
  MoleculeProblem: "molecule",
54
67
  HamiltonianProblem: "fock_hamiltonian",
55
68
  }
56
69
 
57
- _ANSATZ_PARAMETERS_FUNCTION_NAME_MAPPING: Dict[Type[AnsatzParameters], str] = {
70
+ _ANSATZ_PARAMETERS_FUNCTION_NAME_MAPPING: dict[type[AnsatzParameters], str] = {
58
71
  UCCParameters: "ucc",
59
72
  HVAParameters: "hva",
60
73
  }
@@ -62,180 +75,158 @@ _ANSATZ_PARAMETERS_FUNCTION_NAME_MAPPING: Dict[Type[AnsatzParameters], str] = {
62
75
  _EXECUTION_RESULT = "vqe_result"
63
76
  _MOLECULE_PROBLEM_RESULT = "molecule_result"
64
77
 
65
- _HAE_GATE_MAPPING: Dict[str, QuantumFunctionCall] = {
78
+ _HAE_GATE_MAPPING: dict[str, QuantumFunctionCall] = {
66
79
  "h": QuantumFunctionCall(
67
80
  function="H",
68
- inouts={"target": HandleBinding(name="q")},
81
+ positional_args=[HandleBinding(name="q")],
69
82
  ),
70
83
  "x": QuantumFunctionCall(
71
84
  function="X",
72
- inouts={"target": HandleBinding(name="q")},
85
+ positional_args=[HandleBinding(name="q")],
73
86
  ),
74
87
  "y": QuantumFunctionCall(
75
88
  function="Y",
76
- inouts={"target": HandleBinding(name="q")},
89
+ positional_args=[HandleBinding(name="q")],
77
90
  ),
78
91
  "z": QuantumFunctionCall(
79
92
  function="Z",
80
- inouts={"target": HandleBinding(name="q")},
93
+ positional_args=[HandleBinding(name="q")],
81
94
  ),
82
95
  "i": QuantumFunctionCall(
83
96
  function="I",
84
- inouts={"target": HandleBinding(name="q")},
97
+ positional_args=[HandleBinding(name="q")],
85
98
  ),
86
99
  "s": QuantumFunctionCall(
87
100
  function="S",
88
- inouts={"target": HandleBinding(name="q")},
101
+ positional_args=[HandleBinding(name="q")],
89
102
  ),
90
103
  "t": QuantumFunctionCall(
91
104
  function="T",
92
- inouts={"target": HandleBinding(name="q")},
105
+ positional_args=[HandleBinding(name="q")],
93
106
  ),
94
107
  "sdg": QuantumFunctionCall(
95
108
  function="SDG",
96
- inouts={"target": HandleBinding(name="q")},
109
+ positional_args=[HandleBinding(name="q")],
97
110
  ),
98
111
  "tdg": QuantumFunctionCall(
99
112
  function="TDG",
100
- inouts={"target": HandleBinding(name="q")},
113
+ positional_args=[HandleBinding(name="q")],
101
114
  ),
102
115
  "p": QuantumFunctionCall(
103
116
  function="PHASE",
104
- inouts={"target": HandleBinding(name="q")},
117
+ positional_args=[HandleBinding(name="q")],
105
118
  ),
106
119
  "rx": QuantumFunctionCall(
107
120
  function="RX",
108
- params={"theta": Expression(expr="angle")},
109
- inouts={"target": HandleBinding(name="q")},
121
+ positional_args=[Expression(expr="angle"), HandleBinding(name="q")],
110
122
  ),
111
123
  "ry": QuantumFunctionCall(
112
124
  function="RY",
113
- params={"theta": Expression(expr="angle")},
114
- inouts={"target": HandleBinding(name="q")},
125
+ positional_args=[Expression(expr="angle"), HandleBinding(name="q")],
115
126
  ),
116
127
  "rz": QuantumFunctionCall(
117
128
  function="RZ",
118
- params={"theta": Expression(expr="angle")},
119
- inouts={"target": HandleBinding(name="q")},
129
+ positional_args=[Expression(expr="angle"), HandleBinding(name="q")],
120
130
  ),
121
131
  "rxx": QuantumFunctionCall(
122
132
  function="RXX",
123
- params={"theta": Expression(expr="angle")},
124
- inouts={"target": HandleBinding(name="q")},
133
+ positional_args=[Expression(expr="angle"), HandleBinding(name="q")],
125
134
  ),
126
135
  "ryy": QuantumFunctionCall(
127
136
  function="RYY",
128
- params={"theta": Expression(expr="angle")},
129
- inouts={"target": HandleBinding(name="q")},
137
+ positional_args=[Expression(expr="angle"), HandleBinding(name="q")],
130
138
  ),
131
139
  "rzz": QuantumFunctionCall(
132
140
  function="RZZ",
133
- params={"theta": Expression(expr="angle")},
134
- inouts={"target": HandleBinding(name="q")},
141
+ positional_args=[Expression(expr="angle"), HandleBinding(name="q")],
135
142
  ),
136
143
  "ch": QuantumFunctionCall(
137
144
  function="CH",
138
- inouts={
139
- "target": HandleBinding(name="q1"),
140
- "control": HandleBinding(name="q2"),
141
- },
145
+ positional_args=[HandleBinding(name="q1"), HandleBinding(name="q2")],
142
146
  ),
143
147
  "cx": QuantumFunctionCall(
144
148
  function="CX",
145
- inouts={
146
- "target": HandleBinding(name="q1"),
147
- "control": HandleBinding(name="q2"),
148
- },
149
+ positional_args=[HandleBinding(name="q1"), HandleBinding(name="q2")],
149
150
  ),
150
151
  "cy": QuantumFunctionCall(
151
152
  function="CY",
152
- inouts={
153
- "target": HandleBinding(name="q1"),
154
- "control": HandleBinding(name="q2"),
155
- },
153
+ positional_args=[HandleBinding(name="q1"), HandleBinding(name="q2")],
156
154
  ),
157
155
  "cz": QuantumFunctionCall(
158
156
  function="CZ",
159
- inouts={
160
- "target": HandleBinding(name="q1"),
161
- "control": HandleBinding(name="q2"),
162
- },
157
+ positional_args=[HandleBinding(name="q1"), HandleBinding(name="q2")],
163
158
  ),
164
159
  "crx": QuantumFunctionCall(
165
160
  function="CRX",
166
- params={"theta": Expression(expr="angle")},
167
- inouts={
168
- "target": HandleBinding(name="q1"),
169
- "control": HandleBinding(name="q2"),
170
- },
161
+ positional_args=[
162
+ Expression(expr="angle"),
163
+ HandleBinding(name="q1"),
164
+ HandleBinding(name="q2"),
165
+ ],
171
166
  ),
172
167
  "cry": QuantumFunctionCall(
173
168
  function="CRY",
174
- params={"theta": Expression(expr="angle")},
175
- inouts={
176
- "target": HandleBinding(name="q1"),
177
- "control": HandleBinding(name="q2"),
178
- },
169
+ positional_args=[
170
+ Expression(expr="angle"),
171
+ HandleBinding(name="q1"),
172
+ HandleBinding(name="q2"),
173
+ ],
179
174
  ),
180
175
  "crz": QuantumFunctionCall(
181
176
  function="CRZ",
182
- params={"theta": Expression(expr="angle")},
183
- inouts={
184
- "target": HandleBinding(name="q1"),
185
- "control": HandleBinding(name="q2"),
186
- },
177
+ positional_args=[
178
+ Expression(expr="angle"),
179
+ HandleBinding(name="q1"),
180
+ HandleBinding(name="q2"),
181
+ ],
187
182
  ),
188
183
  "cp": QuantumFunctionCall(
189
184
  function="CPHASE",
190
- params={"theta": Expression(expr="angle")},
191
- inouts={
192
- "target": HandleBinding(name="q1"),
193
- "control": HandleBinding(name="q2"),
194
- },
185
+ positional_args=[
186
+ Expression(expr="angle"),
187
+ HandleBinding(name="q1"),
188
+ HandleBinding(name="q2"),
189
+ ],
195
190
  ),
196
191
  "swap": QuantumFunctionCall(
197
192
  function="SWAP",
198
- inouts={"qbit0": HandleBinding(name="q1"), "qbit1": HandleBinding(name="q2")},
193
+ positional_args=[HandleBinding(name="q1"), HandleBinding(name="q2")],
199
194
  ),
200
195
  }
201
196
 
202
197
 
203
- def _atoms_to_qmod_atoms(atoms: List[Atom]) -> str:
204
- # fmt: off
205
- atom_struct_literals = [
206
- "struct_literal(ChemistryAtom,"
207
- f"element={Element[atom.symbol]},"
208
- "position=struct_literal(Position,"
209
- f"x={atom.x},"
210
- f"y={atom.y},"
211
- f"z={atom.z}"
212
- ")"
213
- ")"
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
+ )
214
208
  for atom in atoms
215
209
  ]
216
- # fmt: on
217
- return ",".join(atom_struct_literals)
218
210
 
219
211
 
220
212
  def molecule_problem_to_qmod(
221
213
  molecule_problem: MoleculeProblem,
222
- ) -> str:
223
- # fmt: off
224
- return (
225
- "struct_literal("
226
- "MoleculeProblem,"
227
- f"mapping={FermionMapping[molecule_problem.mapping.value.upper()]},"
228
- f"z2_symmetries={molecule_problem.z2_symmetries},"
229
- "molecule=struct_literal("
230
- "Molecule,"
231
- f"atoms=[{_atoms_to_qmod_atoms(molecule_problem.molecule.atoms)}],"
232
- f"spin={molecule_problem.molecule.spin},"
233
- f"charge={molecule_problem.molecule.charge}"
234
- "),"
235
- f"freeze_core={molecule_problem.freeze_core},"
236
- f"remove_orbitals={molecule_problem.remove_orbitals}"
237
- ")")
238
- # 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
+ )
239
230
 
240
231
 
241
232
  def _fermionic_operator_to_qmod_ladder_ops(
@@ -271,11 +262,12 @@ def _summed_fermionic_operator_to_qmod_lader_terms(
271
262
  def _hamiltonian_problem_to_qmod_fock_hamiltonian_problem(
272
263
  hamiltonian_problem: HamiltonianProblem,
273
264
  ) -> str:
265
+ mapping = FermionMapping[hamiltonian_problem.mapping.value.upper()]
274
266
  return (
275
267
  # fmt: off
276
268
  "struct_literal("
277
269
  "FockHamiltonianProblem,"
278
- f"mapping={FermionMapping[hamiltonian_problem.mapping.value.upper()]},"
270
+ f"mapping={qmod_val_to_expr_str(mapping)},"
279
271
  f"z2_symmetries={hamiltonian_problem.z2_symmetries},"
280
272
  f"terms=[{_summed_fermionic_operator_to_qmod_lader_terms(hamiltonian_problem.hamiltonian)}],"
281
273
  f"num_particles={hamiltonian_problem.num_particles}"
@@ -286,7 +278,7 @@ def _hamiltonian_problem_to_qmod_fock_hamiltonian_problem(
286
278
 
287
279
  def _convert_library_problem_to_qmod_problem(problem: CHEMISTRY_PROBLEMS_TYPE) -> str:
288
280
  if isinstance(problem, MoleculeProblem):
289
- return molecule_problem_to_qmod(problem)
281
+ return qmod_val_to_expr_str(molecule_problem_to_qmod(problem))
290
282
  elif isinstance(problem, HamiltonianProblem):
291
283
  return _hamiltonian_problem_to_qmod_fock_hamiltonian_problem(problem)
292
284
  else:
@@ -297,18 +289,18 @@ def _get_chemistry_function(
297
289
  chemistry_problem: CHEMISTRY_PROBLEMS_TYPE,
298
290
  chemistry_function_name: str,
299
291
  inouts: Mapping[IOName, HandleBinding],
300
- ansatz_parameters_expressions: Optional[Dict[str, Expression]] = None,
292
+ ansatz_parameters_expressions: Optional[list[Expression]] = None,
301
293
  ) -> QuantumFunctionCall:
302
294
  problem_prefix = _CHEMISTRY_PROBLEM_PREFIX_MAPPING[type(chemistry_problem)]
303
295
  return QuantumFunctionCall(
304
296
  function=f"{problem_prefix}_{chemistry_function_name}",
305
- params={
306
- f"{problem_prefix}_problem": Expression(
297
+ positional_args=[
298
+ Expression(
307
299
  expr=_convert_library_problem_to_qmod_problem(chemistry_problem)
308
300
  ),
309
- **(ansatz_parameters_expressions or dict()),
310
- },
311
- inouts=inouts,
301
+ *(ansatz_parameters_expressions or []),
302
+ *inouts.values(),
303
+ ],
312
304
  )
313
305
 
314
306
 
@@ -325,28 +317,32 @@ def _get_hartree_fock(
325
317
  def _get_hea_function(hea_parameters: HEAParameters) -> QuantumFunctionCall:
326
318
  return QuantumFunctionCall(
327
319
  function="full_hea",
328
- params={
329
- "num_qubits": Expression(expr=f"{hea_parameters.num_qubits}"),
330
- "is_parametrized": Expression(
320
+ positional_args=[
321
+ Expression(expr=f"{hea_parameters.num_qubits}"),
322
+ Expression(
331
323
  expr=f"{[int(_is_parametric_gate(_HAE_GATE_MAPPING[gate])) for gate in hea_parameters.one_qubit_gates+hea_parameters.two_qubit_gates]}"
332
324
  ),
333
- "angle_params": Expression(expr="t"),
334
- "connectivity_map": Expression(
325
+ Expression(expr="t"),
326
+ Expression(
335
327
  expr=f"{[list(connectivity_pair) for connectivity_pair in hea_parameters.connectivity_map]}"
336
328
  ),
337
- "reps": Expression(expr=f"{hea_parameters.reps}"),
338
- },
339
- operands={
340
- "operands_1qubit": [
341
- 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
+ )
342
335
  for gate in hea_parameters.one_qubit_gates
343
336
  ],
344
- "operands_2qubit": [
345
- QuantumLambdaFunction(body=[_HAE_GATE_MAPPING[gate]])
337
+ [
338
+ QuantumLambdaFunction(
339
+ pos_rename_params=["angle", "q1", "q2"],
340
+ body=[_HAE_GATE_MAPPING[gate]],
341
+ )
346
342
  for gate in hea_parameters.two_qubit_gates
347
343
  ],
348
- },
349
- inouts={"x": HandleBinding(name="qbv")},
344
+ HandleBinding(name="qbv"),
345
+ ],
350
346
  )
351
347
 
352
348
 
@@ -360,10 +356,10 @@ def _get_ansatz(
360
356
  chemistry_problem,
361
357
  _ANSATZ_PARAMETERS_FUNCTION_NAME_MAPPING[type(ansatz_parameters)],
362
358
  {"qbv": HandleBinding(name="qbv")},
363
- {
364
- param_name: Expression(expr=str(param_value))
359
+ [
360
+ Expression(expr=str(param_value))
365
361
  for param_name, param_value in ansatz_parameters.__dict__.items()
366
- },
362
+ ],
367
363
  )
368
364
 
369
365
 
@@ -385,13 +381,16 @@ def _get_molecule_problem_execution_post_processing(
385
381
  molecule_problem: MoleculeProblem,
386
382
  ) -> str:
387
383
  return f"""
388
- {_MOLECULE_PROBLEM_RESULT} = molecule_ground_state_solution_post_process({molecule_problem_to_qmod(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})
389
385
  save({{{_MOLECULE_PROBLEM_RESULT!r}: {_MOLECULE_PROBLEM_RESULT}}})
390
386
  """
391
387
 
392
388
 
393
389
  def _is_parametric_gate(call: QuantumFunctionCall) -> bool:
394
- 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)
395
394
 
396
395
 
397
396
  def _get_execution_result_post_processing_statements(
@@ -405,7 +404,7 @@ def _get_execution_result_post_processing_statements(
405
404
  raise ClassiqError(f"Invalid problem type: {problem}")
406
405
 
407
406
 
408
- def _count_parametric_gates(gates: List[str]) -> int:
407
+ def _count_parametric_gates(gates: list[str]) -> int:
409
408
  return sum(_is_parametric_gate(_HAE_GATE_MAPPING[gate]) for gate in gates)
410
409
 
411
410
 
@@ -420,14 +419,18 @@ def _get_hea_port_size(hea_parameters: HEAParameters) -> int:
420
419
 
421
420
  def _get_chemistry_quantum_main_params(
422
421
  ansatz_parameters: AnsatzParameters,
423
- ) -> Dict[str, ClassicalType]:
422
+ ) -> list[ClassicalParameterDeclaration]:
424
423
  if not isinstance(ansatz_parameters, HEAParameters):
425
- return dict()
426
- return {
427
- "t": ClassicalArray(
428
- element_type=Real(), size=_get_hea_port_size(ansatz_parameters)
429
- )
430
- }
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
+ ]
431
434
 
432
435
 
433
436
  def _get_problem_to_hamiltonian_name(chemistry_problem: CHEMISTRY_PROBLEMS_TYPE) -> str:
@@ -440,16 +443,13 @@ def _get_chemistry_quantum_main(
440
443
  use_hartree_fock: bool,
441
444
  ansatz_parameters: AnsatzParameters,
442
445
  ) -> NativeFunctionDefinition:
443
- body = []
446
+ body: list[QuantumStatement] = []
444
447
  body.append(
445
- QuantumFunctionCall(
446
- function="allocate",
447
- positional_args=[
448
- Expression(
449
- expr=f"len(get_field({_get_problem_to_hamiltonian_name(chemistry_problem)}({_convert_library_problem_to_qmod_problem(chemistry_problem)})[0], 'pauli'))"
450
- ),
451
- HandleBinding(name="qbv"),
452
- ],
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"),
453
453
  ),
454
454
  )
455
455
  if use_hartree_fock:
@@ -459,14 +459,10 @@ def _get_chemistry_quantum_main(
459
459
 
460
460
  return NativeFunctionDefinition(
461
461
  name="main",
462
- param_decls=_get_chemistry_quantum_main_params(ansatz_parameters),
463
- port_declarations=(
464
- {
465
- "qbv": PortDeclaration(
466
- name="qbv", direction=PortDeclarationDirection.Output
467
- )
468
- }
469
- ),
462
+ positional_arg_declarations=_get_chemistry_quantum_main_params(
463
+ ansatz_parameters
464
+ )
465
+ + [PortDeclaration(name="qbv", direction=PortDeclarationDirection.Output)],
470
466
  body=body,
471
467
  )
472
468
 
@@ -476,14 +472,15 @@ def _get_chemistry_classical_code(
476
472
  execution_parameters: ChemistryExecutionParameters,
477
473
  ) -> str:
478
474
  qmod_problem = _convert_library_problem_to_qmod_problem(chemistry_problem)
479
- return f"""
475
+ return (
476
+ f"""
480
477
  {_EXECUTION_RESULT} = vqe(
481
478
  hamiltonian={_get_problem_to_hamiltonian_name(chemistry_problem)}({qmod_problem}), {_get_chemistry_vqe_additional_params(execution_parameters)}
482
479
  )
483
480
  save({{{_EXECUTION_RESULT!r}: {_EXECUTION_RESULT}}})
484
- """ + _get_execution_result_post_processing_statements(
485
- chemistry_problem
486
- )
481
+ """
482
+ + _get_execution_result_post_processing_statements(chemistry_problem)
483
+ ).strip()
487
484
 
488
485
 
489
486
  def construct_chemistry_model(
@@ -492,12 +489,22 @@ def construct_chemistry_model(
492
489
  ansatz_parameters: AnsatzParameters,
493
490
  execution_parameters: ChemistryExecutionParameters,
494
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
+ )
495
506
  model = Model(
496
- functions=[
497
- _get_chemistry_quantum_main(
498
- chemistry_problem, use_hartree_fock, ansatz_parameters
499
- ),
500
- ],
507
+ functions=chemistry_functions,
501
508
  classical_execution_code=_get_chemistry_classical_code(
502
509
  chemistry_problem, execution_parameters
503
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]
@@ -15,6 +15,9 @@ def is_constraint_sum_less_than_one(
15
15
  isinstance(expression, LessThan)
16
16
  and isinstance(expression.args[0], Add)
17
17
  and all(isinstance(arg, Symbol) for arg in expression.args[0].args)
18
- and expression.args[1] == _INEQUALITY_UPPER_LIMIT
18
+ and (
19
+ expression.args[1] == _INEQUALITY_UPPER_LIMIT
20
+ or expression.args[1] == float(_INEQUALITY_UPPER_LIMIT)
21
+ )
19
22
  and encoding_type is None
20
23
  )
@@ -5,7 +5,7 @@ from pyomo.core.expr.sympy_tools import PyomoSympyBimap
5
5
  from scipy.optimize import differential_evolution
6
6
  from sympy import Expr
7
7
 
8
- from classiq.applications_model_constructors.combinatorial_helpers import encoding_utils
8
+ from classiq.applications.combinatorial_helpers import encoding_utils
9
9
 
10
10
 
11
11
  def sympy_lambdify(*args: Any, **kwargs: Any) -> Any: