classiq 0.53.0__py3-none-any.whl → 0.55.0__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 (301) hide show
  1. classiq/__init__.py +1 -3
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +2 -1
  3. classiq/_internals/__init__.py +0 -20
  4. classiq/_internals/api_wrapper.py +8 -8
  5. classiq/_internals/async_utils.py +1 -3
  6. classiq/_internals/authentication/auth0.py +5 -5
  7. classiq/_internals/authentication/device.py +5 -4
  8. classiq/_internals/authentication/password_manager.py +3 -3
  9. classiq/_internals/authentication/token_manager.py +3 -2
  10. classiq/_internals/client.py +10 -12
  11. classiq/_internals/config.py +2 -2
  12. classiq/_internals/jobs.py +7 -6
  13. classiq/_internals/type_validation.py +9 -9
  14. classiq/analyzer/__init__.py +1 -3
  15. classiq/analyzer/analyzer.py +8 -7
  16. classiq/analyzer/analyzer_utilities.py +8 -8
  17. classiq/analyzer/rb.py +11 -11
  18. classiq/applications/__init__.py +1 -3
  19. classiq/applications/chemistry/__init__.py +1 -3
  20. classiq/applications/chemistry/ansatz_parameters.py +4 -4
  21. classiq/applications/chemistry/chemistry_model_constructor.py +10 -9
  22. classiq/applications/combinatorial_helpers/combinatorial_problem_utils.py +26 -9
  23. classiq/applications/combinatorial_helpers/encoding_mapping.py +10 -10
  24. classiq/applications/combinatorial_helpers/encoding_utils.py +4 -4
  25. classiq/applications/combinatorial_helpers/memory.py +5 -7
  26. classiq/applications/combinatorial_helpers/optimization_model.py +43 -24
  27. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +4 -6
  28. classiq/applications/combinatorial_helpers/pyomo_utils.py +95 -24
  29. classiq/applications/combinatorial_helpers/sympy_utils.py +2 -2
  30. classiq/applications/combinatorial_helpers/transformations/encoding.py +8 -8
  31. classiq/applications/combinatorial_helpers/transformations/fixed_variables.py +5 -5
  32. classiq/applications/combinatorial_helpers/transformations/ising_converter.py +7 -9
  33. classiq/applications/combinatorial_helpers/transformations/penalty.py +1 -2
  34. classiq/applications/combinatorial_helpers/transformations/sign_seperation.py +1 -2
  35. classiq/applications/combinatorial_helpers/transformations/slack_variables.py +1 -2
  36. classiq/applications/combinatorial_optimization/__init__.py +1 -3
  37. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
  38. classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
  39. classiq/applications/finance/__init__.py +1 -3
  40. classiq/applications/grover/__init__.py +1 -3
  41. classiq/applications/grover/grover_model_constructor.py +7 -9
  42. classiq/applications/hamiltonian/pauli_decomposition.py +6 -6
  43. classiq/applications/qnn/__init__.py +1 -3
  44. classiq/applications/qnn/circuit_utils.py +5 -5
  45. classiq/applications/qnn/datasets/__init__.py +1 -3
  46. classiq/applications/qnn/datasets/dataset_base_classes.py +5 -4
  47. classiq/applications/qnn/datasets/dataset_parity.py +2 -2
  48. classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
  49. classiq/applications/qnn/qlayer.py +3 -3
  50. classiq/applications/qnn/torch_utils.py +2 -2
  51. classiq/applications/qnn/types.py +5 -5
  52. classiq/applications/qsvm/qsvm.py +1 -3
  53. classiq/applications/qsvm/qsvm_data_generation.py +3 -3
  54. classiq/applications/qsvm/qsvm_model_constructor.py +5 -5
  55. classiq/execution/__init__.py +1 -3
  56. classiq/execution/all_hardware_devices.py +1 -3
  57. classiq/execution/execution_session.py +16 -16
  58. classiq/execution/jobs.py +4 -4
  59. classiq/execution/qaoa.py +3 -3
  60. classiq/execution/qnn.py +3 -3
  61. classiq/executor.py +3 -3
  62. classiq/interface/_version.py +1 -1
  63. classiq/interface/analyzer/analysis_params.py +9 -10
  64. classiq/interface/analyzer/cytoscape_graph.py +5 -5
  65. classiq/interface/analyzer/result.py +17 -17
  66. classiq/interface/applications/qsvm.py +6 -10
  67. classiq/interface/backend/backend_preferences.py +4 -3
  68. classiq/interface/backend/ionq/ionq_quantum_program.py +4 -5
  69. classiq/interface/backend/pydantic_backend.py +1 -2
  70. classiq/interface/chemistry/fermionic_operator.py +5 -5
  71. classiq/interface/chemistry/ground_state_problem.py +7 -8
  72. classiq/interface/chemistry/molecule.py +4 -4
  73. classiq/interface/chemistry/operator.py +11 -13
  74. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +1 -3
  75. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  76. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  77. classiq/interface/combinatorial_optimization/examples/mht.py +2 -3
  78. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  79. classiq/interface/combinatorial_optimization/examples/set_cover.py +1 -2
  80. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +5 -7
  81. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  82. classiq/interface/combinatorial_optimization/result.py +1 -3
  83. classiq/interface/debug_info/debug_info.py +8 -7
  84. classiq/interface/exceptions.py +8 -6
  85. classiq/interface/execution/jobs.py +2 -2
  86. classiq/interface/execution/primitives.py +3 -3
  87. classiq/interface/executor/aws_execution_cost.py +4 -4
  88. classiq/interface/executor/execution_request.py +2 -3
  89. classiq/interface/executor/execution_result.py +3 -3
  90. classiq/interface/executor/iqae_result.py +3 -5
  91. classiq/interface/executor/optimizer_preferences.py +2 -2
  92. classiq/interface/executor/quantum_code.py +6 -6
  93. classiq/interface/executor/register_initialization.py +2 -4
  94. classiq/interface/executor/result.py +23 -27
  95. classiq/interface/executor/vqe_result.py +8 -8
  96. classiq/interface/finance/function_input.py +2 -2
  97. classiq/interface/finance/gaussian_model_input.py +5 -5
  98. classiq/interface/finance/log_normal_model_input.py +2 -2
  99. classiq/interface/finance/model_input.py +1 -2
  100. classiq/interface/generator/adjacency.py +1 -3
  101. classiq/interface/generator/ansatz_library.py +4 -4
  102. classiq/interface/generator/application_apis/finance_declarations.py +1 -1
  103. classiq/interface/generator/arith/argument_utils.py +3 -3
  104. classiq/interface/generator/arith/arithmetic.py +7 -7
  105. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +5 -5
  106. classiq/interface/generator/arith/arithmetic_expression_abc.py +11 -11
  107. classiq/interface/generator/arith/arithmetic_expression_parser.py +8 -7
  108. classiq/interface/generator/arith/arithmetic_expression_validator.py +8 -8
  109. classiq/interface/generator/arith/arithmetic_operations.py +4 -3
  110. classiq/interface/generator/arith/arithmetic_param_getters.py +6 -6
  111. classiq/interface/generator/arith/arithmetic_result_builder.py +9 -9
  112. classiq/interface/generator/arith/ast_node_rewrite.py +2 -1
  113. classiq/interface/generator/arith/binary_ops.py +10 -13
  114. classiq/interface/generator/arith/extremum_operations.py +3 -2
  115. classiq/interface/generator/arith/logical_ops.py +7 -6
  116. classiq/interface/generator/arith/number_utils.py +4 -4
  117. classiq/interface/generator/arith/register_user_input.py +4 -4
  118. classiq/interface/generator/arith/unary_ops.py +2 -1
  119. classiq/interface/generator/builtin_api_builder.py +2 -1
  120. classiq/interface/generator/circuit_code/circuit_code.py +4 -4
  121. classiq/interface/generator/circuit_code/types_and_constants.py +3 -5
  122. classiq/interface/generator/complex_type.py +1 -2
  123. classiq/interface/generator/control_state.py +2 -2
  124. classiq/interface/generator/custom_ansatz.py +1 -3
  125. classiq/interface/generator/distance.py +3 -5
  126. classiq/interface/generator/excitations.py +3 -2
  127. classiq/interface/generator/expressions/enums/finance_functions.py +1 -3
  128. classiq/interface/generator/expressions/evaluated_expression.py +4 -3
  129. classiq/interface/generator/expressions/expression.py +4 -5
  130. classiq/interface/generator/expressions/expression_constants.py +4 -4
  131. classiq/interface/generator/expressions/qmod_qarray_proxy.py +2 -1
  132. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +2 -1
  133. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +2 -1
  134. classiq/interface/generator/expressions/qmod_sized_proxy.py +2 -1
  135. classiq/interface/generator/expressions/qmod_struct_instance.py +2 -1
  136. classiq/interface/generator/expressions/sympy_supported_expressions.py +11 -13
  137. classiq/interface/generator/finance.py +2 -2
  138. classiq/interface/generator/function_param_library.py +6 -6
  139. classiq/interface/generator/function_params.py +13 -19
  140. classiq/interface/generator/functions/builtins/internal_operators.py +9 -1
  141. classiq/interface/generator/functions/classical_function_declaration.py +4 -3
  142. classiq/interface/generator/functions/classical_type.py +13 -13
  143. classiq/interface/generator/functions/concrete_types.py +1 -2
  144. classiq/interface/generator/functions/function_declaration.py +1 -1
  145. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  146. classiq/interface/generator/functions/type_name.py +3 -2
  147. classiq/interface/generator/generated_circuit_data.py +33 -22
  148. classiq/interface/generator/grover_diffuser.py +7 -7
  149. classiq/interface/generator/grover_operator.py +2 -2
  150. classiq/interface/generator/hardware/hardware_data.py +7 -6
  151. classiq/interface/generator/hardware_efficient_ansatz.py +8 -8
  152. classiq/interface/generator/identity.py +5 -6
  153. classiq/interface/generator/linear_pauli_rotations.py +6 -6
  154. classiq/interface/generator/mcu.py +2 -2
  155. classiq/interface/generator/mcx.py +6 -6
  156. classiq/interface/generator/model/__init__.py +1 -3
  157. classiq/interface/generator/model/constraints.py +2 -2
  158. classiq/interface/generator/model/model.py +5 -6
  159. classiq/interface/generator/model/preferences/preferences.py +11 -6
  160. classiq/interface/generator/model/quantum_register.py +6 -11
  161. classiq/interface/generator/oracles/arithmetic_oracle.py +1 -2
  162. classiq/interface/generator/oracles/custom_oracle.py +2 -2
  163. classiq/interface/generator/oracles/oracle_abc.py +6 -5
  164. classiq/interface/generator/partitioned_register.py +6 -5
  165. classiq/interface/generator/piecewise_linear_amplitude_loading.py +8 -7
  166. classiq/interface/generator/qpe.py +4 -4
  167. classiq/interface/generator/qsvm.py +3 -3
  168. classiq/interface/generator/quantum_function_call.py +24 -29
  169. classiq/interface/generator/quantum_program.py +9 -9
  170. classiq/interface/generator/register_role.py +2 -4
  171. classiq/interface/generator/slice_parsing_utils.py +4 -3
  172. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  173. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  174. classiq/interface/generator/state_preparation/distributions.py +6 -5
  175. classiq/interface/generator/state_preparation/metrics.py +2 -4
  176. classiq/interface/generator/state_preparation/state_preparation.py +4 -4
  177. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +3 -3
  178. classiq/interface/generator/transpiler_basis_gates.py +2 -2
  179. classiq/interface/generator/types/compilation_metadata.py +5 -0
  180. classiq/interface/generator/types/enum_declaration.py +2 -3
  181. classiq/interface/generator/types/qstruct_declaration.py +2 -1
  182. classiq/interface/generator/types/struct_declaration.py +3 -2
  183. classiq/interface/generator/ucc.py +2 -1
  184. classiq/interface/generator/unitary_gate.py +2 -2
  185. classiq/interface/generator/user_defined_function_params.py +1 -1
  186. classiq/interface/generator/validations/flow_graph.py +6 -5
  187. classiq/interface/generator/validations/validator_functions.py +3 -2
  188. classiq/interface/generator/visitor.py +9 -14
  189. classiq/interface/hardware.py +5 -6
  190. classiq/interface/helpers/custom_encoders.py +2 -2
  191. classiq/interface/helpers/custom_pydantic_types.py +8 -9
  192. classiq/interface/helpers/hashable_mixin.py +3 -2
  193. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  194. classiq/interface/helpers/pydantic_model_helpers.py +4 -3
  195. classiq/interface/helpers/validation_helpers.py +2 -2
  196. classiq/interface/ide/ide_data.py +11 -15
  197. classiq/interface/ide/visual_model.py +22 -22
  198. classiq/interface/jobs.py +2 -2
  199. classiq/interface/model/bind_operation.py +5 -4
  200. classiq/interface/model/classical_parameter_declaration.py +2 -2
  201. classiq/interface/model/control.py +22 -1
  202. classiq/interface/model/handle_binding.py +3 -2
  203. classiq/interface/model/inplace_binary_operation.py +2 -1
  204. classiq/interface/model/model.py +16 -11
  205. classiq/interface/model/native_function_definition.py +1 -1
  206. classiq/interface/model/port_declaration.py +2 -2
  207. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +3 -2
  208. classiq/interface/model/quantum_expressions/arithmetic_operation.py +4 -27
  209. classiq/interface/model/quantum_expressions/quantum_expression.py +8 -7
  210. classiq/interface/model/quantum_function_call.py +9 -14
  211. classiq/interface/model/quantum_function_declaration.py +10 -12
  212. classiq/interface/model/quantum_lambda_function.py +3 -16
  213. classiq/interface/model/quantum_statement.py +7 -3
  214. classiq/interface/model/quantum_type.py +5 -5
  215. classiq/interface/model/statement_block.py +2 -3
  216. classiq/interface/model/validation_handle.py +5 -4
  217. classiq/interface/server/global_versions.py +3 -3
  218. classiq/model_expansions/atomic_expression_functions_defs.py +3 -2
  219. classiq/model_expansions/capturing/captured_var_manager.py +4 -6
  220. classiq/model_expansions/capturing/propagated_var_stack.py +7 -7
  221. classiq/model_expansions/closure.py +83 -12
  222. classiq/model_expansions/evaluators/arg_type_match.py +3 -2
  223. classiq/model_expansions/evaluators/argument_types.py +3 -3
  224. classiq/model_expansions/evaluators/control.py +3 -3
  225. classiq/model_expansions/evaluators/parameter_types.py +7 -7
  226. classiq/model_expansions/evaluators/quantum_type_utils.py +2 -1
  227. classiq/model_expansions/evaluators/type_type_match.py +1 -1
  228. classiq/model_expansions/expression_evaluator.py +10 -9
  229. classiq/model_expansions/expression_renamer.py +6 -6
  230. classiq/model_expansions/function_builder.py +13 -12
  231. classiq/model_expansions/generative_functions.py +5 -4
  232. classiq/model_expansions/interpreter.py +20 -11
  233. classiq/model_expansions/model_tables.py +14 -14
  234. classiq/model_expansions/quantum_operations/bind.py +2 -4
  235. classiq/model_expansions/quantum_operations/classicalif.py +1 -1
  236. classiq/model_expansions/quantum_operations/control.py +81 -24
  237. classiq/model_expansions/quantum_operations/emitter.py +33 -20
  238. classiq/model_expansions/quantum_operations/expression_operation.py +47 -16
  239. classiq/model_expansions/quantum_operations/inplace_binary_operation.py +160 -35
  240. classiq/model_expansions/quantum_operations/phase.py +6 -6
  241. classiq/model_expansions/quantum_operations/quantum_assignment_operation.py +28 -31
  242. classiq/model_expansions/quantum_operations/quantum_function_call.py +9 -0
  243. classiq/model_expansions/quantum_operations/repeat.py +1 -3
  244. classiq/model_expansions/quantum_operations/within_apply.py +0 -16
  245. classiq/model_expansions/scope.py +11 -10
  246. classiq/model_expansions/scope_initialization.py +5 -5
  247. classiq/model_expansions/sympy_conversion/expression_to_sympy.py +6 -6
  248. classiq/model_expansions/sympy_conversion/sympy_to_python.py +2 -2
  249. classiq/model_expansions/visitors/variable_references.py +5 -4
  250. classiq/qmod/builtins/classical_execution_primitives.py +9 -9
  251. classiq/qmod/builtins/functions/__init__.py +72 -55
  252. classiq/qmod/builtins/functions/amplitude_estimation.py +4 -1
  253. classiq/qmod/builtins/functions/arithmetic.py +14 -1
  254. classiq/qmod/builtins/functions/discrete_sine_cosine_transform.py +86 -6
  255. classiq/qmod/builtins/functions/grover.py +41 -45
  256. classiq/qmod/builtins/functions/hea.py +60 -4
  257. classiq/qmod/builtins/functions/linear_pauli_rotation.py +26 -4
  258. classiq/qmod/builtins/functions/modular_exponentiation.py +90 -29
  259. classiq/qmod/builtins/functions/operators.py +1 -1
  260. classiq/qmod/builtins/functions/qaoa_penalty.py +14 -5
  261. classiq/qmod/builtins/functions/qft_functions.py +57 -0
  262. classiq/qmod/builtins/functions/qpe.py +20 -4
  263. classiq/qmod/builtins/functions/qsvt.py +49 -4
  264. classiq/qmod/builtins/functions/standard_gates.py +4 -4
  265. classiq/qmod/builtins/functions/state_preparation.py +92 -10
  266. classiq/qmod/builtins/functions/swap_test.py +7 -1
  267. classiq/qmod/builtins/functions/utility_functions.py +43 -0
  268. classiq/qmod/builtins/functions/variational.py +18 -2
  269. classiq/qmod/builtins/operations.py +117 -22
  270. classiq/qmod/cfunc.py +2 -2
  271. classiq/qmod/classical_function.py +3 -7
  272. classiq/qmod/create_model_function.py +16 -17
  273. classiq/qmod/declaration_inferrer.py +7 -10
  274. classiq/qmod/expression_query.py +3 -3
  275. classiq/qmod/generative.py +2 -1
  276. classiq/qmod/model_state_container.py +10 -8
  277. classiq/qmod/native/__init__.py +1 -3
  278. classiq/qmod/native/expression_to_qmod.py +9 -8
  279. classiq/qmod/native/pretty_printer.py +12 -6
  280. classiq/qmod/pretty_print/__init__.py +1 -3
  281. classiq/qmod/pretty_print/expression_to_python.py +13 -12
  282. classiq/qmod/pretty_print/pretty_printer.py +38 -23
  283. classiq/qmod/python_classical_type.py +8 -4
  284. classiq/qmod/qfunc.py +4 -4
  285. classiq/qmod/qmod_variable.py +11 -10
  286. classiq/qmod/quantum_expandable.py +12 -15
  287. classiq/qmod/quantum_function.py +35 -22
  288. classiq/qmod/semantics/annotation.py +1 -1
  289. classiq/qmod/semantics/error_manager.py +8 -7
  290. classiq/qmod/semantics/static_semantics_visitor.py +19 -24
  291. classiq/qmod/semantics/validation/constants_validation.py +1 -1
  292. classiq/qmod/semantics/validation/func_call_validation.py +2 -2
  293. classiq/qmod/semantics/validation/main_validation.py +33 -0
  294. classiq/qmod/semantics/validation/types_validation.py +2 -1
  295. classiq/qmod/symbolic.py +5 -8
  296. classiq/qmod/symbolic_type.py +2 -2
  297. classiq/qmod/synthesize_separately.py +1 -2
  298. {classiq-0.53.0.dist-info → classiq-0.55.0.dist-info}/METADATA +1 -1
  299. {classiq-0.53.0.dist-info → classiq-0.55.0.dist-info}/RECORD +300 -297
  300. classiq/qmod/builtins/functions/qft.py +0 -23
  301. {classiq-0.53.0.dist-info → classiq-0.55.0.dist-info}/WHEEL +0 -0
