classiq 0.92.0__py3-none-any.whl → 0.99.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 (318) hide show
  1. classiq/__init__.py +11 -19
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +7 -7
  3. classiq/_analyzer_extras/interactive_hardware.py +19 -12
  4. classiq/_internals/api_wrapper.py +31 -142
  5. classiq/_internals/async_utils.py +4 -7
  6. classiq/_internals/authentication/auth0.py +41 -15
  7. classiq/_internals/authentication/authorization_code.py +9 -0
  8. classiq/_internals/authentication/authorization_flow.py +41 -0
  9. classiq/_internals/authentication/device.py +33 -52
  10. classiq/_internals/authentication/hybrid_flow.py +19 -0
  11. classiq/_internals/authentication/password_manager.py +13 -13
  12. classiq/_internals/authentication/token_manager.py +9 -9
  13. classiq/_internals/client.py +17 -44
  14. classiq/_internals/config.py +19 -5
  15. classiq/_internals/help.py +1 -2
  16. classiq/_internals/host_checker.py +3 -3
  17. classiq/_internals/jobs.py +14 -14
  18. classiq/_internals/type_validation.py +3 -3
  19. classiq/analyzer/analyzer.py +18 -18
  20. classiq/analyzer/rb.py +17 -8
  21. classiq/analyzer/show_interactive_hack.py +1 -1
  22. classiq/applications/__init__.py +2 -2
  23. classiq/applications/chemistry/__init__.py +0 -30
  24. classiq/applications/chemistry/op_utils.py +4 -4
  25. classiq/applications/chemistry/problems.py +3 -3
  26. classiq/applications/chemistry/ucc.py +1 -2
  27. classiq/applications/chemistry/z2_symmetries.py +4 -4
  28. classiq/applications/combinatorial_helpers/allowed_constraints.py +1 -3
  29. classiq/applications/combinatorial_helpers/arithmetic/arithmetic_expression.py +2 -1
  30. classiq/applications/combinatorial_helpers/combinatorial_problem_utils.py +2 -2
  31. classiq/applications/combinatorial_helpers/encoding_mapping.py +2 -3
  32. classiq/applications/combinatorial_helpers/encoding_utils.py +2 -2
  33. classiq/applications/combinatorial_helpers/optimization_model.py +3 -4
  34. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +2 -2
  35. classiq/applications/combinatorial_helpers/pyomo_utils.py +8 -8
  36. classiq/applications/combinatorial_helpers/sympy_utils.py +1 -3
  37. classiq/applications/combinatorial_helpers/transformations/encoding.py +3 -3
  38. classiq/applications/combinatorial_helpers/transformations/fixed_variables.py +1 -2
  39. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -3
  40. classiq/applications/combinatorial_optimization/combinatorial_optimization_model_constructor.py +4 -6
  41. classiq/applications/combinatorial_optimization/combinatorial_problem.py +15 -10
  42. classiq/applications/hamiltonian/pauli_decomposition.py +6 -4
  43. classiq/applications/iqae/iqae.py +14 -11
  44. classiq/applications/qnn/datasets/dataset_base_classes.py +6 -6
  45. classiq/applications/qnn/datasets/dataset_parity.py +6 -6
  46. classiq/applications/qnn/gradients/simple_quantum_gradient.py +1 -1
  47. classiq/applications/qnn/qlayer.py +9 -8
  48. classiq/applications/qnn/torch_utils.py +5 -6
  49. classiq/applications/qnn/types.py +2 -1
  50. classiq/applications/qsp/__init__.py +20 -2
  51. classiq/applications/qsp/qsp.py +239 -11
  52. classiq/applications/qsvm/qsvm_data_generation.py +1 -2
  53. classiq/evaluators/classical_expression.py +0 -4
  54. classiq/evaluators/parameter_types.py +20 -12
  55. classiq/evaluators/qmod_annotated_expression.py +31 -26
  56. classiq/evaluators/qmod_expression_visitors/qmod_expression_evaluator.py +14 -14
  57. classiq/evaluators/qmod_expression_visitors/qmod_expression_simplifier.py +2 -1
  58. classiq/evaluators/qmod_expression_visitors/sympy_wrappers.py +8 -8
  59. classiq/evaluators/qmod_node_evaluators/binary_op_evaluation.py +4 -4
  60. classiq/evaluators/qmod_node_evaluators/classical_function_evaluation.py +14 -4
  61. classiq/evaluators/qmod_node_evaluators/list_evaluation.py +2 -2
  62. classiq/evaluators/qmod_node_evaluators/numeric_attrs_utils.py +3 -3
  63. classiq/evaluators/qmod_node_evaluators/subscript_evaluation.py +9 -9
  64. classiq/evaluators/qmod_node_evaluators/utils.py +6 -6
  65. classiq/evaluators/qmod_type_inference/classical_type_inference.py +9 -10
  66. classiq/evaluators/qmod_type_inference/quantum_type_inference.py +5 -5
  67. classiq/execution/__init__.py +0 -3
  68. classiq/execution/execution_session.py +28 -21
  69. classiq/execution/jobs.py +26 -26
  70. classiq/execution/qnn.py +1 -2
  71. classiq/execution/user_budgets.py +71 -37
  72. classiq/executor.py +1 -3
  73. classiq/interface/_version.py +1 -1
  74. classiq/interface/analyzer/analysis_params.py +4 -4
  75. classiq/interface/analyzer/cytoscape_graph.py +3 -3
  76. classiq/interface/analyzer/result.py +4 -4
  77. classiq/interface/ast_node.py +3 -3
  78. classiq/interface/backend/backend_preferences.py +26 -50
  79. classiq/interface/backend/ionq/ionq_quantum_program.py +5 -5
  80. classiq/interface/backend/provider_config/__init__.py +0 -0
  81. classiq/interface/backend/provider_config/provider_config.py +8 -0
  82. classiq/interface/backend/provider_config/providers/__init__.py +0 -0
  83. classiq/interface/backend/provider_config/providers/alice_bob.py +47 -0
  84. classiq/interface/backend/provider_config/providers/aqt.py +16 -0
  85. classiq/interface/backend/provider_config/providers/azure.py +37 -0
  86. classiq/interface/backend/provider_config/providers/braket.py +39 -0
  87. classiq/interface/backend/provider_config/providers/ibm.py +26 -0
  88. classiq/interface/backend/provider_config/providers/ionq.py +22 -0
  89. classiq/interface/backend/quantum_backend_providers.py +20 -2
  90. classiq/interface/chemistry/ansatz_library.py +3 -5
  91. classiq/interface/chemistry/operator.py +3 -3
  92. classiq/interface/combinatorial_optimization/examples/knapsack.py +2 -4
  93. classiq/interface/combinatorial_optimization/examples/tsp_digraph.py +1 -2
  94. classiq/interface/compression_utils.py +2 -3
  95. classiq/interface/debug_info/debug_info.py +8 -7
  96. classiq/interface/exceptions.py +10 -7
  97. classiq/interface/execution/primitives.py +6 -6
  98. classiq/interface/executor/estimate_cost.py +1 -1
  99. classiq/interface/executor/execution_preferences.py +3 -5
  100. classiq/interface/executor/execution_request.py +10 -10
  101. classiq/interface/executor/execution_result.py +1 -2
  102. classiq/interface/executor/quantum_code.py +8 -8
  103. classiq/interface/executor/result.py +28 -18
  104. classiq/interface/executor/user_budget.py +25 -17
  105. classiq/interface/executor/vqe_result.py +5 -6
  106. classiq/interface/generator/ansatz_library.py +6 -8
  107. classiq/interface/generator/application_apis/__init__.py +0 -3
  108. classiq/interface/generator/arith/arithmetic.py +2 -2
  109. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +2 -3
  110. classiq/interface/generator/arith/arithmetic_expression_abc.py +4 -5
  111. classiq/interface/generator/arith/arithmetic_expression_parser.py +11 -4
  112. classiq/interface/generator/arith/arithmetic_expression_validator.py +12 -15
  113. classiq/interface/generator/arith/arithmetic_operations.py +4 -6
  114. classiq/interface/generator/arith/arithmetic_param_getters.py +70 -107
  115. classiq/interface/generator/arith/arithmetic_result_builder.py +4 -4
  116. classiq/interface/generator/arith/ast_node_rewrite.py +8 -4
  117. classiq/interface/generator/arith/binary_ops.py +15 -40
  118. classiq/interface/generator/arith/logical_ops.py +2 -3
  119. classiq/interface/generator/arith/number_utils.py +2 -2
  120. classiq/interface/generator/arith/register_user_input.py +3 -3
  121. classiq/interface/generator/arith/unary_ops.py +2 -2
  122. classiq/interface/generator/circuit_code/circuit_code.py +8 -10
  123. classiq/interface/generator/circuit_code/types_and_constants.py +1 -1
  124. classiq/interface/generator/complex_type.py +2 -2
  125. classiq/interface/generator/copy.py +1 -3
  126. classiq/interface/generator/expressions/atomic_expression_functions.py +0 -5
  127. classiq/interface/generator/expressions/evaluated_expression.py +2 -3
  128. classiq/interface/generator/expressions/expression.py +2 -2
  129. classiq/interface/generator/expressions/proxies/classical/classical_array_proxy.py +4 -7
  130. classiq/interface/generator/function_param_list.py +0 -40
  131. classiq/interface/generator/function_params.py +5 -6
  132. classiq/interface/generator/functions/classical_function_declaration.py +2 -2
  133. classiq/interface/generator/functions/classical_type.py +3 -3
  134. classiq/interface/generator/functions/type_modifier.py +0 -15
  135. classiq/interface/generator/functions/type_name.py +2 -2
  136. classiq/interface/generator/generated_circuit_data.py +14 -18
  137. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +2 -4
  138. classiq/interface/generator/hardware/hardware_data.py +8 -8
  139. classiq/interface/generator/hardware_efficient_ansatz.py +9 -9
  140. classiq/interface/generator/mcu.py +3 -3
  141. classiq/interface/generator/mcx.py +3 -3
  142. classiq/interface/generator/model/constraints.py +34 -5
  143. classiq/interface/generator/model/preferences/preferences.py +15 -21
  144. classiq/interface/generator/model/quantum_register.py +7 -10
  145. classiq/interface/generator/noise_properties.py +3 -7
  146. classiq/interface/generator/parameters.py +1 -1
  147. classiq/interface/generator/partitioned_register.py +1 -2
  148. classiq/interface/generator/preferences/qasm_to_qmod_params.py +11 -0
  149. classiq/interface/generator/quantum_function_call.py +9 -12
  150. classiq/interface/generator/quantum_program.py +10 -23
  151. classiq/interface/generator/range_types.py +3 -3
  152. classiq/interface/generator/slice_parsing_utils.py +4 -5
  153. classiq/interface/generator/standard_gates/standard_gates.py +2 -4
  154. classiq/interface/generator/synthesis_execution_parameter.py +1 -3
  155. classiq/interface/generator/synthesis_metadata/synthesis_duration.py +9 -0
  156. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +2 -3
  157. classiq/interface/generator/transpiler_basis_gates.py +12 -4
  158. classiq/interface/generator/types/builtin_enum_declarations.py +0 -145
  159. classiq/interface/generator/types/compilation_metadata.py +12 -1
  160. classiq/interface/generator/types/enum_declaration.py +2 -1
  161. classiq/interface/generator/validations/flow_graph.py +3 -3
  162. classiq/interface/generator/visitor.py +10 -12
  163. classiq/interface/hardware.py +2 -3
  164. classiq/interface/helpers/classproperty.py +2 -2
  165. classiq/interface/helpers/custom_encoders.py +2 -1
  166. classiq/interface/helpers/custom_pydantic_types.py +1 -1
  167. classiq/interface/helpers/text_utils.py +1 -4
  168. classiq/interface/ide/visual_model.py +6 -5
  169. classiq/interface/interface_version.py +1 -1
  170. classiq/interface/jobs.py +3 -3
  171. classiq/interface/model/allocate.py +4 -4
  172. classiq/interface/model/block.py +6 -2
  173. classiq/interface/model/bounds.py +3 -3
  174. classiq/interface/model/classical_if.py +4 -0
  175. classiq/interface/model/control.py +8 -1
  176. classiq/interface/model/inplace_binary_operation.py +2 -2
  177. classiq/interface/model/invert.py +4 -0
  178. classiq/interface/model/model.py +4 -4
  179. classiq/interface/model/model_visitor.py +40 -1
  180. classiq/interface/model/parameter.py +1 -3
  181. classiq/interface/model/port_declaration.py +1 -1
  182. classiq/interface/model/power.py +4 -0
  183. classiq/interface/model/quantum_expressions/quantum_expression.py +1 -2
  184. classiq/interface/model/quantum_function_call.py +3 -6
  185. classiq/interface/model/quantum_function_declaration.py +1 -0
  186. classiq/interface/model/quantum_lambda_function.py +4 -4
  187. classiq/interface/model/quantum_statement.py +11 -4
  188. classiq/interface/model/quantum_type.py +14 -14
  189. classiq/interface/model/repeat.py +4 -0
  190. classiq/interface/model/skip_control.py +4 -0
  191. classiq/interface/model/validation_handle.py +2 -3
  192. classiq/interface/model/variable_declaration_statement.py +2 -2
  193. classiq/interface/model/within_apply_operation.py +4 -0
  194. classiq/interface/pretty_print/expression_to_qmod.py +3 -4
  195. classiq/interface/server/routes.py +0 -16
  196. classiq/interface/source_reference.py +3 -4
  197. classiq/model_expansions/arithmetic.py +11 -7
  198. classiq/model_expansions/arithmetic_compute_result_attrs.py +30 -27
  199. classiq/model_expansions/capturing/captured_vars.py +3 -3
  200. classiq/model_expansions/capturing/mangling_utils.py +1 -2
  201. classiq/model_expansions/closure.py +12 -11
  202. classiq/model_expansions/function_builder.py +14 -6
  203. classiq/model_expansions/generative_functions.py +7 -12
  204. classiq/model_expansions/interpreters/base_interpreter.py +3 -7
  205. classiq/model_expansions/interpreters/frontend_generative_interpreter.py +2 -1
  206. classiq/model_expansions/interpreters/generative_interpreter.py +8 -4
  207. classiq/model_expansions/quantum_operations/allocate.py +4 -4
  208. classiq/model_expansions/quantum_operations/assignment_result_processor.py +8 -4
  209. classiq/model_expansions/quantum_operations/call_emitter.py +31 -37
  210. classiq/model_expansions/quantum_operations/declarative_call_emitter.py +2 -2
  211. classiq/model_expansions/quantum_operations/emitter.py +3 -5
  212. classiq/model_expansions/quantum_operations/expression_evaluator.py +3 -3
  213. classiq/model_expansions/quantum_operations/skip_control_verifier.py +1 -2
  214. classiq/model_expansions/quantum_operations/variable_decleration.py +61 -29
  215. classiq/model_expansions/scope.py +7 -7
  216. classiq/model_expansions/scope_initialization.py +4 -0
  217. classiq/model_expansions/visitors/symbolic_param_inference.py +6 -6
  218. classiq/model_expansions/visitors/uncomputation_signature_inference.py +328 -0
  219. classiq/model_expansions/visitors/variable_references.py +15 -14
  220. classiq/open_library/functions/__init__.py +28 -11
  221. classiq/open_library/functions/amplitude_loading.py +81 -0
  222. classiq/open_library/functions/discrete_sine_cosine_transform.py +19 -14
  223. classiq/open_library/functions/grover.py +8 -10
  224. classiq/open_library/functions/lcu.py +47 -18
  225. classiq/open_library/functions/modular_exponentiation.py +93 -8
  226. classiq/open_library/functions/qsvt.py +66 -79
  227. classiq/open_library/functions/qsvt_temp.py +536 -0
  228. classiq/open_library/functions/state_preparation.py +130 -27
  229. classiq/qmod/__init__.py +6 -4
  230. classiq/qmod/builtins/classical_execution_primitives.py +4 -23
  231. classiq/qmod/builtins/classical_functions.py +1 -42
  232. classiq/qmod/builtins/enums.py +15 -153
  233. classiq/qmod/builtins/functions/__init__.py +9 -18
  234. classiq/qmod/builtins/functions/allocation.py +25 -4
  235. classiq/qmod/builtins/functions/arithmetic.py +22 -27
  236. classiq/qmod/builtins/functions/exponentiation.py +51 -2
  237. classiq/qmod/builtins/functions/mcx_func.py +7 -0
  238. classiq/qmod/builtins/functions/standard_gates.py +46 -27
  239. classiq/qmod/builtins/operations.py +173 -79
  240. classiq/qmod/builtins/structs.py +24 -91
  241. classiq/qmod/cfunc.py +3 -2
  242. classiq/qmod/classical_function.py +2 -1
  243. classiq/qmod/classical_variable.py +4 -2
  244. classiq/qmod/cparam.py +2 -8
  245. classiq/qmod/create_model_function.py +7 -7
  246. classiq/qmod/declaration_inferrer.py +33 -30
  247. classiq/qmod/expression_query.py +7 -4
  248. classiq/qmod/model_state_container.py +2 -2
  249. classiq/qmod/native/pretty_printer.py +25 -14
  250. classiq/qmod/pretty_print/expression_to_python.py +5 -3
  251. classiq/qmod/pretty_print/pretty_printer.py +39 -17
  252. classiq/qmod/python_classical_type.py +40 -13
  253. classiq/qmod/qfunc.py +124 -19
  254. classiq/qmod/qmod_constant.py +2 -2
  255. classiq/qmod/qmod_parameter.py +5 -2
  256. classiq/qmod/qmod_variable.py +47 -46
  257. classiq/qmod/quantum_callable.py +18 -13
  258. classiq/qmod/quantum_expandable.py +33 -26
  259. classiq/qmod/quantum_function.py +84 -36
  260. classiq/qmod/semantics/annotation/call_annotation.py +5 -5
  261. classiq/qmod/semantics/error_manager.py +12 -14
  262. classiq/qmod/semantics/lambdas.py +1 -2
  263. classiq/qmod/semantics/validation/types_validation.py +1 -2
  264. classiq/qmod/symbolic.py +2 -4
  265. classiq/qmod/symbolic_expr.py +12 -4
  266. classiq/qmod/utilities.py +13 -20
  267. classiq/qmod/write_qmod.py +3 -4
  268. classiq/quantum_program.py +1 -3
  269. classiq/synthesis.py +11 -7
  270. {classiq-0.92.0.dist-info → classiq-0.99.0.dist-info}/METADATA +38 -37
  271. {classiq-0.92.0.dist-info → classiq-0.99.0.dist-info}/RECORD +273 -300
  272. classiq-0.99.0.dist-info/WHEEL +4 -0
  273. classiq-0.99.0.dist-info/licenses/LICENSE.txt +27 -0
  274. classiq/applications/chemistry/ansatz_parameters.py +0 -29
  275. classiq/applications/chemistry/chemistry_execution_parameters.py +0 -16
  276. classiq/applications/chemistry/chemistry_model_constructor.py +0 -532
  277. classiq/applications/chemistry/ground_state_problem.py +0 -42
  278. classiq/applications/qsvm/__init__.py +0 -8
  279. classiq/applications/qsvm/qsvm.py +0 -11
  280. classiq/evaluators/qmod_expression_visitors/qmod_expression_bwc.py +0 -129
  281. classiq/execution/iqcc.py +0 -128
  282. classiq/interface/applications/qsvm.py +0 -117
  283. classiq/interface/chemistry/elements.py +0 -120
  284. classiq/interface/chemistry/fermionic_operator.py +0 -208
  285. classiq/interface/chemistry/ground_state_problem.py +0 -132
  286. classiq/interface/chemistry/ground_state_result.py +0 -8
  287. classiq/interface/chemistry/molecule.py +0 -71
  288. classiq/interface/execution/iqcc.py +0 -44
  289. classiq/interface/generator/application_apis/chemistry_declarations.py +0 -69
  290. classiq/interface/generator/application_apis/entangler_declarations.py +0 -29
  291. classiq/interface/generator/application_apis/qsvm_declarations.py +0 -6
  292. classiq/interface/generator/chemistry_function_params.py +0 -50
  293. classiq/interface/generator/entangler_params.py +0 -72
  294. classiq/interface/generator/entanglers.py +0 -14
  295. classiq/interface/generator/hamiltonian_evolution/qdrift.py +0 -27
  296. classiq/interface/generator/hartree_fock.py +0 -26
  297. classiq/interface/generator/hva.py +0 -22
  298. classiq/interface/generator/linear_pauli_rotations.py +0 -92
  299. classiq/interface/generator/qft.py +0 -37
  300. classiq/interface/generator/qsvm.py +0 -96
  301. classiq/interface/generator/state_preparation/__init__.py +0 -14
  302. classiq/interface/generator/state_preparation/bell_state_preparation.py +0 -27
  303. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +0 -28
  304. classiq/interface/generator/state_preparation/distributions.py +0 -53
  305. classiq/interface/generator/state_preparation/exponential_state_preparation.py +0 -14
  306. classiq/interface/generator/state_preparation/ghz_state_preparation.py +0 -14
  307. classiq/interface/generator/state_preparation/metrics.py +0 -41
  308. classiq/interface/generator/state_preparation/state_preparation.py +0 -113
  309. classiq/interface/generator/state_preparation/state_preparation_abc.py +0 -24
  310. classiq/interface/generator/state_preparation/uniform_distibution_state_preparation.py +0 -13
  311. classiq/interface/generator/state_preparation/w_state_preparation.py +0 -13
  312. classiq/interface/generator/ucc.py +0 -74
  313. classiq/interface/helpers/backward_compatibility.py +0 -9
  314. classiq/model_expansions/transformers/type_modifier_inference.py +0 -392
  315. classiq/open_library/functions/lookup_table.py +0 -58
  316. classiq/qmod/builtins/functions/chemistry.py +0 -123
  317. classiq/qmod/builtins/functions/qsvm.py +0 -24
  318. classiq-0.92.0.dist-info/WHEEL +0 -4
