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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (516) hide show
  1. classiq/__init__.py +49 -34
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +3 -2
  3. classiq/_analyzer_extras/interactive_hardware.py +3 -3
  4. classiq/_internals/api_wrapper.py +241 -95
  5. classiq/_internals/async_utils.py +2 -77
  6. classiq/_internals/authentication/auth0.py +26 -10
  7. classiq/_internals/authentication/authentication.py +11 -0
  8. classiq/_internals/authentication/device.py +18 -8
  9. classiq/_internals/authentication/password_manager.py +40 -13
  10. classiq/_internals/authentication/token_manager.py +11 -6
  11. classiq/_internals/client.py +106 -37
  12. classiq/_internals/config.py +3 -4
  13. classiq/_internals/host_checker.py +38 -15
  14. classiq/_internals/jobs.py +56 -50
  15. classiq/_internals/type_validation.py +9 -9
  16. classiq/analyzer/__init__.py +1 -3
  17. classiq/analyzer/analyzer.py +50 -47
  18. classiq/analyzer/analyzer_utilities.py +15 -15
  19. classiq/analyzer/rb.py +19 -20
  20. classiq/analyzer/show_interactive_hack.py +30 -7
  21. classiq/analyzer/url_utils.py +2 -3
  22. classiq/applications/__init__.py +3 -12
  23. classiq/applications/chemistry/__init__.py +14 -10
  24. classiq/applications/chemistry/ansatz_parameters.py +4 -4
  25. classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +170 -170
  26. classiq/applications/chemistry/ground_state_problem.py +1 -1
  27. classiq/applications/combinatorial_helpers/allowed_constraints.py +23 -0
  28. classiq/applications/combinatorial_helpers/arithmetic/arithmetic_expression.py +35 -0
  29. classiq/applications/combinatorial_helpers/arithmetic/isolation.py +42 -0
  30. classiq/applications/combinatorial_helpers/combinatorial_problem_utils.py +166 -0
  31. classiq/applications/combinatorial_helpers/encoding_mapping.py +107 -0
  32. classiq/applications/combinatorial_helpers/encoding_utils.py +124 -0
  33. classiq/applications/combinatorial_helpers/memory.py +75 -0
  34. classiq/applications/combinatorial_helpers/optimization_model.py +193 -0
  35. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +31 -0
  36. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
  37. classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
  38. classiq/applications/combinatorial_helpers/sympy_utils.py +22 -0
  39. classiq/applications/combinatorial_helpers/transformations/encoding.py +189 -0
  40. classiq/applications/combinatorial_helpers/transformations/fixed_variables.py +143 -0
  41. classiq/applications/combinatorial_helpers/transformations/ising_converter.py +120 -0
  42. classiq/applications/combinatorial_helpers/transformations/penalty.py +31 -0
  43. classiq/applications/combinatorial_helpers/transformations/penalty_support.py +37 -0
  44. classiq/applications/combinatorial_helpers/transformations/sign_seperation.py +74 -0
  45. classiq/applications/combinatorial_helpers/transformations/slack_variables.py +87 -0
  46. classiq/applications/combinatorial_optimization/__init__.py +24 -5
  47. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
  48. classiq/applications/combinatorial_optimization/combinatorial_optimization_model_constructor.py +137 -0
  49. classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
  50. classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
  51. classiq/applications/finance/__init__.py +4 -5
  52. classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +50 -57
  53. classiq/applications/grover/__init__.py +9 -0
  54. classiq/applications/grover/grover_model_constructor.py +157 -0
  55. classiq/applications/hamiltonian/__init__.py +0 -0
  56. classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
  57. classiq/applications/libraries/__init__.py +0 -0
  58. classiq/applications/libraries/qmci_library.py +22 -0
  59. classiq/applications/qnn/__init__.py +2 -4
  60. classiq/applications/qnn/circuit_utils.py +8 -8
  61. classiq/applications/qnn/datasets/__init__.py +9 -11
  62. classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
  63. classiq/applications/qnn/datasets/dataset_not.py +2 -1
  64. classiq/applications/qnn/datasets/dataset_parity.py +2 -2
  65. classiq/applications/qnn/gradients/quantum_gradient.py +2 -2
  66. classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
  67. classiq/applications/qnn/qlayer.py +30 -10
  68. classiq/applications/qnn/torch_utils.py +4 -3
  69. classiq/applications/qnn/types.py +7 -7
  70. classiq/applications/qsvm/__init__.py +6 -4
  71. classiq/applications/qsvm/qsvm.py +4 -10
  72. classiq/applications/qsvm/qsvm_data_generation.py +5 -8
  73. classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
  74. classiq/execution/__init__.py +8 -3
  75. classiq/execution/all_hardware_devices.py +11 -0
  76. classiq/execution/execution_session.py +400 -0
  77. classiq/execution/iqcc.py +63 -0
  78. classiq/execution/jobs.py +197 -25
  79. classiq/execution/qnn.py +79 -0
  80. classiq/executor.py +23 -117
  81. classiq/interface/_version.py +1 -1
  82. classiq/interface/analyzer/analysis_params.py +49 -16
  83. classiq/interface/analyzer/cytoscape_graph.py +15 -9
  84. classiq/interface/analyzer/result.py +36 -32
  85. classiq/interface/applications/qsvm.py +28 -25
  86. classiq/interface/ast_node.py +16 -0
  87. classiq/interface/backend/backend_preferences.py +390 -119
  88. classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
  89. classiq/interface/backend/pydantic_backend.py +27 -22
  90. classiq/interface/backend/quantum_backend_providers.py +70 -16
  91. classiq/interface/chemistry/fermionic_operator.py +43 -32
  92. classiq/interface/chemistry/ground_state_problem.py +42 -24
  93. classiq/interface/chemistry/molecule.py +20 -14
  94. classiq/interface/chemistry/operator.py +75 -236
  95. classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
  96. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +2 -4
  97. classiq/interface/combinatorial_optimization/examples/greater_than_ilp.py +1 -1
  98. classiq/interface/combinatorial_optimization/examples/ilp.py +2 -1
  99. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  100. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  101. classiq/interface/combinatorial_optimization/examples/mds.py +2 -1
  102. classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
  103. classiq/interface/combinatorial_optimization/examples/mis.py +4 -1
  104. classiq/interface/combinatorial_optimization/examples/mvc.py +2 -1
  105. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  106. classiq/interface/combinatorial_optimization/examples/set_cover.py +3 -3
  107. classiq/interface/combinatorial_optimization/examples/tsp.py +4 -3
  108. classiq/interface/combinatorial_optimization/examples/tsp_digraph.py +6 -2
  109. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +14 -9
  110. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  111. classiq/interface/combinatorial_optimization/result.py +1 -3
  112. classiq/interface/combinatorial_optimization/solver_types.py +1 -1
  113. classiq/interface/debug_info/__init__.py +0 -0
  114. classiq/interface/debug_info/debug_info.py +86 -0
  115. classiq/interface/exceptions.py +201 -0
  116. classiq/interface/execution/iqcc.py +19 -0
  117. classiq/interface/execution/jobs.py +15 -12
  118. classiq/interface/execution/primitives.py +18 -0
  119. classiq/interface/executor/constants.py +1 -0
  120. classiq/interface/executor/estimation.py +2 -2
  121. classiq/interface/executor/execution_preferences.py +26 -143
  122. classiq/interface/executor/execution_request.py +36 -56
  123. classiq/interface/executor/execution_result.py +30 -8
  124. classiq/interface/executor/iqae_result.py +4 -6
  125. classiq/interface/executor/optimizer_preferences.py +34 -22
  126. classiq/interface/executor/{quantum_program.py → quantum_code.py} +44 -34
  127. classiq/interface/executor/quantum_instruction_set.py +3 -2
  128. classiq/interface/executor/register_initialization.py +12 -17
  129. classiq/interface/executor/result.py +122 -64
  130. classiq/interface/executor/vqe_result.py +11 -11
  131. classiq/interface/finance/function_input.py +42 -19
  132. classiq/interface/finance/gaussian_model_input.py +7 -5
  133. classiq/interface/finance/log_normal_model_input.py +6 -4
  134. classiq/interface/finance/model_input.py +6 -4
  135. classiq/interface/generator/adjacency.py +1 -3
  136. classiq/interface/generator/amplitude_loading.py +27 -14
  137. classiq/interface/generator/ansatz_library.py +5 -5
  138. classiq/interface/generator/application_apis/__init__.py +1 -0
  139. classiq/interface/generator/application_apis/arithmetic_declarations.py +17 -0
  140. classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
  141. classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
  142. classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
  143. classiq/interface/generator/application_apis/finance_declarations.py +48 -69
  144. classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
  145. classiq/interface/generator/arith/argument_utils.py +57 -6
  146. classiq/interface/generator/arith/arithmetic.py +37 -16
  147. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +15 -17
  148. classiq/interface/generator/arith/arithmetic_expression_abc.py +70 -26
  149. classiq/interface/generator/arith/arithmetic_expression_parser.py +18 -12
  150. classiq/interface/generator/arith/arithmetic_expression_validator.py +61 -43
  151. classiq/interface/generator/arith/arithmetic_operations.py +19 -16
  152. classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
  153. classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
  154. classiq/interface/generator/arith/ast_node_rewrite.py +4 -3
  155. classiq/interface/generator/arith/binary_ops.py +375 -139
  156. classiq/interface/generator/arith/endianness.py +1 -1
  157. classiq/interface/generator/arith/extremum_operations.py +96 -23
  158. classiq/interface/generator/arith/logical_ops.py +16 -12
  159. classiq/interface/generator/arith/machine_precision.py +3 -0
  160. classiq/interface/generator/arith/number_utils.py +44 -48
  161. classiq/interface/generator/arith/register_user_input.py +70 -27
  162. classiq/interface/generator/arith/unary_ops.py +57 -46
  163. classiq/interface/generator/arith/uncomputation_methods.py +1 -1
  164. classiq/interface/generator/builtin_api_builder.py +2 -9
  165. classiq/interface/generator/chemistry_function_params.py +5 -5
  166. classiq/interface/generator/circuit_code/circuit_code.py +7 -7
  167. classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
  168. classiq/interface/generator/commuting_pauli_exponentiation.py +8 -6
  169. classiq/interface/generator/compiler_keywords.py +8 -0
  170. classiq/interface/generator/complex_type.py +13 -25
  171. classiq/interface/generator/constant.py +3 -4
  172. classiq/interface/generator/control_state.py +35 -28
  173. classiq/interface/generator/copy.py +47 -0
  174. classiq/interface/generator/custom_ansatz.py +2 -5
  175. classiq/interface/generator/distance.py +3 -5
  176. classiq/interface/generator/excitations.py +3 -2
  177. classiq/interface/generator/expressions/atomic_expression_functions.py +26 -8
  178. classiq/interface/generator/expressions/enums/__init__.py +0 -10
  179. classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
  180. classiq/interface/generator/expressions/evaluated_expression.py +21 -7
  181. classiq/interface/generator/expressions/expression.py +27 -15
  182. classiq/interface/generator/expressions/expression_constants.py +9 -3
  183. classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
  184. classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
  185. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +59 -0
  186. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
  187. classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
  188. classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
  189. classiq/interface/generator/expressions/sympy_supported_expressions.py +20 -11
  190. classiq/interface/generator/finance.py +3 -3
  191. classiq/interface/generator/function_param_library.py +6 -6
  192. classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
  193. classiq/interface/generator/function_params.py +42 -69
  194. classiq/interface/generator/functions/__init__.py +0 -22
  195. classiq/interface/generator/functions/builtins/__init__.py +0 -0
  196. classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
  197. classiq/interface/generator/functions/classical_function_declaration.py +18 -9
  198. classiq/interface/generator/functions/classical_type.py +47 -166
  199. classiq/interface/generator/functions/concrete_types.py +55 -0
  200. classiq/interface/generator/functions/function_declaration.py +13 -14
  201. classiq/interface/generator/functions/port_declaration.py +1 -13
  202. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  203. classiq/interface/generator/functions/type_name.py +90 -0
  204. classiq/interface/generator/generated_circuit_data.py +155 -22
  205. classiq/interface/generator/grover_diffuser.py +32 -25
  206. classiq/interface/generator/grover_operator.py +34 -23
  207. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
  208. classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
  209. classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +12 -8
  210. classiq/interface/generator/hardware/hardware_data.py +76 -36
  211. classiq/interface/generator/hardware_efficient_ansatz.py +38 -17
  212. classiq/interface/generator/hartree_fock.py +14 -4
  213. classiq/interface/generator/identity.py +10 -6
  214. classiq/interface/generator/linear_pauli_rotations.py +33 -19
  215. classiq/interface/generator/mcmt_method.py +1 -1
  216. classiq/interface/generator/mcu.py +20 -16
  217. classiq/interface/generator/mcx.py +29 -20
  218. classiq/interface/generator/model/__init__.py +2 -5
  219. classiq/interface/generator/model/constraints.py +27 -8
  220. classiq/interface/generator/model/model.py +32 -203
  221. classiq/interface/generator/model/preferences/preferences.py +118 -43
  222. classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +27 -22
  223. classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
  224. classiq/interface/generator/oracles/custom_oracle.py +17 -13
  225. classiq/interface/generator/oracles/oracle_abc.py +9 -9
  226. classiq/interface/generator/partitioned_register.py +7 -7
  227. classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
  228. classiq/interface/generator/preferences/optimization.py +1 -2
  229. classiq/interface/generator/qpe.py +47 -34
  230. classiq/interface/generator/qsvm.py +13 -17
  231. classiq/interface/generator/quantum_function_call.py +107 -87
  232. classiq/interface/generator/{generated_circuit.py → quantum_program.py} +50 -37
  233. classiq/interface/generator/range_types.py +13 -12
  234. classiq/interface/generator/register_role.py +18 -6
  235. classiq/interface/generator/slice_parsing_utils.py +11 -6
  236. classiq/interface/generator/standard_gates/controlled_standard_gates.py +32 -39
  237. classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
  238. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  239. classiq/interface/generator/standard_gates/u_gate.py +7 -10
  240. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  241. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
  242. classiq/interface/generator/state_preparation/distributions.py +16 -15
  243. classiq/interface/generator/state_preparation/metrics.py +5 -7
  244. classiq/interface/generator/state_preparation/state_preparation.py +30 -23
  245. classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
  246. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
  247. classiq/interface/generator/transpiler_basis_gates.py +7 -3
  248. classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
  249. classiq/interface/generator/types/compilation_metadata.py +6 -0
  250. classiq/interface/generator/types/enum_declaration.py +54 -0
  251. classiq/interface/generator/types/qstruct_declaration.py +18 -0
  252. classiq/interface/generator/types/struct_declaration.py +15 -14
  253. classiq/interface/generator/ucc.py +9 -6
  254. classiq/interface/generator/unitary_gate.py +10 -6
  255. classiq/interface/generator/user_defined_function_params.py +4 -1
  256. classiq/interface/generator/validations/flow_graph.py +11 -9
  257. classiq/interface/generator/validations/validator_functions.py +8 -6
  258. classiq/interface/generator/visitor.py +23 -16
  259. classiq/interface/hardware.py +31 -10
  260. classiq/interface/helpers/classproperty.py +8 -0
  261. classiq/interface/helpers/custom_encoders.py +3 -0
  262. classiq/interface/helpers/custom_pydantic_types.py +40 -50
  263. classiq/interface/helpers/datastructures.py +26 -0
  264. classiq/interface/helpers/hashable_mixin.py +3 -2
  265. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  266. classiq/interface/helpers/pydantic_model_helpers.py +7 -11
  267. classiq/interface/helpers/validation_helpers.py +4 -21
  268. classiq/interface/helpers/versioned_model.py +1 -1
  269. classiq/interface/ide/ide_data.py +16 -20
  270. classiq/interface/ide/visual_model.py +130 -0
  271. classiq/interface/interface_version.py +1 -0
  272. classiq/interface/jobs.py +35 -6
  273. classiq/interface/model/allocate.py +16 -0
  274. classiq/interface/model/bind_operation.py +44 -14
  275. classiq/interface/model/classical_if.py +15 -0
  276. classiq/interface/model/classical_parameter_declaration.py +33 -3
  277. classiq/interface/model/control.py +45 -0
  278. classiq/interface/model/handle_binding.py +298 -20
  279. classiq/interface/model/inplace_binary_operation.py +31 -26
  280. classiq/interface/model/invert.py +12 -0
  281. classiq/interface/model/model.py +87 -73
  282. classiq/interface/model/native_function_definition.py +16 -21
  283. classiq/interface/model/parameter.py +13 -0
  284. classiq/interface/model/phase_operation.py +11 -0
  285. classiq/interface/model/port_declaration.py +27 -9
  286. classiq/interface/model/power.py +14 -0
  287. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +38 -21
  288. classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
  289. classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
  290. classiq/interface/model/quantum_function_call.py +146 -462
  291. classiq/interface/model/quantum_function_declaration.py +193 -152
  292. classiq/interface/model/quantum_lambda_function.py +65 -0
  293. classiq/interface/model/quantum_statement.py +71 -12
  294. classiq/interface/model/quantum_type.py +205 -67
  295. classiq/interface/model/quantum_variable_declaration.py +4 -26
  296. classiq/interface/model/repeat.py +15 -0
  297. classiq/interface/model/statement_block.py +58 -0
  298. classiq/interface/model/validation_handle.py +13 -6
  299. classiq/interface/model/variable_declaration_statement.py +3 -1
  300. classiq/interface/model/within_apply_operation.py +13 -0
  301. classiq/interface/pyomo_extension/pyomo_sympy_bimap.py +4 -1
  302. classiq/interface/server/global_versions.py +6 -7
  303. classiq/interface/server/routes.py +22 -21
  304. classiq/interface/source_reference.py +59 -0
  305. classiq/model_expansions/__init__.py +0 -0
  306. classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
  307. classiq/model_expansions/capturing/__init__.py +0 -0
  308. classiq/model_expansions/capturing/captured_vars.py +435 -0
  309. classiq/model_expansions/capturing/mangling_utils.py +56 -0
  310. classiq/model_expansions/closure.py +171 -0
  311. classiq/model_expansions/debug_flag.py +3 -0
  312. classiq/model_expansions/evaluators/__init__.py +0 -0
  313. classiq/model_expansions/evaluators/arg_type_match.py +158 -0
  314. classiq/model_expansions/evaluators/argument_types.py +42 -0
  315. classiq/model_expansions/evaluators/classical_expression.py +36 -0
  316. classiq/model_expansions/evaluators/control.py +144 -0
  317. classiq/model_expansions/evaluators/parameter_types.py +226 -0
  318. classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
  319. classiq/model_expansions/evaluators/type_type_match.py +90 -0
  320. classiq/model_expansions/expression_evaluator.py +135 -0
  321. classiq/model_expansions/expression_renamer.py +76 -0
  322. classiq/model_expansions/function_builder.py +247 -0
  323. classiq/model_expansions/generative_functions.py +158 -0
  324. classiq/model_expansions/interpreters/__init__.py +0 -0
  325. classiq/model_expansions/interpreters/base_interpreter.py +263 -0
  326. classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
  327. classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
  328. classiq/model_expansions/model_tables.py +18 -0
  329. classiq/model_expansions/quantum_operations/__init__.py +9 -0
  330. classiq/model_expansions/quantum_operations/bind.py +60 -0
  331. classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
  332. classiq/model_expansions/quantum_operations/classicalif.py +53 -0
  333. classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
  334. classiq/model_expansions/quantum_operations/emitter.py +181 -0
  335. classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
  336. classiq/model_expansions/quantum_operations/repeat.py +56 -0
  337. classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
  338. classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
  339. classiq/model_expansions/scope.py +240 -0
  340. classiq/model_expansions/scope_initialization.py +150 -0
  341. classiq/model_expansions/sympy_conversion/__init__.py +0 -0
  342. classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
  343. classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
  344. classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
  345. classiq/model_expansions/transformers/__init__.py +0 -0
  346. classiq/model_expansions/transformers/ast_renamer.py +26 -0
  347. classiq/model_expansions/transformers/var_splitter.py +299 -0
  348. classiq/model_expansions/utils/__init__.py +0 -0
  349. classiq/model_expansions/utils/counted_name_allocator.py +11 -0
  350. classiq/model_expansions/utils/handles_collector.py +33 -0
  351. classiq/model_expansions/visitors/__init__.py +0 -0
  352. classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
  353. classiq/model_expansions/visitors/variable_references.py +144 -0
  354. classiq/open_library/__init__.py +4 -0
  355. classiq/open_library/functions/__init__.py +130 -0
  356. classiq/open_library/functions/amplitude_estimation.py +30 -0
  357. classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
  358. classiq/open_library/functions/grover.py +157 -0
  359. classiq/open_library/functions/hea.py +115 -0
  360. classiq/open_library/functions/linear_pauli_rotation.py +82 -0
  361. classiq/open_library/functions/modular_exponentiation.py +201 -0
  362. classiq/open_library/functions/qaoa_penalty.py +117 -0
  363. classiq/open_library/functions/qft_functions.py +54 -0
  364. classiq/open_library/functions/qpe.py +46 -0
  365. classiq/open_library/functions/qsvt.py +331 -0
  366. classiq/open_library/functions/state_preparation.py +301 -0
  367. classiq/open_library/functions/swap_test.py +27 -0
  368. classiq/open_library/functions/utility_functions.py +81 -0
  369. classiq/open_library/functions/variational.py +52 -0
  370. classiq/qmod/__init__.py +17 -10
  371. classiq/qmod/builtins/__init__.py +19 -2
  372. classiq/qmod/builtins/classical_execution_primitives.py +60 -47
  373. classiq/qmod/builtins/classical_functions.py +44 -38
  374. classiq/qmod/builtins/constants.py +10 -0
  375. classiq/qmod/builtins/enums.py +208 -0
  376. classiq/qmod/builtins/functions/__init__.py +137 -0
  377. classiq/qmod/builtins/functions/allocation.py +150 -0
  378. classiq/qmod/builtins/functions/arithmetic.py +55 -0
  379. classiq/qmod/builtins/functions/benchmarking.py +8 -0
  380. classiq/qmod/builtins/functions/chemistry.py +91 -0
  381. classiq/qmod/builtins/functions/exponentiation.py +105 -0
  382. classiq/qmod/builtins/functions/finance.py +34 -0
  383. classiq/qmod/builtins/functions/operators.py +16 -0
  384. classiq/qmod/builtins/functions/qsvm.py +24 -0
  385. classiq/qmod/builtins/functions/standard_gates.py +651 -0
  386. classiq/qmod/builtins/operations.py +379 -57
  387. classiq/qmod/builtins/structs.py +103 -80
  388. classiq/qmod/cfunc.py +42 -0
  389. classiq/qmod/classical_function.py +8 -20
  390. classiq/qmod/cparam.py +64 -0
  391. classiq/qmod/create_model_function.py +56 -0
  392. classiq/qmod/declaration_inferrer.py +145 -112
  393. classiq/qmod/expression_query.py +39 -0
  394. classiq/qmod/generative.py +42 -0
  395. classiq/qmod/model_state_container.py +19 -5
  396. classiq/qmod/native/__init__.py +7 -0
  397. classiq/qmod/native/expression_to_qmod.py +194 -0
  398. classiq/qmod/native/pretty_printer.py +401 -0
  399. classiq/qmod/pretty_print/__init__.py +7 -0
  400. classiq/qmod/pretty_print/expression_to_python.py +222 -0
  401. classiq/qmod/pretty_print/pretty_printer.py +572 -0
  402. classiq/qmod/python_classical_type.py +67 -0
  403. classiq/qmod/qfunc.py +79 -0
  404. classiq/qmod/qmod_constant.py +143 -0
  405. classiq/qmod/qmod_parameter.py +84 -53
  406. classiq/qmod/qmod_variable.py +497 -100
  407. classiq/qmod/quantum_callable.py +17 -7
  408. classiq/qmod/quantum_expandable.py +278 -105
  409. classiq/qmod/quantum_function.py +232 -48
  410. classiq/qmod/semantics/__init__.py +0 -0
  411. classiq/qmod/semantics/annotation/__init__.py +0 -0
  412. classiq/qmod/semantics/annotation/call_annotation.py +92 -0
  413. classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
  414. classiq/qmod/semantics/error_manager.py +88 -0
  415. classiq/qmod/semantics/lambdas.py +25 -0
  416. classiq/qmod/semantics/static_semantics_visitor.py +384 -0
  417. classiq/qmod/semantics/validation/__init__.py +0 -0
  418. classiq/qmod/semantics/validation/constants_validation.py +16 -0
  419. classiq/qmod/semantics/validation/func_call_validation.py +99 -0
  420. classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
  421. classiq/qmod/semantics/validation/handle_validation.py +85 -0
  422. classiq/qmod/semantics/validation/main_validation.py +33 -0
  423. classiq/qmod/semantics/validation/types_validation.py +128 -0
  424. classiq/qmod/symbolic.py +178 -111
  425. classiq/qmod/symbolic_expr.py +36 -12
  426. classiq/qmod/symbolic_type.py +2 -5
  427. classiq/qmod/type_attribute_remover.py +32 -0
  428. classiq/qmod/utilities.py +108 -1
  429. classiq/qmod/write_qmod.py +53 -0
  430. classiq/synthesis.py +210 -22
  431. {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/METADATA +16 -8
  432. classiq-0.65.3.dist-info/RECORD +521 -0
  433. {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/WHEEL +1 -1
  434. classiq/_internals/_qfunc_ext.py +0 -6
  435. classiq/applications/benchmarking/__init__.py +0 -9
  436. classiq/applications/benchmarking/mirror_benchmarking.py +0 -67
  437. classiq/applications/numpy_utils.py +0 -37
  438. classiq/applications_model_constructors/__init__.py +0 -17
  439. classiq/applications_model_constructors/combinatorial_optimization_model_constructor.py +0 -178
  440. classiq/applications_model_constructors/grover_model_constructor.py +0 -227
  441. classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
  442. classiq/applications_model_constructors/libraries/qmci_library.py +0 -109
  443. classiq/builtin_functions/__init__.py +0 -43
  444. classiq/builtin_functions/amplitude_loading.py +0 -3
  445. classiq/builtin_functions/binary_ops.py +0 -1
  446. classiq/builtin_functions/exponentiation.py +0 -5
  447. classiq/builtin_functions/qpe.py +0 -4
  448. classiq/builtin_functions/qsvm.py +0 -7
  449. classiq/builtin_functions/range_types.py +0 -5
  450. classiq/builtin_functions/standard_gates.py +0 -1
  451. classiq/builtin_functions/state_preparation.py +0 -6
  452. classiq/builtin_functions/suzuki_trotter.py +0 -3
  453. classiq/exceptions.py +0 -131
  454. classiq/interface/executor/aws_execution_cost.py +0 -72
  455. classiq/interface/executor/error_mitigation.py +0 -6
  456. classiq/interface/generator/credit_risk_example/linear_gci.py +0 -115
  457. classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -59
  458. classiq/interface/generator/expressions/enums/chemistry.py +0 -28
  459. classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
  460. classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
  461. classiq/interface/generator/expressions/enums/optimizers.py +0 -9
  462. classiq/interface/generator/expressions/enums/pauli.py +0 -8
  463. classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
  464. classiq/interface/generator/expressions/qmod_qnum_proxy.py +0 -22
  465. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
  466. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
  467. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
  468. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -862
  469. classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -169
  470. classiq/interface/generator/functions/foreign_function_definition.py +0 -106
  471. classiq/interface/generator/functions/function_implementation.py +0 -103
  472. classiq/interface/generator/functions/native_function_definition.py +0 -153
  473. classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
  474. classiq/interface/generator/functions/register.py +0 -42
  475. classiq/interface/generator/functions/register_mapping_data.py +0 -102
  476. classiq/interface/generator/inequality_mixer.py +0 -51
  477. classiq/interface/generator/model/classical_main_validator.py +0 -106
  478. classiq/interface/generator/range_mixer.py +0 -56
  479. classiq/interface/generator/state_propagator.py +0 -63
  480. classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -2
  481. classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
  482. classiq/interface/generator/types/builtin_struct_declarations/qaoa_declarations.py +0 -23
  483. classiq/interface/generator/types/combinatorial_problem.py +0 -26
  484. classiq/interface/ide/show.py +0 -34
  485. classiq/interface/model/common_model_types.py +0 -23
  486. classiq/interface/model/numeric_reinterpretation.py +0 -25
  487. classiq/interface/model/operator_synthesis_data.py +0 -48
  488. classiq/interface/model/quantum_expressions/control_state.py +0 -38
  489. classiq/interface/model/quantum_if_operation.py +0 -95
  490. classiq/interface/model/resolvers/function_call_resolver.py +0 -43
  491. classiq/interface/model/validations/handle_validation_base.py +0 -55
  492. classiq/interface/model/validations/handles_validator.py +0 -154
  493. classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
  494. classiq/model/__init__.py +0 -14
  495. classiq/model/composite_function_generator.py +0 -33
  496. classiq/model/function_handler.py +0 -466
  497. classiq/model/function_handler.pyi +0 -152
  498. classiq/model/logic_flow.py +0 -149
  499. classiq/model/logic_flow_change_handler.py +0 -71
  500. classiq/model/model.py +0 -246
  501. classiq/qmod/builtins/functions.py +0 -896
  502. classiq/qmod/qmod_struct.py +0 -37
  503. classiq/quantum_functions/__init__.py +0 -17
  504. classiq/quantum_functions/annotation_parser.py +0 -207
  505. classiq/quantum_functions/decorators.py +0 -22
  506. classiq/quantum_functions/function_library.py +0 -181
  507. classiq/quantum_functions/function_parser.py +0 -74
  508. classiq/quantum_functions/quantum_function.py +0 -236
  509. classiq-0.37.1.dist-info/RECORD +0 -418
  510. /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers}/__init__.py +0 -0
  511. /classiq/{interface/generator/credit_risk_example → applications/combinatorial_helpers/arithmetic}/__init__.py +0 -0
  512. /classiq/{interface/generator/functions/core_lib_declarations → applications/combinatorial_helpers/pauli_helpers}/__init__.py +0 -0
  513. /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → applications/combinatorial_helpers/py.typed} +0 -0
  514. /classiq/{interface/model/resolvers → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
  515. /classiq/{interface/model/validations → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
  516. /classiq/{_internals → interface}/enum_utils.py +0 -0
@@ -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__
@@ -1,36 +1,30 @@
1
1
  from math import floor, log
2
2
  from typing import Union
3
3
 
4
+ from classiq.interface.exceptions import ClassiqError
4
5
  from classiq.interface.finance.function_input import FinanceFunctionInput
5
6
  from classiq.interface.finance.gaussian_model_input import GaussianModelInput
6
7
  from classiq.interface.finance.log_normal_model_input import LogNormalModelInput
7
- from classiq.interface.generator.expressions.enums.finance_functions import (
8
- FINANCE_FUNCTION_STRING,
9
- FinanceFunctionType,
10
- )
11
8
  from classiq.interface.generator.expressions.expression import Expression
12
9
  from classiq.interface.generator.functions.port_declaration import (
13
10
  PortDeclarationDirection,
14
11
  )
12
+ from classiq.interface.model.allocate import Allocate
15
13
  from classiq.interface.model.handle_binding import HandleBinding
16
14
  from classiq.interface.model.model import Model, SerializedModel
17
15
  from classiq.interface.model.native_function_definition import NativeFunctionDefinition
18
16
  from classiq.interface.model.port_declaration import PortDeclaration
19
- from classiq.interface.model.quantum_function_call import (
20
- QuantumFunctionCall,
21
- QuantumLambdaFunction,
22
- )
17
+ from classiq.interface.model.quantum_function_call import QuantumFunctionCall
18
+ from classiq.interface.model.quantum_lambda_function import QuantumLambdaFunction
19
+ from classiq.interface.model.quantum_type import QuantumNumeric
23
20
  from classiq.interface.model.variable_declaration_statement import (
24
21
  VariableDeclarationStatement,
25
22
  )
26
23
 
27
- from classiq.applications_model_constructors.libraries.ampltitude_estimation_library import (
28
- AE_CLASSICAL_LIBRARY,
29
- )
30
- from classiq.applications_model_constructors.libraries.qmci_library import QMCI_LIBRARY
31
- from classiq.exceptions import ClassiqError
24
+ from classiq.applications.libraries.qmci_library import QMCI_LIBRARY
25
+ from classiq.qmod.utilities import qmod_val_to_expr_str
32
26
 
33
- _OUTPUT_VARIABLE_NAME = "result"
27
+ _OUTPUT_VARIABLE_NAME = "payoff_estimation"
34
28
 
35
29
 
36
30
  def construct_finance_model(
@@ -56,13 +50,6 @@ def construct_finance_model(
56
50
  else:
57
51
  raise ClassiqError(f"Invalid model input: {finance_model_input}")
58
52
 
59
- if isinstance(finance_function_input.f, FinanceFunctionType):
60
- finance_function_f = finance_function_input.f
61
- elif isinstance(finance_function_input.f, str):
62
- finance_function_f = FINANCE_FUNCTION_STRING[finance_function_input.f]
63
- else:
64
- finance_function_f = FinanceFunctionType(finance_function_input.f)
65
-
66
53
  polynomial_degree = 0
67
54
  if finance_function_input.polynomial_degree is not None:
68
55
  polynomial_degree = finance_function_input.polynomial_degree
@@ -71,7 +58,7 @@ def construct_finance_model(
71
58
  if finance_function_input.tail_probability is not None:
72
59
  tail_probability = finance_function_input.tail_probability
73
60
 
74
- finance_function_object = f"struct_literal(FinanceFunction, f={finance_function_f}, threshold={finance_function_input.condition.threshold}, larger={finance_function_input.condition.larger}, polynomial_degree={polynomial_degree}, use_chebyshev_polynomial_approximation={finance_function_input.use_chebyshev_polynomial_approximation}, tail_probability={tail_probability})"
61
+ finance_function_object = f"struct_literal(FinanceFunction, f={qmod_val_to_expr_str(finance_function_input.f)}, threshold={finance_function_input.condition.threshold}, larger={finance_function_input.condition.larger}, polynomial_degree={polynomial_degree}, use_chebyshev_polynomial_approximation={finance_function_input.use_chebyshev_polynomial_approximation}, tail_probability={tail_probability})"
75
62
  num_unitary_qubits = total_num_qubits + 1
76
63
 
77
64
  model = Model(
@@ -79,57 +66,63 @@ def construct_finance_model(
79
66
  *QMCI_LIBRARY,
80
67
  NativeFunctionDefinition(
81
68
  name="main",
82
- port_declarations={
83
- "phase_port": PortDeclaration(
69
+ positional_arg_declarations=[
70
+ PortDeclaration(
84
71
  name="phase_port",
85
- size=Expression(expr=f"{phase_port_size}"),
72
+ quantum_type=QuantumNumeric(
73
+ size=Expression(expr=f"{phase_port_size}"),
74
+ is_signed=Expression(expr="False"),
75
+ fraction_digits=Expression(expr=f"{phase_port_size}"),
76
+ ),
86
77
  direction=PortDeclarationDirection.Output,
87
78
  ),
88
- },
79
+ ],
89
80
  body=[
90
81
  VariableDeclarationStatement(name="unitary_port"),
82
+ Allocate(
83
+ size=Expression(expr=f"{num_unitary_qubits}"),
84
+ target=HandleBinding(name="unitary_port"),
85
+ ),
86
+ Allocate(
87
+ size=Expression(expr=f"{phase_port_size}"),
88
+ target=HandleBinding(name="phase_port"),
89
+ ),
91
90
  QuantumFunctionCall(
92
91
  function="qmci",
93
- params={
94
- "num_unitary_qubits": Expression(
95
- expr=f"{num_unitary_qubits}"
96
- ),
97
- "num_phase_qubits": Expression(expr=f"{phase_port_size}"),
98
- },
99
- operands={
100
- "sp_op": QuantumLambdaFunction(
92
+ positional_args=[
93
+ QuantumLambdaFunction(
94
+ pos_rename_params=["state", "ind"],
101
95
  body=[
102
96
  QuantumFunctionCall(
103
97
  function=finance_function,
104
- params={
105
- "finance_model": Expression(
106
- expr=finance_model
107
- ),
108
- "finance_function": Expression(
109
- expr=finance_function_object
110
- ),
111
- },
112
- inouts={
113
- "func_port": HandleBinding(name="reg"),
114
- "obj_port": HandleBinding(name="ind"),
115
- },
98
+ positional_args=[
99
+ Expression(expr=finance_model),
100
+ Expression(expr=finance_function_object),
101
+ HandleBinding(name="state"),
102
+ HandleBinding(name="ind"),
103
+ ],
116
104
  ),
117
105
  ],
118
106
  ),
119
- },
120
- outputs={
121
- "phase_port": HandleBinding(name="phase_port"),
122
- "unitary_port": HandleBinding(name="unitary_port"),
123
- },
107
+ HandleBinding(name="phase_port"),
108
+ HandleBinding(name="unitary_port"),
109
+ ],
124
110
  ),
125
111
  ],
126
112
  ),
127
113
  ],
128
- classical_execution_code=AE_CLASSICAL_LIBRARY
129
- + f"""
130
- estimation = execute_amplitude_estimation({phase_port_size})
131
- {_OUTPUT_VARIABLE_NAME} = {post_process_function}({finance_model}, {finance_function_object}, estimation)
132
- save({{{_OUTPUT_VARIABLE_NAME!r}: {_OUTPUT_VARIABLE_NAME}}})
133
- """,
114
+ classical_execution_code=f"""
115
+ phase_port_size = {phase_port_size}
116
+ counts = sample()
117
+ save({{"counts": counts}})
118
+ probability_estimation = qae_with_qpe_result_post_processing(
119
+ estimation_register_size=phase_port_size,
120
+ estimation_method=1,
121
+ result=counts
122
+ )
123
+ save({{"probability_estimation": probability_estimation}})
124
+ {_OUTPUT_VARIABLE_NAME} = {post_process_function}({finance_model}, {finance_function_object}, probability_estimation)
125
+ save({{"{_OUTPUT_VARIABLE_NAME}": {_OUTPUT_VARIABLE_NAME}}})
126
+ """.strip(),
134
127
  )
135
128
  return model.get_model()
@@ -0,0 +1,9 @@
1
+ from .grover_model_constructor import construct_grover_model
2
+
3
+ __all__ = [
4
+ "construct_grover_model",
5
+ ]
6
+
7
+
8
+ def __dir__() -> list[str]:
9
+ return __all__
@@ -0,0 +1,157 @@
1
+ from classiq.interface.generator.expressions.expression import Expression
2
+ from classiq.interface.generator.functions.port_declaration import (
3
+ PortDeclarationDirection,
4
+ )
5
+ from classiq.interface.model.allocate import Allocate
6
+ from classiq.interface.model.bind_operation import BindOperation
7
+ from classiq.interface.model.handle_binding import HandleBinding, SlicedHandleBinding
8
+ from classiq.interface.model.model import Model, SerializedModel
9
+ from classiq.interface.model.native_function_definition import NativeFunctionDefinition
10
+ from classiq.interface.model.port_declaration import PortDeclaration
11
+ from classiq.interface.model.quantum_expressions.arithmetic_operation import (
12
+ ArithmeticOperation,
13
+ ArithmeticOperationKind,
14
+ )
15
+ from classiq.interface.model.quantum_function_call import QuantumFunctionCall
16
+ from classiq.interface.model.quantum_lambda_function import QuantumLambdaFunction
17
+ from classiq.interface.model.quantum_type import QuantumBitvector, QuantumNumeric
18
+ from classiq.interface.model.variable_declaration_statement import (
19
+ VariableDeclarationStatement,
20
+ )
21
+
22
+ from classiq import RegisterUserInput
23
+ from classiq.open_library.functions.grover import grover_search, phase_oracle
24
+
25
+ _OUTPUT_VARIABLE_NAME = "result"
26
+
27
+ _PREDICATE_FUNCTION_NAME = "expr_predicate"
28
+
29
+
30
+ def _arithmetic_oracle_ios(
31
+ definitions: list[tuple[str, RegisterUserInput]], handle_name: str
32
+ ) -> list[HandleBinding]:
33
+ cursor = 0
34
+ ios: list[HandleBinding] = []
35
+ for _, reg in definitions:
36
+ ios.append(
37
+ SlicedHandleBinding(
38
+ base_handle=HandleBinding(name=handle_name),
39
+ start=Expression(expr=f"{cursor}"),
40
+ end=Expression(expr=f"{cursor + reg.size}"),
41
+ )
42
+ )
43
+ cursor += reg.size
44
+ return ios
45
+
46
+
47
+ def _construct_arithmetic_oracle(
48
+ predicate_function: str,
49
+ definitions: list[tuple[str, RegisterUserInput]],
50
+ ) -> QuantumFunctionCall:
51
+ predicate_var_binding = _arithmetic_oracle_ios(definitions, "state")
52
+ predicate_var_binding.append(HandleBinding(name="oracle"))
53
+ return QuantumFunctionCall(
54
+ function="phase_oracle",
55
+ positional_args=[
56
+ QuantumLambdaFunction(
57
+ pos_rename_params=["state", "oracle"],
58
+ body=[
59
+ QuantumFunctionCall(
60
+ function=predicate_function,
61
+ positional_args=predicate_var_binding,
62
+ ),
63
+ ],
64
+ ),
65
+ HandleBinding(name="packed_vars"),
66
+ ],
67
+ )
68
+
69
+
70
+ def grover_main_port_declarations(
71
+ definitions: list[tuple[str, RegisterUserInput]],
72
+ direction: PortDeclarationDirection,
73
+ ) -> list[PortDeclaration]:
74
+ return [
75
+ PortDeclaration(
76
+ name=name,
77
+ quantum_type=QuantumNumeric(
78
+ size=Expression(expr=f"{reg.size}"),
79
+ is_signed=Expression(expr=f"{reg.is_signed}"),
80
+ fraction_digits=Expression(expr=f"{reg.fraction_places}"),
81
+ ),
82
+ direction=direction,
83
+ )
84
+ for name, reg in definitions
85
+ ]
86
+
87
+
88
+ def construct_grover_model(
89
+ definitions: list[tuple[str, RegisterUserInput]],
90
+ expression: str,
91
+ num_reps: int = 1,
92
+ ) -> SerializedModel:
93
+ predicate_port_decls = grover_main_port_declarations(
94
+ definitions, PortDeclarationDirection.Inout
95
+ )
96
+ predicate_port_decls.append(
97
+ PortDeclaration(
98
+ name="res",
99
+ quantum_type=QuantumBitvector(length=Expression(expr="1")),
100
+ direction=PortDeclarationDirection.Inout,
101
+ )
102
+ )
103
+ num_qubits = sum(reg.size for _, reg in definitions)
104
+
105
+ grover_model = Model(
106
+ functions=[
107
+ NativeFunctionDefinition(
108
+ name=_PREDICATE_FUNCTION_NAME,
109
+ positional_arg_declarations=predicate_port_decls,
110
+ body=[
111
+ ArithmeticOperation(
112
+ expression=Expression(expr=expression),
113
+ result_var=HandleBinding(name="res"),
114
+ operation_kind=ArithmeticOperationKind.InplaceXor,
115
+ ),
116
+ ],
117
+ ),
118
+ NativeFunctionDefinition(
119
+ name="main",
120
+ positional_arg_declarations=grover_main_port_declarations(
121
+ definitions, PortDeclarationDirection.Output
122
+ ),
123
+ body=[
124
+ VariableDeclarationStatement(name="packed_vars"),
125
+ Allocate(
126
+ size=Expression(expr=f"{num_qubits}"),
127
+ target=HandleBinding(name="packed_vars"),
128
+ ),
129
+ QuantumFunctionCall(
130
+ function="grover_search",
131
+ positional_args=[
132
+ Expression(expr=f"{num_reps}"),
133
+ QuantumLambdaFunction(
134
+ pos_rename_params=["packed_vars"],
135
+ body=[
136
+ _construct_arithmetic_oracle(
137
+ _PREDICATE_FUNCTION_NAME,
138
+ definitions,
139
+ )
140
+ ],
141
+ ),
142
+ HandleBinding(name="packed_vars"),
143
+ ],
144
+ ),
145
+ BindOperation(
146
+ in_handles=[HandleBinding(name="packed_vars")],
147
+ out_handles=[
148
+ HandleBinding(name=name) for name, _ in definitions
149
+ ],
150
+ ),
151
+ ],
152
+ ),
153
+ *[f for f in grover_search.create_model().functions if f.name != "main"],
154
+ *[f for f in phase_oracle.create_model().functions if f.name != "main"],
155
+ ],
156
+ )
157
+ return grover_model.get_model()
File without changes