@@ -1,15 +1,85 @@
1
+ from classiq.qmod.builtins.functions.arithmetic import modular_increment
2
+ from classiq.qmod.builtins.functions.qft_functions import qft
3
+ from classiq.qmod.builtins.functions.standard_gates import PHASE, H, S, X, Z
4
+ from classiq.qmod.builtins.functions.state_preparation import allocate
5
+ from classiq.qmod.builtins.functions.utility_functions import apply_to_all
6
+ from classiq.qmod.builtins.operations import bind, control, invert, repeat, within_apply
1
7
  from classiq.qmod.qfunc import qfunc
2
8
  from classiq.qmod.qmod_variable import QArray, QBit, QNum
9
+ from classiq.qmod.symbolic import pi
10
+
11
+
12
+ def _b_operator(q: QBit) -> None:
13
+ S(q)
14
+ H(q)
3
15
 
4
16
 
5
17
  @qfunc(external=True)
6
18
  def _qct_d_operator(x: QNum, q: QBit) -> None:
7
- pass
19
+ _b_operator(q)
20
+ control(x == 0, lambda: invert(lambda: _b_operator(q)))
8
21
 
9
22
 
10
23
  @qfunc(external=True)
11
24
  def _qct_pi_operator(x: QArray[QBit], q: QBit) -> None:
