classiq 0.38.0__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 (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.3.dist-info}/METADATA +16 -9
  414. classiq-0.65.3.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.3.dist-info}/WHEEL +0 -0
@@ -0,0 +1,301 @@
1
+ import warnings
2
+ from typing import Literal
3
+
4
+ from classiq.interface.exceptions import ClassiqDeprecationWarning
5
+
6
+ from classiq.open_library.functions.utility_functions import (
7
+ hadamard_transform,
8
+ modular_increment,
9
+ )
10
+ from classiq.qmod.builtins.functions.standard_gates import CX, IDENTITY, RY, H, X
11
+ from classiq.qmod.builtins.operations import allocate, control, if_, repeat
12
+ from classiq.qmod.cparam import CBool, CInt
13
+ from classiq.qmod.qfunc import qfunc
14
+ from classiq.qmod.qmod_variable import Output, QArray, QBit, QNum
15
+ from classiq.qmod.symbolic import (
16
+ asin,
17
+ atan,
18
+ exp,
19
+ floor,
20
+ log,
21
+ logical_or,
22
+ max as qmax,
23
+ min as qmin,
24
+ pi,
25
+ sqrt,
26
+ )
27
+
28
+
29
+ @qfunc
30
+ def allocate_num(
31
+ num_qubits: CInt,
32
+ is_signed: CBool,
33
+ fraction_digits: CInt,
34
+ out: Output[
35
+ QNum[Literal["num_qubits"], Literal["is_signed"], Literal["fraction_digits"]]
36
+ ],
37
+ ) -> None:
38
+ """
39
+ [Qmod Classiq-library function]
40
+
41
+ Initializes a quantum number with the given number of qubits, sign, and fractional digits.
42
+
43
+ Args:
44
+ num_qubits: The number of qubits to allocate.
45
+ is_signed: Whether the number is signed or unsigned.
46
+ fraction_digits: The number of fractional digits.
47
+ """
48
+ allocate(num_qubits, out)
49
+
50
+
51
+ def prepare_uniform_trimmed_state_apply_rotation(
52
+ size_lsb: CInt, lsbs_val: CInt, rotation_var: QBit
53
+ ) -> None:
54
+ # max hold for the case where the value is on the left side
55
+ # the fraction in the sqrt is the wanted amount of probability
56
+ # in the left side divided by the total amount
57
+ RY(
58
+ -2 * (asin(sqrt(qmin((2 ** (size_lsb)) / lsbs_val, 1))) + pi / 4) + pi,
59
+ rotation_var,
60
+ )
61
+
62
+
63
+ @qfunc
64
+ def _prepare_uniform_trimmed_state_step(
65
+ size_lsb: CInt, ctrl_val: CInt, lsbs_val: CInt, ctrl_var: QNum, rotation_var: QBit
66
+ ) -> None:
67
+ if_(
68
+ lsbs_val != 0, # stop condition
69
+ lambda: control(
70
+ ctrl_var == ctrl_val,
71
+ lambda: prepare_uniform_trimmed_state_apply_rotation(
72
+ size_lsb, lsbs_val, rotation_var
73
+ ),
74
+ ),
75
+ )
76
+
77
+
78
+ @qfunc
79
+ def prepare_uniform_trimmed_state(m: CInt, q: QArray[QBit]) -> None:
80
+ """
81
+ [Qmod Classiq-library function]
82
+
83
+ Initializes a quantum variable in a uniform superposition of the first `m` computational basis states:
84
+
85
+ $$
86
+ \\left|\\text{q}\\right\\rangle = \\frac{1}{\\sqrt{m}}\\sum_{i=0}^{m-1}{|i\\rangle}
87
+ $$
88
+
89
+ The number of allocated qubits would be $\\left\\lceil\\log_2{m}\\right\\rceil$.
90
+ The function is especially useful when `m` is not a power of 2.
91
+
92
+ Args:
93
+ m: The number of states to load in the superposition.
94
+ q: The quantum variable that will receive the initialized state. Must be uninitialized.
95
+
96
+ Notes:
97
+ 1. If the output variable has been declared with a specific number of qubits, it must match the number of allocated qubits.
98
+ 2. The synthesis engine automatically handles the allocation, either by drawing new qubits from the available pool or by reusing existing ones.
99
+ """
100
+ hadamard_transform(q)
101
+
102
+ if_(
103
+ m < 2**q.len,
104
+ # initial step without control
105
+ lambda: prepare_uniform_trimmed_state_apply_rotation(
106
+ q.len - 1, # type:ignore[arg-type]
107
+ m,
108
+ q[q.len - 1],
109
+ ),
110
+ )
111
+
112
+ repeat(
113
+ qmax(q.len - 1, 0),
114
+ lambda i: _prepare_uniform_trimmed_state_step(
115
+ q.len - i - 2,
116
+ floor(m / (2 ** (q.len - i - 1))),
117
+ m % (2 ** (q.len - i - 1)),
118
+ q[q.len - i - 1 : q.len],
119
+ q[q.len - i - 2],
120
+ ),
121
+ )
122
+
123
+
124
+ @qfunc
125
+ def prepare_uniform_interval_state(start: CInt, end: CInt, q: QArray[QBit]) -> None:
126
+ """
127
+ [Qmod Classiq-library function]
128
+
129
+ Initializes a quantum variable in a uniform superposition of the specified interval in the computational basis states:
130
+
131
+ $$
132
+ \\left|\\text{q}\\right\\rangle = \\frac{1}{\\sqrt{\\text{end} - \\text{start}}}\\sum_{i=\\text{start}}^{\\text{end}-1}{|i\\rangle}
133
+ $$
134
+
135
+ The number of allocated qubits would be $\\left\\lceil\\log_2{\\left(\\text{end}\\right)}\\right\\rceil$.
136
+
137
+ Args:
138
+ start: The lower bound of the interval to load (inclusive).
139
+ end: The upper bound of the interval to load (exclusive).
140
+ q: The quantum variable that will receive the initialized state. Must be uninitialized.
141
+
142
+ Notes:
143
+ 1. If the output variable has been declared with a specific number of qubits, it must match the number of allocated qubits.
144
+ 2. The synthesis engine automatically handles the allocation, either by drawing new qubits from the available pool or by reusing existing ones.
145
+ """
146
+ prepare_uniform_trimmed_state(end - start, q)
147
+ modular_increment(start, q)
148
+
149
+
150
+ @qfunc
151
+ def prepare_ghz_state(size: CInt, q: Output[QArray[QBit]]) -> None:
152
+ """
153
+ [Qmod Classiq-library function]
154
+
155
+ Initializes a quantum variable in a Greenberger-Horne-Zeilinger (GHZ) state. i.e., a balanced superposition of all ones and all zeros, on an arbitrary number of qubits..
156
+
157
+ Args:
158
+ size: The number of qubits in the GHZ state. Must be a positive integer.
159
+ q: The quantum variable that will receive the initialized state. Must be uninitialized.
160
+
161
+ Notes:
162
+ The synthesis engine automatically handles the allocation, either by drawing new qubits from the available pool or by reusing existing ones.
163
+
164
+
165
+ """
166
+
167
+ def inner_lop(step: CInt) -> None:
168
+ repeat(
169
+ count=2**step,
170
+ iteration=lambda control_index: if_(
171
+ condition=control_index + 2**step >= size,
172
+ then=lambda: IDENTITY(q[0]),
173
+ else_=lambda: CX(q[control_index], q[control_index + 2**step]),
174
+ ),
175
+ )
176
+
177
+ allocate(size, q)
178
+ H(q[0])
179
+ repeat(floor(log(size - 1, 2)) + 1, inner_lop) # type:ignore[arg-type]
180
+
181
+
182
+ @qfunc
183
+ def prepare_exponential_state(rate: CInt, q: QArray[QBit]) -> None:
184
+ """
185
+
186
+ [Qmod Classiq-library function]
187
+
188
+ Prepares a quantum state with exponentially decreasing amplitudes. The state is prepared in the computational basis, with the amplitudes of the states decreasing exponentially with the index of the state:
189
+
190
+ $$
191
+ P(n) = \\frac{1}{Z} e^{- \\text{rate} \\cdot n}
192
+ $$
193
+
194
+ Args:
195
+ rate: The rate of the exponential decay.
196
+ q: The quantum register to prepare.
197
+ """
198
+ repeat(q.len, lambda i: RY(2.0 * atan(exp((-rate * 2.0**i) / 2.0)), q[i]))
199
+
200
+
201
+ @qfunc
202
+ def prepare_bell_state(state_num: CInt, q: Output[QArray[QBit, Literal[2]]]) -> None:
203
+ """
204
+ [Qmod Classiq-library function]
205
+
206
+ Initializes a quantum array of size 2 in one of the four Bell states.
207
+
208
+ Args:
209
+ state_num: The number of the Bell state to be prepared. Must be an integer between 0 and 3.
210
+ q: The quantum variable that will receive the initialized state. Must be uninitialized.
211
+
212
+ Bell States:
213
+ The four Bell states are defined as follows (each state correlates to an integer between 0 and 3 as defined by the `state_num` argument):
214
+
215
+ If `state_num` = 0 the function prepares the Bell state:
216
+
217
+ $$
218
+ \\left|\\Phi^+\\right\\rangle = \\frac{1}{\\sqrt{2}} \\left( \\left| 00 \\right\\rangle + \\left| 11 \\right\\rangle \\right)
219
+ $$
220
+
221
+ If `state_num` = 1 the function prepares the Bell state:
222
+
223
+ $$
224
+ \\left|\\Phi^-\\right\\rangle = \\frac{1}{\\sqrt{2}} \\left( \\left| 00 \\right\\rangle - \\left| 11 \\right\\rangle \\right)
225
+ $$
226
+
227
+ If `state_num` = 2 the function prepares the Bell state:
228
+
229
+ $$
230
+ \\left|\\Psi^+\\right\\rangle = \\frac{1}{\\sqrt{2}} \\left( \\left| 01 \\right\\rangle + \\left| 10 \\right\\rangle \\right)
231
+ $$
232
+
233
+ If `state_num` = 3 the function prepares the Bell state:
234
+
235
+ $$
236
+ \\left|\\Psi^-\\right\\rangle = \\frac{1}{\\sqrt{2}} \\left( \\left| 01 \\right\\rangle - \\left| 10 \\right\\rangle \\right)
237
+ $$
238
+
239
+ Notes:
240
+ The synthesis engine automatically handles the allocation, either by drawing new qubits from the available pool or by reusing existing ones.
241
+
242
+
243
+ """
244
+ allocate(2, q)
245
+ if_(logical_or(state_num == 1, state_num == 3), lambda: X(q[0]))
246
+ if_(logical_or(state_num == 2, state_num == 3), lambda: X(q[1]))
247
+ H(q[0])
248
+ CX(q[0], q[1])
249
+
250
+
251
+ @qfunc
252
+ def inplace_prepare_int(value: CInt, target: QNum) -> None:
253
+ """
254
+ [Qmod Classiq-library function]
255
+
256
+ This function is **deprecated**. Use in-place-xor assignment statement in the form _target-var_ **^=** _quantum-expression_ or **inplace_xor(**_quantum-expression_**,** _target-var_**)** instead.
257
+
258
+ Transitions a quantum variable in the zero state $|0\\rangle$ into the computational basis state $|\\text{value}\\rangle$.
259
+ In the general case, the function performs a bitwise-XOR, i.e. transitions the state $|\\psi\\rangle$ into $|\\psi \\oplus \\text{value}\\rangle$.
260
+
261
+ Args:
262
+ value: The value to assign to the quantum variable.
263
+ target: The quantum variable to act upon.
264
+
265
+ Note:
266
+ If the value cannot fit into the quantum variable, it is truncated, i.e. treated as the value modulo $2^\\text{target.size}$.
267
+ """
268
+ warnings.warn(
269
+ "Function 'inplace_prepare_int' is deprecated. Use in-place-xor assignment statement in the form '<var> ^= <expression>' or 'inplace_xor(<expression>, <var>)' instead.",
270
+ ClassiqDeprecationWarning,
271
+ stacklevel=1,
272
+ )
273
+ target ^= value
274
+
275
+
276
+ @qfunc
277
+ def prepare_int(
278
+ value: CInt,
279
+ out: Output[QNum[Literal["floor(log(value, 2)) + 1"]]],
280
+ ) -> None:
281
+ """
282
+ [Qmod Classiq-library function]
283
+
284
+ This function is **deprecated**. Use assignment statement in the form _target-var_ **|=** _quantum-expression_ or **assign(**_quantum-expression_**,** _target-var_**)** instead.
285
+
286
+ Initializes a quantum variable to the computational basis state $|\\text{value}\\rangle$.
287
+ The number of allocated qubits is automatically computed from the value, and is the minimal number required for representation in the computational basis.
288
+
289
+ Args:
290
+ value: The value to assign to the quantum variable.
291
+ out: The allocated quantum variable. Must be uninitialized.
292
+
293
+ Note:
294
+ If the output variable has been declared with a specific number of qubits, it must match the number of allocated qubits.
295
+ """
296
+ warnings.warn(
297
+ "Function 'prepare_int' is deprecated. Use assignment statement in the form '<var> |= <expression>' or 'assign(<expression>, <var>)' instead.",
298
+ ClassiqDeprecationWarning,
299
+ stacklevel=1,
300
+ )
301
+ out |= value
@@ -0,0 +1,27 @@
1
+ from classiq.qmod.builtins.functions.standard_gates import SWAP, H
2
+ from classiq.qmod.builtins.operations import allocate, control, repeat
3
+ from classiq.qmod.qfunc import qfunc
4
+ from classiq.qmod.qmod_variable import Output, QArray, QBit
5
+
6
+
7
+ @qfunc
8
+ def swap_test(state1: QArray[QBit], state2: QArray[QBit], test: Output[QBit]) -> None:
9
+ """
10
+ [Qmod Classiq-library function]
11
+
12
+ Tests the overlap (in terms of fidelity) of two quantum states.
13
+ The fidelity of `state1` and `state2` is calculated from the probability of measuring `test` qubit in the state 0 as follows:
14
+
15
+ $$
16
+ |\\langle state1 | state2 \\rangle |^2 = 2*Prob(test=0)-1
17
+ $$
18
+
19
+ Args:
20
+ state1: A quantum state to check its overlap with state2.
21
+ state2: A quantum state to check its overlap with state1.
22
+ test: A qubit for which the probability of measuring 0 is $0.5*(|\\langle state1 | state2 \\rangle |^2+1)$
23
+ """
24
+ allocate(1, test)
25
+ H(test)
26
+ control(test, lambda: repeat(state1.len, lambda i: SWAP(state1[i], state2[i])))
27
+ H(test)
@@ -0,0 +1,81 @@
1
+ from typing import Annotated
2
+
3
+ from classiq.open_library.functions.qft_functions import qft
4
+ from classiq.qmod.builtins.functions.standard_gates import PHASE, H
5
+ from classiq.qmod.builtins.operations import bind, repeat, within_apply
6
+ from classiq.qmod.cparam import CInt
7
+ from classiq.qmod.qfunc import qfunc
8
+ from classiq.qmod.qmod_variable import QArray, QBit, QCallable, QNum
9
+ from classiq.qmod.quantum_callable import QCallableList
10
+ from classiq.qmod.symbolic import pi
11
+
12
+
13
+ @qfunc
14
+ def apply_to_all(
15
+ gate_operand: QCallable[Annotated[QBit, "target"]], target: QArray[QBit]
16
+ ) -> None:
17
+ """
18
+ [Qmod Classiq-library function]
19
+
20
+ Applies the single-qubit operand `gate_operand` to each qubit in the qubit
21
+ array `target`.
22
+
23
+ Args:
24
+ gate_operand: The single-qubit gate to apply to each qubit in the array.
25
+ target: The qubit array to apply the gate to.
26
+ """
27
+ repeat(target.len, lambda index: gate_operand(target[index]))
28
+
29
+
30
+ @qfunc
31
+ def hadamard_transform(target: QArray[QBit]) -> None:
32
+ """
33
+ [Qmod Classiq-library function]
34
+
35
+ Applies Hadamard transform to the target qubits.
36
+
37
+ Corresponds to the braket notation:
38
+
39
+ $$
40
+ H^{\\otimes n} |x\rangle = \frac{1}{\\sqrt{2^n}} \\sum_{y=0}^{2^n - 1} (-1)^{x \\cdot y} |y\rangle
41
+ $$
42
+
43
+ Args:
44
+ target: qubits to apply to Hadamard transform to.
45
+
46
+ """
47
+ apply_to_all(H, target)
48
+
49
+
50
+ @qfunc
51
+ def switch(selector: CInt, cases: QCallableList) -> None:
52
+ cases[selector]()
53
+
54
+
55
+ @qfunc
56
+ def modular_increment(a: CInt, x: QNum) -> None:
57
+ """
58
+ [Qmod Classiq-library function]
59
+
60
+ Adds $a$ to $x$ modulo the range of $x$, assumed that $x$ is a non-negative integer and $a$ is an integer.
61
+ Mathematically it is described as:
62
+
63
+ $$
64
+ x = (x+a)\\ \\mod \\ 2^{x.size}-1
65
+ $$
66
+
67
+ Args:
68
+ a: A classical integer to be added to x.
69
+ x: A quantum number that is assumed to be non-negative integer.
70
+
71
+ """
72
+ array_cast: QArray = QArray("array_cast")
73
+ within_apply(
74
+ lambda: ( # type:ignore[arg-type]
75
+ bind(x, array_cast), # type:ignore[func-returns-value]
76
+ qft(array_cast),
77
+ ),
78
+ lambda: repeat(
79
+ x.size, lambda i: PHASE(a * 2 * pi * 2**i / (2**x.size), array_cast[i])
80
+ ),
81
+ )
@@ -0,0 +1,52 @@
1
+ from classiq.qmod.builtins.functions.standard_gates import RX, RY, RZ
2
+ from classiq.qmod.builtins.operations import allocate, repeat
3
+ from classiq.qmod.cparam import CReal
4
+ from classiq.qmod.qfunc import qfunc
5
+ from classiq.qmod.qmod_parameter import CArray
6
+ from classiq.qmod.qmod_variable import Output, QArray, QBit
7
+ from classiq.qmod.symbolic import ceiling, floor, pi
8
+
9
+
10
+ @qfunc
11
+ def encode_in_angle(data: CArray[CReal], qba: Output[QArray[QBit]]) -> None:
12
+ """
13
+ [Qmod Classiq-library function]
14
+
15
+ Creates an angle encoding of n data points on n qubits.
16
+
17
+ Applies RY($\\pi$data[i]) on qba[i].
18
+
19
+ Args:
20
+ data: A classical array representing the data to encode.
21
+ qba: The array of qubits on which the data is encoded.
22
+ """
23
+ allocate(data.len, qba)
24
+ repeat(
25
+ count=data.len,
26
+ iteration=lambda index: RY(pi * data[index], qba[index]),
27
+ )
28
+
29
+
30
+ @qfunc
31
+ def encode_on_bloch(data: CArray[CReal], qba: Output[QArray]) -> None:
32
+ """
33
+ [Qmod Classiq-library function]
34
+
35
+ Creates a dense angle encoding of n data points on n//2 qubits.
36
+
37
+ Encodes pairs of data points on a Bloch sphere, via RX($\\pi$data[2*i])RZ($\\pi$data[2*i+1]) on qba[i].
38
+ If the length of the data is odd then RX($\\pi$data[i]) is applied on the last qubit.
39
+
40
+ Args:
41
+ data: A classical array representing the data to encode.
42
+ qba: The QArray of QBits on which the data is encoded.
43
+ """
44
+ allocate(ceiling(data.len / 2), qba)
45
+ repeat(
46
+ count=ceiling(data.len / 2),
47
+ iteration=lambda index: RX(pi * data[2 * index], qba[index]),
48
+ )
49
+ repeat(
50
+ count=floor(data.len / 2),
51
+ iteration=lambda index: RZ(pi * data[2 * index + 1], qba[index]),
52
+ )
classiq/qmod/__init__.py CHANGED
@@ -1,20 +1,21 @@
1
- from . import symbolic
2
1
  from .builtins import * # noqa: F403