@@ -1,72 +0,0 @@
1
- import pydantic
2
-
3
- from classiq.interface.generator.arith.register_user_input import RegisterUserInput
4
- from classiq.interface.generator.function_params import FunctionParams
5
- from classiq.interface.helpers.custom_pydantic_types import PydanticProbabilityFloat
6
-
7
- IN_NAME: str = "IN"
8
- OUT_NAME: str = "OUT"
9
-
10
-
11
- class Entangler(FunctionParams):
12
- """
13
- A Father class for all entangler classes
14
- """
15
-
16
- qubit_count: pydantic.PositiveInt = pydantic.Field(
17
- description="The number of qubits for the entangler."
18
- )
19
- schmidt_rank: pydantic.NonNegativeInt = pydantic.Field(
20
- default=0, description="The required schmidt rank (log of schmidt number)."
21
- )
22
-
23
- def _create_ios(self) -> None:
24
- self._inputs = {IN_NAME: RegisterUserInput(name=IN_NAME, size=self.qubit_count)}
25
- self._outputs = {
26
- OUT_NAME: RegisterUserInput(name=OUT_NAME, size=self.qubit_count)
27
- }
28
-
29
-
30
- class TwoDimensionalEntangler(Entangler):
31
- """
32
- Creates a two dimensional cluster state with the specified number of qubits and schmidt rank
33
- (log of schmidt number). When the desired schmidt rank is too high, a rectangular grid with schmidt rank
34
- floor(sqrt(qubit_count))-1 is generated.
35
- """
36
-
37
- pass
38
-
39
-
40
- class HypercubeEntangler(Entangler):
41
- """
42
- Creates a cluster/graph state in the form of a hypercube with the specified number of qubits. The hypercube is
43
- constructed by building cubes of growing dimension therefore if the number of qubits is not a a power of 2 (n=2^k)
44
- the last cube will not be completed. for example if n = 11 = 2^3 + 3 a three dimensional cube is constructed
45
- connected to additional 3 qubits in the natural order
46
- (that is, these qubits will be: 1000, 1001, 1010)
47
- """
48
-
49
- pass
50
-
51
-
52
- class GridEntangler(Entangler):
53
- """
54
- creates a graph state in the form of multi-dimensional grid according to the specified number of qubits and Schmidt
55
- rank. If possible the grid will include the exact Schmidt rank if not a smaller grid with a lower schmidt rank is
56
- constructed - as close as possible to the specified parameters. if the specified Schmidt rank is too high a 'long'
57
- grid with the maximal possible Schmidt rank width is constructed (that still obeys the condition that the largest
58
- dimension minus 1 is larger then the sum of the (d_i - 1) -- d_i including all other dimensions)
59
- """
60
-
61
- grid_randomization: bool = pydantic.Field(
62
- default=True,
63
- description="Boolean determining whether the grid structure is randomly selected out of all grids which provide"
64
- "the same Schmidt rank width. If False the grid with maximal number of dimensions is selected.",
65
- )
66
-
67
- filling_factor: PydanticProbabilityFloat = pydantic.Field(
68
- default=1,
69
- description="float determining the fraction of cz gates that are included in a circuit for a given grid "
70
- "structure. For example, for filling_factor=0.5 half of the cz gates required for the full grid structure are "
71
- "included in the output circuit. The cz gates included in the circuit are chosen randomaly.",
72
- )
@@ -1,14 +0,0 @@
1
- import pydantic
2
- from pydantic import BaseModel
3
-
4
- from classiq.interface.helpers.custom_pydantic_types import PydanticLargerThanOneInteger
5
-
6
-
7
- class SquareClusterEntanglerParameters(BaseModel):
8
- num_of_qubits: PydanticLargerThanOneInteger
9
- schmidt_rank: pydantic.NonNegativeInt
10
-
11
-
12
- class Open2DClusterEntanglerParameters(BaseModel):
13
- qubit_count: PydanticLargerThanOneInteger
14
- schmidt_rank: pydantic.NonNegativeInt
@@ -1,27 +0,0 @@
1
- import pydantic
2
-
3
- from classiq.interface.chemistry import operator
4
- from classiq.interface.chemistry.operator import PauliOperator
5
- from classiq.interface.generator.function_params import FunctionParamsNumericParameter
6
- from classiq.interface.generator.hamiltonian_evolution.hamiltonian_evolution import (
7
- HamiltonianEvolution,
8
- )
9
-
10
-
11
- class QDrift(HamiltonianEvolution):
12
- """
13
- qDrift trotterization of a Hermitian operator; see https://arxiv.org/abs/1811.08017
14
- """
15
-
16
- evolution_coefficient: FunctionParamsNumericParameter = pydantic.Field(
17
- default=1.0,
18
- description="A global coefficient multiplying the operator.",
19
- )
20
- num_qdrift: pydantic.PositiveInt = pydantic.Field(
21
- description="The number of elements in the qDrift product.",
22
- )
23
-
24
- @pydantic.field_validator("pauli_operator")
25
- @classmethod
26
- def _validate_is_hermitian(cls, pauli_operator: PauliOperator) -> PauliOperator:
27
- return operator.validate_operator_is_hermitian(pauli_operator)
@@ -1,26 +0,0 @@
1
- from typing import Any, Union
2
-
3
- import pydantic
4
-
5
- from classiq.interface.chemistry.ground_state_problem import (
6
- CHEMISTRY_PROBLEMS,
7
- HamiltonianProblem,
8
- MoleculeProblem,
9
- )
10
- from classiq.interface.exceptions import ClassiqValueError
11
- from classiq.interface.generator.chemistry_function_params import (
12
- ChemistryFunctionParams,
13
- )
14
-
15
-
16
- class HartreeFock(ChemistryFunctionParams):
17
- @pydantic.field_validator("gs_problem")
18
- @classmethod
19
- def validate_gs_problem(
20
- cls, gs_problem: Any
21
- ) -> Union[MoleculeProblem, HamiltonianProblem]:
22
- if not isinstance(gs_problem, CHEMISTRY_PROBLEMS):
23
- raise ClassiqValueError(
24
- f"ground state problem must be of type {CHEMISTRY_PROBLEMS}"
25
- )
26
- return gs_problem
@@ -1,22 +0,0 @@
1
- import pydantic
2
-
3
- from classiq.interface.generator.chemistry_function_params import (
4
- ChemistryFunctionParams,
5
- )
6
-
7
-
8
- class HVA(ChemistryFunctionParams):
9
- """
10
- Hamiltonian Variational Ansatz
11
- """
12
-
13
- reps: pydantic.PositiveInt = pydantic.Field(
14
- default=1, description="Number of layers in the Ansatz"
15
- )
16
- use_naive_evolution: bool = pydantic.Field(
17
- default=False, description="Whether to evolve the operator naively"
18
- )
19
- parameter_prefix: str = pydantic.Field(
20
- default="hva_param_",
21
- description="Prefix for the generated parameters",
22
- )
@@ -1,92 +0,0 @@
1
- from typing import TYPE_CHECKING, Annotated, Any
2
-
3
- import pydantic
4
- from pydantic import StringConstraints
5
- from typing_extensions import Self
6
-
7
- from classiq.interface.exceptions import ClassiqValueError
8
- from classiq.interface.generator import function_params
9
- from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
10
-
11
- STATE = "state"
12
- TARGET = "target"
13
-
14
- LENGTH_ERROR_MESSAGE = "Field required"
15
-
16
- if TYPE_CHECKING:
17
- PydanticPauliBasisStr = str
18
- else:
19
- PydanticPauliBasisStr = Annotated[
20
- str,
21
- StringConstraints(
22
- to_lower=True,
23
- pattern=r"[xyz]",
24
- ),
25
- ]
26
-
27
-
28
- class LinearPauliRotations(function_params.FunctionParams):
29
- """
30
- Perform independent linear rotations on target qubits, each controlled by an identical
31
- n-qubit state register |x>.
32
-
33
- Each target qubit, indexed with k and denoted by q_k, undergoes the following transformation:
34
- |x>|q_k> -> |x> * [cos(theta(x,k)/2) + i*sin(theta(x,k)/2)*sigma]|q_k>
35
- with sigma being 'X', 'Y' or 'Z' Pauli matrix, and the angle is a linear function of the state,
36
- theta(x,k)/2 = (slope(k)*x + offset(k))/2.
37
-
38
- For example, a 'Y' rotation on one target qubit will result in a circuit implementing the following logic:
39
- |x>|0> -> cos((slope*x + offset)/2)|x>|0> + sin((slope*x + offset)/2)|x>|1>
40
-
41
- q_0: ─────────────────────────■───────── ... ──────────────────────
42
-
43
- .
44
-
45
- q_(n-1): ─────────────────────────┼───────── ... ───────────■──────────
46
- ┌────────────┐ ┌───────┴───────┐ ┌─────────┴─────────┐
47
- target: ─┤ RY(offset) ├──┤ RY(2^0 slope) ├ ... ┤ RY(2^(n-1) slope) ├
48
- └────────────┘ └───────────────┘ └───────────────────┘
49
- """
50
-
51
- num_state_qubits: pydantic.PositiveInt = pydantic.Field(
52
- description="The number of input qubits"
53
- )
54
- bases: list[PydanticPauliBasisStr] = pydantic.Field(
55
- description="The types of Pauli rotations ('X', 'Y', 'Z')."
56
- )
57
- slopes: list[float] = pydantic.Field(
58
- description="The slopes of the controlled rotations."
59
- )
60
- offsets: list[float] = pydantic.Field(
61
- description="The offsets of the controlled rotations."
62
- )
63
-
64
- @pydantic.field_validator("bases", "slopes", "offsets", mode="before")
65
- @classmethod
66
- def as_list(cls, v: Any) -> list[Any]:
67
- if not isinstance(v, list):
68
- v = [v]
69
- res = []
70
- for x in v:
71
- element = x
72
- if isinstance(x, str):
73
- res.append(element.lower())
74
- else:
75
- res.append(element)
76
- return res
77
-
78
- @pydantic.model_validator(mode="after")
79
- def validate_lists(self) -> Self:
80
- offsets = self.offsets or list()
81
- bases = self.bases or list()
82
- slopes = self.slopes or list()
83
- if len(slopes) == len(offsets) and len(offsets) == len(bases):
84
- return self
85
- raise ClassiqValueError(LENGTH_ERROR_MESSAGE)
86
-
87
- def _create_ios(self) -> None:
88
- self._inputs = {
89
- STATE: RegisterArithmeticInfo(size=self.num_state_qubits),
90
- TARGET: RegisterArithmeticInfo(size=len(self.bases)),
91
- }
92
- self._outputs = {**self.inputs}
@@ -1,37 +0,0 @@
1
- import pydantic
2
-
3
- from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
4
- from classiq.interface.generator.function_params import (
5
- DEFAULT_INPUT_NAME,
6
- DEFAULT_OUTPUT_NAME,
7
- FunctionParams,
8
- )
9
-
10
-
11
- class QFT(FunctionParams):
12
- """
13
- Creates a quantum Fourier transform on a specified number of qubits.
14
- """
15
-
16
- num_qubits: pydantic.PositiveInt = pydantic.Field(
17
- description="The number of qubits on which the QFT acts."
18
- )
19
- approximation_degree: pydantic.NonNegativeInt = pydantic.Field(
20
- default=0,
21
- description="The degree of approximation (0 for no approximation). The smallest "
22
- "'approximation_degree' rotation angles are dropped from the QFT.",
23
- )
24
- do_swaps: bool = pydantic.Field(
25
- default=True, description="Whether to include the final swaps in the QFT."
26
- )
27
-
28
- def _create_ios(self) -> None:
29
- self._inputs = {
30
- DEFAULT_INPUT_NAME: RegisterArithmeticInfo(size=self.num_qubits)
31
- }
32
- self._outputs = {
33
- DEFAULT_OUTPUT_NAME: RegisterArithmeticInfo(size=self.num_qubits)
34
- }
35
-
36
- def get_power_order(self) -> int:
37
- return 4
@@ -1,96 +0,0 @@
1
- from typing import Literal, Optional, Union
2
-
3
- import numpy as np
4
- import pydantic
5
- from pydantic import ConfigDict
6
-
7
- from classiq.interface.enum_utils import StrEnum
8
- from classiq.interface.exceptions import ClassiqQSVMError, ClassiqValueError
9
- from classiq.interface.generator.arith.register_user_input import RegisterUserInput
10
- from classiq.interface.generator.function_params import (
11
- DEFAULT_INPUT_NAME,
12
- DEFAULT_OUTPUT_NAME,
13
- FunctionParams,
14
- )
15
- from classiq.interface.helpers.hashable_pydantic_base_model import (
16
- HashablePydanticBaseModel,
17
- )
18
-
19
- VALID_PAULI_LETTERS = ("I", "X", "Y", "Z")
20
-
21
-
22
- class QSVMFeatureMapEntanglement(StrEnum):
23
- FULL = "full"
24
- LINEAR = "linear"
25
- CIRCULAR = "circular"
26
- SCA = "sca"
27
- PAIRWISE = "pairwise"
28
-
29
-
30
- class QSVMFeatureMapDimensional(HashablePydanticBaseModel):
31
- feature_dimension: Optional[int] = None
32
- model_config = ConfigDict(frozen=True)
33
-
34
-
35
- class QSVMFeatureMapPauli(QSVMFeatureMapDimensional):
36
- map_type: Literal["pauli_feature_map"] = pydantic.Field(default="pauli_feature_map")
37
- reps: int = 2
38
- entanglement: QSVMFeatureMapEntanglement = QSVMFeatureMapEntanglement.LINEAR
39
- alpha: float = 2.0
40
- paulis: list[str] = ["Z", "ZZ"]
41
- parameter_prefix: str = "x"
42
- name: str = "PauliFeatureMap"
43
-
44
- @pydantic.field_validator("paulis", mode="before")
45
- @classmethod
46
- def set_paulis(cls, paulis: list[str]) -> list[str]:
47
- # iterate every letter in every string in the list of paulis
48
- for s in paulis:
49
- if not all(map(VALID_PAULI_LETTERS.__contains__, s.upper())):
50
- raise ClassiqValueError(
51
- f"Invalid pauli string given: {s!r}. Expecting a combination of {VALID_PAULI_LETTERS}"
52
- )
53
- return list(map(str.upper, paulis))
54
-
55
-
56
- class QSVMFeatureMapBlochSphere(QSVMFeatureMapDimensional):
57
- map_type: Literal["bloch_sphere_feature_map"] = pydantic.Field(
58
- default="bloch_sphere_feature_map"
59
- )
60
-
61
-
62
- FeatureMapType = Union[QSVMFeatureMapBlochSphere, QSVMFeatureMapPauli]
63
-
64
-
65
- class QSVMFeatureMap(FunctionParams):
66
- """
67
- Feature map circuit used for QSVM
68
- """
69
-
70
- feature_map: FeatureMapType = pydantic.Field(
71
- description="The feature map for the qsvm",
72
- discriminator="map_type",
73
- )
74
-
75
- @property
76
- def num_qubits(self) -> int:
77
- if not self.feature_map.feature_dimension:
78
- raise ClassiqQSVMError(
79
- "Feature dimension should be provided to create a circuit."
80
- )
81
- if isinstance(self.feature_map, QSVMFeatureMapPauli):
82
- return self.feature_map.feature_dimension
83
- else:
84
- return int(np.ceil(self.feature_map.feature_dimension / 2))
85
-
86
- def _create_ios(self) -> None:
87
- self._inputs = {
88
- DEFAULT_INPUT_NAME: RegisterUserInput(
89
- name=DEFAULT_INPUT_NAME, size=self.num_qubits
90
- )
91
- }
92
- self._outputs = {
93
- DEFAULT_OUTPUT_NAME: RegisterUserInput(
94
- name=DEFAULT_OUTPUT_NAME, size=self.num_qubits
95
- )
96
- }
@@ -1,14 +0,0 @@
1
- from .bell_state_preparation import BellStatePreparation
2
- from .computational_basis_state_preparation import ComputationalBasisStatePreparation
3
- from .distributions import PMF, GaussianMixture, GaussianMoments
4
- from .exponential_state_preparation import ExponentialStatePreparation
5
- from .ghz_state_preparation import GHZStatePreparation
6
- from .metrics import Metrics
7
- from .state_preparation import StatePreparation
8
- from .state_preparation_abc import (
9
- DEFAULT_INPUT_NAME,
10
- DEFAULT_OUTPUT_NAME,
11
- StatePreparationABC,
12
- )
13
- from .uniform_distibution_state_preparation import UniformDistributionStatePreparation
14
- from .w_state_preparation import WStatePreparation
@@ -1,27 +0,0 @@
1
- from typing import Literal
2
-
3
- import pydantic
4
-
5
- from classiq.interface.generator.state_preparation.state_preparation_abc import (
6
- StatePreparationABC,
7
- )
8
-
9
- BellStateName = Literal["psi+", "psi-", "phi+", "phi-"]
10
- _ALIGNED_STATES: frozenset[BellStateName] = frozenset({"phi+", "phi-"})
11
- _SIGNED_STATES: frozenset[BellStateName] = frozenset({"psi-", "phi-"})
12
-
13
-
14
- class BellStatePreparation(StatePreparationABC):
15
- name: BellStateName = pydantic.Field(default="phi+")
16
-
17
- @property
18
- def aligned(self) -> bool:
19
- return self.name in _ALIGNED_STATES
20
-
21
- @property
22
- def signed(self) -> bool:
23
- return self.name in _SIGNED_STATES
24
-
25
- @property
26
- def num_state_qubits(self) -> int:
27
- return 2
@@ -1,28 +0,0 @@
1
- import pydantic
2
-
3
- from classiq.interface.generator.control_state import ControlState
4
- from classiq.interface.generator.state_preparation.state_preparation_abc import (
5
- StatePreparationABC,
6
- )
7
- from classiq.interface.helpers.custom_pydantic_types import PydanticNonEmptyString
8
-
9
-
10
- class ComputationalBasisStatePreparation(StatePreparationABC):
11
- computational_state: PydanticNonEmptyString = pydantic.Field(
12
- description="binary computational state to create"
13
- )
14
-
15
- @pydantic.field_validator("computational_state")
16
- @classmethod
17
- def _validate_computational_state(
18
- cls, computational_state: PydanticNonEmptyString
19
- ) -> PydanticNonEmptyString:
20
- ControlState.validate_control_string(computational_state)
21
- return computational_state
22
-
23
- @property
24
- def num_state_qubits(self) -> int:
25
- return len(self.computational_state)
26
-
27
- def get_power_order(self) -> int:
28
- return 2
@@ -1,53 +0,0 @@
1
- from collections.abc import Collection, Sequence
2
- from typing import Union
3
-
4
- import pydantic
5
- from numpy.typing import ArrayLike
6
- from pydantic import ConfigDict
7
-
8
- from classiq.interface.generator.validations.validator_functions import (
9
- validate_probabilities,
10
- )
11
- from classiq.interface.helpers.custom_pydantic_types import PydanticProbabilityFloat
12
-
13
-
14
- class PMF(pydantic.BaseModel):
15
- pmf: tuple[PydanticProbabilityFloat, ...]
16
-
17
- @pydantic.field_validator("pmf")
18
- @classmethod
19
- def _validate_pmf(
20
- cls, pmf: tuple[PydanticProbabilityFloat, ...]
21
- ) -> Sequence[PydanticProbabilityFloat]:
22
- return validate_probabilities(cls, pmf)
23
-
24
- model_config = ConfigDict(frozen=True)
25
-
26
-
27
- class GaussianMoments(pydantic.BaseModel):
28
- mu: float
29
- sigma: pydantic.PositiveFloat
30
- model_config = ConfigDict(frozen=True)
31
-
32
-
33
- class GaussianMixture(pydantic.BaseModel):
34
- gaussian_moment_list: tuple[GaussianMoments, ...]
35
- num_qubits: pydantic.PositiveInt = pydantic.Field(
36
- description="Number of qubits for the provided state."
37
- )
38
- model_config = ConfigDict(frozen=True)
39
-
40
-
41
- Probabilities = Union[PMF, GaussianMixture]
42
- FlexibleProbabilities = Union[Probabilities, ArrayLike, dict, Collection[float]]
43
- Amplitudes = tuple[float, ...]
44
- FlexibleAmplitudes = Union[ArrayLike, Collection[float]]
45
- Distribution = Union[Amplitudes, Probabilities]
46
-
47
-
48
- def num_of_qubits(distribution: Distribution) -> int:
49
- if isinstance(distribution, GaussianMixture):
50
- return distribution.num_qubits
51
- if isinstance(distribution, PMF):
52
- return len(distribution.pmf).bit_length() - 1
53
- return len(distribution).bit_length() - 1
@@ -1,14 +0,0 @@
1
- import pydantic
2
-
3
- from classiq.interface.generator.state_preparation.state_preparation_abc import (
4
- StatePreparationABC,
5
- )
6
-
7
-
8
- class ExponentialStatePreparation(StatePreparationABC):
9
- num_qubits: pydantic.PositiveInt = pydantic.Field()
10
- rate: float = pydantic.Field()
11
-
12
- @property
13
- def num_state_qubits(self) -> int:
14
- return self.num_qubits
@@ -1,14 +0,0 @@
1
- import pydantic
2
-
3
- from classiq.interface.generator.state_preparation.state_preparation_abc import (
4
- StatePreparationABC,
5
- )
6
- from classiq.interface.helpers.custom_pydantic_types import PydanticLargerThanOneInteger
7
-
8
-
9
- class GHZStatePreparation(StatePreparationABC):
10
- num_qubits: PydanticLargerThanOneInteger = pydantic.Field(default=3)
11
-
12
- @property
13
- def num_state_qubits(self) -> int:
14
- return self.num_qubits
@@ -1,41 +0,0 @@
1
- from classiq.interface.enum_utils import StrEnum
2
- from classiq.interface.exceptions import ClassiqValueError
3
- from classiq.interface.generator.preferences.optimization import (
4
- StatePrepOptimizationMethod,
5
- )
6
-
7
- _AMPLITUDE_SUPPORTING_METRICS: frozenset = frozenset(
8
- {"L2", "L1", "MAX_PROBABILITY", "TOTAL_VARIATION"}
9
- )
10
-
11
- _ZERO_DIVERGENT_METRICS: frozenset = frozenset({"KL", "BHATTACHARYYA"})
12
-
13
-
14
- class Metrics(StrEnum):
15
- KL = "KL"
16
- L2 = "L2"
17
- L1 = "L1"
18
- MAX_PROBABILITY = "MAX_PROBABILITY"
19
- LOSS_OF_FIDELITY = "LOSS_OF_FIDELITY"
20
- TOTAL_VARIATION = "TOTAL_VARIATION"
21
- HELLINGER = "HELLINGER"
22
- BHATTACHARYYA = "BHATTACHARYYA"
23
-
24
- @classmethod
25
- def from_sp_optimization_method(
26
- cls, sp_opt_method: StatePrepOptimizationMethod
27
- ) -> "Metrics":
28
- try:
29
- return Metrics(sp_opt_method.value)
30
- except ValueError:
31
- raise ClassiqValueError(
32
- f"Failed to convert {sp_opt_method} to an error metric"
33
- ) from None
34
-
35
- @property
36
- def supports_amplitudes(self) -> bool:
37
- return self.value in _AMPLITUDE_SUPPORTING_METRICS
38
-
39
- @property
40
- def possibly_diverges(self) -> bool:
41
- return self.value in _ZERO_DIVERGENT_METRICS