12
- pass
25
+ control(q == 1, lambda: apply_to_all(X, x))
26
+ control(q == 1, lambda: modular_increment(1, x))
27
+
28
+
29
+ def _t_operator(x: QArray) -> None:
30
+ _qct_d_operator(x[0 : x.len - 1], x[x.len - 1])
31
+ _qct_pi_operator(x[0 : x.len - 1], x[x.len - 1])
32
+
33
+
34
+ def _vn_operator(x: QArray[QBit], q: QBit) -> None:
35
+ H(q)
36
+ control(q == 1, lambda: apply_to_all(X, x))
37
+
38
+
39
+ def _d1_operator(x: QArray[QBit], q: QBit) -> None:
40
+ omega_exp = 2 * pi / (4 * 2**x.len)
41
+
42
+ # Li
43
+ control(q == 0, lambda: repeat(x.len, lambda k: PHASE(omega_exp * (2**k), x[k])))
44
+ # Ki
45
+ control(
46
+ q == 1,
47
+ lambda: repeat(
48
+ x.len,
49
+ lambda k: within_apply(
50
+ lambda: X(x[k]), lambda: PHASE(-omega_exp * (2**k), x[k])
51
+ ),
52
+ ),
53
+ )
54
+ PHASE(-omega_exp, q)
55
+
56
+
57
+ def _pi2_operator(x: QArray[QBit], q: QBit) -> None:
58
+ control(q == 1, lambda: modular_increment(1, x))
59
+
60
+
61
+ def _j_operator(q: QBit) -> None:
62
+ within_apply(lambda: Z(q), lambda: (S(q), H(q), S(q))) # type:ignore[arg-type]
63
+
64
+
65
+ def _b_t_operator(q: QBit) -> None:
66
+ H(q)
67
+ S(q)
68
+
69
+
70
+ def _d0dt_operator(x: QArray, q: QBit) -> None:
71
+ x_num: QNum = QNum("x_num", x.len, False, 0)
72
+ bind(x, x_num)
73
+ _b_t_operator(q)
74
+ control(x_num == 0, lambda: _j_operator(q))
75
+ bind(x_num, x)
76
+
77
+
78
+ def _un_dag_operator(x: QArray[QBit], q: QBit) -> None:
79
+ _d1_operator(x, q)
80
+ invert(lambda: _qct_pi_operator(x, q))
81
+ _d0dt_operator(x, q)
82
+ invert(lambda: _pi2_operator(x, q))
13
83
 