3
2
  from .builtins import __all__ as _builtins_all
4
3
  from .cfunc import cfunc
4
+ from .create_model_function import create_model
5
5
  from .expression_query import get_expression_numeric_attributes
6
6
  from .qfunc import qfunc
7
7
  from .qmod_constant import QConstant
8
- from .qmod_parameter import Array, QParam
9
- from .qmod_struct import struct
10
- from .qmod_variable import Input, Output, QArray, QBit, QNum
8
+ from .qmod_parameter import Array, CArray, CBool, CInt, CReal
9
+ from .qmod_variable import Input, Output, QArray, QBit, QNum, QStruct
11
10
  from .quantum_callable import QCallable, QCallableList
12
- from .quantum_function import create_model
13
11
  from .write_qmod import write_qmod
14
12
 
15
13
  __all__ = [
16
- "QParam",
17
14
  "Array",
15
+ "CArray",
16
+ "CBool",
17
+ "CInt",
18
+ "CReal",
18
19
  "Input",
19
20
  "Output",
20
21
  "QArray",
@@ -23,11 +24,10 @@ __all__ = [
23
24
  "QCallable",
24
25
  "QCallableList",
25
26
  "QConstant",
26
- "struct",
27
- "qfunc",
27
+ "QStruct",
28
28
  "cfunc",
29
29
  "create_model",
30
- "symbolic",
31
- "write_qmod",
32
30
  "get_expression_numeric_attributes",
31
+ "qfunc",
32
+ "write_qmod",
33
33
  ] + _builtins_all
@@ -1,20 +1,37 @@
1
+ from classiq.interface.finance.function_input import FinanceFunctionInput
2
+
1
3
  from .classical_execution_primitives import * # noqa: F403
2
4
  from .classical_execution_primitives import (
3
5
  __all__ as _builtin_classical_execution_primitives,
4
6
  )
5
7
  from .classical_functions import * # noqa: F403
6
8
  from .classical_functions import __all__ as _builtin_classical_functions
9
+ from .constants import * # noqa: F403
10
+ from .constants import __all__ as _builtin_constants
11
+ from .enums import * # noqa: F403
12
+ from .enums import __all__ as _builtin_enums
7
13
  from .functions import * # noqa: F403
8
14
  from .functions import __all__ as _builtin_functions
9
- from .operations import * # noqa: F403
15
+ from .operations import * # type:ignore[assignment] # noqa: F403
10
16
  from .operations import __all__ as _builtin_operations
11
17
  from .structs import * # noqa: F403
12
18
  from .structs import __all__ as _builtin_structs
13
19
 
20
+ FinanceFunctionInput.model_rebuild()
21
+ BUILTIN_CONSTANTS = [
22
+ constant._get_constant_node()
23
+ for constant in [
24
+ SIGNED, # noqa: F405
25
+ UNSIGNED, # noqa: F405
26
+ ]
27
+ ]
28
+
14
29
  __all__ = (
15
- _builtin_structs
30
+ _builtin_enums
31
+ + _builtin_structs
16
32
  + _builtin_functions
17
33
  + _builtin_operations
18
34
  + _builtin_classical_execution_primitives
19
35
  + _builtin_classical_functions
36
+ + _builtin_constants
20
37
  )
@@ -1,21 +1,28 @@
1
- from typing import Dict, List, Optional, Union
1
+ from typing import Final, Optional, Union
2
2
 
3
+ from classiq.interface.exceptions import ClassiqError
3
4
  from classiq.interface.executor.execution_preferences import QaeWithQpeEstimationMethod
4
5
  from classiq.interface.executor.iqae_result import IQAEResult
5
- from classiq.interface.executor.result import EstimationResult, ExecutionDetails
6
+ from classiq.interface.executor.result import (
7
+ EstimationResult,
8
+ EstimationResults,
9
+ ExecutionDetails,
10
+ MultipleExecutionDetails,
11
+ )
6
12
  from classiq.interface.executor.vqe_result import VQESolverResult
7
- from classiq.interface.generator.expressions.enums import Optimizer
8
13
  from classiq.interface.generator.functions.qmod_python_interface import QmodPyStruct
9
14
 
10
15
  from classiq.applications.qsvm.qsvm import Data, Labels
11
- from classiq.exceptions import ClassiqError
16
+ from classiq.qmod.builtins.enums import Optimizer
12
17
 
13
- ExecutionParams = Dict[str, Union[float, int]]
18
+ ExecutionParams = dict[str, Union[float, int, list[int], list[float]]]
14
19
 
15
20
  _CALL_IN_QFUNC_ERROR = (
16
21
  'Cannot call "{}" in a quantum context. "{}" is a classical execution primitive.'
17
22
  )
18
23
 
24
+ CARRAY_SEPARATOR: Final[str] = "_"
25
+
19
26
 
20
27
  def _raise_error(primitive_name: str) -> None:
21
28
  raise ClassiqError(_CALL_IN_QFUNC_ERROR.format(primitive_name, primitive_name))
@@ -31,16 +38,29 @@ def sample( # type: ignore[return]
31
38
  _raise_error("sample")
32
39
 
33
40
 
41
+ def batch_sample( # type: ignore[return]
42
+ batch_execution_params: list[ExecutionParams],
43
+ ) -> MultipleExecutionDetails:
44
+ _raise_error("batch_sample")
45
+
46
+
34
47
  def estimate( # type: ignore[return]
35
- hamiltonian: List[QmodPyStruct], execution_params: Optional[ExecutionParams] = None
48
+ hamiltonian: list[QmodPyStruct], execution_params: Optional[ExecutionParams] = None
36
49
  ) -> EstimationResult:
37
50
  _raise_error("estimate")
38
51
 
39
52
 
53
+ def batch_estimate( # type: ignore[return]
54
+ hamiltonian: list[QmodPyStruct],
55
+ batch_execution_params: list[ExecutionParams],
56
+ ) -> EstimationResults:
57
+ _raise_error("batch_estimate")
58
+
59
+
40
60
  def vqe( # type: ignore[return]
41
- hamiltonian: List[QmodPyStruct],
61
+ hamiltonian: list[QmodPyStruct],
42
62
  maximize: bool,
43
- initial_point: List[int],
63
+ initial_point: list[float],
44
64
  optimizer: Optimizer,
45
65
  max_iteration: int,
46
66
  tolerance: float,
@@ -85,16 +105,18 @@ def molecule_ground_state_solution_post_process( # type: ignore[return]
85
105
 
86
106
  __all__ = [
87
107
  "ExecutionParams",
88
- "save",
89
- "sample",
108
+ "batch_estimate",
109
+ "batch_sample",
90
110
  "estimate",
91
- "vqe",
92
- "qae_with_qpe_result_post_processing",
93
- "qsvm_full_run",
94
111
  "iqae",
95
112
  "molecule_ground_state_solution_post_process",
113
+ "qae_with_qpe_result_post_processing",
114
+ "qsvm_full_run",
115
+ "sample",
116
+ "save",
117
+ "vqe",
96
118
  ]
97
119
 
98
120
 
99
- def __dir__() -> List[str]:
121
+ def __dir__() -> list[str]:
100
122
  return __all__