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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (516) hide show
  1. classiq/__init__.py +49 -34
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +3 -2
  3. classiq/_analyzer_extras/interactive_hardware.py +3 -3
  4. classiq/_internals/api_wrapper.py +241 -95
  5. classiq/_internals/async_utils.py +2 -77
  6. classiq/_internals/authentication/auth0.py +26 -10
  7. classiq/_internals/authentication/authentication.py +11 -0
  8. classiq/_internals/authentication/device.py +18 -8
  9. classiq/_internals/authentication/password_manager.py +40 -13
  10. classiq/_internals/authentication/token_manager.py +11 -6
  11. classiq/_internals/client.py +106 -37
  12. classiq/_internals/config.py +3 -4
  13. classiq/_internals/host_checker.py +38 -15
  14. classiq/_internals/jobs.py +56 -50
  15. classiq/_internals/type_validation.py +9 -9
  16. classiq/analyzer/__init__.py +1 -3
  17. classiq/analyzer/analyzer.py +50 -47
  18. classiq/analyzer/analyzer_utilities.py +15 -15
  19. classiq/analyzer/rb.py +19 -20
  20. classiq/analyzer/show_interactive_hack.py +30 -7
  21. classiq/analyzer/url_utils.py +2 -3
  22. classiq/applications/__init__.py +3 -12
  23. classiq/applications/chemistry/__init__.py +14 -10
  24. classiq/applications/chemistry/ansatz_parameters.py +4 -4
  25. classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +170 -170
  26. classiq/applications/chemistry/ground_state_problem.py +1 -1
  27. classiq/applications/combinatorial_helpers/allowed_constraints.py +23 -0
  28. classiq/applications/combinatorial_helpers/arithmetic/arithmetic_expression.py +35 -0
  29. classiq/applications/combinatorial_helpers/arithmetic/isolation.py +42 -0
  30. classiq/applications/combinatorial_helpers/combinatorial_problem_utils.py +166 -0
  31. classiq/applications/combinatorial_helpers/encoding_mapping.py +107 -0
  32. classiq/applications/combinatorial_helpers/encoding_utils.py +124 -0
  33. classiq/applications/combinatorial_helpers/memory.py +75 -0
  34. classiq/applications/combinatorial_helpers/optimization_model.py +193 -0
  35. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +31 -0
  36. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
  37. classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
  38. classiq/applications/combinatorial_helpers/sympy_utils.py +22 -0
  39. classiq/applications/combinatorial_helpers/transformations/encoding.py +189 -0
  40. classiq/applications/combinatorial_helpers/transformations/fixed_variables.py +143 -0
  41. classiq/applications/combinatorial_helpers/transformations/ising_converter.py +120 -0
  42. classiq/applications/combinatorial_helpers/transformations/penalty.py +31 -0
  43. classiq/applications/combinatorial_helpers/transformations/penalty_support.py +37 -0
  44. classiq/applications/combinatorial_helpers/transformations/sign_seperation.py +74 -0
  45. classiq/applications/combinatorial_helpers/transformations/slack_variables.py +87 -0
  46. classiq/applications/combinatorial_optimization/__init__.py +24 -5
  47. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
  48. classiq/applications/combinatorial_optimization/combinatorial_optimization_model_constructor.py +137 -0
  49. classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
  50. classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
  51. classiq/applications/finance/__init__.py +4 -5
  52. classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +50 -57
  53. classiq/applications/grover/__init__.py +9 -0
  54. classiq/applications/grover/grover_model_constructor.py +157 -0
  55. classiq/applications/hamiltonian/__init__.py +0 -0
  56. classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
  57. classiq/applications/libraries/__init__.py +0 -0
  58. classiq/applications/libraries/qmci_library.py +22 -0
  59. classiq/applications/qnn/__init__.py +2 -4
  60. classiq/applications/qnn/circuit_utils.py +8 -8
  61. classiq/applications/qnn/datasets/__init__.py +9 -11
  62. classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
  63. classiq/applications/qnn/datasets/dataset_not.py +2 -1
  64. classiq/applications/qnn/datasets/dataset_parity.py +2 -2
  65. classiq/applications/qnn/gradients/quantum_gradient.py +2 -2
  66. classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
  67. classiq/applications/qnn/qlayer.py +30 -10
  68. classiq/applications/qnn/torch_utils.py +4 -3
  69. classiq/applications/qnn/types.py +7 -7
  70. classiq/applications/qsvm/__init__.py +6 -4
  71. classiq/applications/qsvm/qsvm.py +4 -10
  72. classiq/applications/qsvm/qsvm_data_generation.py +5 -8
  73. classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
  74. classiq/execution/__init__.py +8 -3
  75. classiq/execution/all_hardware_devices.py +11 -0
  76. classiq/execution/execution_session.py +400 -0
  77. classiq/execution/iqcc.py +63 -0
  78. classiq/execution/jobs.py +197 -25
  79. classiq/execution/qnn.py +79 -0
  80. classiq/executor.py +23 -117
  81. classiq/interface/_version.py +1 -1
  82. classiq/interface/analyzer/analysis_params.py +49 -16
  83. classiq/interface/analyzer/cytoscape_graph.py +15 -9
  84. classiq/interface/analyzer/result.py +36 -32
  85. classiq/interface/applications/qsvm.py +28 -25
  86. classiq/interface/ast_node.py +16 -0
  87. classiq/interface/backend/backend_preferences.py +390 -119
  88. classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
  89. classiq/interface/backend/pydantic_backend.py +27 -22
  90. classiq/interface/backend/quantum_backend_providers.py +70 -16
  91. classiq/interface/chemistry/fermionic_operator.py +43 -32
  92. classiq/interface/chemistry/ground_state_problem.py +42 -24
  93. classiq/interface/chemistry/molecule.py +20 -14
  94. classiq/interface/chemistry/operator.py +75 -236
  95. classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
  96. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +2 -4
  97. classiq/interface/combinatorial_optimization/examples/greater_than_ilp.py +1 -1
  98. classiq/interface/combinatorial_optimization/examples/ilp.py +2 -1
  99. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  100. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  101. classiq/interface/combinatorial_optimization/examples/mds.py +2 -1
  102. classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
  103. classiq/interface/combinatorial_optimization/examples/mis.py +4 -1
  104. classiq/interface/combinatorial_optimization/examples/mvc.py +2 -1
  105. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  106. classiq/interface/combinatorial_optimization/examples/set_cover.py +3 -3
  107. classiq/interface/combinatorial_optimization/examples/tsp.py +4 -3
  108. classiq/interface/combinatorial_optimization/examples/tsp_digraph.py +6 -2
  109. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +14 -9
  110. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  111. classiq/interface/combinatorial_optimization/result.py +1 -3
  112. classiq/interface/combinatorial_optimization/solver_types.py +1 -1
  113. classiq/interface/debug_info/__init__.py +0 -0
  114. classiq/interface/debug_info/debug_info.py +86 -0
  115. classiq/interface/exceptions.py +201 -0
  116. classiq/interface/execution/iqcc.py +19 -0
  117. classiq/interface/execution/jobs.py +15 -12
  118. classiq/interface/execution/primitives.py +18 -0
  119. classiq/interface/executor/constants.py +1 -0
  120. classiq/interface/executor/estimation.py +2 -2
  121. classiq/interface/executor/execution_preferences.py +26 -143
  122. classiq/interface/executor/execution_request.py +36 -56
  123. classiq/interface/executor/execution_result.py +30 -8
  124. classiq/interface/executor/iqae_result.py +4 -6
  125. classiq/interface/executor/optimizer_preferences.py +34 -22
  126. classiq/interface/executor/{quantum_program.py → quantum_code.py} +44 -34
  127. classiq/interface/executor/quantum_instruction_set.py +3 -2
  128. classiq/interface/executor/register_initialization.py +12 -17
  129. classiq/interface/executor/result.py +122 -64
  130. classiq/interface/executor/vqe_result.py +11 -11
  131. classiq/interface/finance/function_input.py +42 -19
  132. classiq/interface/finance/gaussian_model_input.py +7 -5
  133. classiq/interface/finance/log_normal_model_input.py +6 -4
  134. classiq/interface/finance/model_input.py +6 -4
  135. classiq/interface/generator/adjacency.py +1 -3
  136. classiq/interface/generator/amplitude_loading.py +27 -14
  137. classiq/interface/generator/ansatz_library.py +5 -5
  138. classiq/interface/generator/application_apis/__init__.py +1 -0
  139. classiq/interface/generator/application_apis/arithmetic_declarations.py +17 -0
  140. classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
  141. classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
  142. classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
  143. classiq/interface/generator/application_apis/finance_declarations.py +48 -69
  144. classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
  145. classiq/interface/generator/arith/argument_utils.py +57 -6
  146. classiq/interface/generator/arith/arithmetic.py +37 -16
  147. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +15 -17
  148. classiq/interface/generator/arith/arithmetic_expression_abc.py +70 -26
  149. classiq/interface/generator/arith/arithmetic_expression_parser.py +18 -12
  150. classiq/interface/generator/arith/arithmetic_expression_validator.py +61 -43
  151. classiq/interface/generator/arith/arithmetic_operations.py +19 -16
  152. classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
  153. classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
  154. classiq/interface/generator/arith/ast_node_rewrite.py +4 -3
  155. classiq/interface/generator/arith/binary_ops.py +375 -139
  156. classiq/interface/generator/arith/endianness.py +1 -1
  157. classiq/interface/generator/arith/extremum_operations.py +96 -23
  158. classiq/interface/generator/arith/logical_ops.py +16 -12
  159. classiq/interface/generator/arith/machine_precision.py +3 -0
  160. classiq/interface/generator/arith/number_utils.py +44 -48
  161. classiq/interface/generator/arith/register_user_input.py +70 -27
  162. classiq/interface/generator/arith/unary_ops.py +57 -46
  163. classiq/interface/generator/arith/uncomputation_methods.py +1 -1
  164. classiq/interface/generator/builtin_api_builder.py +2 -9
  165. classiq/interface/generator/chemistry_function_params.py +5 -5
  166. classiq/interface/generator/circuit_code/circuit_code.py +7 -7
  167. classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
  168. classiq/interface/generator/commuting_pauli_exponentiation.py +8 -6
  169. classiq/interface/generator/compiler_keywords.py +8 -0
  170. classiq/interface/generator/complex_type.py +13 -25
  171. classiq/interface/generator/constant.py +3 -4
  172. classiq/interface/generator/control_state.py +35 -28
  173. classiq/interface/generator/copy.py +47 -0
  174. classiq/interface/generator/custom_ansatz.py +2 -5
  175. classiq/interface/generator/distance.py +3 -5
  176. classiq/interface/generator/excitations.py +3 -2
  177. classiq/interface/generator/expressions/atomic_expression_functions.py +26 -8
  178. classiq/interface/generator/expressions/enums/__init__.py +0 -10
  179. classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
  180. classiq/interface/generator/expressions/evaluated_expression.py +21 -7
  181. classiq/interface/generator/expressions/expression.py +27 -15
  182. classiq/interface/generator/expressions/expression_constants.py +9 -3
  183. classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
  184. classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
  185. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +59 -0
  186. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
  187. classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
  188. classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
  189. classiq/interface/generator/expressions/sympy_supported_expressions.py +20 -11
  190. classiq/interface/generator/finance.py +3 -3
  191. classiq/interface/generator/function_param_library.py +6 -6
  192. classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
  193. classiq/interface/generator/function_params.py +42 -69
  194. classiq/interface/generator/functions/__init__.py +0 -22
  195. classiq/interface/generator/functions/builtins/__init__.py +0 -0
  196. classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
  197. classiq/interface/generator/functions/classical_function_declaration.py +18 -9
  198. classiq/interface/generator/functions/classical_type.py +47 -166
  199. classiq/interface/generator/functions/concrete_types.py +55 -0
  200. classiq/interface/generator/functions/function_declaration.py +13 -14
  201. classiq/interface/generator/functions/port_declaration.py +1 -13
  202. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  203. classiq/interface/generator/functions/type_name.py +90 -0
  204. classiq/interface/generator/generated_circuit_data.py +155 -22
  205. classiq/interface/generator/grover_diffuser.py +32 -25
  206. classiq/interface/generator/grover_operator.py +34 -23
  207. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
  208. classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
  209. classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +12 -8
  210. classiq/interface/generator/hardware/hardware_data.py +76 -36
  211. classiq/interface/generator/hardware_efficient_ansatz.py +38 -17
  212. classiq/interface/generator/hartree_fock.py +14 -4
  213. classiq/interface/generator/identity.py +10 -6
  214. classiq/interface/generator/linear_pauli_rotations.py +33 -19
  215. classiq/interface/generator/mcmt_method.py +1 -1
  216. classiq/interface/generator/mcu.py +20 -16
  217. classiq/interface/generator/mcx.py +29 -20
  218. classiq/interface/generator/model/__init__.py +2 -5
  219. classiq/interface/generator/model/constraints.py +27 -8
  220. classiq/interface/generator/model/model.py +32 -203
  221. classiq/interface/generator/model/preferences/preferences.py +118 -43
  222. classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +27 -22
  223. classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
  224. classiq/interface/generator/oracles/custom_oracle.py +17 -13
  225. classiq/interface/generator/oracles/oracle_abc.py +9 -9
  226. classiq/interface/generator/partitioned_register.py +7 -7
  227. classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
  228. classiq/interface/generator/preferences/optimization.py +1 -2
  229. classiq/interface/generator/qpe.py +47 -34
  230. classiq/interface/generator/qsvm.py +13 -17
  231. classiq/interface/generator/quantum_function_call.py +107 -87
  232. classiq/interface/generator/{generated_circuit.py → quantum_program.py} +50 -37
  233. classiq/interface/generator/range_types.py +13 -12
  234. classiq/interface/generator/register_role.py +18 -6
  235. classiq/interface/generator/slice_parsing_utils.py +11 -6
  236. classiq/interface/generator/standard_gates/controlled_standard_gates.py +32 -39
  237. classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
  238. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  239. classiq/interface/generator/standard_gates/u_gate.py +7 -10
  240. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  241. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
  242. classiq/interface/generator/state_preparation/distributions.py +16 -15
  243. classiq/interface/generator/state_preparation/metrics.py +5 -7
  244. classiq/interface/generator/state_preparation/state_preparation.py +30 -23
  245. classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
  246. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
  247. classiq/interface/generator/transpiler_basis_gates.py +7 -3
  248. classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
  249. classiq/interface/generator/types/compilation_metadata.py +6 -0
  250. classiq/interface/generator/types/enum_declaration.py +54 -0
  251. classiq/interface/generator/types/qstruct_declaration.py +18 -0
  252. classiq/interface/generator/types/struct_declaration.py +15 -14
  253. classiq/interface/generator/ucc.py +9 -6
  254. classiq/interface/generator/unitary_gate.py +10 -6
  255. classiq/interface/generator/user_defined_function_params.py +4 -1
  256. classiq/interface/generator/validations/flow_graph.py +11 -9
  257. classiq/interface/generator/validations/validator_functions.py +8 -6
  258. classiq/interface/generator/visitor.py +23 -16
  259. classiq/interface/hardware.py +31 -10
  260. classiq/interface/helpers/classproperty.py +8 -0
  261. classiq/interface/helpers/custom_encoders.py +3 -0
  262. classiq/interface/helpers/custom_pydantic_types.py +40 -50
  263. classiq/interface/helpers/datastructures.py +26 -0
  264. classiq/interface/helpers/hashable_mixin.py +3 -2
  265. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  266. classiq/interface/helpers/pydantic_model_helpers.py +7 -11
  267. classiq/interface/helpers/validation_helpers.py +4 -21
  268. classiq/interface/helpers/versioned_model.py +1 -1
  269. classiq/interface/ide/ide_data.py +16 -20
  270. classiq/interface/ide/visual_model.py +130 -0
  271. classiq/interface/interface_version.py +1 -0
  272. classiq/interface/jobs.py +35 -6
  273. classiq/interface/model/allocate.py +16 -0
  274. classiq/interface/model/bind_operation.py +44 -14
  275. classiq/interface/model/classical_if.py +15 -0
  276. classiq/interface/model/classical_parameter_declaration.py +33 -3
  277. classiq/interface/model/control.py +45 -0
  278. classiq/interface/model/handle_binding.py +298 -20
  279. classiq/interface/model/inplace_binary_operation.py +31 -26
  280. classiq/interface/model/invert.py +12 -0
  281. classiq/interface/model/model.py +87 -73
  282. classiq/interface/model/native_function_definition.py +16 -21
  283. classiq/interface/model/parameter.py +13 -0
  284. classiq/interface/model/phase_operation.py +11 -0
  285. classiq/interface/model/port_declaration.py +27 -9
  286. classiq/interface/model/power.py +14 -0
  287. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +38 -21
  288. classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
  289. classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
  290. classiq/interface/model/quantum_function_call.py +146 -462
  291. classiq/interface/model/quantum_function_declaration.py +193 -152
  292. classiq/interface/model/quantum_lambda_function.py +65 -0
  293. classiq/interface/model/quantum_statement.py +71 -12
  294. classiq/interface/model/quantum_type.py +205 -67
  295. classiq/interface/model/quantum_variable_declaration.py +4 -26
  296. classiq/interface/model/repeat.py +15 -0
  297. classiq/interface/model/statement_block.py +58 -0
  298. classiq/interface/model/validation_handle.py +13 -6
  299. classiq/interface/model/variable_declaration_statement.py +3 -1
  300. classiq/interface/model/within_apply_operation.py +13 -0
  301. classiq/interface/pyomo_extension/pyomo_sympy_bimap.py +4 -1
  302. classiq/interface/server/global_versions.py +6 -7
  303. classiq/interface/server/routes.py +22 -21
  304. classiq/interface/source_reference.py +59 -0
  305. classiq/model_expansions/__init__.py +0 -0
  306. classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
  307. classiq/model_expansions/capturing/__init__.py +0 -0
  308. classiq/model_expansions/capturing/captured_vars.py +435 -0
  309. classiq/model_expansions/capturing/mangling_utils.py +56 -0
  310. classiq/model_expansions/closure.py +171 -0
  311. classiq/model_expansions/debug_flag.py +3 -0
  312. classiq/model_expansions/evaluators/__init__.py +0 -0
  313. classiq/model_expansions/evaluators/arg_type_match.py +158 -0
  314. classiq/model_expansions/evaluators/argument_types.py +42 -0
  315. classiq/model_expansions/evaluators/classical_expression.py +36 -0
  316. classiq/model_expansions/evaluators/control.py +144 -0
  317. classiq/model_expansions/evaluators/parameter_types.py +226 -0
  318. classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
  319. classiq/model_expansions/evaluators/type_type_match.py +90 -0
  320. classiq/model_expansions/expression_evaluator.py +135 -0
  321. classiq/model_expansions/expression_renamer.py +76 -0
  322. classiq/model_expansions/function_builder.py +247 -0
  323. classiq/model_expansions/generative_functions.py +158 -0
  324. classiq/model_expansions/interpreters/__init__.py +0 -0
  325. classiq/model_expansions/interpreters/base_interpreter.py +263 -0
  326. classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
  327. classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
  328. classiq/model_expansions/model_tables.py +18 -0
  329. classiq/model_expansions/quantum_operations/__init__.py +9 -0
  330. classiq/model_expansions/quantum_operations/bind.py +60 -0
  331. classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
  332. classiq/model_expansions/quantum_operations/classicalif.py +53 -0
  333. classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
  334. classiq/model_expansions/quantum_operations/emitter.py +181 -0
  335. classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
  336. classiq/model_expansions/quantum_operations/repeat.py +56 -0
  337. classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
  338. classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
  339. classiq/model_expansions/scope.py +240 -0
  340. classiq/model_expansions/scope_initialization.py +150 -0
  341. classiq/model_expansions/sympy_conversion/__init__.py +0 -0
  342. classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
  343. classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
  344. classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
  345. classiq/model_expansions/transformers/__init__.py +0 -0
  346. classiq/model_expansions/transformers/ast_renamer.py +26 -0
  347. classiq/model_expansions/transformers/var_splitter.py +299 -0
  348. classiq/model_expansions/utils/__init__.py +0 -0
  349. classiq/model_expansions/utils/counted_name_allocator.py +11 -0
  350. classiq/model_expansions/utils/handles_collector.py +33 -0
  351. classiq/model_expansions/visitors/__init__.py +0 -0
  352. classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
  353. classiq/model_expansions/visitors/variable_references.py +144 -0
  354. classiq/open_library/__init__.py +4 -0
  355. classiq/open_library/functions/__init__.py +130 -0
  356. classiq/open_library/functions/amplitude_estimation.py +30 -0
  357. classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
  358. classiq/open_library/functions/grover.py +157 -0
  359. classiq/open_library/functions/hea.py +115 -0
  360. classiq/open_library/functions/linear_pauli_rotation.py +82 -0
  361. classiq/open_library/functions/modular_exponentiation.py +201 -0
  362. classiq/open_library/functions/qaoa_penalty.py +117 -0
  363. classiq/open_library/functions/qft_functions.py +54 -0
  364. classiq/open_library/functions/qpe.py +46 -0
  365. classiq/open_library/functions/qsvt.py +331 -0
  366. classiq/open_library/functions/state_preparation.py +301 -0
  367. classiq/open_library/functions/swap_test.py +27 -0
  368. classiq/open_library/functions/utility_functions.py +81 -0
  369. classiq/open_library/functions/variational.py +52 -0
  370. classiq/qmod/__init__.py +17 -10
  371. classiq/qmod/builtins/__init__.py +19 -2
  372. classiq/qmod/builtins/classical_execution_primitives.py +60 -47
  373. classiq/qmod/builtins/classical_functions.py +44 -38
  374. classiq/qmod/builtins/constants.py +10 -0
  375. classiq/qmod/builtins/enums.py +208 -0
  376. classiq/qmod/builtins/functions/__init__.py +137 -0
  377. classiq/qmod/builtins/functions/allocation.py +150 -0
  378. classiq/qmod/builtins/functions/arithmetic.py +55 -0
  379. classiq/qmod/builtins/functions/benchmarking.py +8 -0
  380. classiq/qmod/builtins/functions/chemistry.py +91 -0
  381. classiq/qmod/builtins/functions/exponentiation.py +105 -0
  382. classiq/qmod/builtins/functions/finance.py +34 -0
  383. classiq/qmod/builtins/functions/operators.py +16 -0
  384. classiq/qmod/builtins/functions/qsvm.py +24 -0
  385. classiq/qmod/builtins/functions/standard_gates.py +651 -0
  386. classiq/qmod/builtins/operations.py +379 -57
  387. classiq/qmod/builtins/structs.py +103 -80
  388. classiq/qmod/cfunc.py +42 -0
  389. classiq/qmod/classical_function.py +8 -20
  390. classiq/qmod/cparam.py +64 -0
  391. classiq/qmod/create_model_function.py +56 -0
  392. classiq/qmod/declaration_inferrer.py +145 -112
  393. classiq/qmod/expression_query.py +39 -0
  394. classiq/qmod/generative.py +42 -0
  395. classiq/qmod/model_state_container.py +19 -5
  396. classiq/qmod/native/__init__.py +7 -0
  397. classiq/qmod/native/expression_to_qmod.py +194 -0
  398. classiq/qmod/native/pretty_printer.py +401 -0
  399. classiq/qmod/pretty_print/__init__.py +7 -0
  400. classiq/qmod/pretty_print/expression_to_python.py +222 -0
  401. classiq/qmod/pretty_print/pretty_printer.py +572 -0
  402. classiq/qmod/python_classical_type.py +67 -0
  403. classiq/qmod/qfunc.py +79 -0
  404. classiq/qmod/qmod_constant.py +143 -0
  405. classiq/qmod/qmod_parameter.py +84 -53
  406. classiq/qmod/qmod_variable.py +497 -100
  407. classiq/qmod/quantum_callable.py +17 -7
  408. classiq/qmod/quantum_expandable.py +278 -105
  409. classiq/qmod/quantum_function.py +232 -48
  410. classiq/qmod/semantics/__init__.py +0 -0
  411. classiq/qmod/semantics/annotation/__init__.py +0 -0
  412. classiq/qmod/semantics/annotation/call_annotation.py +92 -0
  413. classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
  414. classiq/qmod/semantics/error_manager.py +88 -0
  415. classiq/qmod/semantics/lambdas.py +25 -0
  416. classiq/qmod/semantics/static_semantics_visitor.py +384 -0
  417. classiq/qmod/semantics/validation/__init__.py +0 -0
  418. classiq/qmod/semantics/validation/constants_validation.py +16 -0
  419. classiq/qmod/semantics/validation/func_call_validation.py +99 -0
  420. classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
  421. classiq/qmod/semantics/validation/handle_validation.py +85 -0
  422. classiq/qmod/semantics/validation/main_validation.py +33 -0
  423. classiq/qmod/semantics/validation/types_validation.py +128 -0
  424. classiq/qmod/symbolic.py +178 -111
  425. classiq/qmod/symbolic_expr.py +36 -12
  426. classiq/qmod/symbolic_type.py +2 -5
  427. classiq/qmod/type_attribute_remover.py +32 -0
  428. classiq/qmod/utilities.py +108 -1
  429. classiq/qmod/write_qmod.py +53 -0
  430. classiq/synthesis.py +210 -22
  431. {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/METADATA +16 -8
  432. classiq-0.65.3.dist-info/RECORD +521 -0
  433. {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/WHEEL +1 -1
  434. classiq/_internals/_qfunc_ext.py +0 -6
  435. classiq/applications/benchmarking/__init__.py +0 -9
  436. classiq/applications/benchmarking/mirror_benchmarking.py +0 -67
  437. classiq/applications/numpy_utils.py +0 -37
  438. classiq/applications_model_constructors/__init__.py +0 -17
  439. classiq/applications_model_constructors/combinatorial_optimization_model_constructor.py +0 -178
  440. classiq/applications_model_constructors/grover_model_constructor.py +0 -227
  441. classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
  442. classiq/applications_model_constructors/libraries/qmci_library.py +0 -109
  443. classiq/builtin_functions/__init__.py +0 -43
  444. classiq/builtin_functions/amplitude_loading.py +0 -3
  445. classiq/builtin_functions/binary_ops.py +0 -1
  446. classiq/builtin_functions/exponentiation.py +0 -5
  447. classiq/builtin_functions/qpe.py +0 -4
  448. classiq/builtin_functions/qsvm.py +0 -7
  449. classiq/builtin_functions/range_types.py +0 -5
  450. classiq/builtin_functions/standard_gates.py +0 -1
  451. classiq/builtin_functions/state_preparation.py +0 -6
  452. classiq/builtin_functions/suzuki_trotter.py +0 -3
  453. classiq/exceptions.py +0 -131
  454. classiq/interface/executor/aws_execution_cost.py +0 -72
  455. classiq/interface/executor/error_mitigation.py +0 -6
  456. classiq/interface/generator/credit_risk_example/linear_gci.py +0 -115
  457. classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -59
  458. classiq/interface/generator/expressions/enums/chemistry.py +0 -28
  459. classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
  460. classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
  461. classiq/interface/generator/expressions/enums/optimizers.py +0 -9
  462. classiq/interface/generator/expressions/enums/pauli.py +0 -8
  463. classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
  464. classiq/interface/generator/expressions/qmod_qnum_proxy.py +0 -22
  465. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
  466. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
  467. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
  468. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -862
  469. classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -169
  470. classiq/interface/generator/functions/foreign_function_definition.py +0 -106
  471. classiq/interface/generator/functions/function_implementation.py +0 -103
  472. classiq/interface/generator/functions/native_function_definition.py +0 -153
  473. classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
  474. classiq/interface/generator/functions/register.py +0 -42
  475. classiq/interface/generator/functions/register_mapping_data.py +0 -102
  476. classiq/interface/generator/inequality_mixer.py +0 -51
  477. classiq/interface/generator/model/classical_main_validator.py +0 -106
  478. classiq/interface/generator/range_mixer.py +0 -56
  479. classiq/interface/generator/state_propagator.py +0 -63
  480. classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -2
  481. classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
  482. classiq/interface/generator/types/builtin_struct_declarations/qaoa_declarations.py +0 -23
  483. classiq/interface/generator/types/combinatorial_problem.py +0 -26
  484. classiq/interface/ide/show.py +0 -34
  485. classiq/interface/model/common_model_types.py +0 -23
  486. classiq/interface/model/numeric_reinterpretation.py +0 -25
  487. classiq/interface/model/operator_synthesis_data.py +0 -48
  488. classiq/interface/model/quantum_expressions/control_state.py +0 -38
  489. classiq/interface/model/quantum_if_operation.py +0 -95
  490. classiq/interface/model/resolvers/function_call_resolver.py +0 -43
  491. classiq/interface/model/validations/handle_validation_base.py +0 -55
  492. classiq/interface/model/validations/handles_validator.py +0 -154
  493. classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
  494. classiq/model/__init__.py +0 -14
  495. classiq/model/composite_function_generator.py +0 -33
  496. classiq/model/function_handler.py +0 -466
  497. classiq/model/function_handler.pyi +0 -152
  498. classiq/model/logic_flow.py +0 -149
  499. classiq/model/logic_flow_change_handler.py +0 -71
  500. classiq/model/model.py +0 -246
  501. classiq/qmod/builtins/functions.py +0 -896
  502. classiq/qmod/qmod_struct.py +0 -37
  503. classiq/quantum_functions/__init__.py +0 -17
  504. classiq/quantum_functions/annotation_parser.py +0 -207
  505. classiq/quantum_functions/decorators.py +0 -22
  506. classiq/quantum_functions/function_library.py +0 -181
  507. classiq/quantum_functions/function_parser.py +0 -74
  508. classiq/quantum_functions/quantum_function.py +0 -236
  509. classiq-0.37.1.dist-info/RECORD +0 -418
  510. /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers}/__init__.py +0 -0
  511. /classiq/{interface/generator/credit_risk_example → applications/combinatorial_helpers/arithmetic}/__init__.py +0 -0
  512. /classiq/{interface/generator/functions/core_lib_declarations → applications/combinatorial_helpers/pauli_helpers}/__init__.py +0 -0
  513. /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → applications/combinatorial_helpers/py.typed} +0 -0
  514. /classiq/{interface/model/resolvers → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
  515. /classiq/{interface/model/validations → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
  516. /classiq/{_internals → interface}/enum_utils.py +0 -0
@@ -1,67 +0,0 @@
1
- from copy import deepcopy
2
-
3
- from classiq.interface.generator.generated_circuit import GeneratedCircuit
4
- from classiq.interface.generator.model.preferences.preferences import (
5
- Preferences,
6
- QuantumFormat,
7
- TranspilationOption,
8
- )
9
-
10
- from classiq._internals.async_utils import Asyncify
11
- from classiq.model.model import Model
12
- from classiq.quantum_functions.decorators import quantum_function as qfunc
13
- from classiq.quantum_functions.function_library import QASM_INTRO, FunctionLibrary
14
- from classiq.quantum_register import QReg, ZeroQReg
15
- from classiq.synthesis import synthesize_async
16
-
17
- _MB_NAME: str = "mirror_benchmarking"
18
- _MB_FUNCTION_LIBRARY_NAME: str = f"{_MB_NAME}_function_library"
19
-
20
-
21
- class MirrorBenchmarking(metaclass=Asyncify):
22
- def __init__(self, model: Model) -> None:
23
- self.functional_model: Model = model
24
- self.functional_model._model.preferences = self.get_functional_preferences(
25
- model.preferences
26
- )
27
-
28
- async def mirror_benchmarking_model_async(self) -> Model:
29
- functional_circuit: GeneratedCircuit = GeneratedCircuit.parse_raw(
30
- await synthesize_async(self.functional_model.get_model())
31
- )
32
-
33
- num_qubits: int = functional_circuit.data.width
34
- circuit_qasm_list = functional_circuit.qasm.split(QASM_INTRO) # type: ignore[union-attr]
35
- if not circuit_qasm_list:
36
- raise AssertionError(
37
- "Functional model synthesis did not result in a legal QASM"
38
- )
39
- circuit_qasm: str = circuit_qasm_list[-1]
40
-
41
- @qfunc
42
- def functional_model_function(reg: ZeroQReg[num_qubits]) -> QReg[num_qubits]: # type: ignore[type-arg, valid-type]
43
- return QASM_INTRO + circuit_qasm # type: ignore[return-value]
44
-
45
- model_function_library = FunctionLibrary(functional_model_function)
46
-
47
- mb_model = Model(
48
- preferences=self.get_mirror_benchmarking_preferences(
49
- self.functional_model.preferences
50
- )
51
- )
52
- mb_model.include_library(model_function_library)
53
- inner_wires = mb_model.functional_model_function()
54
- mb_model.functional_model_function(in_wires=inner_wires, is_inverse=True)
55
- return mb_model
56
-
57
- @staticmethod
58
- def get_functional_preferences(preferences: Preferences) -> Preferences:
59
- functional_preferences = deepcopy(preferences)
60
- functional_preferences.output_format = [QuantumFormat.QASM]
61
- return functional_preferences
62
-
63
- @staticmethod
64
- def get_mirror_benchmarking_preferences(preferences: Preferences) -> Preferences:
65
- mb_preferences = deepcopy(preferences)
66
- mb_preferences.transpilation_option = TranspilationOption.DECOMPOSE
67
- return mb_preferences
@@ -1,37 +0,0 @@
1
- from typing import Any, TypeVar, cast
2
-
3
- import numpy as np
4
-
5
-
6
- # numpy utils
7
- def _is_empty_ndarray(obj: np.ndarray) -> bool:
8
- return 0 in obj.shape
9
-
10
-
11
- def bool_datum(
12
- obj: Any,
13
- ) -> Any: # returning `Any` since any object in python is convertable to `bool`
14
- if isinstance(obj, np.ndarray):
15
- # check that it's non-empty
16
- return not _is_empty_ndarray(obj)
17
- else:
18
- return obj
19
-
20
-
21
- def bool_data(*objects: Any) -> bool:
22
- return all(map(bool_datum, objects))
23
-
24
-
25
- T = TypeVar("T")
26
-
27
-
28
- def choose_first(*objects: T) -> T:
29
- for obj in objects:
30
- if isinstance(obj, np.ndarray):
31
- if not _is_empty_ndarray(obj):
32
- return cast(T, obj)
33
- else:
34
- if obj:
35
- return obj
36
- # if everything failed, return the last
37
- return objects[-1]
@@ -1,17 +0,0 @@
1
- from typing import List
2
-
3
- from .chemistry_model_constructor import construct_chemistry_model
4
- from .combinatorial_optimization_model_constructor import (
5
- construct_combinatorial_optimization_model,
6
- )
7
- from .finance_model_constructor import construct_finance_model
8
- from .grover_model_constructor import construct_grover_model
9
- from .qsvm_model_constructor import construct_qsvm_model
10
-
11
- __all__: List[str] = [
12
- "construct_qsvm_model",
13
- "construct_combinatorial_optimization_model",
14
- "construct_chemistry_model",
15
- "construct_finance_model",
16
- "construct_grover_model",
17
- ]
@@ -1,178 +0,0 @@
1
- import json
2
- from typing import List, Optional
3
-
4
- import sympy
5
- from pyomo import environ as pyo
6
- from pyomo.core import ConcreteModel, Constraint, Objective, Var, maximize
7
- from pyomo.core.base.objective import ScalarObjective
8
- from pyomo.core.expr.sympy_tools import Pyomo2SympyVisitor, PyomoSympyBimap
9
-
10
- from classiq.interface.generator.expressions.expression import Expression
11
- from classiq.interface.generator.functions.classical_type import ClassicalArray, Real
12
- from classiq.interface.generator.functions.port_declaration import (
13
- PortDeclarationDirection,
14
- )
15
- from classiq.interface.generator.types.combinatorial_problem import (
16
- CombinatorialOptimizationStructDeclaration,
17
- )
18
- from classiq.interface.model.handle_binding import HandleBinding
19
- from classiq.interface.model.model import Model, SerializedModel
20
- from classiq.interface.model.native_function_definition import NativeFunctionDefinition
21
- from classiq.interface.model.port_declaration import PortDeclaration
22
- from classiq.interface.model.quantum_function_call import QuantumFunctionCall
23
-
24
- from classiq.applications.combinatorial_optimization.combinatorial_optimization_config import (
25
- OptimizerConfig,
26
- QAOAConfig,
27
- )
28
-
29
- _OUTPUT_VARIABLE_NAME = "solution"
30
-
31
-
32
- def pyomo2qmod(struct_name: str, pyo_model: ConcreteModel) -> str:
33
- symbols_map = PyomoSympyBimap()
34
-
35
- variables: List[sympy.Symbol] = []
36
-
37
- bounds_set = False
38
- lower_bound = None
39
- upper_bound = None
40
-
41
- for var_dict in pyo_model.component_objects(Var):
42
- for key in var_dict:
43
- var = Pyomo2SympyVisitor(symbols_map).walk_expression(var_dict[key])
44
- var.name = var.name.replace(",", "_")
45
- variables.append(var)
46
- if bounds_set:
47
- if lower_bound != var_dict[key].lb:
48
- raise ValueError("All problem variables must agree on lower bound")
49
- if upper_bound != var_dict[key].ub:
50
- raise ValueError("All problem variables must agree on upper bound")
51
- else:
52
- lower_bound = var_dict[key].lb
53
- upper_bound = var_dict[key].ub
54
- bounds_set = True
55
-
56
- constraint_exprs: List[sympy.Expr] = []
57
-
58
- for constraint_dict in pyo_model.component_objects(Constraint):
59
- for key in constraint_dict:
60
- constraint_exprs.append(
61
- Pyomo2SympyVisitor(symbols_map).walk_expression(
62
- constraint_dict[key].expr
63
- )
64
- )
65
-
66
- pyo_objective: ScalarObjective = next(pyo_model.component_objects(Objective))
67
- objective_type_str = "Max" if pyo_objective.sense == maximize else "Min"
68
- objective_expr: sympy.Expr = Pyomo2SympyVisitor(symbols_map).walk_expression(
69
- pyo_objective
70
- )
71
-
72
- combi_struct_decl = {
73
- "name": struct_name,
74
- "variables": {str(variable): {"kind": "int"} for variable in variables},
75
- "variable_lower_bound": lower_bound,
76
- "variable_upper_bound": upper_bound,
77
- "constraints": [
78
- {"expr": str(constraint_expr)} for constraint_expr in constraint_exprs
79
- ],
80
- "objective_type": objective_type_str,
81
- "objective_function": {"expr": str(objective_expr)},
82
- }
83
- return json.dumps(combi_struct_decl, indent=2)
84
-
85
-
86
- def construct_combi_opt_py_model(
87
- pyo_model: pyo.ConcreteModel,
88
- qaoa_config: Optional[QAOAConfig] = None,
89
- optimizer_config: Optional[OptimizerConfig] = None,
90
- ) -> Model:
91
- if qaoa_config is None:
92
- qaoa_config = QAOAConfig()
93
-
94
- if optimizer_config is None:
95
- optimizer_config = OptimizerConfig()
96
-
97
- max_iteration = 0
98
- if optimizer_config.max_iteration is not None:
99
- max_iteration = optimizer_config.max_iteration
100
-
101
- initial_point_expression = (
102
- f"{optimizer_config.initial_point}"
103
- if optimizer_config.initial_point is not None
104
- else f"compute_qaoa_initial_point(optimization_problem_to_hamiltonian(get_type(MyCombiProblem), {qaoa_config.penalty_energy}),{qaoa_config.num_layers})"
105
- )
106
-
107
- return Model(
108
- types=[
109
- CombinatorialOptimizationStructDeclaration.parse_raw(
110
- pyomo2qmod("MyCombiProblem", pyo_model)
111
- )
112
- ],
113
- functions=[
114
- NativeFunctionDefinition(
115
- name="main",
116
- param_decls={
117
- "params_list": ClassicalArray(
118
- element_type=Real(), size=qaoa_config.num_layers * 2
119
- )
120
- },
121
- port_declarations={
122
- "target": PortDeclaration(
123
- name="target",
124
- size=Expression(
125
- expr=f"len(get_field(optimization_problem_to_hamiltonian(get_type(MyCombiProblem), {qaoa_config.penalty_energy})[0], 'pauli'))"
126
- ),
127
- direction=PortDeclarationDirection.Output,
128
- ),
129
- },
130
- body=[
131
- QuantumFunctionCall(
132
- function="allocate",
133
- positional_args=[
134
- Expression(expr="len(target)"),
135
- HandleBinding(name="target"),
136
- ],
137
- ),
138
- QuantumFunctionCall(
139
- function="qaoa_penalty",
140
- params={
141
- "hamiltonian": Expression(
142
- expr=f"optimization_problem_to_hamiltonian(get_type(MyCombiProblem), {qaoa_config.penalty_energy})"
143
- ),
144
- "params_list": Expression(expr="params_list"),
145
- "num_qubits": Expression(expr="len(target)"),
146
- "is_st": Expression(expr="True"),
147
- },
148
- inouts={"target": HandleBinding(name="target")},
149
- ),
150
- ],
151
- ),
152
- ],
153
- classical_execution_code=f"""
154
- vqe_result = vqe(
155
- hamiltonian=optimization_problem_to_hamiltonian(get_type(MyCombiProblem), {qaoa_config.penalty_energy}),
156
- maximize={next(pyo_model.component_objects(Objective)).sense==maximize},
157
- initial_point={initial_point_expression},
158
- optimizer=Optimizer.{optimizer_config.opt_type},
159
- max_iteration={max_iteration},
160
- tolerance={optimizer_config.tolerance},
161
- step_size={optimizer_config.step_size},
162
- skip_compute_variance={optimizer_config.skip_compute_variance},
163
- alpha_cvar={optimizer_config.alpha_cvar}
164
- )
165
- {_OUTPUT_VARIABLE_NAME} = get_optimization_solution(get_type(MyCombiProblem), vqe_result, {qaoa_config.penalty_energy})
166
- hamiltonian = optimization_problem_to_hamiltonian(get_type(MyCombiProblem), {qaoa_config.penalty_energy})
167
- save({{{_OUTPUT_VARIABLE_NAME!r}: {_OUTPUT_VARIABLE_NAME}, "vqe_result": vqe_result, "hamiltonian": hamiltonian}})
168
- """,
169
- )
170
-
171
-
172
- def construct_combinatorial_optimization_model(
173
- pyo_model: pyo.ConcreteModel,
174
- qaoa_config: Optional[QAOAConfig] = None,
175
- optimizer_config: Optional[OptimizerConfig] = None,
176
- ) -> SerializedModel:
177
- model = construct_combi_opt_py_model(pyo_model, qaoa_config, optimizer_config)
178
- return model.get_model()
@@ -1,227 +0,0 @@
1
- from typing import Dict, List, Tuple
2
-
3
- from classiq.interface.generator.expressions.expression import Expression
4
- from classiq.interface.generator.functions.port_declaration import (
5
- PortDeclarationDirection,
6
- )
7
- from classiq.interface.model.bind_operation import BindOperation
8
- from classiq.interface.model.handle_binding import HandleBinding, SlicedHandleBinding
9
- from classiq.interface.model.model import Model, SerializedModel
10
- from classiq.interface.model.native_function_definition import NativeFunctionDefinition
11
- from classiq.interface.model.numeric_reinterpretation import (
12
- NumericReinterpretationOperation,
13
- )
14
- from classiq.interface.model.port_declaration import PortDeclaration
15
- from classiq.interface.model.quantum_expressions.arithmetic_operation import (
16
- ArithmeticOperation,
17
- )
18
- from classiq.interface.model.quantum_function_call import (
19
- QuantumFunctionCall,
20
- QuantumLambdaFunction,
21
- )
22
- from classiq.interface.model.quantum_statement import QuantumStatement
23
- from classiq.interface.model.quantum_type import QuantumNumeric
24
- from classiq.interface.model.variable_declaration_statement import (
25
- VariableDeclarationStatement,
26
- )
27
-
28
- from classiq import RegisterUserInput
29
-
30
- _OUTPUT_VARIABLE_NAME = "result"
31
-
32
- _PREDICATE_FUNCTION_NAME = "expr_predicate"
33
-
34
-
35
- def split_registers(
36
- register_names: List[str],
37
- register_sizes: List[int],
38
- input_wire_name: str,
39
- ) -> List[QuantumStatement]:
40
- if len(register_names) == 0:
41
- return []
42
- wires = (
43
- [input_wire_name]
44
- + [f"split{i}" for i in range(len(register_names) - 2)]
45
- + [register_names[-1]]
46
- )
47
-
48
- if len(register_names) == 1:
49
- return [
50
- BindOperation(
51
- in_handle=HandleBinding(name=wires[0]),
52
- out_handle=HandleBinding(name=wires[1]),
53
- )
54
- ]
55
-
56
- return [
57
- QuantumFunctionCall(
58
- function="split",
59
- params={
60
- "out1_size": Expression(expr=f"{int(register_sizes[i])}"),
61
- "out2_size": Expression(expr=f"{int(sum(register_sizes[i + 1:]))}"),
62
- },
63
- inputs={"in": HandleBinding(name=wires[i])},
64
- outputs={
65
- "out1": HandleBinding(name=register),
66
- "out2": HandleBinding(name=wires[i + 1]),
67
- },
68
- )
69
- for i, register in enumerate(register_names[:-1])
70
- ]
71
-
72
-
73
- def _arithmetic_oracle_io_dict(
74
- definitions: List[Tuple[str, RegisterUserInput]], handle_name: str
75
- ) -> Dict[str, HandleBinding]:
76
- cursor = 0
77
- ios: Dict[str, HandleBinding] = dict()
78
- for reg_name, reg in definitions:
79
- ios[reg_name] = SlicedHandleBinding(
80
- name=handle_name,
81
- start=Expression(expr=f"{cursor}"),
82
- end=Expression(expr=f"{cursor + reg.size}"),
83
- )
84
- cursor += reg.size
85
- return ios
86
-
87
-
88
- def _construct_arithmetic_oracle(
89
- predicate_function: str,
90
- definitions: List[Tuple[str, RegisterUserInput]],
91
- ) -> QuantumFunctionCall:
92
- predicate_var_binding = _arithmetic_oracle_io_dict(definitions, "vars")
93
- predicate_var_binding["res"] = HandleBinding(name="result")
94
- return QuantumFunctionCall(
95
- function="simple_oracle",
96
- inouts={
97
- "target": HandleBinding(name="oq"),
98
- },
99
- operands={
100
- "predicate": QuantumLambdaFunction(
101
- body=[
102
- QuantumFunctionCall(
103
- function=predicate_function,
104
- inouts=predicate_var_binding,
105
- ),
106
- ],
107
- ),
108
- },
109
- )
110
-
111
-
112
- def grover_main_port_declarations(
113
- definitions: List[Tuple[str, RegisterUserInput]],
114
- direction: PortDeclarationDirection,
115
- ) -> Dict[str, PortDeclaration]:
116
- return {
117
- name: PortDeclaration(
118
- name=name,
119
- size=Expression(expr=f"{reg.size}"),
120
- quantum_type=QuantumNumeric(),
121
- direction=direction,
122
- )
123
- for name, reg in definitions
124
- }
125
-
126
-
127
- def _generate_variable_declaration_statements(
128
- definitions: List[Tuple[str, RegisterUserInput]]
129
- ) -> List[VariableDeclarationStatement]:
130
- ret = [VariableDeclarationStatement(name="gsq")]
131
- if len(definitions) >= 2:
132
- ret += [
133
- VariableDeclarationStatement(name=f"split{i}")
134
- for i in range(len(definitions) - 2)
135
- ]
136
- return ret
137
-
138
-
139
- def reinterpret_registers(
140
- definitions: List[Tuple[str, RegisterUserInput]]
141
- ) -> List[QuantumStatement]:
142
- return [
143
- NumericReinterpretationOperation(
144
- target=HandleBinding(name=name),
145
- fraction_digits=Expression(expr=f"{definition.fraction_places}"),
146
- is_signed=Expression(expr=f"{definition.is_signed}"),
147
- )
148
- for name, definition in definitions
149
- ]
150
-
151
-
152
- def construct_grover_model(
153
- definitions: List[Tuple[str, RegisterUserInput]],
154
- expression: str,
155
- num_reps: int = 1,
156
- ) -> SerializedModel:
157
- predicate_port_decls = grover_main_port_declarations(
158
- definitions, PortDeclarationDirection.Inout
159
- )
160
- predicate_port_decls["res"] = PortDeclaration(
161
- name="res",
162
- size=Expression(expr="1"),
163
- direction=PortDeclarationDirection.Inout,
164
- )
165
- num_qubits = sum(reg.size for _, reg in definitions)
166
-
167
- grover_model = Model(
168
- functions=[
169
- NativeFunctionDefinition(
170
- name=_PREDICATE_FUNCTION_NAME,
171
- port_declarations=predicate_port_decls,
172
- body=[
173
- *reinterpret_registers(definitions),
174
- ArithmeticOperation(
175
- expression=Expression(expr=expression),
176
- result_var=HandleBinding(name="res"),
177
- inplace_result=True,
178
- ),
179
- ],
180
- ),
181
- NativeFunctionDefinition(
182
- name="main",
183
- port_declarations=grover_main_port_declarations(
184
- definitions, PortDeclarationDirection.Output
185
- ),
186
- body=[
187
- *_generate_variable_declaration_statements(definitions),
188
- QuantumFunctionCall(
189
- function="allocate",
190
- positional_args=[
191
- Expression(expr=f"{num_qubits}"),
192
- HandleBinding(name="gsq"),
193
- ],
194
- ),
195
- QuantumFunctionCall(
196
- function="grover_search",
197
- params={
198
- "num_qubits": Expression(expr=f"{num_qubits}"),
199
- "reps": Expression(expr=f"{num_reps}"),
200
- },
201
- inouts={"gsq": HandleBinding(name="gsq")},
202
- operands={
203
- "oracle_op": QuantumLambdaFunction(
204
- body=[
205
- _construct_arithmetic_oracle(
206
- _PREDICATE_FUNCTION_NAME,
207
- definitions,
208
- )
209
- ]
210
- )
211
- },
212
- ),
213
- *split_registers(
214
- [name for name, _ in definitions],
215
- [reg.size for _, reg in definitions],
216
- "gsq",
217
- ),
218
- *reinterpret_registers(definitions),
219
- ],
220
- ),
221
- ],
222
- classical_execution_code=f"""
223
- {_OUTPUT_VARIABLE_NAME} = sample()
224
- save({{{_OUTPUT_VARIABLE_NAME!r}: {_OUTPUT_VARIABLE_NAME}}})
225
- """,
226
- )
227
- return grover_model.get_model()
@@ -1,11 +0,0 @@
1
- AE_CLASSICAL_LIBRARY = """
2
- def execute_amplitude_estimation(phase_port_size):
3
- result = sample()
4
- estimation = qae_with_qpe_result_post_processing(
5
- estimation_register_size=phase_port_size,
6
- estimation_method=1,
7
- result=result
8
- )
9
- save({"result": result, "estimation": estimation})
10
- return estimation
11
- """
@@ -1,109 +0,0 @@
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.handle_binding import HandleBinding, SlicedHandleBinding
6
- from classiq.interface.model.native_function_definition import NativeFunctionDefinition
7
- from classiq.interface.model.port_declaration import PortDeclaration
8
- from classiq.interface.model.quantum_function_call import (
9
- QuantumFunctionCall,
10
- QuantumLambdaFunction,
11
- )
12
- from classiq.interface.model.quantum_function_declaration import (
13
- QuantumOperandDeclaration,
14
- )
15
-
16
- from classiq import Integer
17
-
18
- QMCI_LIBRARY = [
19
- NativeFunctionDefinition(
20
- name="qmci",
21
- param_decls={
22
- "num_phase_qubits": Integer(),
23
- "num_unitary_qubits": Integer(),
24
- },
25
- port_declarations={
26
- "phase_port": PortDeclaration(
27
- name="phase_port",
28
- size=Expression(expr="num_phase_qubits"),
29
- direction=PortDeclarationDirection.Output,
30
- ),
31
- "unitary_port": PortDeclaration(
32
- name="unitary_port",
33
- size=Expression(expr="num_unitary_qubits"),
34
- direction=PortDeclarationDirection.Output,
35
- ),
36
- },
37
- operand_declarations={
38
- "sp_op": QuantumOperandDeclaration(
39
- name="sp_op",
40
- param_decls={"num_unitary_qubits": Integer()},
41
- port_declarations={
42
- "reg": PortDeclaration(
43
- name="reg",
44
- direction=PortDeclarationDirection.Inout,
45
- size=Expression(expr="num_unitary_qubits-1"),
46
- ),
47
- "ind": PortDeclaration(
48
- name="ind",
49
- direction=PortDeclarationDirection.Inout,
50
- size=Expression(expr="1"),
51
- ),
52
- },
53
- ),
54
- },
55
- body=[
56
- QuantumFunctionCall(
57
- function="amplitude_estimation",
58
- params={
59
- "num_unitary_qubits": Expression(expr="num_unitary_qubits"),
60
- "num_phase_qubits": Expression(expr="num_phase_qubits"),
61
- },
62
- outputs={
63
- "phase_port": HandleBinding(name="phase_port"),
64
- "unitary_port": HandleBinding(name="unitary_port"),
65
- },
66
- operands={
67
- "oracle_op": QuantumLambdaFunction(
68
- body=[
69
- QuantumFunctionCall(
70
- function="Z",
71
- inouts={
72
- "target": SlicedHandleBinding(
73
- name="oq",
74
- start=Expression(expr="num_unitary_qubits-1"),
75
- end=Expression(expr="num_unitary_qubits"),
76
- ),
77
- },
78
- ),
79
- ]
80
- ),
81
- "sp_op": QuantumLambdaFunction(
82
- body=[
83
- QuantumFunctionCall(
84
- function="sp_op",
85
- params={
86
- "num_unitary_qubits": Expression(
87
- expr="num_unitary_qubits"
88
- )
89
- },
90
- inouts={
91
- "reg": SlicedHandleBinding(
92
- name="spq",
93
- start=Expression(expr="0"),
94
- end=Expression(expr="num_unitary_qubits-1"),
95
- ),
96
- "ind": SlicedHandleBinding(
97
- name="spq",
98
- start=Expression(expr="num_unitary_qubits-1"),
99
- end=Expression(expr="num_unitary_qubits"),
100
- ),
101
- },
102
- )
103
- ],
104
- ),
105
- },
106
- ),
107
- ],
108
- ),
109
- ]
@@ -1,43 +0,0 @@
1
- from typing import List
2
-
3
- from classiq.interface.generator.function_param_list import * # noqa: F403
4
- from classiq.interface.generator.function_param_list_without_self_reference import * # noqa: F403
5
- from classiq.interface.generator.oracles.oracle_function_param_list import * # noqa: F403
6
-
7
- from ..builtin_functions import (
8
- amplitude_loading,
9
- binary_ops,
10
- exponentiation,
11
- qpe,
12
- qsvm,
13
- range_types,
14
- state_preparation,
15
- suzuki_trotter,
16
- )
17
- from .standard_gates import * # noqa: F403
18
-
19
- __all__ = (
20
- [function.__name__ for function in function_param_library.param_list] # noqa: F405
21
- + [
22
- function.__name__
23
- for function in standard_gate_function_param_library.param_list # noqa: F405
24
- ]
25
- + [
26
- function.__name__
27
- for function in oracle_function_param_library.param_list # noqa: F405
28
- ]
29
- + [
30
- "exponentiation",
31
- "state_preparation",
32
- "suzuki_trotter",
33
- "range_types",
34
- "binary_ops",
35
- "qpe",
36
- "amplitude_loading",
37
- "qsvm",
38
- ]
39
- )
40
-
41
-
42
- def __dir__() -> List[str]:
43
- return __all__