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

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