14
84
 
15
85
  @qfunc(external=True)
@@ -39,7 +109,7 @@ def qct_qst_type1(x: QArray[QBit]) -> None:
39
109
  Links:
40
110
  - [Quantum Sine and Cosine Transforms](https://docs.classiq.io/latest/reference-manual/qmod/library-reference/open-library-functions/qct_qst/qct_qst/)
41
111
  """
42
- pass
112
+ within_apply(lambda: _t_operator(x), lambda: qft(x))
43
113
 
44
114
 
45
115
  @qfunc(external=True)
@@ -68,7 +138,12 @@ def qct_qst_type2(x: QArray[QBit], q: QBit) -> None:
68
138
  Links:
69
139
  - [Quantum Sine and Cosine Transforms](https://docs.classiq.io/latest/reference-manual/qmod/library-reference/open-library-functions/qct_qst/qct_qst/)
70
140
  """
71
- pass
141
+ extended_state: QArray = QArray("extended_state")
142
+ _vn_operator(x, q)
143
+ bind([x, q], extended_state)
144
+ qft(extended_state)
145
+ bind(extended_state, [x, q])
146
+ _un_dag_operator(x, q)
72
147
 
73
148
 
74
149
  @qfunc(external=True)
@@ -85,7 +160,8 @@ def qct_type2(x: QArray[QBit]) -> None:
85
160
  Links:
86
161
  - [Quantum Sine and Cosine Transforms](https://docs.classiq.io/latest/reference-manual/qmod/library-reference/open-library-functions/qct_qst/qct_qst/)
87
162
  """
88
- pass
163
+ q = QBit("q")
164
+ within_apply(lambda: allocate(1, q), lambda: qct_qst_type2(x, q))
89
165
 
90
166
 
91
167
  @qfunc(external=True)
@@ -102,4 +178,8 @@ def qst_type2(x: QArray[QBit]) -> None:
102
178
  Links:
103
179
  - [Quantum Sine and Cosine Transforms](https://docs.classiq.io/latest/reference-manual/qmod/library-reference/open-library-functions/qct_qst/qct_qst/)
104
180
  """
105
- pass
181
+ q = QBit("q")
182
+ within_apply(
183
+ lambda: (allocate(1, q), X(q)), # type:ignore[arg-type]
184
+ lambda: qct_qst_type2(x, q),
185
+ )
@@ -1,9 +1,18 @@
1
- from typing_extensions import Annotated
2
-
1
+ from classiq.qmod.builtins.functions.standard_gates import H, U, X
2
+ from classiq.qmod.builtins.functions.state_preparation import allocate
3
+ from classiq.qmod.builtins.functions.utility_functions import hadamard_transform
4
+ from classiq.qmod.builtins.operations import (
5
+ bind,
6
+ control,
7
+ invert,
8
+ power,
9
+ within_apply,
10
+ )
3
11
  from classiq.qmod.qfunc import qfunc
4
12
  from classiq.qmod.qmod_parameter import CInt
5
- from classiq.qmod.qmod_variable import QArray, QBit
13
+ from classiq.qmod.qmod_variable import QArray, QBit, QNum
6
14
  from classiq.qmod.quantum_callable import QCallable
15
+ from classiq.qmod.symbolic import pi
7
16
 
8
17
 
9
18
  @qfunc(external=True)
@@ -36,7 +45,11 @@ def phase_oracle(
36
45
 
37
46
  [Hidden shift](https://docs.classiq.io/latest/explore/algorithms/algebraic/hidden_shift/hidden_shift/)
38
47
  """
39
- pass
48
+ aux = QBit("aux")
49
+ within_apply(
50
+ within=lambda: (allocate(1, aux), X(aux), H(aux)), # type:ignore[arg-type]
51
+ apply=lambda: predicate(target, aux),
52
+ )
40
53
 
41
54
 
42
55
  @qfunc(external=True)
@@ -56,7 +69,14 @@ def reflect_about_zero(packed_vars: QArray[QBit]) -> None:
56
69
  Args:
57
70
  packed_vars: The quantum state to reflect.
58
71
  """
59
- pass
72
+ msbs: QNum = QNum("msbs", packed_vars.len - 1, False, 0)
73
+ lsb = QBit("lsb")
74
+ bind(packed_vars, [msbs, lsb])
75
+ within_apply(
76
+ lambda: (X(lsb), H(lsb)), # type:ignore[arg-type]
77
+ lambda: control(msbs == 0, lambda: X(lsb)),
78
+ )
79
+ bind([msbs, lsb], packed_vars)
60
80
 
61
81
 
62
82
  @qfunc(external=True)
@@ -81,7 +101,10 @@ def grover_diffuser(
81
101
  space_transform: The operator which encodes the axis of reflection.
82
102
  packed_vars: The state to which to apply the diffuser.
83
103
  """
84
- pass
104
+ within_apply(
105
+ lambda: invert(lambda: space_transform(packed_vars)),
106
+ lambda: reflect_about_zero(packed_vars),
107
+ )
85
108
 
86
109
 
87
110
  @qfunc(external=True)
@@ -115,7 +138,9 @@ def grover_operator(
115
138
  - [Wikipedia page](https://en.wikipedia.org/wiki/Grover%27s_algorithm).
116
139
 
117
140
  """
118
- pass
141
+ oracle(packed_vars)
142
+ grover_diffuser(lambda qba: space_transform(qba), packed_vars)
143
+ U(0, 0, 0, pi, packed_vars[0])
119
144
 
120
145
 
121
146
  @qfunc(external=True)
@@ -138,41 +163,12 @@ def grover_search(
138
163
  [Grover Algorithm](https://docs.classiq.io/latest/explore/functions/qmod_library_reference/classiq_open_library/grover_operator/grover_operator/)
139
164
 
140
165
  """
141
- pass
142
-
143
-
144
- @qfunc(external=True)
145
- def hadamard_transform(target: QArray[QBit]) -> None:
146
- """
147
- [Qmod Classiq-library function]
148
-
149
- Applies Hadamard transform to the target qubits.
150
-
151
- Corresponds to the braket notation:
152
-
153
- $$
154
- H^{\\otimes n} |x\rangle = \frac{1}{\\sqrt{2^n}} \\sum_{y=0}^{2^n - 1} (-1)^{x \\cdot y} |y\rangle
155
- $$
156
-
157
- Args:
158
- target: qubits to apply to Hadamard transform to.
159
-
160
- """
161
- pass
162
-
163
-
164
- @qfunc(external=True)
165
- def apply_to_all(
166
- gate_operand: QCallable[Annotated[QBit, "target"]], target: QArray[QBit]
167
- ) -> None:
168
- """
169
- [Qmod Classiq-library function]
170
-
171
- Applies the single-qubit operand `gate_operand` to each qubit in the qubit
172
- array `target`.
173
-
174
- Args:
175
- gate_operand: The single-qubit gate to apply to each qubit in the array.
176
- target: The qubit array to apply the gate to.
177
- """
178
- pass
166
+ hadamard_transform(packed_vars)
167
+ power(
168
+ reps,
169
+ lambda: grover_operator(
170
+ lambda qba: oracle(qba),
171
+ lambda qba: hadamard_transform(qba),
172
+ packed_vars,
173
+ ),
174
+ )
@@ -1,11 +1,11 @@
1
- from typing import Literal
2
-
3
- from typing_extensions import Annotated
1
+ from typing import Annotated, Literal
4
2
 
3
+ from classiq.qmod.builtins.operations import if_, repeat
5
4
  from classiq.qmod.qfunc import qfunc
6
5
  from classiq.qmod.qmod_parameter import CArray, CInt, CReal
7
6
  from classiq.qmod.qmod_variable import QArray, QBit
8
7
  from classiq.qmod.quantum_callable import QCallableList
8
+ from classiq.qmod.symbolic import floor, sum
9
9
 
10
10
 
11
11
  @qfunc(external=True)
@@ -56,4 +56,60 @@ def full_hea(
56
56
  operands_2qubit: A list of operations on two qubits
57
57
  x: The quantum object to be transformed by the ansatz
58
58
  """
59
- pass
59
+ repeat(
60
+ reps,
61
+ lambda r: [ # type:ignore[arg-type]
62
+ repeat( # type:ignore[func-returns-value]
63
+ operands_1qubit.len,
64
+ lambda i1: repeat(
65
+ num_qubits,
66
+ lambda index: if_(
67
+ condition=is_parametrized[i1] == 1,
68
+ then=lambda: operands_1qubit[i1](
69
+ angle_params[
70
+ sum(is_parametrized[0:i1]) # type:ignore[index]
71
+ + floor((angle_params.len / reps) * r)
72
+ + index
73
+ ],
74
+ x[index],
75
+ ),
76
+ else_=lambda: operands_1qubit[i1](0, x[index]),
77
+ ),
78
+ ),
79
+ ),
80
+ repeat( # type:ignore[func-returns-value]
81
+ operands_2qubit.len,
82
+ lambda i2: repeat(
83
+ connectivity_map.len,
84
+ lambda index: if_(
85
+ condition=is_parametrized[operands_1qubit.len + i2] == 1,
86
+ then=lambda: operands_2qubit[i2](
87
+ angle_params[
88
+ num_qubits
89
+ * sum(
90
+ is_parametrized[
91
+ 0 : operands_1qubit.len
92
+ ] # type:ignore[index]
93
+ )
94
+ + connectivity_map.len
95
+ * sum(
96
+ is_parametrized[
97
+ operands_1qubit.len : operands_1qubit.len + i2
98
+ ]
99
+ )
100
+ + floor((angle_params.len / reps) * r)
101
+ + index
102
+ ],
103
+ x[connectivity_map[index][0]],
104
+ x[connectivity_map[index][1]],
105
+ ),
106
+ else_=lambda: operands_2qubit[i2](
107
+ 0,
108
+ x[connectivity_map[index][0]],
109
+ x[connectivity_map[index][1]],
110
+ ),
111
+ ),
112
+ ),
113
+ ),
114
+ ],
115
+ )
@@ -1,6 +1,9 @@
1
- from typing_extensions import Annotated
1
+ from typing import Annotated
2
2
 
3
3
  from classiq.qmod.builtins.enums import Pauli
4
+ from classiq.qmod.builtins.functions.operators import switch
5
+ from classiq.qmod.builtins.functions.standard_gates import IDENTITY, RX, RY, RZ
6
+ from classiq.qmod.builtins.operations import control, repeat
4
7
  from classiq.qmod.qfunc import qfunc
5
8
  from classiq.qmod.qmod_parameter import CArray, CReal
6
9
  from classiq.qmod.qmod_variable import QArray, QBit
@@ -15,7 +18,10 @@ def _single_pauli(
15
18
  x: QArray[QBit],
16
19
  q: QBit,
17
20
  ) -> None:
18
- pass
21
+ repeat(
22
+ x.len, lambda index: control(x[index], lambda: q1_qfunc(2**index * slope, q))
23
+ )
24
+ q1_qfunc(offset, q)
19
25
 
20
26
 
21
27
  @qfunc(external=True)
@@ -61,5 +67,21 @@ def linear_pauli_rotations(
61
67
  Links:
62
68
  [linear_pauli_rotations](https://docs.classiq.io/latest/explore/functions/qmod_library_reference/classiq_open_library/linear_pauli_rotations/linear_pauli_rotations)
63
69
  """
64
-
65
- pass
70
+ repeat(
71
+ q.len,
72
+ lambda index: _single_pauli(
73
+ slope=slopes[index],
74
+ offset=offsets[index],
75
+ q1_qfunc=lambda theta, target: switch(
76
+ bases[index],
77
+ [
78
+ lambda: IDENTITY(target),
79
+ lambda: RX(theta, target),
80
+ lambda: RY(theta, target),
81
+ lambda: RZ(theta, target),
82
+ ],
83
+ ),
84
+ x=x,
85
+ q=q[index],
86
+ ),
87
+ )
@@ -1,30 +1,26 @@
1
+ from classiq.qmod.builtins.classical_functions import qft_const_adder_phase
2
+ from classiq.qmod.builtins.functions.qft_functions import qft, qft_no_swap
3
+ from classiq.qmod.builtins.functions.standard_gates import PHASE, SWAP, X
4
+ from classiq.qmod.builtins.functions.state_preparation import allocate
5
+ from classiq.qmod.builtins.operations import bind, control, invert, repeat, within_apply
6
+ from classiq.qmod.cparam import CInt
1
7
  from classiq.qmod.qfunc import qfunc
2
- from classiq.qmod.qmod_parameter import CInt
3
8
  from classiq.qmod.qmod_variable import QArray, QBit, QNum
4
-
5
-
6
- @qfunc(external=True)
7
- def qft_no_swap(qbv: QArray[QBit]) -> None:
8
- """
9
- [Qmod Classiq-library function]
10
-
11
- Applies the Quantum Fourier Transform (QFT) without the swap gates.
12
-
13
- Args:
14
- qbv: The quantum number to which the QFT is applied.
15
-
16
- """
17
- pass
9
+ from classiq.qmod.symbolic import min, mod_inverse
18
10
 
19
11
 
20
12
  @qfunc(external=True)
21
13
  def _check_msb(ref: CInt, x: QArray[QBit], aux: QBit) -> None:
22
- pass
14
+ within_apply(
15
+ lambda: invert(lambda: qft_no_swap(x)), lambda: _ctrl_x(ref, x[0], aux)
16
+ )
23
17
 
24
18
 
25
19
  @qfunc(external=True)
26
- def _ctrl_x(ref: CInt, ctrl: QNum, aux: QBit) -> None:
27
- pass
20
+ def _ctrl_x(
21
+ ref: CInt, ctrl: QNum, aux: QBit
22
+ ) -> None: # TODO: remove qfunc when expressions of QBit is supported
23
+ control(ctrl == ref, lambda: X(aux))
28
24
 
29
25
 
30
26
  @qfunc(external=True)
@@ -43,7 +39,15 @@ def qft_space_add_const(value: CInt, phi_b: QArray[QBit]) -> None:
43
39
  phi_b: The quantum number (at the aft space) to which the constant is added.
44
40
 
45
41
  """
46
- pass
42
+ repeat(
43
+ count=phi_b.len,
44
+ iteration=lambda index: PHASE(
45
+ theta=qft_const_adder_phase(
46
+ index, value, phi_b.len # type:ignore[arg-type]
47
+ ),
48
+ target=phi_b[index],
49
+ ),
50
+ )
47
51
 
48
52
 
49
53
  @qfunc(external=True)
@@ -62,7 +66,33 @@ def cc_modular_add(n: CInt, a: CInt, phi_b: QArray[QBit], c1: QBit, c2: QBit) ->
62
66
  c2: a control qubit.
63
67
 
64
68
  """
65
- pass
69
+ ctrl: QArray[QBit] = QArray("ctrl")
70
+ aux = QBit("aux")
71
+
72
+ within_apply(
73
+ lambda: ( # type:ignore[arg-type]
74
+ allocate(1, aux),
75
+ bind([c1, c2], ctrl), # type:ignore[func-returns-value]
76
+ ),
77
+ lambda: ( # type:ignore[arg-type]
78
+ control( # type:ignore[func-returns-value]
79
+ ctrl, lambda: qft_space_add_const(a, phi_b)
80
+ ),
81
+ invert( # type:ignore[func-returns-value]
82
+ lambda: qft_space_add_const(n, phi_b)
83
+ ),
84
+ _check_msb(1, phi_b, aux),
85
+ control( # type:ignore[func-returns-value]
86
+ aux, lambda: qft_space_add_const(n, phi_b)
87
+ ),
88
+ within_apply(
89
+ lambda: invert( # type:ignore[func-returns-value]
90
+ lambda: control(ctrl, lambda: qft_space_add_const(a, phi_b))
91
+ ),
92
+ lambda: _check_msb(0, phi_b, aux),
93
+ ),
94
+ ),
95
+ )
66
96
 
67
97
 
68
98
  @qfunc(external=True)
@@ -82,7 +112,15 @@ def c_modular_multiply(
82
112
  x: The quantum factor.
83
113
  ctrl: The control bit.
84
114
  """
85
- pass
115
+ within_apply(
116
+ lambda: qft(b),
117
+ lambda: repeat(
118
+ count=x.len,
119
+ iteration=lambda index: cc_modular_add(
120
+ n, (a * (2**index)) % n, b, x[index], ctrl
121
+ ),
122
+ ),
123
+ )
86
124
 
87
125
 
88
126
  @qfunc(external=True)
@@ -98,7 +136,10 @@ def multiswap(x: QArray[QBit], y: QArray[QBit]) -> None:
98
136
  y: The second array
99
137
 
100
138
  """
101
- pass
139
+ repeat(
140
+ count=min(x.len, y.len),
141
+ iteration=lambda index: SWAP(x[index], y[index]),
142
+ )
102
143
 
103
144
 
104
145
  @qfunc(external=True)
@@ -115,7 +156,20 @@ def inplace_c_modular_multiply(n: CInt, a: CInt, x: QArray[QBit], ctrl: QBit) ->
115
156
  x: The quantum factor.
116
157
  ctrl: The control bit.
117
158
  """
118
- pass
159
+ b: QArray[QBit] = QArray("b")
160
+
161
+ within_apply(
162
+ lambda: allocate(x.len + 1, b),
163
+ lambda: ( # type:ignore[arg-type]
164
+ c_modular_multiply(n, a, b, x, ctrl),
165
+ control( # type:ignore[func-returns-value]
166
+ ctrl, lambda: multiswap(x, b)
167
+ ),
168
+ invert( # type:ignore[func-returns-value]
169
+ lambda: c_modular_multiply(n, mod_inverse(a, n), b, x, ctrl)
170
+ ),
171
+ ),
172
+ )
119
173
 
120
174
 
121
175
  @qfunc(external=True)
@@ -123,15 +177,22 @@ def modular_exp(n: CInt, a: CInt, x: QArray[QBit], power: QArray[QBit]) -> None:
123
177
  """
124
178
  [Qmod Classiq-library function]
125
179
 
126
- Raises a classical integer `a` to the power of a quantum number `x` modulo classical integer `n`
127
- times a quantum number `power`. Performs $power=(a^x \\mod n)*power$ in-place.
128
- (and specifically if at the input $power=1$, at the output $power=a^x \\mod n$).
180
+ Raises a classical integer `a` to the power of a quantum number `power` modulo classical integer `n`
181
+ times a quantum number `x`. Performs $x=(a^{power} \\mod n)*x$ in-place.
182
+ (and specifically if at the input $x=1$, at the output $x=a^{power} \\mod n$).
129
183
 
130
184
  Args:
131
185
  n: The modulus number. Should be non-negative.
132
186
  a: The base of the exponentiation. Should be non-negative.
133
- x: The power of the exponentiation.
134
- power: A quantum number which multiplies the modular exponentiation and holds the output.
187
+ x: A quantum number that multiplies the modular exponentiation and holds the output. It should be at least the size of $\\lceil \\log(n) \rceil$.
188
+ power: The power of the exponentiation.
135
189
 
190
+ Usage Example:
191
+ [Modular Exponentiation](https://docs.classiq.io/latest/explore/functions/function_usage_examples/arithmetic/modular_exp/modular_exp_example)
136
192
  """
137
- pass
193
+ repeat(
194
+ count=power.len,
195
+ iteration=lambda index: inplace_c_modular_multiply(
196
+ n, (a ** (2**index)) % n, x, power[index]
197
+ ),
198
+ )
@@ -19,4 +19,4 @@ def apply(
19
19
 
20
20
  @qfunc(external=True)
21
21
  def switch(selector: CInt, cases: QCallableList) -> None:
22
- pass
22
+ cases[selector]()
@@ -1,5 +1,7 @@
1
1
  from typing import Literal
2
2
 
3
+ from classiq.qmod.builtins.functions import RX, H, suzuki_trotter
4
+ from classiq.qmod.builtins.operations import repeat
3
5
  from classiq.qmod.builtins.structs import PauliTerm
4
6
  from classiq.qmod.qfunc import qfunc
5
7
  from classiq.qmod.qmod_parameter import CArray, CInt, CReal
@@ -22,7 +24,7 @@ def qaoa_mixer_layer(b: CReal, target: QArray[QBit]) -> None:
22
24
  b: The rotation parameter for the mixer layer.
23
25
  target: The target quantum array.
24
26
  """
25
- pass
27
+ repeat(target.len, lambda index: RX(b, target[index]))
26
28
 
27
29
 
28
30
  @qfunc(external=True)
@@ -44,7 +46,7 @@ def qaoa_cost_layer(
44
46
  hamiltonian: The Hamiltonian terms for the QAOA model.
45
47
  target: The target quantum array variable.
46
48
  """
47
- pass
49
+ suzuki_trotter(hamiltonian, g, 1, 1, target)
48
50
 
49
51
 
50
52
  @qfunc(external=True)
@@ -68,7 +70,8 @@ def qaoa_layer(
68
70
  target: The target quantum array variable.
69
71
 
70
72
  """
71
- pass
73
+ qaoa_cost_layer(g, hamiltonian, target)
74
+ qaoa_mixer_layer(b, target)
72
75
 
73
76
 
74
77
  @qfunc(external=True)
@@ -85,7 +88,7 @@ def qaoa_init(target: QArray[QBit]) -> None:
85
88
  Args:
86
89
  target: The target quantum array variable.
87
90
  """
88
- pass
91
+ repeat(target.len, lambda index: H(target[index]))
89
92
 
90
93
 
91
94
  @qfunc(external=True)
@@ -113,4 +116,10 @@ def qaoa_penalty(
113
116
  hamiltonian: The Hamiltonian terms for the QAOA model.
114
117
  target: The target quantum array variable.
115
118
  """
116
- pass
119
+ qaoa_init(target)
120
+ repeat(
121
+ params_list.len / 2, # type:ignore[arg-type]
122
+ lambda index: qaoa_layer(
123
+ params_list[2 * index], params_list[(2 * index) + 1], hamiltonian, target
124
+ ),
125
+ )
@@ -0,0 +1,57 @@
1
+ from classiq.qmod.builtins.functions.standard_gates import CPHASE, SWAP, H
2
+ from classiq.qmod.builtins.operations import repeat
3
+ from classiq.qmod.qfunc import qfunc
4
+ from classiq.qmod.qmod_variable import QArray, QBit
5
+ from classiq.qmod.symbolic import pi
6
+
7
+
8
+ @qfunc(external=True)
9
+ def qft_no_swap(qbv: QArray[QBit]) -> None:
10
+ """
11
+ [Qmod Classiq-library function]
12
+
13
+ Applies the Quantum Fourier Transform (QFT) without the swap gates.
14
+
15
+ Args:
16
+ qbv: The quantum number to which the QFT is applied.
17
+
18
+ """
19
+ repeat(
20
+ qbv.len,
21
+ lambda i: ( # type:ignore[arg-type]
22
+ H(qbv[i]),
23
+ repeat( # type:ignore[func-returns-value]
24
+ qbv.len - i - 1,
25
+ lambda j: CPHASE(
26
+ theta=pi / (2 ** (j + 1)),
27
+ ctrl=qbv[i + j + 1],
28
+ target=qbv[i],
29
+ ),
30
+ ),
31
+ ),
32
+ )
33
+
34
+
35
+ @qfunc(external=True)
36
+ def qft(target: QArray[QBit]) -> None:
37
+ """
38
+ [Qmod Classiq-library function]
39
+
40
+ Performs the Quantum Fourier Transform (QFT) on `target` in-place.
41
+ Implements the following transformation:
42
+
43
+ $$
44
+ y_{k} = \\frac{1}{\\sqrt{N}} \\sum_{j=0}^{N-1} x_j e^{2\\pi i \\frac{jk}{N}}
45
+ $$
46
+
47
+ Args:
48
+ target: The quantum object to be transformed
49
+
50
+ Further reading in Classiq Library:
51
+ Link: [qft library reference](https://github.com/Classiq/classiq-library/blob/main/functions/qmod_library_reference/classiq_open_library/qft/qft.ipynb)
52
+ """
53
+ repeat(
54
+ target.len / 2, # type:ignore[arg-type]
55
+ lambda index: SWAP(target[index], target[(target.len - 1) - index]),
56
+ )
57
+ qft_no_swap(target)