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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. classiq/__init__.py +47 -32
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +2 -1
  3. classiq/_internals/api_wrapper.py +235 -97
  4. classiq/_internals/async_utils.py +1 -3
  5. classiq/_internals/authentication/auth0.py +26 -10
  6. classiq/_internals/authentication/authentication.py +11 -0
  7. classiq/_internals/authentication/device.py +10 -5
  8. classiq/_internals/authentication/password_manager.py +18 -6
  9. classiq/_internals/authentication/token_manager.py +10 -5
  10. classiq/_internals/client.py +94 -33
  11. classiq/_internals/config.py +3 -4
  12. classiq/_internals/host_checker.py +38 -15
  13. classiq/_internals/jobs.py +60 -57
  14. classiq/_internals/type_validation.py +9 -9
  15. classiq/analyzer/__init__.py +1 -3
  16. classiq/analyzer/analyzer.py +24 -19
  17. classiq/analyzer/analyzer_utilities.py +10 -10
  18. classiq/analyzer/rb.py +15 -15
  19. classiq/analyzer/show_interactive_hack.py +27 -4
  20. classiq/analyzer/url_utils.py +2 -3
  21. classiq/applications/__init__.py +3 -12
  22. classiq/applications/chemistry/__init__.py +14 -10
  23. classiq/applications/chemistry/ansatz_parameters.py +4 -4
  24. classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +165 -158
  25. classiq/applications/chemistry/ground_state_problem.py +1 -1
  26. classiq/{applications_model_constructors → applications}/combinatorial_helpers/allowed_constraints.py +4 -1
  27. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/arithmetic_expression.py +1 -1
  28. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/isolation.py +1 -1
  29. classiq/{applications_model_constructors → applications}/combinatorial_helpers/combinatorial_problem_utils.py +51 -15
  30. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_mapping.py +12 -12
  31. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_utils.py +8 -6
  32. classiq/{applications_model_constructors → applications}/combinatorial_helpers/memory.py +7 -11
  33. classiq/{applications_model_constructors → applications}/combinatorial_helpers/optimization_model.py +67 -40
  34. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
  35. classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
  36. classiq/{applications_model_constructors → applications}/combinatorial_helpers/sympy_utils.py +2 -2
  37. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/encoding.py +15 -20
  38. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/fixed_variables.py +14 -15
  39. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/ising_converter.py +11 -15
  40. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty.py +1 -2
  41. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty_support.py +3 -7
  42. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/sign_seperation.py +2 -3
  43. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/slack_variables.py +5 -8
  44. classiq/applications/combinatorial_optimization/__init__.py +20 -6
  45. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
  46. classiq/{applications_model_constructors → applications/combinatorial_optimization}/combinatorial_optimization_model_constructor.py +35 -33
  47. classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
  48. classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
  49. classiq/applications/finance/__init__.py +4 -5
  50. classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +48 -42
  51. classiq/applications/grover/__init__.py +9 -0
  52. classiq/{applications_model_constructors → applications/grover}/grover_model_constructor.py +52 -51
  53. classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
  54. classiq/applications/libraries/qmci_library.py +22 -0
  55. classiq/applications/qnn/__init__.py +2 -4
  56. classiq/applications/qnn/circuit_utils.py +6 -6
  57. classiq/applications/qnn/datasets/__init__.py +9 -11
  58. classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
  59. classiq/applications/qnn/datasets/dataset_not.py +2 -1
  60. classiq/applications/qnn/datasets/dataset_parity.py +2 -2
  61. classiq/applications/qnn/gradients/quantum_gradient.py +1 -1
  62. classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
  63. classiq/applications/qnn/qlayer.py +30 -10
  64. classiq/applications/qnn/torch_utils.py +4 -3
  65. classiq/applications/qnn/types.py +5 -5
  66. classiq/applications/qsvm/__init__.py +6 -4
  67. classiq/applications/qsvm/qsvm.py +3 -6
  68. classiq/applications/qsvm/qsvm_data_generation.py +3 -3
  69. classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
  70. classiq/execution/__init__.py +8 -3
  71. classiq/execution/all_hardware_devices.py +11 -0
  72. classiq/execution/execution_session.py +400 -0
  73. classiq/execution/iqcc.py +63 -0
  74. classiq/execution/jobs.py +197 -25
  75. classiq/execution/qnn.py +79 -0
  76. classiq/executor.py +20 -115
  77. classiq/interface/_version.py +1 -1
  78. classiq/interface/analyzer/analysis_params.py +43 -13
  79. classiq/interface/analyzer/cytoscape_graph.py +15 -9
  80. classiq/interface/analyzer/result.py +28 -32
  81. classiq/interface/applications/qsvm.py +20 -29
  82. classiq/interface/ast_node.py +16 -0
  83. classiq/interface/backend/backend_preferences.py +390 -121
  84. classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
  85. classiq/interface/backend/pydantic_backend.py +25 -22
  86. classiq/interface/backend/quantum_backend_providers.py +69 -16
  87. classiq/interface/chemistry/fermionic_operator.py +30 -21
  88. classiq/interface/chemistry/ground_state_problem.py +28 -25
  89. classiq/interface/chemistry/molecule.py +14 -10
  90. classiq/interface/chemistry/operator.py +64 -231
  91. classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
  92. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +1 -3
  93. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  94. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  95. classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
  96. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  97. classiq/interface/combinatorial_optimization/examples/set_cover.py +1 -2
  98. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +8 -9
  99. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  100. classiq/interface/combinatorial_optimization/result.py +1 -3
  101. classiq/interface/combinatorial_optimization/solver_types.py +1 -1
  102. classiq/interface/debug_info/debug_info.py +86 -0
  103. classiq/{exceptions.py → interface/exceptions.py} +37 -9
  104. classiq/interface/execution/iqcc.py +19 -0
  105. classiq/interface/execution/jobs.py +15 -12
  106. classiq/interface/execution/primitives.py +18 -0
  107. classiq/interface/executor/constants.py +1 -0
  108. classiq/interface/executor/execution_preferences.py +26 -114
  109. classiq/interface/executor/execution_request.py +24 -46
  110. classiq/interface/executor/execution_result.py +30 -8
  111. classiq/interface/executor/iqae_result.py +4 -6
  112. classiq/interface/executor/optimizer_preferences.py +17 -14
  113. classiq/interface/executor/quantum_code.py +28 -24
  114. classiq/interface/executor/quantum_instruction_set.py +2 -2
  115. classiq/interface/executor/register_initialization.py +11 -14
  116. classiq/interface/executor/result.py +83 -56
  117. classiq/interface/executor/vqe_result.py +10 -10
  118. classiq/interface/finance/function_input.py +35 -25
  119. classiq/interface/finance/gaussian_model_input.py +5 -5
  120. classiq/interface/finance/log_normal_model_input.py +4 -4
  121. classiq/interface/finance/model_input.py +4 -4
  122. classiq/interface/generator/adjacency.py +1 -3
  123. classiq/interface/generator/amplitude_loading.py +22 -12
  124. classiq/interface/generator/ansatz_library.py +5 -5
  125. classiq/interface/generator/application_apis/arithmetic_declarations.py +8 -5
  126. classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
  127. classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
  128. classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
  129. classiq/interface/generator/application_apis/finance_declarations.py +48 -69
  130. classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
  131. classiq/interface/generator/arith/argument_utils.py +46 -5
  132. classiq/interface/generator/arith/arithmetic.py +35 -16
  133. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +6 -7
  134. classiq/interface/generator/arith/arithmetic_expression_abc.py +66 -25
  135. classiq/interface/generator/arith/arithmetic_expression_parser.py +11 -11
  136. classiq/interface/generator/arith/arithmetic_expression_validator.py +47 -43
  137. classiq/interface/generator/arith/arithmetic_operations.py +14 -6
  138. classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
  139. classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
  140. classiq/interface/generator/arith/ast_node_rewrite.py +3 -2
  141. classiq/interface/generator/arith/binary_ops.py +218 -130
  142. classiq/interface/generator/arith/endianness.py +1 -1
  143. classiq/interface/generator/arith/extremum_operations.py +96 -25
  144. classiq/interface/generator/arith/logical_ops.py +14 -12
  145. classiq/interface/generator/arith/number_utils.py +12 -6
  146. classiq/interface/generator/arith/register_user_input.py +60 -37
  147. classiq/interface/generator/arith/unary_ops.py +49 -29
  148. classiq/interface/generator/arith/uncomputation_methods.py +1 -1
  149. classiq/interface/generator/builtin_api_builder.py +2 -9
  150. classiq/interface/generator/chemistry_function_params.py +3 -3
  151. classiq/interface/generator/circuit_code/circuit_code.py +7 -7
  152. classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
  153. classiq/interface/generator/commuting_pauli_exponentiation.py +7 -7
  154. classiq/interface/generator/compiler_keywords.py +5 -1
  155. classiq/interface/generator/complex_type.py +13 -18
  156. classiq/interface/generator/constant.py +3 -4
  157. classiq/interface/generator/control_state.py +34 -29
  158. classiq/interface/generator/copy.py +47 -0
  159. classiq/interface/generator/custom_ansatz.py +2 -5
  160. classiq/interface/generator/distance.py +3 -5
  161. classiq/interface/generator/excitations.py +3 -2
  162. classiq/interface/generator/expressions/atomic_expression_functions.py +21 -5
  163. classiq/interface/generator/expressions/enums/__init__.py +0 -10
  164. classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
  165. classiq/interface/generator/expressions/evaluated_expression.py +5 -5
  166. classiq/interface/generator/expressions/expression.py +26 -14
  167. classiq/interface/generator/expressions/expression_constants.py +9 -3
  168. classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
  169. classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
  170. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +34 -8
  171. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
  172. classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
  173. classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
  174. classiq/interface/generator/expressions/sympy_supported_expressions.py +19 -11
  175. classiq/interface/generator/finance.py +2 -2
  176. classiq/interface/generator/function_param_library.py +6 -6
  177. classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
  178. classiq/interface/generator/function_params.py +36 -64
  179. classiq/interface/generator/functions/__init__.py +0 -22
  180. classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
  181. classiq/interface/generator/functions/classical_function_declaration.py +18 -9
  182. classiq/interface/generator/functions/classical_type.py +47 -166
  183. classiq/interface/generator/functions/concrete_types.py +55 -0
  184. classiq/interface/generator/functions/function_declaration.py +13 -14
  185. classiq/interface/generator/functions/port_declaration.py +1 -13
  186. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  187. classiq/interface/generator/functions/type_name.py +90 -0
  188. classiq/interface/generator/generated_circuit_data.py +153 -20
  189. classiq/interface/generator/grover_diffuser.py +32 -25
  190. classiq/interface/generator/grover_operator.py +34 -25
  191. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
  192. classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
  193. classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +9 -9
  194. classiq/interface/generator/hardware/hardware_data.py +72 -34
  195. classiq/interface/generator/hardware_efficient_ansatz.py +20 -16
  196. classiq/interface/generator/hartree_fock.py +13 -5
  197. classiq/interface/generator/identity.py +10 -6
  198. classiq/interface/generator/linear_pauli_rotations.py +32 -20
  199. classiq/interface/generator/mcmt_method.py +1 -1
  200. classiq/interface/generator/mcu.py +17 -15
  201. classiq/interface/generator/mcx.py +24 -17
  202. classiq/interface/generator/model/__init__.py +2 -5
  203. classiq/interface/generator/model/constraints.py +26 -8
  204. classiq/interface/generator/model/model.py +27 -190
  205. classiq/interface/generator/model/preferences/preferences.py +115 -41
  206. classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +14 -17
  207. classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
  208. classiq/interface/generator/oracles/custom_oracle.py +15 -13
  209. classiq/interface/generator/oracles/oracle_abc.py +7 -7
  210. classiq/interface/generator/partitioned_register.py +7 -7
  211. classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
  212. classiq/interface/generator/preferences/optimization.py +1 -2
  213. classiq/interface/generator/qpe.py +41 -30
  214. classiq/interface/generator/qsvm.py +9 -10
  215. classiq/interface/generator/quantum_function_call.py +88 -73
  216. classiq/interface/generator/quantum_program.py +41 -24
  217. classiq/interface/generator/range_types.py +11 -12
  218. classiq/interface/generator/register_role.py +18 -6
  219. classiq/interface/generator/slice_parsing_utils.py +5 -5
  220. classiq/interface/generator/standard_gates/controlled_standard_gates.py +30 -39
  221. classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
  222. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  223. classiq/interface/generator/standard_gates/u_gate.py +7 -10
  224. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  225. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
  226. classiq/interface/generator/state_preparation/distributions.py +16 -15
  227. classiq/interface/generator/state_preparation/metrics.py +4 -7
  228. classiq/interface/generator/state_preparation/state_preparation.py +25 -20
  229. classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
  230. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
  231. classiq/interface/generator/transpiler_basis_gates.py +7 -3
  232. classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
  233. classiq/interface/generator/types/compilation_metadata.py +6 -0
  234. classiq/interface/generator/types/enum_declaration.py +54 -0
  235. classiq/interface/generator/types/qstruct_declaration.py +18 -0
  236. classiq/interface/generator/types/struct_declaration.py +7 -11
  237. classiq/interface/generator/ucc.py +5 -4
  238. classiq/interface/generator/unitary_gate.py +5 -5
  239. classiq/interface/generator/user_defined_function_params.py +4 -1
  240. classiq/interface/generator/validations/flow_graph.py +7 -7
  241. classiq/interface/generator/validations/validator_functions.py +4 -4
  242. classiq/interface/generator/visitor.py +23 -16
  243. classiq/interface/hardware.py +29 -8
  244. classiq/interface/helpers/classproperty.py +8 -0
  245. classiq/interface/helpers/custom_encoders.py +2 -2
  246. classiq/interface/helpers/custom_pydantic_types.py +40 -50
  247. classiq/interface/helpers/datastructures.py +26 -0
  248. classiq/interface/helpers/hashable_mixin.py +3 -2
  249. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  250. classiq/interface/helpers/pydantic_model_helpers.py +7 -5
  251. classiq/interface/helpers/validation_helpers.py +3 -20
  252. classiq/interface/helpers/versioned_model.py +1 -4
  253. classiq/interface/ide/ide_data.py +16 -20
  254. classiq/interface/ide/visual_model.py +130 -0
  255. classiq/interface/interface_version.py +1 -0
  256. classiq/interface/jobs.py +29 -69
  257. classiq/interface/model/allocate.py +16 -0
  258. classiq/interface/model/bind_operation.py +32 -9
  259. classiq/interface/model/classical_if.py +15 -0
  260. classiq/interface/model/classical_parameter_declaration.py +33 -3
  261. classiq/interface/model/control.py +45 -0
  262. classiq/interface/model/handle_binding.py +298 -20
  263. classiq/interface/model/inplace_binary_operation.py +29 -24
  264. classiq/interface/model/invert.py +12 -0
  265. classiq/interface/model/model.py +69 -61
  266. classiq/interface/model/native_function_definition.py +17 -20
  267. classiq/interface/model/parameter.py +13 -0
  268. classiq/interface/model/phase_operation.py +11 -0
  269. classiq/interface/model/port_declaration.py +27 -9
  270. classiq/interface/model/power.py +14 -0
  271. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +30 -18
  272. classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
  273. classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
  274. classiq/interface/model/quantum_function_call.py +141 -343
  275. classiq/interface/model/quantum_function_declaration.py +190 -157
  276. classiq/interface/model/quantum_lambda_function.py +33 -32
  277. classiq/interface/model/quantum_statement.py +71 -12
  278. classiq/interface/model/quantum_type.py +177 -40
  279. classiq/interface/model/quantum_variable_declaration.py +3 -25
  280. classiq/interface/model/repeat.py +15 -0
  281. classiq/interface/model/statement_block.py +40 -14
  282. classiq/interface/model/validation_handle.py +13 -6
  283. classiq/interface/model/variable_declaration_statement.py +3 -1
  284. classiq/interface/model/within_apply_operation.py +7 -5
  285. classiq/interface/server/global_versions.py +6 -7
  286. classiq/interface/server/routes.py +17 -21
  287. classiq/interface/source_reference.py +59 -0
  288. classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
  289. classiq/model_expansions/capturing/__init__.py +0 -0
  290. classiq/model_expansions/capturing/captured_vars.py +435 -0
  291. classiq/model_expansions/capturing/mangling_utils.py +56 -0
  292. classiq/model_expansions/closure.py +171 -0
  293. classiq/model_expansions/debug_flag.py +3 -0
  294. classiq/model_expansions/evaluators/__init__.py +0 -0
  295. classiq/model_expansions/evaluators/arg_type_match.py +158 -0
  296. classiq/model_expansions/evaluators/argument_types.py +42 -0
  297. classiq/model_expansions/evaluators/classical_expression.py +36 -0
  298. classiq/model_expansions/evaluators/control.py +144 -0
  299. classiq/model_expansions/evaluators/parameter_types.py +226 -0
  300. classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
  301. classiq/model_expansions/evaluators/type_type_match.py +90 -0
  302. classiq/model_expansions/expression_evaluator.py +135 -0
  303. classiq/model_expansions/expression_renamer.py +76 -0
  304. classiq/model_expansions/function_builder.py +247 -0
  305. classiq/model_expansions/generative_functions.py +158 -0
  306. classiq/model_expansions/interpreters/__init__.py +0 -0
  307. classiq/model_expansions/interpreters/base_interpreter.py +263 -0
  308. classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
  309. classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
  310. classiq/model_expansions/model_tables.py +18 -0
  311. classiq/model_expansions/quantum_operations/__init__.py +9 -0
  312. classiq/model_expansions/quantum_operations/bind.py +60 -0
  313. classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
  314. classiq/model_expansions/quantum_operations/classicalif.py +53 -0
  315. classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
  316. classiq/model_expansions/quantum_operations/emitter.py +181 -0
  317. classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
  318. classiq/model_expansions/quantum_operations/repeat.py +56 -0
  319. classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
  320. classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
  321. classiq/model_expansions/scope.py +240 -0
  322. classiq/model_expansions/scope_initialization.py +150 -0
  323. classiq/model_expansions/sympy_conversion/__init__.py +0 -0
  324. classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
  325. classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
  326. classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
  327. classiq/model_expansions/transformers/__init__.py +0 -0
  328. classiq/model_expansions/transformers/ast_renamer.py +26 -0
  329. classiq/model_expansions/transformers/var_splitter.py +299 -0
  330. classiq/model_expansions/utils/__init__.py +0 -0
  331. classiq/model_expansions/utils/counted_name_allocator.py +11 -0
  332. classiq/model_expansions/utils/handles_collector.py +33 -0
  333. classiq/model_expansions/visitors/__init__.py +0 -0
  334. classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
  335. classiq/model_expansions/visitors/variable_references.py +144 -0
  336. classiq/open_library/__init__.py +4 -0
  337. classiq/open_library/functions/__init__.py +130 -0
  338. classiq/open_library/functions/amplitude_estimation.py +30 -0
  339. classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
  340. classiq/open_library/functions/grover.py +157 -0
  341. classiq/open_library/functions/hea.py +115 -0
  342. classiq/open_library/functions/linear_pauli_rotation.py +82 -0
  343. classiq/open_library/functions/modular_exponentiation.py +201 -0
  344. classiq/open_library/functions/qaoa_penalty.py +117 -0
  345. classiq/open_library/functions/qft_functions.py +54 -0
  346. classiq/open_library/functions/qpe.py +46 -0
  347. classiq/open_library/functions/qsvt.py +331 -0
  348. classiq/open_library/functions/state_preparation.py +301 -0
  349. classiq/open_library/functions/swap_test.py +27 -0
  350. classiq/open_library/functions/utility_functions.py +81 -0
  351. classiq/open_library/functions/variational.py +52 -0
  352. classiq/qmod/__init__.py +10 -10
  353. classiq/qmod/builtins/__init__.py +19 -2
  354. classiq/qmod/builtins/classical_execution_primitives.py +36 -14
  355. classiq/qmod/builtins/classical_functions.py +39 -43
  356. classiq/qmod/builtins/constants.py +10 -0
  357. classiq/qmod/builtins/enums.py +208 -0
  358. classiq/qmod/builtins/functions/__init__.py +137 -0
  359. classiq/qmod/builtins/functions/allocation.py +150 -0
  360. classiq/qmod/builtins/functions/arithmetic.py +55 -0
  361. classiq/qmod/builtins/functions/benchmarking.py +8 -0
  362. classiq/qmod/builtins/functions/chemistry.py +91 -0
  363. classiq/qmod/builtins/functions/exponentiation.py +105 -0
  364. classiq/qmod/builtins/functions/finance.py +34 -0
  365. classiq/qmod/builtins/functions/operators.py +16 -0
  366. classiq/qmod/builtins/functions/qsvm.py +24 -0
  367. classiq/qmod/builtins/functions/standard_gates.py +651 -0
  368. classiq/qmod/builtins/operations.py +373 -40
  369. classiq/qmod/builtins/structs.py +103 -80
  370. classiq/qmod/cfunc.py +2 -2
  371. classiq/qmod/classical_function.py +4 -8
  372. classiq/qmod/cparam.py +64 -0
  373. classiq/qmod/create_model_function.py +56 -0
  374. classiq/qmod/declaration_inferrer.py +143 -101
  375. classiq/qmod/expression_query.py +20 -4
  376. classiq/qmod/generative.py +42 -0
  377. classiq/qmod/model_state_container.py +18 -6
  378. classiq/qmod/native/__init__.py +7 -0
  379. classiq/qmod/native/expression_to_qmod.py +16 -11
  380. classiq/qmod/native/pretty_printer.py +187 -97
  381. classiq/qmod/pretty_print/__init__.py +7 -0
  382. classiq/qmod/pretty_print/expression_to_python.py +222 -0
  383. classiq/qmod/pretty_print/pretty_printer.py +572 -0
  384. classiq/qmod/python_classical_type.py +67 -0
  385. classiq/qmod/qfunc.py +60 -8
  386. classiq/qmod/qmod_constant.py +93 -26
  387. classiq/qmod/qmod_parameter.py +68 -59
  388. classiq/qmod/qmod_variable.py +468 -155
  389. classiq/qmod/quantum_callable.py +17 -7
  390. classiq/qmod/quantum_expandable.py +269 -96
  391. classiq/qmod/quantum_function.py +196 -41
  392. classiq/qmod/semantics/__init__.py +0 -0
  393. classiq/qmod/semantics/annotation/__init__.py +0 -0
  394. classiq/qmod/semantics/annotation/call_annotation.py +92 -0
  395. classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
  396. classiq/qmod/semantics/error_manager.py +88 -0
  397. classiq/qmod/semantics/lambdas.py +25 -0
  398. classiq/qmod/semantics/static_semantics_visitor.py +384 -0
  399. classiq/qmod/semantics/validation/__init__.py +0 -0
  400. classiq/qmod/semantics/validation/constants_validation.py +16 -0
  401. classiq/qmod/semantics/validation/func_call_validation.py +99 -0
  402. classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
  403. classiq/qmod/semantics/validation/handle_validation.py +85 -0
  404. classiq/qmod/semantics/validation/main_validation.py +33 -0
  405. classiq/qmod/semantics/validation/types_validation.py +128 -0
  406. classiq/qmod/symbolic.py +147 -123
  407. classiq/qmod/symbolic_expr.py +27 -12
  408. classiq/qmod/symbolic_type.py +2 -5
  409. classiq/qmod/type_attribute_remover.py +32 -0
  410. classiq/qmod/utilities.py +98 -4
  411. classiq/qmod/write_qmod.py +17 -3
  412. classiq/synthesis.py +210 -22
  413. {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/METADATA +16 -9
  414. classiq-0.65.4.dist-info/RECORD +521 -0
  415. classiq/_internals/_qfunc_ext.py +0 -6
  416. classiq/applications/benchmarking/__init__.py +0 -9
  417. classiq/applications/benchmarking/mirror_benchmarking.py +0 -70
  418. classiq/applications/numpy_utils.py +0 -37
  419. classiq/applications_model_constructors/__init__.py +0 -25
  420. classiq/applications_model_constructors/combinatorial_helpers/multiple_comp_basis_sp.py +0 -34
  421. classiq/applications_model_constructors/combinatorial_helpers/pauli_helpers/pauli_utils.py +0 -65
  422. classiq/applications_model_constructors/combinatorial_helpers/pyomo_utils.py +0 -243
  423. classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
  424. classiq/applications_model_constructors/libraries/qmci_library.py +0 -107
  425. classiq/builtin_functions/__init__.py +0 -43
  426. classiq/builtin_functions/amplitude_loading.py +0 -3
  427. classiq/builtin_functions/binary_ops.py +0 -1
  428. classiq/builtin_functions/exponentiation.py +0 -5
  429. classiq/builtin_functions/qpe.py +0 -4
  430. classiq/builtin_functions/qsvm.py +0 -7
  431. classiq/builtin_functions/range_types.py +0 -5
  432. classiq/builtin_functions/standard_gates.py +0 -1
  433. classiq/builtin_functions/state_preparation.py +0 -6
  434. classiq/builtin_functions/suzuki_trotter.py +0 -3
  435. classiq/interface/executor/aws_execution_cost.py +0 -73
  436. classiq/interface/executor/error_mitigation.py +0 -6
  437. classiq/interface/generator/credit_risk_example/linear_gci.py +0 -122
  438. classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -69
  439. classiq/interface/generator/expressions/enums/chemistry.py +0 -28
  440. classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
  441. classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
  442. classiq/interface/generator/expressions/enums/optimizers.py +0 -9
  443. classiq/interface/generator/expressions/enums/pauli.py +0 -8
  444. classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
  445. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
  446. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
  447. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
  448. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -1229
  449. classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -95
  450. classiq/interface/generator/functions/foreign_function_definition.py +0 -114
  451. classiq/interface/generator/functions/function_implementation.py +0 -107
  452. classiq/interface/generator/functions/native_function_definition.py +0 -155
  453. classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
  454. classiq/interface/generator/functions/register.py +0 -44
  455. classiq/interface/generator/functions/register_mapping_data.py +0 -106
  456. classiq/interface/generator/inequality_mixer.py +0 -51
  457. classiq/interface/generator/model/classical_main_validator.py +0 -106
  458. classiq/interface/generator/range_mixer.py +0 -56
  459. classiq/interface/generator/state_propagator.py +0 -74
  460. classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -1
  461. classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
  462. classiq/interface/ide/show.py +0 -34
  463. classiq/interface/model/call_synthesis_data.py +0 -68
  464. classiq/interface/model/common_model_types.py +0 -23
  465. classiq/interface/model/quantum_expressions/control_state.py +0 -38
  466. classiq/interface/model/quantum_if_operation.py +0 -94
  467. classiq/interface/model/resolvers/function_call_resolver.py +0 -43
  468. classiq/interface/model/validations/handle_validation_base.py +0 -55
  469. classiq/interface/model/validations/handles_validator.py +0 -156
  470. classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
  471. classiq/model/__init__.py +0 -14
  472. classiq/model/composite_function_generator.py +0 -33
  473. classiq/model/function_handler.py +0 -462
  474. classiq/model/logic_flow.py +0 -149
  475. classiq/model/logic_flow_change_handler.py +0 -71
  476. classiq/model/model.py +0 -229
  477. classiq/qmod/builtins/functions.py +0 -913
  478. classiq/qmod/qmod_struct.py +0 -37
  479. classiq/quantum_functions/__init__.py +0 -17
  480. classiq/quantum_functions/annotation_parser.py +0 -205
  481. classiq/quantum_functions/decorators.py +0 -22
  482. classiq/quantum_functions/function_library.py +0 -181
  483. classiq/quantum_functions/function_parser.py +0 -74
  484. classiq/quantum_functions/quantum_function.py +0 -236
  485. classiq-0.38.0.dist-info/RECORD +0 -454
  486. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/__init__.py +0 -0
  487. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/__init__.py +0 -0
  488. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/__init__.py +0 -0
  489. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +0 -0
  490. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/py.typed +0 -0
  491. /classiq/{applications_model_constructors/combinatorial_helpers/transformations → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
  492. /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
  493. /classiq/{interface/generator/credit_risk_example → applications/hamiltonian}/__init__.py +0 -0
  494. /classiq/{interface/generator/functions/core_lib_declarations → applications/libraries}/__init__.py +0 -0
  495. /classiq/interface/{model/resolvers → debug_info}/__init__.py +0 -0
  496. /classiq/{_internals → interface}/enum_utils.py +0 -0
  497. /classiq/interface/{model/validations → generator/functions/builtins}/__init__.py +0 -0
  498. /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → model_expansions/__init__.py} +0 -0
  499. {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/WHEEL +0 -0
@@ -1,6 +1,7 @@
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
@@ -8,23 +9,22 @@ from classiq.interface.generator.expressions.expression import Expression
8
9
  from classiq.interface.generator.functions.port_declaration import (
9
10
  PortDeclarationDirection,
10
11
  )
12
+ from classiq.interface.model.allocate import Allocate
11
13
  from classiq.interface.model.handle_binding import HandleBinding
12
14
  from classiq.interface.model.model import Model, SerializedModel
13
15
  from classiq.interface.model.native_function_definition import NativeFunctionDefinition
14
16
  from classiq.interface.model.port_declaration import PortDeclaration
15
17
  from classiq.interface.model.quantum_function_call import QuantumFunctionCall
16
18
  from classiq.interface.model.quantum_lambda_function import QuantumLambdaFunction
19
+ from classiq.interface.model.quantum_type import QuantumNumeric
17
20
  from classiq.interface.model.variable_declaration_statement import (
18
21
  VariableDeclarationStatement,
19
22
  )
20
23
 
21
- from classiq.applications_model_constructors.libraries.ampltitude_estimation_library import (
22
- AE_CLASSICAL_LIBRARY,
23
- )
24
- from classiq.applications_model_constructors.libraries.qmci_library import QMCI_LIBRARY
25
- 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
26
26
 
27
- _OUTPUT_VARIABLE_NAME = "result"
27
+ _OUTPUT_VARIABLE_NAME = "payoff_estimation"
28
28
 
29
29
 
30
30
  def construct_finance_model(
@@ -58,7 +58,7 @@ def construct_finance_model(
58
58
  if finance_function_input.tail_probability is not None:
59
59
  tail_probability = finance_function_input.tail_probability
60
60
 
61
- finance_function_object = f"struct_literal(FinanceFunction, f={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})"
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})"
62
62
  num_unitary_qubits = total_num_qubits + 1
63
63
 
64
64
  model = Model(
@@ -66,57 +66,63 @@ def construct_finance_model(
66
66
  *QMCI_LIBRARY,
67
67
  NativeFunctionDefinition(
68
68
  name="main",
69
- port_declarations={
70
- "phase_port": PortDeclaration(
69
+ positional_arg_declarations=[
70
+ PortDeclaration(
71
71
  name="phase_port",
72
- 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
+ ),
73
77
  direction=PortDeclarationDirection.Output,
74
78
  ),
75
- },
79
+ ],
76
80
  body=[
77
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
+ ),
78
90
  QuantumFunctionCall(
79
91
  function="qmci",
80
- params={
81
- "num_phase_qubits": Expression(expr=f"{phase_port_size}"),
82
- "num_unitary_qubits": Expression(
83
- expr=f"{num_unitary_qubits}"
84
- ),
85
- },
86
- operands={
87
- "sp_op": QuantumLambdaFunction(
92
+ positional_args=[
93
+ QuantumLambdaFunction(
94
+ pos_rename_params=["state", "ind"],
88
95
  body=[
89
96
  QuantumFunctionCall(
90
97
  function=finance_function,
91
- params={
92
- "finance_model": Expression(
93
- expr=finance_model
94
- ),
95
- "finance_function": Expression(
96
- expr=finance_function_object
97
- ),
98
- },
99
- inouts={
100
- "func_port": HandleBinding(name="reg"),
101
- "obj_port": HandleBinding(name="ind"),
102
- },
98
+ positional_args=[
99
+ Expression(expr=finance_model),
100
+ Expression(expr=finance_function_object),
101
+ HandleBinding(name="state"),
102
+ HandleBinding(name="ind"),
103
+ ],
103
104
  ),
104
105
  ],
105
106
  ),
106
- },
107
- outputs={
108
- "phase_port": HandleBinding(name="phase_port"),
109
- "unitary_port": HandleBinding(name="unitary_port"),
110
- },
107
+ HandleBinding(name="phase_port"),
108
+ HandleBinding(name="unitary_port"),
109
+ ],
111
110
  ),
112
111
  ],
113
112
  ),
114
113
  ],
115
- classical_execution_code=AE_CLASSICAL_LIBRARY
116
- + f"""
117
- estimation = execute_amplitude_estimation({phase_port_size})
118
- {_OUTPUT_VARIABLE_NAME} = {post_process_function}({finance_model}, {finance_function_object}, estimation)
119
- save({{{_OUTPUT_VARIABLE_NAME!r}: {_OUTPUT_VARIABLE_NAME}}})
120
- """,
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(),
121
127
  )
122
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__
@@ -1,9 +1,8 @@
1
- from typing import Dict, List, Tuple
2
-
3
1
  from classiq.interface.generator.expressions.expression import Expression
4
2
  from classiq.interface.generator.functions.port_declaration import (
5
3
  PortDeclarationDirection,
6
4
  )
5
+ from classiq.interface.model.allocate import Allocate
7
6
  from classiq.interface.model.bind_operation import BindOperation
8
7
  from classiq.interface.model.handle_binding import HandleBinding, SlicedHandleBinding
9
8
  from classiq.interface.model.model import Model, SerializedModel
@@ -11,31 +10,35 @@ from classiq.interface.model.native_function_definition import NativeFunctionDef
11
10
  from classiq.interface.model.port_declaration import PortDeclaration
12
11
  from classiq.interface.model.quantum_expressions.arithmetic_operation import (
13
12
  ArithmeticOperation,
13
+ ArithmeticOperationKind,
14
14
  )
15
15
  from classiq.interface.model.quantum_function_call import QuantumFunctionCall
16
16
  from classiq.interface.model.quantum_lambda_function import QuantumLambdaFunction
17
- from classiq.interface.model.quantum_type import QuantumNumeric
17
+ from classiq.interface.model.quantum_type import QuantumBitvector, QuantumNumeric
18
18
  from classiq.interface.model.variable_declaration_statement import (
19
19
  VariableDeclarationStatement,
20
20
  )
21
21
 
22
22
  from classiq import RegisterUserInput
23
+ from classiq.open_library.functions.grover import grover_search, phase_oracle
23
24
 
24
25
  _OUTPUT_VARIABLE_NAME = "result"
25
26
 
26
27
  _PREDICATE_FUNCTION_NAME = "expr_predicate"
27
28
 
28
29
 
29
- def _arithmetic_oracle_io_dict(
30
- definitions: List[Tuple[str, RegisterUserInput]], handle_name: str
31
- ) -> Dict[str, HandleBinding]:
30
+ def _arithmetic_oracle_ios(
31
+ definitions: list[tuple[str, RegisterUserInput]], handle_name: str
32
+ ) -> list[HandleBinding]:
32
33
  cursor = 0
33
- ios: Dict[str, HandleBinding] = dict()
34
- for reg_name, reg in definitions:
35
- ios[reg_name] = SlicedHandleBinding(
36
- name=handle_name,
37
- start=Expression(expr=f"{cursor}"),
38
- end=Expression(expr=f"{cursor + reg.size}"),
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
+ )
39
42
  )
40
43
  cursor += reg.size
41
44
  return ios
@@ -43,36 +46,34 @@ def _arithmetic_oracle_io_dict(
43
46
 
44
47
  def _construct_arithmetic_oracle(
45
48
  predicate_function: str,
46
- definitions: List[Tuple[str, RegisterUserInput]],
49
+ definitions: list[tuple[str, RegisterUserInput]],
47
50
  ) -> QuantumFunctionCall:
48
- predicate_var_binding = _arithmetic_oracle_io_dict(definitions, "arg0")
49
- predicate_var_binding["res"] = HandleBinding(name="arg1")
51
+ predicate_var_binding = _arithmetic_oracle_ios(definitions, "state")
52
+ predicate_var_binding.append(HandleBinding(name="oracle"))
50
53
  return QuantumFunctionCall(
51
54
  function="phase_oracle",
52
- inouts={
53
- "target": HandleBinding(name="arg0"),
54
- },
55
- operands={
56
- "predicate": QuantumLambdaFunction(
55
+ positional_args=[
56
+ QuantumLambdaFunction(
57
+ pos_rename_params=["state", "oracle"],
57
58
  body=[
58
59
  QuantumFunctionCall(
59
60
  function=predicate_function,
60
- inouts=predicate_var_binding,
61
+ positional_args=predicate_var_binding,
61
62
  ),
62
63
  ],
63
64
  ),
64
- },
65
+ HandleBinding(name="packed_vars"),
66
+ ],
65
67
  )
66
68
 
67
69
 
68
70
  def grover_main_port_declarations(
69
- definitions: List[Tuple[str, RegisterUserInput]],
71
+ definitions: list[tuple[str, RegisterUserInput]],
70
72
  direction: PortDeclarationDirection,
71
- ) -> Dict[str, PortDeclaration]:
72
- return {
73
- name: PortDeclaration(
73
+ ) -> list[PortDeclaration]:
74
+ return [
75
+ PortDeclaration(
74
76
  name=name,
75
- size=Expression(expr=f"{reg.size}"),
76
77
  quantum_type=QuantumNumeric(
77
78
  size=Expression(expr=f"{reg.size}"),
78
79
  is_signed=Expression(expr=f"{reg.is_signed}"),
@@ -81,21 +82,23 @@ def grover_main_port_declarations(
81
82
  direction=direction,
82
83
  )
83
84
  for name, reg in definitions
84
- }
85
+ ]
85
86
 
86
87
 
87
88
  def construct_grover_model(
88
- definitions: List[Tuple[str, RegisterUserInput]],
89
+ definitions: list[tuple[str, RegisterUserInput]],
89
90
  expression: str,
90
91
  num_reps: int = 1,
91
92
  ) -> SerializedModel:
92
93
  predicate_port_decls = grover_main_port_declarations(
93
94
  definitions, PortDeclarationDirection.Inout
94
95
  )
95
- predicate_port_decls["res"] = PortDeclaration(
96
- name="res",
97
- size=Expression(expr="1"),
98
- direction=PortDeclarationDirection.Inout,
96
+ predicate_port_decls.append(
97
+ PortDeclaration(
98
+ name="res",
99
+ quantum_type=QuantumBitvector(length=Expression(expr="1")),
100
+ direction=PortDeclarationDirection.Inout,
101
+ )
99
102
  )
100
103
  num_qubits = sum(reg.size for _, reg in definitions)
101
104
 
@@ -103,45 +106,41 @@ def construct_grover_model(
103
106
  functions=[
104
107
  NativeFunctionDefinition(
105
108
  name=_PREDICATE_FUNCTION_NAME,
106
- port_declarations=predicate_port_decls,
109
+ positional_arg_declarations=predicate_port_decls,
107
110
  body=[
108
111
  ArithmeticOperation(
109
112
  expression=Expression(expr=expression),
110
113
  result_var=HandleBinding(name="res"),
111
- inplace_result=True,
114
+ operation_kind=ArithmeticOperationKind.InplaceXor,
112
115
  ),
113
116
  ],
114
117
  ),
115
118
  NativeFunctionDefinition(
116
119
  name="main",
117
- port_declarations=grover_main_port_declarations(
120
+ positional_arg_declarations=grover_main_port_declarations(
118
121
  definitions, PortDeclarationDirection.Output
119
122
  ),
120
123
  body=[
121
124
  VariableDeclarationStatement(name="packed_vars"),
122
- QuantumFunctionCall(
123
- function="allocate",
124
- positional_args=[
125
- Expression(expr=f"{num_qubits}"),
126
- HandleBinding(name="packed_vars"),
127
- ],
125
+ Allocate(
126
+ size=Expression(expr=f"{num_qubits}"),
127
+ target=HandleBinding(name="packed_vars"),
128
128
  ),
129
129
  QuantumFunctionCall(
130
130
  function="grover_search",
131
- params={
132
- "reps": Expression(expr=f"{num_reps}"),
133
- },
134
- inouts={"packed_vars": HandleBinding(name="packed_vars")},
135
- operands={
136
- "oracle": QuantumLambdaFunction(
131
+ positional_args=[
132
+ Expression(expr=f"{num_reps}"),
133
+ QuantumLambdaFunction(
134
+ pos_rename_params=["packed_vars"],
137
135
  body=[
138
136
  _construct_arithmetic_oracle(
139
137
  _PREDICATE_FUNCTION_NAME,
140
138
  definitions,
141
139
  )
142
- ]
143
- )
144
- },
140
+ ],
141
+ ),
142
+ HandleBinding(name="packed_vars"),
143
+ ],
145
144
  ),
146
145
  BindOperation(
147
146
  in_handles=[HandleBinding(name="packed_vars")],
@@ -151,6 +150,8 @@ def construct_grover_model(
151
150
  ),
152
151
  ],
153
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"],
154
155
  ],
155
156
  )
156
157
  return grover_model.get_model()
@@ -0,0 +1,113 @@
1
+ from typing import Union
2
+
3
+ import numpy as np
4
+ from sympy import fwht
5
+
6
+ from classiq.qmod import ( # type:ignore[attr-defined]
7
+ Pauli,
8
+ PauliTerm,
9
+ )
10
+
11
+ ATOL = 1e-12
12
+ PAULI_MATRICES_DICT = {
13
+ Pauli.I: np.array([[1, 0], [0, 1]], dtype=np.complex128),
14
+ Pauli.Z: np.array([[1, 0], [0, -1]], dtype=np.complex128),
15
+ Pauli.X: np.array([[0, 1], [1, 0]], dtype=np.complex128),
16
+ Pauli.Y: np.array([[0, -1j], [1j, 0]], dtype=np.complex128),
17
+ }
18
+
19
+
20
+ def _get_pauli_string(set_index: int, term_index: int, num_qubits: int) -> list[Pauli]:
21
+ """
22
+ The basis of 4^N Pauli strings on N qubits can be partitioned to 2^N sets, each contains 2^N Pauli strings.
23
+ In the k-th set we have Pauli strings of the form s_1s_2...s_N, where s_j is in {I,Z} if k_j is 0,
24
+ and in {X,iY} if k_j=1. The function get_pauli_string returns the m-th Pauli string in the k-th set of Pauli strings
25
+ """
26
+
27
+ # returns the Pauli (I,Z) or (iY, X) appearing in the pauli_index position for a given set
28
+ def _get_paulis_for_set(set_index: int, pauli_index: int) -> tuple[Pauli, Pauli]:
29
+ if (set_index >> pauli_index) & 1:
30
+ return Pauli.Y, Pauli.X
31
+ else:
32
+ return Pauli.Z, Pauli.I
33
+
34
+ return [
35
+ (
36
+ _get_paulis_for_set(set_index, s)[0]
37
+ if (term_index >> s) & 1
38
+ else _get_paulis_for_set(set_index, s)[1]
39
+ )
40
+ for s in range(num_qubits)
41
+ ][::-1]
42
+
43
+
44
+ def _coefficents_for_set(mat: np.ndarray, set_index: int) -> list:
45
+ """
46
+ The 2^N coefficients in a 2^N x 2^N matrix that are decomposed to the elements
47
+ in the k-th set are the indices [i,j] such that i^j=k
48
+ The function coefficents_for_set returns the matrix entries that are decomposed to the same Pauli strigs set
49
+ """
50
+ return [mat[k, k ^ set_index] / len(mat) for k in range(len(mat))]
51
+
52
+
53
+ def _get_signed_coefficient(
54
+ c: complex, k: int, i: int, is_hermitian: bool
55
+ ) -> Union[complex, float]:
56
+ # correct from iY to Y
57
+ coef = complex((1j) ** ((i & k).bit_count()) * c)
58
+ if is_hermitian:
59
+ return coef.real
60
+ else:
61
+ return coef
62
+
63
+
64
+ def matrix_to_hamiltonian(
65
+ mat: np.ndarray, tol: float = ATOL, is_hermitian: bool = True
66
+ ) -> list[PauliTerm]:
67
+ """
68
+ The decomposition per set is done by the Walsh-Hadamard transform,
69
+ since the transformation between {e_0,e_3} ({e_1,e_2}) to {I,Z} ({X,iY}) is the Hadamard matrix.
70
+ """
71
+ mat.shape[0] != 0, "matrix is of size 0"
72
+ if is_hermitian:
73
+ assert np.allclose(
74
+ mat, np.conjugate(mat.T)
75
+ ), "Matrix is not hermitian, please pass is_hermitian=False"
76
+ assert mat.shape[0] == mat.shape[1], "Matrix is not square"
77
+ mat_dimension = mat.shape[0]
78
+ assert mat_dimension.bit_count() == 1, "Matrix dimension is not a power of 2"
79
+ num_qubits = (mat_dimension - 1).bit_length()
80
+ hamiltonian = []
81
+ for k in range(2**num_qubits):
82
+ coef = fwht(
83
+ _coefficents_for_set(mat, k)
84
+ ) # the transformation per set is given by the Walsh-Hadamard transform
85
+ hamiltonian += [
86
+ PauliTerm(
87
+ pauli=_get_pauli_string(k, i, num_qubits),
88
+ coefficient=_get_signed_coefficient(coef[i], k, i, is_hermitian),
89
+ )
90
+ for i in range(2**num_qubits)
91
+ if abs(coef[i]) > tol
92
+ ]
93
+ return hamiltonian
94
+
95
+
96
+ # convert a single puali string of length N to 2**N X 2**N matrix
97
+ def pauli_string_to_mat(seq: list[Pauli]) -> np.ndarray:
98
+ real_matrix = PAULI_MATRICES_DICT[seq[0]]
99
+ for p in seq[1:]:
100
+ real_matrix = np.kron(real_matrix, PAULI_MATRICES_DICT[p])
101
+ return real_matrix
102
+
103
+
104
+ # return matrix from hamiltonian
105
+ def hamiltonian_to_matrix(hamiltonian: list[PauliTerm]) -> np.ndarray:
106
+ matrix = np.zeros(
107
+ [2 ** len(hamiltonian[0].pauli), 2 ** len(hamiltonian[0].pauli)],
108
+ dtype=np.complex_,
109
+ )
110
+ for p in hamiltonian:
111
+ matrix += p.coefficient * pauli_string_to_mat(p.pauli)
112
+
113
+ return matrix
@@ -0,0 +1,22 @@
1
+ from classiq.open_library.functions.amplitude_estimation import amplitude_estimation
2
+ from classiq.qmod.builtins.functions import Z
3
+ from classiq.qmod.qfunc import qfunc
4
+ from classiq.qmod.qmod_variable import QArray, QBit, QNum
5
+ from classiq.qmod.quantum_callable import QCallable
6
+
7
+
8
+ @qfunc
9
+ def qmci(
10
+ space_transform: QCallable[QArray[QBit], QBit],
11
+ phase: QNum,
12
+ packed_vars: QArray[QBit],
13
+ ) -> None:
14
+ amplitude_estimation(
15
+ lambda reg: Z(reg[reg.len - 1]),
16
+ lambda reg: space_transform(reg[0 : reg.len - 1], reg[reg.len - 1]),
17
+ phase,
18
+ packed_vars,
19
+ )
20
+
21
+
22
+ QMCI_LIBRARY = [func for func in qmci.create_model().functions if func.name != "main"]
@@ -1,7 +1,5 @@
1
1
  # This file will be called first whenever any file from within this directory is imported.
2
2
  # Thus, we'll test dependencies only here, once.
3
- from typing import List
4
-
5
3
  try:
6
4
  import torch
7
5
  except ImportError as exc:
@@ -10,8 +8,8 @@ except ImportError as exc:
10
8
  from ..qnn import datasets, types
11
9
  from ..qnn.qlayer import QLayer
12
10
 
13
- __all__ = ["datasets", "types", "QLayer"]
11
+ __all__ = ["QLayer", "datasets", "types"]
14
12
 
15
13
 
16
- def __dir__() -> List[str]:
14
+ def __dir__() -> list[str]:
17
15
  return __all__
@@ -1,21 +1,21 @@
1
1
  import itertools
2
- from collections.abc import Collection
3
- from typing import Iterable, List, Tuple, Union
2
+ from collections.abc import Collection, Iterable
3
+ from typing import Union
4
4
 
5
5
  from torch import Tensor
6
6
 
7
+ from classiq.interface.exceptions import ClassiqQNNError, ClassiqValueError
7
8
  from classiq.interface.generator.circuit_code.types_and_constants import QasmVersion
8
9
  from classiq.interface.generator.model.preferences.preferences import QuantumFormat
9
10
  from classiq.interface.generator.quantum_program import QuantumProgram
10
11
 
11
12
  from classiq.applications.qnn.types import Arguments, Circuit
12
- from classiq.exceptions import ClassiqQNNError, ClassiqValueError
13
13
 
14
14
  WEIGHT_INITIALS = ["weight_", "w_"]
15
15
  INPUT_INITIALS = ["input_", "i_"]
16
16
 
17
- Parameters = List[str]
18
- ParametersTuple = Tuple[Parameters, Parameters]
17
+ Parameters = list[str]
18
+ ParametersTuple = tuple[Parameters, Parameters]
19
19
 
20
20
 
21
21
  def _is_name_valid(name: str) -> bool:
@@ -46,7 +46,7 @@ def validate_circuit(circuit: Circuit) -> bool:
46
46
  return True
47
47
 
48
48
 
49
- def _extract_by_prefix(lst: Parameters, prefix: List[str]) -> Parameters:
49
+ def _extract_by_prefix(lst: Parameters, prefix: list[str]) -> Parameters:
50
50
  return [s for s in lst if any(s.startswith(p) for p in prefix)]
51
51
 
52
52
 
@@ -1,5 +1,3 @@
1
- from typing import List
2
-
3
1
  from ..datasets import builtin_datasets
4
2
  from ..datasets.builtin_datasets import (
5
3
  DATALOADER_NOT,
@@ -15,21 +13,21 @@ from ..datasets.dataset_xor import DatasetXor
15
13
  from ..datasets.datasets_utils import state_to_label, state_to_weights
16
14
 
17
15
  __all__ = [
18
- "builtin_datasets",
19
- "DatasetNot",
20
- "DATASET_NOT",
21
16
  "DATALOADER_NOT",
22
- "DatasetXor",
23
- "DATASET_XOR",
17
+ "DATALOADER_SUBSET_PARITY",
24
18
  "DATALOADER_XOR",
25
- "DatasetSubsetParity",
19
+ "DATASET_NOT",
26
20
  "DATASET_SUBSET_PARITY",
27
- "DATALOADER_SUBSET_PARITY",
21
+ "DATASET_XOR",
22
+ "DatasetNot",
28
23
  "DatasetParity",
29
- "state_to_weights",
24
+ "DatasetSubsetParity",
25
+ "DatasetXor",
26
+ "builtin_datasets",
30
27
  "state_to_label",
28
+ "state_to_weights",
31
29
  ]
32
30
 
33
31
 
34
- def __dir__() -> List[str]:
32
+ def __dir__() -> list[str]:
35
33
  return __all__
@@ -1,11 +1,13 @@
1
1
  from abc import ABC, abstractmethod
2
- from typing import List, Literal, Optional, Sequence, Tuple, TypeVar, Union
2
+ from collections.abc import Sequence
3
+ from typing import Literal, Optional, TypeVar, Union
3
4
 
4
5
  from torch import Tensor, tensor
5
6
  from torch.utils.data import Dataset
6
7
 
8
+ from classiq.interface.exceptions import ClassiqIndexError, ClassiqValueError
9
+
7
10
  from classiq.applications.qnn.types import DataAndLabel, Transform
8
- from classiq.exceptions import ClassiqIndexError, ClassiqValueError
9
11
 
10
12
  T = TypeVar("T")
11
13
 
@@ -29,7 +31,7 @@ class MyDataset(Dataset, ABC):
29
31
  def _get_data_and_label(self, index: int) -> DataAndLabel:
30
32
  pass
31
33
 
32
- def __getitem__(self, index: int) -> Tuple[Tensor, Tensor]:
34
+ def __getitem__(self, index: int) -> tuple[Tensor, Tensor]:
33
35
  if index < 0 or index >= len(self):
34
36
  raise ClassiqIndexError(f"{self.__class__.__name__} out of range")
35
37
 
@@ -53,7 +55,7 @@ class MySubsetDataset(MyDataset, ABC):
53
55
  def __init__(
54
56
  self,
55
57
  n: int = 2,
56
- subset: Union[List[int], Literal["all"]] = "all",
58
+ subset: Union[list[int], Literal["all"]] = "all",
57
59
  transform: Optional[Transform] = None,
58
60
  target_transform: Optional[Transform] = None,
59
61
  ) -> None:
@@ -73,5 +75,5 @@ class MySubsetDataset(MyDataset, ABC):
73
75
  'Invalid subset - please enter a `list` of `int`, or the string "all"'
74
76
  )
75
77
 
76
- def _get_subset(self, coll: Sequence[T]) -> List[T]:
78
+ def _get_subset(self, coll: Sequence[T]) -> list[T]:
77
79
  return [coll[i] for i in self._subset]
@@ -1,10 +1,11 @@
1
+ from classiq.interface.exceptions import ClassiqIndexError
2
+
1
3
  from classiq.applications.qnn.datasets.dataset_base_classes import MyDataset
2
4
  from classiq.applications.qnn.datasets.datasets_utils import (
3
5
  all_bits_to_one,
4
6
  all_bits_to_zero,
5
7
  )
6
8
  from classiq.applications.qnn.types import DataAndLabel
7
- from classiq.exceptions import ClassiqIndexError
8
9
 
9
10
 
10
11
  class DatasetNot(MyDataset):
@@ -1,4 +1,4 @@
1
- from typing import List, Literal, Optional, Union
1
+ from typing import Literal, Optional, Union
2
2
 
3
3
  from classiq.applications.qnn.datasets.dataset_base_classes import MySubsetDataset
4
4
  from classiq.applications.qnn.types import DataAndLabel, Transform
@@ -8,7 +8,7 @@ class DatasetSubsetParity(MySubsetDataset):
8
8
  def __init__(
9
9
  self,
10
10
  n: int = 2,
11
- subset: Union[List[int], Literal["all"]] = "all",
11
+ subset: Union[list[int], Literal["all"]] = "all",
12
12
  add_readout_qubit: bool = True,
13
13
  transform: Optional[Transform] = None,
14
14
  target_transform: Optional[Transform] = None,
@@ -23,7 +23,7 @@ class QuantumGradient(abc.ABC):
23
23
  self._execute = execute
24
24
  self._post_process = post_process
25
25
 
26
- circuit = QuantumProgram.parse_raw(quantum_program)
26
+ circuit = QuantumProgram.model_validate_json(quantum_program)
27
27
  validate_circuit(circuit)
28
28
  self._quantum_program = quantum_program
29
29
  self._parameters_names = extract_parameters(circuit)