classiq 0.37.1__py3-none-any.whl → 0.39.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 (280) hide show
  1. classiq/__init__.py +23 -24
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +1 -1
  3. classiq/_analyzer_extras/interactive_hardware.py +3 -3
  4. classiq/_internals/api_wrapper.py +37 -17
  5. classiq/_internals/async_utils.py +1 -74
  6. classiq/_internals/authentication/device.py +9 -4
  7. classiq/_internals/authentication/password_manager.py +25 -10
  8. classiq/_internals/authentication/token_manager.py +2 -2
  9. classiq/_internals/client.py +24 -6
  10. classiq/_internals/jobs.py +10 -7
  11. classiq/analyzer/analyzer.py +29 -29
  12. classiq/analyzer/analyzer_utilities.py +5 -5
  13. classiq/analyzer/rb.py +4 -5
  14. classiq/analyzer/show_interactive_hack.py +6 -6
  15. classiq/applications/__init__.py +1 -8
  16. classiq/applications/chemistry/__init__.py +6 -0
  17. classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +9 -16
  18. classiq/applications/combinatorial_helpers/allowed_constraints.py +20 -0
  19. classiq/applications/combinatorial_helpers/arithmetic/arithmetic_expression.py +35 -0
  20. classiq/applications/combinatorial_helpers/arithmetic/isolation.py +42 -0
  21. classiq/applications/combinatorial_helpers/combinatorial_problem_utils.py +150 -0
  22. classiq/applications/combinatorial_helpers/encoding_mapping.py +107 -0
  23. classiq/applications/combinatorial_helpers/encoding_utils.py +122 -0
  24. classiq/applications/combinatorial_helpers/memory.py +77 -0
  25. classiq/applications/combinatorial_helpers/optimization_model.py +162 -0
  26. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +31 -0
  27. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +75 -0
  28. classiq/applications/combinatorial_helpers/py.typed +0 -0
  29. classiq/applications/combinatorial_helpers/pyomo_utils.py +245 -0
  30. classiq/applications/combinatorial_helpers/solvers/__init__.py +0 -0
  31. classiq/applications/combinatorial_helpers/sympy_utils.py +22 -0
  32. classiq/applications/combinatorial_helpers/transformations/__init__.py +0 -0
  33. classiq/applications/combinatorial_helpers/transformations/encoding.py +187 -0
  34. classiq/applications/combinatorial_helpers/transformations/fixed_variables.py +142 -0
  35. classiq/applications/combinatorial_helpers/transformations/ising_converter.py +122 -0
  36. classiq/applications/combinatorial_helpers/transformations/penalty.py +32 -0
  37. classiq/applications/combinatorial_helpers/transformations/penalty_support.py +37 -0
  38. classiq/applications/combinatorial_helpers/transformations/sign_seperation.py +75 -0
  39. classiq/applications/combinatorial_helpers/transformations/slack_variables.py +88 -0
  40. classiq/applications/combinatorial_optimization/__init__.py +13 -2
  41. classiq/applications/combinatorial_optimization/combinatorial_optimization_model_constructor.py +134 -0
  42. classiq/applications/finance/__init__.py +3 -2
  43. classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +27 -30
  44. classiq/applications/grover/__init__.py +11 -0
  45. classiq/{applications_model_constructors → applications/grover}/grover_model_constructor.py +20 -91
  46. classiq/applications/libraries/__init__.py +0 -0
  47. classiq/applications/libraries/qmci_library.py +35 -0
  48. classiq/applications/qnn/circuit_utils.py +2 -2
  49. classiq/applications/qnn/gradients/quantum_gradient.py +2 -2
  50. classiq/applications/qnn/types.py +2 -2
  51. classiq/applications/qsvm/__init__.py +5 -1
  52. classiq/applications/qsvm/qsvm.py +4 -7
  53. classiq/applications/qsvm/qsvm_data_generation.py +2 -5
  54. classiq/exceptions.py +43 -1
  55. classiq/execution/all_hardware_devices.py +13 -0
  56. classiq/executor.py +12 -10
  57. classiq/interface/_version.py +1 -1
  58. classiq/interface/analyzer/analysis_params.py +6 -3
  59. classiq/interface/analyzer/result.py +12 -8
  60. classiq/interface/applications/qsvm.py +17 -3
  61. classiq/interface/ast_node.py +23 -0
  62. classiq/interface/backend/backend_preferences.py +4 -2
  63. classiq/interface/backend/pydantic_backend.py +3 -1
  64. classiq/interface/backend/quantum_backend_providers.py +1 -0
  65. classiq/interface/chemistry/fermionic_operator.py +15 -13
  66. classiq/interface/chemistry/ground_state_problem.py +18 -3
  67. classiq/interface/chemistry/molecule.py +8 -6
  68. classiq/interface/chemistry/operator.py +20 -14
  69. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +1 -1
  70. classiq/interface/combinatorial_optimization/examples/greater_than_ilp.py +1 -1
  71. classiq/interface/combinatorial_optimization/examples/ilp.py +2 -1
  72. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -2
  73. classiq/interface/combinatorial_optimization/examples/mds.py +2 -1
  74. classiq/interface/combinatorial_optimization/examples/mht.py +8 -3
  75. classiq/interface/combinatorial_optimization/examples/mis.py +4 -1
  76. classiq/interface/combinatorial_optimization/examples/mvc.py +2 -1
  77. classiq/interface/combinatorial_optimization/examples/set_cover.py +2 -1
  78. classiq/interface/combinatorial_optimization/examples/tsp.py +4 -3
  79. classiq/interface/combinatorial_optimization/examples/tsp_digraph.py +6 -2
  80. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +9 -3
  81. classiq/interface/executor/aws_execution_cost.py +4 -3
  82. classiq/interface/executor/estimation.py +2 -2
  83. classiq/interface/executor/execution_preferences.py +5 -34
  84. classiq/interface/executor/execution_request.py +15 -48
  85. classiq/interface/executor/optimizer_preferences.py +22 -13
  86. classiq/interface/executor/{quantum_program.py → quantum_code.py} +21 -15
  87. classiq/interface/executor/quantum_instruction_set.py +2 -1
  88. classiq/interface/executor/register_initialization.py +1 -3
  89. classiq/interface/executor/result.py +41 -10
  90. classiq/interface/executor/vqe_result.py +2 -2
  91. classiq/interface/finance/function_input.py +17 -4
  92. classiq/interface/finance/gaussian_model_input.py +3 -1
  93. classiq/interface/finance/log_normal_model_input.py +3 -1
  94. classiq/interface/finance/model_input.py +2 -0
  95. classiq/interface/generator/amplitude_loading.py +6 -3
  96. classiq/interface/generator/application_apis/__init__.py +1 -0
  97. classiq/interface/generator/application_apis/arithmetic_declarations.py +14 -0
  98. classiq/interface/generator/arith/argument_utils.py +14 -4
  99. classiq/interface/generator/arith/arithmetic.py +3 -1
  100. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +12 -13
  101. classiq/interface/generator/arith/arithmetic_expression_abc.py +4 -1
  102. classiq/interface/generator/arith/arithmetic_expression_parser.py +8 -2
  103. classiq/interface/generator/arith/arithmetic_expression_validator.py +16 -2
  104. classiq/interface/generator/arith/arithmetic_operations.py +5 -10
  105. classiq/interface/generator/arith/ast_node_rewrite.py +1 -1
  106. classiq/interface/generator/arith/binary_ops.py +202 -54
  107. classiq/interface/generator/arith/extremum_operations.py +5 -3
  108. classiq/interface/generator/arith/logical_ops.py +4 -2
  109. classiq/interface/generator/arith/machine_precision.py +3 -0
  110. classiq/interface/generator/arith/number_utils.py +34 -44
  111. classiq/interface/generator/arith/register_user_input.py +21 -1
  112. classiq/interface/generator/arith/unary_ops.py +16 -25
  113. classiq/interface/generator/builtin_api_builder.py +0 -5
  114. classiq/interface/generator/chemistry_function_params.py +4 -4
  115. classiq/interface/generator/commuting_pauli_exponentiation.py +3 -1
  116. classiq/interface/generator/compiler_keywords.py +4 -0
  117. classiq/interface/generator/complex_type.py +3 -10
  118. classiq/interface/generator/constant.py +2 -3
  119. classiq/interface/generator/control_state.py +5 -3
  120. classiq/interface/generator/credit_risk_example/linear_gci.py +10 -3
  121. classiq/interface/generator/credit_risk_example/weighted_adder.py +14 -4
  122. classiq/interface/generator/expressions/atomic_expression_functions.py +5 -3
  123. classiq/interface/generator/expressions/evaluated_expression.py +18 -4
  124. classiq/interface/generator/expressions/expression.py +3 -5
  125. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +33 -0
  126. classiq/interface/generator/expressions/sympy_supported_expressions.py +2 -1
  127. classiq/interface/generator/finance.py +1 -1
  128. classiq/interface/generator/function_params.py +7 -6
  129. classiq/interface/generator/functions/__init__.py +2 -2
  130. classiq/interface/generator/functions/builtins/__init__.py +15 -0
  131. classiq/interface/generator/functions/builtins/core_library/__init__.py +14 -0
  132. classiq/interface/generator/functions/builtins/core_library/chemistry_functions.py +0 -0
  133. classiq/interface/generator/functions/builtins/internal_operators.py +62 -0
  134. classiq/interface/generator/functions/{core_lib_declarations/quantum_functions/std_lib_functions.py → builtins/open_lib_functions.py} +612 -219
  135. classiq/interface/generator/functions/builtins/quantum_operators.py +37 -0
  136. classiq/interface/generator/functions/classical_type.py +2 -4
  137. classiq/interface/generator/functions/foreign_function_definition.py +12 -4
  138. classiq/interface/generator/functions/function_declaration.py +2 -2
  139. classiq/interface/generator/functions/function_implementation.py +8 -4
  140. classiq/interface/generator/functions/native_function_definition.py +4 -2
  141. classiq/interface/generator/functions/register.py +4 -2
  142. classiq/interface/generator/functions/register_mapping_data.py +14 -10
  143. classiq/interface/generator/generated_circuit_data.py +2 -2
  144. classiq/interface/generator/grover_operator.py +5 -3
  145. classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +5 -1
  146. classiq/interface/generator/hardware/hardware_data.py +6 -4
  147. classiq/interface/generator/hardware_efficient_ansatz.py +25 -8
  148. classiq/interface/generator/hartree_fock.py +13 -3
  149. classiq/interface/generator/linear_pauli_rotations.py +3 -1
  150. classiq/interface/generator/mcu.py +5 -3
  151. classiq/interface/generator/mcx.py +7 -5
  152. classiq/interface/generator/model/classical_main_validator.py +1 -1
  153. classiq/interface/generator/model/constraints.py +2 -1
  154. classiq/interface/generator/model/model.py +12 -20
  155. classiq/interface/generator/model/preferences/preferences.py +4 -3
  156. classiq/interface/generator/oracles/custom_oracle.py +4 -2
  157. classiq/interface/generator/oracles/oracle_abc.py +2 -2
  158. classiq/interface/generator/qpe.py +6 -4
  159. classiq/interface/generator/qsvm.py +5 -8
  160. classiq/interface/generator/quantum_function_call.py +21 -16
  161. classiq/interface/generator/{generated_circuit.py → quantum_program.py} +10 -14
  162. classiq/interface/generator/range_types.py +3 -1
  163. classiq/interface/generator/slice_parsing_utils.py +8 -3
  164. classiq/interface/generator/standard_gates/controlled_standard_gates.py +4 -2
  165. classiq/interface/generator/state_preparation/metrics.py +2 -1
  166. classiq/interface/generator/state_preparation/state_preparation.py +7 -5
  167. classiq/interface/generator/state_propagator.py +16 -5
  168. classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -1
  169. classiq/interface/generator/types/struct_declaration.py +10 -7
  170. classiq/interface/generator/ucc.py +6 -4
  171. classiq/interface/generator/unitary_gate.py +7 -3
  172. classiq/interface/generator/validations/flow_graph.py +6 -4
  173. classiq/interface/generator/validations/validator_functions.py +6 -4
  174. classiq/interface/hardware.py +2 -2
  175. classiq/interface/helpers/custom_encoders.py +3 -0
  176. classiq/interface/helpers/pydantic_model_helpers.py +0 -6
  177. classiq/interface/helpers/validation_helpers.py +1 -1
  178. classiq/interface/helpers/versioned_model.py +4 -1
  179. classiq/interface/ide/show.py +2 -2
  180. classiq/interface/jobs.py +72 -3
  181. classiq/interface/model/bind_operation.py +18 -11
  182. classiq/interface/model/call_synthesis_data.py +68 -0
  183. classiq/interface/model/classical_if.py +13 -0
  184. classiq/interface/model/classical_parameter_declaration.py +2 -3
  185. classiq/interface/model/control.py +16 -0
  186. classiq/interface/model/handle_binding.py +3 -2
  187. classiq/interface/model/inplace_binary_operation.py +2 -2
  188. classiq/interface/model/invert.py +10 -0
  189. classiq/interface/model/model.py +29 -22
  190. classiq/interface/model/native_function_definition.py +3 -5
  191. classiq/interface/model/power.py +12 -0
  192. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +9 -4
  193. classiq/interface/model/quantum_expressions/control_state.py +2 -2
  194. classiq/interface/model/quantum_function_call.py +33 -142
  195. classiq/interface/model/quantum_function_declaration.py +8 -0
  196. classiq/interface/model/quantum_if_operation.py +4 -5
  197. classiq/interface/model/quantum_lambda_function.py +58 -0
  198. classiq/{quantum_register.py → interface/model/quantum_register.py} +17 -9
  199. classiq/interface/model/quantum_statement.py +3 -2
  200. classiq/interface/model/quantum_type.py +58 -59
  201. classiq/interface/model/quantum_variable_declaration.py +3 -3
  202. classiq/interface/model/repeat.py +13 -0
  203. classiq/interface/model/resolvers/function_call_resolver.py +26 -0
  204. classiq/interface/model/statement_block.py +49 -0
  205. classiq/interface/model/validations/handles_validator.py +16 -18
  206. classiq/interface/model/within_apply_operation.py +11 -0
  207. classiq/interface/pyomo_extension/pyomo_sympy_bimap.py +4 -1
  208. classiq/interface/server/routes.py +5 -4
  209. classiq/qmod/__init__.py +13 -6
  210. classiq/qmod/builtins/classical_execution_primitives.py +27 -36
  211. classiq/qmod/builtins/classical_functions.py +22 -12
  212. classiq/qmod/builtins/functions.py +272 -328
  213. classiq/qmod/builtins/operations.py +171 -35
  214. classiq/qmod/builtins/structs.py +15 -15
  215. classiq/qmod/cfunc.py +42 -0
  216. classiq/qmod/classical_function.py +6 -14
  217. classiq/qmod/declaration_inferrer.py +12 -21
  218. classiq/qmod/expression_query.py +23 -0
  219. classiq/qmod/model_state_container.py +2 -0
  220. classiq/qmod/native/__init__.py +0 -0
  221. classiq/qmod/native/expression_to_qmod.py +189 -0
  222. classiq/qmod/native/pretty_printer.py +340 -0
  223. classiq/qmod/qfunc.py +27 -0
  224. classiq/qmod/qmod_constant.py +100 -0
  225. classiq/qmod/qmod_parameter.py +36 -13
  226. classiq/qmod/qmod_struct.py +3 -3
  227. classiq/qmod/qmod_variable.py +148 -31
  228. classiq/qmod/quantum_callable.py +1 -0
  229. classiq/qmod/quantum_expandable.py +18 -19
  230. classiq/qmod/quantum_function.py +41 -8
  231. classiq/qmod/symbolic.py +48 -5
  232. classiq/qmod/symbolic_expr.py +9 -0
  233. classiq/qmod/utilities.py +13 -0
  234. classiq/qmod/write_qmod.py +39 -0
  235. {classiq-0.37.1.dist-info → classiq-0.39.0.dist-info}/METADATA +2 -1
  236. {classiq-0.37.1.dist-info → classiq-0.39.0.dist-info}/RECORD +244 -225
  237. {classiq-0.37.1.dist-info → classiq-0.39.0.dist-info}/WHEEL +1 -1
  238. classiq/applications/benchmarking/__init__.py +0 -9
  239. classiq/applications/benchmarking/mirror_benchmarking.py +0 -67
  240. classiq/applications/numpy_utils.py +0 -37
  241. classiq/applications_model_constructors/__init__.py +0 -17
  242. classiq/applications_model_constructors/combinatorial_optimization_model_constructor.py +0 -178
  243. classiq/applications_model_constructors/libraries/qmci_library.py +0 -109
  244. classiq/builtin_functions/__init__.py +0 -43
  245. classiq/builtin_functions/amplitude_loading.py +0 -3
  246. classiq/builtin_functions/binary_ops.py +0 -1
  247. classiq/builtin_functions/exponentiation.py +0 -5
  248. classiq/builtin_functions/qpe.py +0 -4
  249. classiq/builtin_functions/qsvm.py +0 -7
  250. classiq/builtin_functions/range_types.py +0 -5
  251. classiq/builtin_functions/standard_gates.py +0 -1
  252. classiq/builtin_functions/state_preparation.py +0 -6
  253. classiq/builtin_functions/suzuki_trotter.py +0 -3
  254. classiq/interface/generator/expressions/qmod_qnum_proxy.py +0 -22
  255. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
  256. classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -169
  257. classiq/interface/generator/types/builtin_struct_declarations/qaoa_declarations.py +0 -23
  258. classiq/interface/generator/types/combinatorial_problem.py +0 -26
  259. classiq/interface/model/numeric_reinterpretation.py +0 -25
  260. classiq/interface/model/operator_synthesis_data.py +0 -48
  261. classiq/model/__init__.py +0 -14
  262. classiq/model/composite_function_generator.py +0 -33
  263. classiq/model/function_handler.py +0 -466
  264. classiq/model/function_handler.pyi +0 -152
  265. classiq/model/logic_flow.py +0 -149
  266. classiq/model/logic_flow_change_handler.py +0 -71
  267. classiq/model/model.py +0 -246
  268. classiq/quantum_functions/__init__.py +0 -17
  269. classiq/quantum_functions/annotation_parser.py +0 -207
  270. classiq/quantum_functions/decorators.py +0 -22
  271. classiq/quantum_functions/function_library.py +0 -181
  272. classiq/quantum_functions/function_parser.py +0 -74
  273. classiq/quantum_functions/quantum_function.py +0 -236
  274. /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers}/__init__.py +0 -0
  275. /classiq/{interface/generator/functions/core_lib_declarations → applications/combinatorial_helpers/arithmetic}/__init__.py +0 -0
  276. /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → applications/combinatorial_helpers/pauli_helpers/__init__.py} +0 -0
  277. /classiq/{applications_model_constructors → applications}/libraries/ampltitude_estimation_library.py +0 -0
  278. /classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +0 -0
  279. /classiq/interface/generator/functions/{core_lib_declarations/quantum_functions → builtins/core_library}/atomic_quantum_functions.py +0 -0
  280. /classiq/interface/generator/functions/{core_lib_declarations/quantum_functions → builtins/core_library}/exponentiation_functions.py +0 -0
