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,4 @@
1
1
  import itertools
2
- from typing import List
3
2
 
4
3
  from pyomo.core.base.constraint import _GeneralConstraintData
5
4
  from pyomo.core.expr.relational_expr import EqualityExpression
@@ -7,7 +6,7 @@ from pyomo.environ import Expression
7
6
 
8
7
 
9
8
  def get_penalty_expression(
10
- flat_constraints: List[_GeneralConstraintData],
9
+ flat_constraints: list[_GeneralConstraintData],
11
10
  ) -> Expression:
12
11
  return sum(
13
12
  _convert_constraint_to_penalty_term(constraint)
@@ -3,16 +3,12 @@ from pyomo.core.base.constraint import _GeneralConstraintData
3
3
  from pyomo.core.expr.relational_expr import EqualityExpression
4
4
  from pyomo.repn.standard_repn import _GeneralVarData
5
5
 
6
- from classiq.applications_model_constructors.combinatorial_helpers import (
6
+ from classiq.applications.combinatorial_helpers import (
7
7
  allowed_constraints,
8
8
  encoding_utils,
9
9
  )
10
- from classiq.applications_model_constructors.combinatorial_helpers.pyomo_utils import (
11
- extract,
12
- )
13
- from classiq.applications_model_constructors.combinatorial_helpers.sympy_utils import (
14
- sympyify_expression,
15
- )
10
+ from classiq.applications.combinatorial_helpers.pyomo_utils import extract
11
+ from classiq.applications.combinatorial_helpers.sympy_utils import sympyify_expression
16
12
 
17
13
 
18
14
  def is_model_penalty_supported(model: ConcreteModel) -> bool:
@@ -1,5 +1,4 @@
1
1
  from itertools import filterfalse
2
- from typing import List, Tuple
3
2
 
4
3
  from sympy import (
5
4
  Add,
@@ -13,7 +12,7 @@ from sympy import (
13
12
  simplify,
14
13
  )
15
14
 
16
- from classiq.exceptions import ClassiqCombOptError
15
+ from classiq.interface.exceptions import ClassiqCombOptError
17
16
 
18
17
 
19
18
  def sign_separation(expr: Expr) -> LessThan:
@@ -43,7 +42,7 @@ def sign_separation(expr: Expr) -> LessThan:
43
42
  return modified_expr
44
43
 
45
44
 
46
- def _get_positive_and_negative_args(expr: Expr) -> Tuple[List[Expr], List[Expr]]:
45
+ def _get_positive_and_negative_args(expr: Expr) -> tuple[list[Expr], list[Expr]]:
47
46
  positive_args = []
48
47
  negative_args = []
49
48
 
@@ -1,20 +1,17 @@
1
1
  import math
2
2
  from functools import cached_property
3
3
  from itertools import filterfalse
4
- from typing import List
5
4
 
6
5
  import pyomo.core as pyo
7
6
  from pyomo.core.base.component import _ComponentBase
8
7
  from pyomo.core.expr.sympy_tools import sympy2pyomo_expression, sympyify_expression
9
8
 
10
- from classiq.applications_model_constructors.combinatorial_helpers import pyomo_utils
11
- from classiq.applications_model_constructors.combinatorial_helpers.arithmetic.arithmetic_expression import (
9
+ from classiq.applications.combinatorial_helpers import pyomo_utils
10
+ from classiq.applications.combinatorial_helpers.arithmetic.arithmetic_expression import (
12
11
  multivariate_extremum,
13
12
  )
14
- from classiq.applications_model_constructors.combinatorial_helpers.transformations import (
15
- penalty_support,
16
- )
17
- from classiq.applications_model_constructors.combinatorial_helpers.transformations.sign_seperation import (
13
+ from classiq.applications.combinatorial_helpers.transformations import penalty_support
14
+ from classiq.applications.combinatorial_helpers.transformations.sign_seperation import (
18
15
  sign_separation,
19
16
  )
20
17
 
@@ -69,7 +66,7 @@ class ConstraintConvertor:
69
66
  return max_upper - min_lower
70
67
 
71
68
  @cached_property
72
- def _slack_coeffs(self) -> List[int]:
69
+ def _slack_coeffs(self) -> list[int]:
73
70
  coeffs = [2**idx for idx in self.slack_var_idxs[:-1]]
74
71
  coeffs += [self._bound_int - sum(coeffs)]
75
72
  return coeffs
@@ -1,22 +1,36 @@
1
- from typing import List
2
-
3
1
  from classiq.interface.combinatorial_optimization import examples
2
+ from classiq.interface.combinatorial_optimization.encoding_types import EncodingType
4
3
  from classiq.interface.combinatorial_optimization.solver_types import QSolver
5
4
 
6
- from classiq.applications_model_constructors.combinatorial_helpers.combinatorial_problem_utils import (
5
+ from classiq.applications.combinatorial_helpers.combinatorial_problem_utils import (
6
+ compute_qaoa_initial_point,
7
7
  get_optimization_solution_from_pyo,
8
+ pyo_model_to_hamiltonian,
8
9
  )
9
10
 
10
11
  from .combinatorial_optimization_config import OptimizerConfig, QAOAConfig
12
+ from .combinatorial_optimization_model_constructor import (
13
+ construct_combinatorial_optimization_model,
14
+ )
15
+ from .combinatorial_problem import (
16
+ CombinatorialProblem,
17
+ execute_qaoa,
18
+ )
11
19
 
12
20
  __all__ = [
21
+ "CombinatorialProblem",
22
+ "EncodingType",
23
+ "OptimizerConfig",
24
+ "QAOAConfig",
13
25
  "QSolver",
26
+ "compute_qaoa_initial_point",
27
+ "construct_combinatorial_optimization_model",
14
28
  "examples",
15
- "QAOAConfig",
16
- "OptimizerConfig",
29
+ "execute_qaoa",
17
30
  "get_optimization_solution_from_pyo",
31
+ "pyo_model_to_hamiltonian",
18
32
  ]
19
33
 
20
34
 
21
- def __dir__() -> List[str]:
35
+ def __dir__() -> list[str]:
22
36
  return __all__
@@ -1,6 +1,6 @@
1
1
  import dataclasses
2
2
  from dataclasses import dataclass
3
- from typing import List, Optional
3
+ from typing import Optional
4
4
 
5
5
  from classiq.interface.executor.optimizer_preferences import CostType, OptimizerType
6
6
 
@@ -20,4 +20,4 @@ class OptimizerConfig:
20
20
  skip_compute_variance: bool = False
21
21
  cost_type: CostType = CostType.CVAR
22
22
  alpha_cvar: float = 1.0
23
- initial_point: Optional[List[float]] = dataclasses.field(default=None)
23
+ initial_point: Optional[list[float]] = dataclasses.field(default=None)
@@ -9,30 +9,32 @@ from classiq.interface.generator.functions.classical_type import (
9
9
  ClassicalArray,
10
10
  ClassicalList,
11
11
  Real,
12
- Struct,
13
12
  )
14
13
  from classiq.interface.generator.functions.port_declaration import (
15
14
  PortDeclarationDirection,
16
15
  )
16
+ from classiq.interface.generator.functions.type_name import Struct
17
+ from classiq.interface.model.allocate import Allocate
18
+ from classiq.interface.model.classical_parameter_declaration import (
19
+ ClassicalParameterDeclaration,
20
+ )
17
21
  from classiq.interface.model.handle_binding import HandleBinding
18
22
  from classiq.interface.model.model import Model, SerializedModel
19
23
  from classiq.interface.model.native_function_definition import NativeFunctionDefinition
20
24
  from classiq.interface.model.port_declaration import PortDeclaration
21
25
  from classiq.interface.model.quantum_function_call import QuantumFunctionCall
26
+ from classiq.interface.model.quantum_type import QuantumBitvector
22
27
 
23
- from classiq.applications.combinatorial_optimization.combinatorial_optimization_config import (
24
- OptimizerConfig,
25
- QAOAConfig,
26
- )
27
- from classiq.applications_model_constructors.combinatorial_helpers.combinatorial_problem_utils import (
28
+ from classiq.applications.combinatorial_helpers.combinatorial_problem_utils import (
28
29
  compute_qaoa_initial_point,
29
30
  convert_pyomo_to_global_presentation,
30
31
  pyo_model_to_hamiltonian,
31
32
  )
32
- from classiq.applications_model_constructors.combinatorial_helpers.pauli_helpers.pauli_utils import (
33
- _pauli_operator_to_qmod,
34
- get_pauli_operator,
33
+ from classiq.applications.combinatorial_helpers.pauli_helpers.pauli_utils import (
34
+ _pauli_terms_to_qmod,
35
35
  )
36
+ from classiq.applications.combinatorial_optimization import OptimizerConfig, QAOAConfig
37
+ from classiq.open_library.functions.qaoa_penalty import qaoa_penalty
36
38
 
37
39
 
38
40
  def construct_combi_opt_py_model(
@@ -51,10 +53,9 @@ def construct_combi_opt_py_model(
51
53
  max_iteration = optimizer_config.max_iteration
52
54
 
53
55
  hamiltonian = pyo_model_to_hamiltonian(pyo_model, qaoa_config.penalty_energy)
56
+ len_hamiltonian = len(hamiltonian[0].pauli) # type: ignore[arg-type]
54
57
  qaoa_initial_point = compute_qaoa_initial_point(hamiltonian, qaoa_config.num_layers)
55
- len_hamiltonian = len(hamiltonian[0]["pauli"])
56
- pauli_oper = get_pauli_operator(hamiltonian)
57
- pauli_qmod = _pauli_operator_to_qmod(pauli_oper)
58
+ pauli_qmod = _pauli_terms_to_qmod(hamiltonian)
58
59
 
59
60
  initial_point_expression = (
60
61
  f"{optimizer_config.initial_point}"
@@ -73,37 +74,38 @@ def construct_combi_opt_py_model(
73
74
  functions=[
74
75
  NativeFunctionDefinition(
75
76
  name="main",
76
- param_decls={
77
- "params_list": ClassicalArray(
78
- element_type=Real(), size=qaoa_config.num_layers * 2
79
- )
80
- },
81
- port_declarations={
82
- "target": PortDeclaration(
77
+ positional_arg_declarations=[
78
+ ClassicalParameterDeclaration(
79
+ name="params_list",
80
+ classical_type=ClassicalArray(
81
+ element_type=Real(), size=qaoa_config.num_layers * 2
82
+ ),
83
+ ),
84
+ PortDeclaration(
83
85
  name="target",
84
- size=Expression(expr=f"{len_hamiltonian}"),
86
+ quantum_type=QuantumBitvector(
87
+ length=Expression(expr=f"{len_hamiltonian}"),
88
+ ),
85
89
  direction=PortDeclarationDirection.Output,
86
90
  ),
87
- },
91
+ ],
88
92
  body=[
93
+ Allocate(
94
+ size=Expression(expr="get_field(target, 'len')"),
95
+ target=HandleBinding(name="target"),
96
+ ),
89
97
  QuantumFunctionCall(
90
- function="allocate",
98
+ function="qaoa_penalty",
91
99
  positional_args=[
92
- Expression(expr="len(target)"),
100
+ Expression(expr="get_field(target, 'len')"),
101
+ Expression(expr="params_list"),
102
+ Expression(expr="hamiltonian"),
93
103
  HandleBinding(name="target"),
94
104
  ],
95
105
  ),
96
- QuantumFunctionCall(
97
- function="qaoa_penalty",
98
- params={
99
- "num_qubits": Expression(expr="len(target)"),
100
- "params_list": Expression(expr="params_list"),
101
- "hamiltonian": Expression(expr="hamiltonian"),
102
- },
103
- inouts={"target": HandleBinding(name="target")},
104
- ),
105
106
  ],
106
107
  ),
108
+ *[f for f in qaoa_penalty.create_model().functions if f.name != "main"],
107
109
  ],
108
110
  classical_execution_code=f"""
109
111
  vqe_result = vqe(
@@ -119,7 +121,7 @@ alpha_cvar={optimizer_config.alpha_cvar}
119
121
  )
120
122
 
121
123
  save({{"vqe_result": vqe_result, "hamiltonian": hamiltonian}})
122
- """,
124
+ """.strip(),
123
125
  )
124
126
 
125
127
 
@@ -0,0 +1,229 @@
1
+ import math
2
+ import re
3
+ from typing import Callable, Optional
4
+
5
+ import numpy as np
6
+ import pandas as pd
7
+ import pyomo.core as pyo
8
+ import scipy
9
+ from tqdm import tqdm
10
+
11
+ from classiq.interface.executor.execution_preferences import ExecutionPreferences
12
+ from classiq.interface.executor.result import ExecutionDetails
13
+ from classiq.interface.model.model import SerializedModel
14
+
15
+ from classiq import Constraints, Preferences
16
+ from classiq.applications.combinatorial_helpers.combinatorial_problem_utils import (
17
+ pyo_model_to_qmod_problem,
18
+ )
19
+ from classiq.execution import ExecutionSession
20
+ from classiq.open_library.functions.utility_functions import (
21
+ apply_to_all,
22
+ hadamard_transform,
23
+ )
24
+ from classiq.qmod.builtins.functions import RX
25
+ from classiq.qmod.builtins.operations import allocate, phase, repeat
26
+ from classiq.qmod.cparam import CReal
27
+ from classiq.qmod.create_model_function import create_model
28
+ from classiq.qmod.qfunc import qfunc
29
+ from classiq.qmod.qmod_parameter import CArray
30
+ from classiq.qmod.qmod_variable import Output, QVar
31
+ from classiq.synthesis import SerializedQuantumProgram, synthesize
32
+
33
+
34
+ class CombinatorialProblem:
35
+ def __init__(
36
+ self,
37
+ pyo_model: pyo.ConcreteModel,
38
+ num_layers: int,
39
+ penalty_factor: int = 1,
40
+ ):
41
+ self.problem_vars_, self.cost_func = pyo_model_to_qmod_problem(
42
+ pyo_model, penalty_factor
43
+ )
44
+ self.num_layers_ = num_layers
45
+ self.model_ = None
46
+ self.qprog_ = None
47
+ self.es_ = None
48
+ self.optimized_params_ = None
49
+ self.params_trace_: list[np.ndarray] = []
50
+ self.cost_trace_: list = []
51
+
52
+ @property
53
+ def cost_trace(self) -> list:
54
+ return self.cost_trace_
55
+
56
+ @property
57
+ def params_trace(self) -> list[np.ndarray]:
58
+ return self.params_trace_
59
+
60
+ @property
61
+ def optimized_params(self) -> list:
62
+ return self.optimized_params_ # type:ignore[return-value]
63
+
64
+ def get_model(
65
+ self,
66
+ constraints: Optional[Constraints] = None,
67
+ preferences: Optional[Preferences] = None,
68
+ ) -> SerializedModel:
69
+ @qfunc
70
+ def main(
71
+ params: CArray[CReal, self.num_layers_ * 2], # type:ignore[valid-type]
72
+ v: Output[self.problem_vars_], # type:ignore[name-defined]
73
+ ) -> None:
74
+ allocate(v.size, v)
75
+ hadamard_transform(v)
76
+ repeat(
77
+ self.num_layers_,
78
+ lambda i: [ # type:ignore[arg-type]
79
+ phase(
80
+ -self.cost_func(v), params[i]
81
+ ), # type:ignore[func-returns-value]
82
+ apply_to_all(lambda q: RX(params[self.num_layers_ + i], q), v),
83
+ ],
84
+ )
85
+
86
+ self.model_ = create_model(
87
+ main, constraints=constraints, preferences=preferences
88
+ ) # type:ignore[assignment]
89
+ return self.model_ # type:ignore[return-value]
90
+
91
+ def get_qprog(self) -> SerializedQuantumProgram:
92
+ if self.model_ is None:
93
+ self.get_model()
94
+ self.qprog_ = synthesize(self.model_) # type:ignore[assignment,arg-type]
95
+ return self.qprog_ # type:ignore[return-value]
96
+
97
+ def optimize(
98
+ self,
99
+ execution_preferences: Optional[ExecutionPreferences] = None,
100
+ maxiter: int = 20,
101
+ quantile: float = 1.0,
102
+ ) -> list[float]:
103
+ if self.qprog_ is None:
104
+ self.get_qprog()
105
+ self.es_ = ExecutionSession(
106
+ self.qprog_, execution_preferences # type:ignore[assignment,arg-type]
107
+ )
108
+ self.params_trace_ = []
109
+ self.cost_trace_ = []
110
+
111
+ def estimate_cost_wrapper(params: np.ndarray) -> float:
112
+ cost = self.es_.estimate_cost( # type:ignore[attr-defined]
113
+ lambda state: self.cost_func(state["v"]),
114
+ {"params": params.tolist()},
115
+ quantile=quantile,
116
+ )
117
+ self.cost_trace_.append(cost)
118
+ self.params_trace_.append(params)
119
+ return cost
120
+
121
+ initial_params = (
122
+ np.concatenate(
123
+ (
124
+ np.linspace(1 / self.num_layers_, 1, self.num_layers_),
125
+ np.linspace(1, 1 / self.num_layers_, self.num_layers_),
126
+ )
127
+ )
128
+ * math.pi
129
+ )
130
+
131
+ with tqdm(total=maxiter, desc="Optimization Progress", leave=True) as pbar:
132
+
133
+ def _minimze_callback(xk: np.ndarray) -> None:
134
+ pbar.update(1) # increment progress bar
135
+ self.optimized_params_ = xk.tolist() # save recent optimized value
136
+
137
+ self.optimized_params_ = scipy.optimize.minimize(
138
+ estimate_cost_wrapper,
139
+ callback=_minimze_callback,
140
+ x0=initial_params,
141
+ method="COBYLA",
142
+ options={"maxiter": maxiter},
143
+ ).x.tolist()
144
+
145
+ return self.optimized_params_ # type:ignore[return-value]
146
+
147
+ def sample_uniform(self) -> pd.DataFrame:
148
+ return self.sample([0] * self.num_layers_ * 2)
149
+
150
+ def sample(self, params: list) -> pd.DataFrame:
151
+ assert self.es_ is not None
152
+ res = self.es_.sample( # type:ignore[unreachable]
153
+ {"params": params}
154
+ )
155
+ parsed_result = [
156
+ {
157
+ "solution": {
158
+ key: value
159
+ for key, value in sampled.state["v"].items()
160
+ if not re.match(".*_slack_var_.*", key)
161
+ },
162
+ "probability": sampled.shots / res.num_shots,
163
+ "cost": self.cost_func(sampled.state["v"]),
164
+ }
165
+ for sampled in res.parsed_counts
166
+ ]
167
+ return pd.DataFrame.from_records(parsed_result)
168
+
169
+
170
+ def execute_qaoa(
171
+ problem_vars: type[QVar],
172
+ cost_func: Callable,
173
+ num_layers: int,
174
+ maxiter: int,
175
+ execution_preferences: Optional[ExecutionPreferences] = None,
176
+ ) -> tuple[SerializedModel, SerializedQuantumProgram, ExecutionDetails]:
177
+ """
178
+ Implements a simple QAOA algorithm, including the creation and synthesis of the QAOA
179
+ ansatz and the classical optimization loop.
180
+
181
+ Args:
182
+ problem_vars: the quantum type (scalar, array, or struct) of the problem variable(s)
183
+ cost_func: the arithmetic expression that evaluates the cost given an instance of the problem_vars type
184
+ num_layers: the number of layers of the QAOA ansatz
185
+ maxiter: the maximum number of iterations for the classical optimization loop
186
+ execution_preferences: the execution settings for running the QAOA ansatz
187
+
188
+ Returns:
189
+ a tuple containing the model of the QAOA ansatz, the corresponding synthesized quantum program,
190
+ and the result of the execution with the optimized parameters
191
+ """
192
+
193
+ @qfunc
194
+ def main(
195
+ params: CArray[CReal, num_layers * 2], # type:ignore[valid-type]
196
+ v: Output[problem_vars], # type:ignore[valid-type]
197
+ ) -> None:
198
+ allocate(v.size, v) # type:ignore[attr-defined]
199
+ hadamard_transform(v)
200
+ repeat(
201
+ num_layers,
202
+ lambda i: [ # type:ignore[arg-type]
203
+ phase(-cost_func(v), params[i]), # type:ignore[func-returns-value]
204
+ apply_to_all(lambda q: RX(params[num_layers + i], q), v),
205
+ ],
206
+ )
207
+
208
+ model = create_model(main)
209
+ qprog = synthesize(model)
210
+
211
+ with ExecutionSession(qprog, execution_preferences) as es:
212
+ initial_params = (
213
+ np.concatenate(
214
+ (np.linspace(0, 1, num_layers), np.linspace(1, 0, num_layers))
215
+ )
216
+ * math.pi
217
+ )
218
+ final_params = scipy.optimize.minimize(
219
+ lambda params: es.estimate_cost(
220
+ lambda state: cost_func(state["v"]),
221
+ {"params": params.tolist()},
222
+ ),
223
+ x0=initial_params,
224
+ method="COBYLA",
225
+ options={"maxiter": maxiter},
226
+ ).x.tolist()
227
+ result = es.sample({"params": final_params})
228
+
229
+ return model, qprog, result
@@ -1,5 +1,3 @@
1
- from typing import List
2
-
3
1
  from classiq.interface.combinatorial_optimization.examples.ascending_sequence import (
4
2
  ascending_sequence,
5
3
  )
@@ -47,5 +45,5 @@ __all__ = [
47
45
  ]
48
46
 
49
47
 
50
- def __dir__() -> List[str]:
48
+ def __dir__() -> list[str]:
51
49
  return __all__
@@ -1,19 +1,18 @@
1
- from typing import List
2
-
3
1
  from classiq.interface.finance import (
4
2
  function_input,
5
3
  gaussian_model_input,
6
4
  log_normal_model_input,
7
- model_input,
8
5
  )
9
6
 
7
+ from .finance_model_constructor import construct_finance_model
8
+
10
9
  __all__ = [
10
+ "construct_finance_model",
11
11
  "function_input",
12
12
  "gaussian_model_input",
13
13
  "log_normal_model_input",
14
- "model_input",
15
14
  ]
16
15
 
17
16
 
18
- def __dir__() -> List[str]:
17
+ def __dir__() -> list[str]:
19
18
  return __all__