@@ -8,18 +8,12 @@ from classiq.interface.model.bind_operation import BindOperation
8
8
  from classiq.interface.model.handle_binding import HandleBinding, SlicedHandleBinding
9
9
  from classiq.interface.model.model import Model, SerializedModel
10
10
  from classiq.interface.model.native_function_definition import NativeFunctionDefinition
11
- from classiq.interface.model.numeric_reinterpretation import (
12
- NumericReinterpretationOperation,
13
- )
14
11
  from classiq.interface.model.port_declaration import PortDeclaration
15
12
  from classiq.interface.model.quantum_expressions.arithmetic_operation import (
16
13
  ArithmeticOperation,
17
14
  )
18
- from classiq.interface.model.quantum_function_call import (
19
- QuantumFunctionCall,
20
- QuantumLambdaFunction,
21
- )
22
- from classiq.interface.model.quantum_statement import QuantumStatement
15
+ from classiq.interface.model.quantum_function_call import QuantumFunctionCall
16
+ from classiq.interface.model.quantum_lambda_function import QuantumLambdaFunction
23
17
  from classiq.interface.model.quantum_type import QuantumNumeric
24
18
  from classiq.interface.model.variable_declaration_statement import (
25
19
  VariableDeclarationStatement,
@@ -32,44 +26,6 @@ _OUTPUT_VARIABLE_NAME = "result"
32
26
  _PREDICATE_FUNCTION_NAME = "expr_predicate"
33
27
 
34
28
 
35
- def split_registers(
36
- register_names: List[str],
37
- register_sizes: List[int],
38
- input_wire_name: str,
39
- ) -> List[QuantumStatement]:
40
- if len(register_names) == 0:
41
- return []
42
- wires = (
43
- [input_wire_name]
44
- + [f"split{i}" for i in range(len(register_names) - 2)]
45
- + [register_names[-1]]
46
- )
47
-
48
- if len(register_names) == 1:
49
- return [
50
- BindOperation(
51
- in_handle=HandleBinding(name=wires[0]),
52
- out_handle=HandleBinding(name=wires[1]),
53
- )
54
- ]
55
-
56
- return [
57
- QuantumFunctionCall(
58
- function="split",
59
- params={
60
- "out1_size": Expression(expr=f"{int(register_sizes[i])}"),
61
- "out2_size": Expression(expr=f"{int(sum(register_sizes[i + 1:]))}"),
62
- },
63
- inputs={"in": HandleBinding(name=wires[i])},
64
- outputs={
65
- "out1": HandleBinding(name=register),
66
- "out2": HandleBinding(name=wires[i + 1]),
67
- },
68
- )
69
- for i, register in enumerate(register_names[:-1])
70
- ]
71
-
72
-
73
29
  def _arithmetic_oracle_io_dict(
74
30
  definitions: List[Tuple[str, RegisterUserInput]], handle_name: str
75
31
  ) -> Dict[str, HandleBinding]:
@@ -89,12 +45,12 @@ def _construct_arithmetic_oracle(
89
45
  predicate_function: str,
90
46
  definitions: List[Tuple[str, RegisterUserInput]],
91
47
  ) -> QuantumFunctionCall:
92
- predicate_var_binding = _arithmetic_oracle_io_dict(definitions, "vars")
93
- predicate_var_binding["res"] = HandleBinding(name="result")
48
+ predicate_var_binding = _arithmetic_oracle_io_dict(definitions, "arg0")
49
+ predicate_var_binding["res"] = HandleBinding(name="arg1")
94
50
  return QuantumFunctionCall(
95
- function="simple_oracle",
51
+ function="phase_oracle",
96
52
  inouts={
97
- "target": HandleBinding(name="oq"),
53
+ "target": HandleBinding(name="arg0"),
98
54
  },
99
55
  operands={
100
56
  "predicate": QuantumLambdaFunction(
@@ -117,38 +73,17 @@ def grover_main_port_declarations(
117
73
  name: PortDeclaration(
118
74
  name=name,
119
75
  size=Expression(expr=f"{reg.size}"),
120
- quantum_type=QuantumNumeric(),
76
+ quantum_type=QuantumNumeric(
77
+ size=Expression(expr=f"{reg.size}"),
78
+ is_signed=Expression(expr=f"{reg.is_signed}"),
79
+ fraction_digits=Expression(expr=f"{reg.fraction_places}"),
80
+ ),
121
81
  direction=direction,
122
82
  )
123
83
  for name, reg in definitions
124
84
  }
125
85
 
126
86
 
127
- def _generate_variable_declaration_statements(
128
- definitions: List[Tuple[str, RegisterUserInput]]
129
- ) -> List[VariableDeclarationStatement]:
130
- ret = [VariableDeclarationStatement(name="gsq")]
131
- if len(definitions) >= 2:
132
- ret += [
133
- VariableDeclarationStatement(name=f"split{i}")
134
- for i in range(len(definitions) - 2)
135
- ]
136
- return ret
137
-
138
-
139
- def reinterpret_registers(
140
- definitions: List[Tuple[str, RegisterUserInput]]
141
- ) -> List[QuantumStatement]:
142
- return [
143
- NumericReinterpretationOperation(
144
- target=HandleBinding(name=name),
145
- fraction_digits=Expression(expr=f"{definition.fraction_places}"),
146
- is_signed=Expression(expr=f"{definition.is_signed}"),
147
- )
148
- for name, definition in definitions
149
- ]
150
-
151
-
152
87
  def construct_grover_model(
153
88
  definitions: List[Tuple[str, RegisterUserInput]],
154
89
  expression: str,
@@ -170,7 +105,6 @@ def construct_grover_model(
170
105
  name=_PREDICATE_FUNCTION_NAME,
171
106
  port_declarations=predicate_port_decls,
172
107
  body=[
173
- *reinterpret_registers(definitions),
174
108
  ArithmeticOperation(
175
109
  expression=Expression(expr=expression),
176
110
  result_var=HandleBinding(name="res"),
@@ -184,23 +118,22 @@ def construct_grover_model(
184
118
  definitions, PortDeclarationDirection.Output
185
119
  ),
186
120
  body=[
187
- *_generate_variable_declaration_statements(definitions),
121
+ VariableDeclarationStatement(name="packed_vars"),
188
122
  QuantumFunctionCall(
189
123
  function="allocate",
190
124
  positional_args=[
191
125
  Expression(expr=f"{num_qubits}"),
192
- HandleBinding(name="gsq"),
126
+ HandleBinding(name="packed_vars"),
193
127
  ],
194
128
  ),
195
129
  QuantumFunctionCall(
196
130
  function="grover_search",
197
131
  params={
198
- "num_qubits": Expression(expr=f"{num_qubits}"),
199
132
  "reps": Expression(expr=f"{num_reps}"),
200
133
  },
201
- inouts={"gsq": HandleBinding(name="gsq")},
134
+ inouts={"packed_vars": HandleBinding(name="packed_vars")},
202
135
  operands={
203
- "oracle_op": QuantumLambdaFunction(
136
+ "oracle": QuantumLambdaFunction(
204
137
  body=[
205
138
  _construct_arithmetic_oracle(
206
139
  _PREDICATE_FUNCTION_NAME,
@@ -210,18 +143,14 @@ def construct_grover_model(
210
143
  )
211
144
  },
212
145
  ),
213
- *split_registers(
214
- [name for name, _ in definitions],
215
- [reg.size for _, reg in definitions],
216
- "gsq",
146
+ BindOperation(
147
+ in_handles=[HandleBinding(name="packed_vars")],
148
+ out_handles=[
149
+ HandleBinding(name=name) for name, _ in definitions
150
+ ],
217
151
  ),
218
- *reinterpret_registers(definitions),
219
152
  ],
220
153
  ),
221
154
  ],
222
- classical_execution_code=f"""
223
- {_OUTPUT_VARIABLE_NAME} = sample()
224
- save({{{_OUTPUT_VARIABLE_NAME!r}: {_OUTPUT_VARIABLE_NAME}}})
225
- """,
226
155
  )
227
156
  return grover_model.get_model()
File without changes
@@ -0,0 +1,35 @@
1
+ from typing import cast
2
+
3
+ from classiq.interface.model.native_function_definition import NativeFunctionDefinition
4
+
5
+ from classiq.qmod import ( # type:ignore[attr-defined]
6
+ QArray,
7
+ QBit,
8
+ QCallable,
9
+ QNum,
10
+ Z,
11
+ amplitude_estimation,
12
+ qfunc,
13
+ )
14
+
15
+
16
+ @qfunc
17
+ def qmci(
18
+ space_transform: QCallable[QArray[QBit], QBit],
19
+ phase: QNum,
20
+ packed_vars: QArray[QBit],
21
+ ) -> None:
22
+ amplitude_estimation(
23
+ lambda reg: Z(reg[reg.len - 1]),
24
+ lambda reg: space_transform(reg[0 : reg.len - 1], reg[reg.len - 1]),
25
+ phase,
26
+ packed_vars,
27
+ )
28
+
29
+
30
+ QMCI_LIBRARY = [
31
+ cast(
32
+ NativeFunctionDefinition,
33
+ qmci.create_model().function_dict["qmci"],
34
+ ),
35
+ ]
@@ -5,8 +5,8 @@ from typing import Iterable, List, Tuple, Union
5
5
  from torch import Tensor
6
6
 
7
7
  from classiq.interface.generator.circuit_code.types_and_constants import QasmVersion
8
- from classiq.interface.generator.generated_circuit import GeneratedCircuit
9
8
  from classiq.interface.generator.model.preferences.preferences import QuantumFormat
9
+ from classiq.interface.generator.quantum_program import QuantumProgram
10
10
 
11
11
  from classiq.applications.qnn.types import Arguments, Circuit
12
12
  from classiq.exceptions import ClassiqQNNError, ClassiqValueError
@@ -95,7 +95,7 @@ def _get_extracted_parameters(obj: CircuitOrExtractedParameters) -> ParametersTu
95
95
  # This `if` is for caching
96
96
  if isinstance(obj, tuple):
97
97
  weight_params, input_params = obj
98
- elif isinstance(obj, GeneratedCircuit):
98
+ elif isinstance(obj, QuantumProgram):
99
99
  weight_params, input_params = extract_parameters(obj)
100
100
  else:
101
101
  raise ClassiqValueError("Invalid object passed to `map_parameters`")
@@ -4,7 +4,7 @@ from typing import Any
4
4
 
5
5
  from torch import Tensor
6
6
 
7
- from classiq.interface.generator.generated_circuit import GeneratedCircuit
7
+ from classiq.interface.generator.quantum_program import QuantumProgram
8
8
 
9
9
  from classiq.applications.qnn.circuit_utils import extract_parameters, validate_circuit
10
10
  from classiq.applications.qnn.types import ExecuteFunction, PostProcessFunction
@@ -23,7 +23,7 @@ class QuantumGradient(abc.ABC):
23
23
  self._execute = execute
24
24
  self._post_process = post_process
25
25
 
26
- circuit = GeneratedCircuit.parse_raw(quantum_program)
26
+ circuit = QuantumProgram.parse_raw(quantum_program)
27
27
  validate_circuit(circuit)
28
28
  self._quantum_program = quantum_program
29
29
  self._parameters_names = extract_parameters(circuit)
@@ -5,13 +5,13 @@ from torch import Tensor
5
5
 
6
6
  from classiq.interface.executor.execution_result import ResultsCollection, SavedResult
7
7
 
8
- from classiq import GeneratedCircuit
8
+ from classiq import QuantumProgram
9
9
  from classiq.synthesis import SerializedQuantumProgram
10
10
 
11
11
  Arguments = Dict[str, float]
12
12
  MultipleArguments = Tuple[Arguments, ...]
13
13
 
14
- Circuit = GeneratedCircuit
14
+ Circuit = QuantumProgram
15
15
  ExecuteFunction = Callable[
16
16
  [SerializedQuantumProgram, MultipleArguments], ResultsCollection
17
17
  ]
@@ -4,5 +4,9 @@ from classiq.interface.generator.expressions.enums.qsvm_feature_map_entanglement
4
4
 
5
5
  from ..qsvm import qsvm_data_generation
6
6
  from .qsvm import * # noqa: F403
7
+ from .qsvm_model_constructor import construct_qsvm_model
7
8
 
8
- __all__ = ["QSVMFeatureMapEntanglement"]
9
+ __all__ = [
10
+ "QSVMFeatureMapEntanglement",
11
+ "construct_qsvm_model",
12
+ ]
@@ -1,15 +1,12 @@
1
- from typing import Any, List, Union
1
+ from typing import List
2
2
 
3
- import numpy as np
4
-
5
- from classiq.interface.applications.qsvm import DataList, QSVMData, QSVMPreferences
6
-
7
- Data = Union[DataList, np.ndarray]
8
- Labels = Union[List[Any], np.ndarray]
3
+ from classiq.interface.applications.qsvm import Data, Labels, QSVMData, QSVMPreferences
9
4
 
10
5
  __all__ = [
11
6
  "QSVMData",
12
7
  "QSVMPreferences",
8
+ "Data",
9
+ "Labels",
13
10
  ]
14
11
 
15
12
 
@@ -24,11 +24,8 @@ def generate_data(
24
24
 
25
25
  results = {}
26
26
  for index, s in enumerate(sources):
27
- temp = []
28
- # for each dimension
29
- for point in s:
30
- # draw from a gaussian distribution
31
- temp.append(np.random.normal(point, std, amount))
27
+ # for each dimension draw from a gaussian distribution
28
+ temp = [np.random.normal(point, std, amount) for point in s]
32
29
  # combine the list of np.arrays
33
30
  results[index] = np.array(list(zip(*temp)))
34
31
 
classiq/exceptions.py CHANGED
@@ -1,5 +1,5 @@
1
1
  import logging
2
- from typing import List
2
+ from typing import Iterable, List
3
3
 
4
4
  _logger = logging.getLogger(__name__)
5
5
 
@@ -129,3 +129,45 @@ class ClassiqMismatchIOsError(ClassiqError):
129
129
 
130
130
  class ClassiqNotImplementedError(ClassiqError, NotImplementedError):
131
131
  pass
132
+
133
+
134
+ class ClassiqCombOptError(ClassiqError):
135
+ pass
136
+
137
+
138
+ class ClassiqCombOptNoSolutionError(ClassiqError):
139
+
140
+ def __init__(self) -> None:
141
+ super().__init__("There is no valid solution for this optimization problem.")
142
+
143
+
144
+ class ClassiqCombOptTrivialProblemError(ClassiqError):
145
+
146
+ def __init__(self, solution: List[int]) -> None:
147
+ super().__init__(
148
+ message=f"The problem doesn't have free decision variables. "
149
+ f"The trivial solution is {solution}."
150
+ )
151
+
152
+
153
+ class ClassiqCombOptInvalidEncodingTypeError(ClassiqError):
154
+
155
+ def __init__(self, encoding_type: str, valid_types: Iterable[str]) -> None:
156
+ super().__init__(
157
+ f"Invalid variable encoding type {encoding_type}. "
158
+ f"The available encoding types are {list(valid_types)}"
159
+ )
160
+
161
+
162
+ class ClassiqNonNumericCoefficientInPauliError(ClassiqError):
163
+ pass
164
+
165
+
166
+ class ClassiqCombOptNotSupportedProblemError(ClassiqCombOptError):
167
+ pass
168
+
169
+
170
+ class ClassiqExecutorInvalidHamiltonianError(ClassiqCombOptError):
171
+
172
+ def __init__(self) -> None:
173
+ super().__init__("Invalid hamiltonian")
@@ -0,0 +1,13 @@
1
+ from typing import List
2
+
3
+ from classiq.interface.hardware import HardwareInformation
4
+
5
+ from classiq._internals import async_utils
6
+ from classiq._internals.api_wrapper import ApiWrapper
7
+
8
+
9
+ def get_all_hardware_devices() -> List[HardwareInformation]:
10
+ """
11
+ Returns a list of all hardware devices known to Classiq.
12
+ """
13
+ return async_utils.run(ApiWrapper.call_get_all_hardware_devices())
classiq/executor.py CHANGED
@@ -13,6 +13,7 @@ from classiq.interface.executor.execution_preferences import ExecutionPreference
13
13
  from classiq.interface.executor.execution_request import (
14
14
  EstimateOperatorsExecution,
15
15
  ExecutionRequest,
16
+ QuantumCodeExecution,
16
17
  )
17
18
  from classiq.interface.executor.execution_result import (
18
19
  ResultsCollection,
@@ -20,19 +21,20 @@ from classiq.interface.executor.execution_result import (
20
21
  TaggedEstimationResult,
21
22
  TaggedExecutionDetails,
22
23
  )
24
+ from classiq.interface.executor.quantum_code import MultipleArguments, QuantumCode
23
25
  from classiq.interface.executor.quantum_instruction_set import QuantumInstructionSet
24
- from classiq.interface.executor.quantum_program import MultipleArguments, QuantumProgram
25
26
  from classiq.interface.executor.result import ExecutionDetails
26
- from classiq.interface.generator.generated_circuit import GeneratedCircuit
27
+ from classiq.interface.generator.quantum_program import QuantumProgram
27
28
 
28
29
  from classiq._internals.api_wrapper import ApiWrapper
29
30
  from classiq._internals.async_utils import syncify_function
30
31
  from classiq.execution.jobs import ExecutionJob
31
- from classiq.model.model import DEFAULT_RESULT_NAME
32
32
  from classiq.synthesis import SerializedQuantumProgram
33
33
 
34
+ DEFAULT_RESULT_NAME = "result"
35
+
34
36
  BatchExecutionResult: TypeAlias = Union[ExecutionDetails, BaseException]
35
- ProgramAndResult: TypeAlias = Tuple[QuantumProgram, BatchExecutionResult]
37
+ ProgramAndResult: TypeAlias = Tuple[QuantumCode, BatchExecutionResult]
36
38
  BackendPreferencesAndResult: TypeAlias = Tuple[
37
39
  BackendPreferencesTypes, int, BatchExecutionResult
38
40
  ]
@@ -41,8 +43,8 @@ _MAX_ARGUMENTS_SIZE = 1024
41
43
 
42
44
  def _parse_serialized_qprog(
43
45
  quantum_program: SerializedQuantumProgram,
44
- ) -> GeneratedCircuit:
45
- return GeneratedCircuit.parse_raw(quantum_program)
46
+ ) -> QuantumProgram:
47
+ return QuantumProgram.parse_raw(quantum_program)
46
48
 
47
49
 
48
50
  async def execute_async(quantum_program: SerializedQuantumProgram) -> ExecutionJob:
@@ -55,7 +57,7 @@ execute = syncify_function(execute_async)
55
57
 
56
58
 
57
59
  async def _execute_qnn_async_estimate(
58
- quantum_program: QuantumProgram,
60
+ quantum_program: QuantumCode,
59
61
  execution_preferences: ExecutionPreferences,
60
62
  observables: PauliOperators,
61
63
  ) -> ResultsCollection:
@@ -79,11 +81,11 @@ async def _execute_qnn_async_estimate(
79
81
 
80
82
 
81
83
  async def _execute_qnn_async_program(
82
- quantum_program: QuantumProgram,
84
+ quantum_program: QuantumCode,
83
85
  execution_preferences: ExecutionPreferences,
84
86
  ) -> ResultsCollection:
85
87
  request = ExecutionRequest(
86
- execution_payload=quantum_program.dict(),
88
+ execution_payload=QuantumCodeExecution(**quantum_program.dict()),
87
89
  preferences=execution_preferences,
88
90
  )
89
91
 
@@ -154,7 +156,7 @@ def set_initial_values(
154
156
 
155
157
 
156
158
  __all__ = [
157
- "QuantumProgram",
159
+ "QuantumCode",
158
160
  "QuantumInstructionSet",
159
161
  "execute_qnn",
160
162
  "OperatorsEstimation",
@@ -3,5 +3,5 @@ from packaging.version import Version
3
3
  # This file was generated automatically
4
4
  # Please don't track in version control (DONTTRACK)
5
5
 
6
- SEMVER_VERSION = '0.37.1'
6
+ SEMVER_VERSION = '0.39.0'
7
7
  VERSION = str(Version(SEMVER_VERSION))
@@ -8,7 +8,9 @@ from classiq.interface.backend.quantum_backend_providers import AnalyzerProvider
8
8
  from classiq.interface.chemistry.ground_state_problem import MoleculeProblem
9
9
  from classiq.interface.executor.optimizer_preferences import OptimizerPreferences
10
10
  from classiq.interface.generator.hardware.hardware_data import SynthesisHardwareData
11
- from classiq.interface.generator.model.preferences.preferences import Preferences
11
+ from classiq.interface.generator.model.preferences.preferences import (
12
+ TranspilationOption,
13
+ )
12
14
  from classiq.interface.hardware import Provider
13
15
  from classiq.interface.helpers.custom_pydantic_types import PydanticNonEmptyString
14
16
 
@@ -44,7 +46,8 @@ class AnalysisOptionalDevicesParams(HardwareListParams):
44
46
 
45
47
  class AnalysisHardwareTranspilationParams(pydantic.BaseModel):
46
48
  hardware_data: Optional[SynthesisHardwareData]
47
- model_preferences: Preferences
49
+ random_seed: int
50
+ transpilation_option: TranspilationOption
48
51
 
49
52
 
50
53
  class AnalysisHardwareListParams(AnalysisParams, HardwareListParams):
@@ -87,7 +90,7 @@ class ChemistryGenerationParams(pydantic.BaseModel):
87
90
  def initial_point(self) -> Optional[numpy.ndarray]:
88
91
  if self.optimizer_preferences.initial_point is not None:
89
92
  return numpy.ndarray(
90
- self.optimizer_preferences.initial_point # type: ignore
93
+ self.optimizer_preferences.initial_point # type: ignore[arg-type]
91
94
  )
92
95
  else:
93
96
  return None
@@ -1,13 +1,15 @@
1
- from typing import Dict, List, Optional, Set, Tuple
1
+ from typing import Dict, List, Literal, Optional, Set, Tuple, Union
2
2
  from uuid import UUID
3
3
 
4
4
  import pydantic
5
- from pydantic import AnyHttpUrl
5
+ from pydantic import Field
6
+ from typing_extensions import Annotated
6
7
 
7
8
  from classiq.interface.helpers.custom_pydantic_types import PydanticNonEmptyString
8
9
  from classiq.interface.helpers.versioned_model import VersionedModel
9
10
 
10
11
  from classiq._internals.enum_utils import StrEnum
12
+ from classiq.exceptions import ClassiqValueError
11
13
 
12
14
  Match = List[List[int]]
13
15
 
@@ -18,6 +20,7 @@ class GraphStatus(StrEnum):
18
20
 
19
21
 
20
22
  class GraphResult(VersionedModel):
23
+ kind: Literal["graph"] = Field(default="graph")
21
24
  details: str
22
25
 
23
26
 
@@ -38,10 +41,6 @@ class QasmCode(pydantic.BaseModel):
38
41
  code: str
39
42
 
40
43
 
41
- class PreSignedS3Url(VersionedModel):
42
- url: AnyHttpUrl
43
-
44
-
45
44
  class AnalysisStatus(StrEnum):
46
45
  NONE = "none"
47
46
  SUCCESS = "success"
@@ -79,7 +78,7 @@ class HardwareComparisonInformation(pydantic.BaseModel):
79
78
  def validate_equal_length(cls, values: Dict[str, list]) -> Dict[str, list]:
80
79
  lengths = list(map(len, values.values()))
81
80
  if len(set(lengths)) != 1:
82
- raise ValueError("All lists should have the same length")
81
+ raise ClassiqValueError("All lists should have the same length")
83
82
  return values
84
83
 
85
84
 
@@ -103,10 +102,15 @@ class SingleHardwareInformation(pydantic.BaseModel):
103
102
  )
104
103
 
105
104
 
106
- class HardwareComparisonData(pydantic.BaseModel):
105
+ class HardwareComparisonData(VersionedModel):
106
+ kind: Literal["hardware_comparison"] = Field(default="hardware_comparison")
107
107
  data: List[SingleHardwareInformation]
108
108
 
109
109
 
110
+ HardwareComparisonGraphType = Annotated[
111
+ Union[HardwareComparisonData, GraphResult], Field(discriminator="kind")
112
+ ]
113
+
110
114
  _HARDWARE_COMPARISON_TABLE_COLUMNS_NAMES: Dict[str, str] = {
111
115
  s.upper(): s.capitalize() for s in SingleHardwareInformation.__fields__
112
116
  }
@@ -1,5 +1,13 @@
1
1
  from collections.abc import Sequence
2
- from typing import TYPE_CHECKING, Iterable as IterableType, List, Optional, Tuple, Union
2
+ from typing import (
3
+ TYPE_CHECKING,
4
+ Any,
5
+ Iterable as IterableType,
6
+ List,
7
+ Optional,
8
+ Tuple,
9
+ Union,
10
+ )
3
11
 
4
12
  import numpy as np
5
13
  import pydantic
@@ -95,11 +103,13 @@ class QSVMData(VersionedModel):
95
103
  extra = "forbid"
96
104
 
97
105
  @pydantic.validator("data", pre=True)
98
- def set_data(cls, data):
106
+ def set_data(cls, data: Union[IterableType, ArrayLike]) -> list:
99
107
  return listify(data)
100
108
 
101
109
  @pydantic.validator("labels", pre=True)
102
- def set_labels(cls, labels):
110
+ def set_labels(
111
+ cls, labels: Optional[Union[IterableType, ArrayLike]]
112
+ ) -> Optional[list]:
103
113
  if labels is None:
104
114
  return None
105
115
  else:
@@ -112,3 +122,7 @@ class QSVMTestResult(VersionedModel):
112
122
 
113
123
  class QSVMPredictResult(VersionedModel):
114
124
  data: list # serialized np.array
125
+
126
+
127
+ Data = Union[DataList, np.ndarray]
128
+ Labels = Union[List[Any], np.ndarray]
@@ -0,0 +1,23 @@
1
+ from typing import Optional
2
+
3
+ import pydantic
4
+
5
+ from classiq.interface.helpers.hashable_pydantic_base_model import (
6
+ HashablePydanticBaseModel,
7
+ )
8
+
9
+
10
+ class SourceReference(pydantic.BaseModel):
11
+ start_line: int
12
+ start_column: int
13
+ end_line: int
14
+ end_column: int
15
+ file_name: Optional[str] = pydantic.Field(default=None)
16
+
17
+
18
+ class ASTNode(pydantic.BaseModel):
19
+ source_ref: Optional[SourceReference] = pydantic.Field(default=None)
20
+
21
+
22
+ class HashableASTNode(ASTNode, HashablePydanticBaseModel):
23
+ pass
@@ -22,6 +22,8 @@ from classiq.interface.backend.quantum_backend_providers import (
22
22
  from classiq.interface.hardware import Provider
23
23
  from classiq.interface.helpers.pydantic_model_helpers import values_with_discriminator
24
24
 
25
+ from classiq.exceptions import ClassiqValueError
26
+
25
27
 
26
28
  class BackendPreferences(BaseModel):
27
29
  # Due to the way the field is currently implemented, i.e. it redefined with different types
@@ -103,7 +105,7 @@ class AwsBackendPreferences(BackendPreferences):
103
105
  ) -> str:
104
106
  s3_bucket_name = s3_bucket_name.strip()
105
107
  if not s3_bucket_name.startswith("amazon-braket-"):
106
- raise ValueError('S3 bucket name should start with "amazon-braket-"')
108
+ raise ClassiqValueError('S3 bucket name should start with "amazon-braket-"')
107
109
  return s3_bucket_name
108
110
 
109
111
  @pydantic.root_validator(pre=True)
@@ -273,7 +275,7 @@ def validate_backend_service_provider(backend_service_provider: Any) -> Provider
273
275
  for member in Provider:
274
276
  if member.lower() == backend_service_provider.lower():
275
277
  return Provider(member)
276
- raise ValueError(
278
+ raise ClassiqValueError(
277
279
  f"""Vendor {backend_service_provider} is not supported.
278
280
  The supported providers are {', '.join(Provider)}."""
279
281
  )
@@ -13,6 +13,8 @@ INVALID_EMAIL_OQC: str = "aa@aa.aa"
13
13
  INVALID_PASSWORD_OQC: str = "Aa1!Aa1!"
14
14
  MAX_EXECUTION_TIMEOUT_SECONDS = timedelta(hours=4).total_seconds()
15
15
 
16
+ EXECUTION_PARAMETER_PATTERN = "[_a-z][_a-z0-9]*"
17
+
16
18
  if TYPE_CHECKING:
17
19
  PydanticExecutionTimeout = int
18
20
  PydanticAwsRoleArn = str
@@ -46,4 +48,4 @@ else:
46
48
 
47
49
  PydanticArgumentNameType = pydantic.constr(regex="[_a-zA-Z][_a-zA-Z0-9]*")
48
50
 
49
- PydanticExecutionParameter = pydantic.constr(regex="[_a-z][_a-z0-9]*")
51
+ PydanticExecutionParameter = pydantic.constr(regex=EXECUTION_PARAMETER_PATTERN)