classiq 0.51.0__py3-none-any.whl → 0.52.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 (150) hide show
  1. classiq/_internals/api_wrapper.py +41 -15
  2. classiq/_internals/authentication/auth0.py +20 -4
  3. classiq/_internals/authentication/password_manager.py +16 -4
  4. classiq/_internals/client.py +2 -2
  5. classiq/_internals/host_checker.py +5 -3
  6. classiq/_internals/jobs.py +3 -3
  7. classiq/analyzer/analyzer_utilities.py +1 -1
  8. classiq/applications/chemistry/ground_state_problem.py +1 -1
  9. classiq/applications/combinatorial_helpers/pyomo_utils.py +3 -1
  10. classiq/applications/qnn/gradients/quantum_gradient.py +1 -1
  11. classiq/applications/qnn/qlayer.py +2 -2
  12. classiq/execution/__init__.py +3 -0
  13. classiq/execution/execution_session.py +2 -2
  14. classiq/execution/iqcc.py +63 -0
  15. classiq/execution/jobs.py +2 -2
  16. classiq/executor.py +2 -2
  17. classiq/interface/_version.py +1 -1
  18. classiq/interface/analyzer/analysis_params.py +19 -9
  19. classiq/interface/analyzer/cytoscape_graph.py +10 -3
  20. classiq/interface/analyzer/result.py +6 -5
  21. classiq/interface/applications/qsvm.py +13 -12
  22. classiq/interface/backend/backend_preferences.py +78 -105
  23. classiq/interface/backend/ionq/ionq_quantum_program.py +12 -19
  24. classiq/interface/backend/pydantic_backend.py +24 -12
  25. classiq/interface/backend/quantum_backend_providers.py +2 -0
  26. classiq/interface/chemistry/fermionic_operator.py +7 -7
  27. classiq/interface/chemistry/ground_state_problem.py +23 -18
  28. classiq/interface/chemistry/molecule.py +10 -5
  29. classiq/interface/chemistry/operator.py +71 -44
  30. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +2 -1
  31. classiq/interface/debug_info/debug_info.py +3 -4
  32. classiq/interface/execution/iqcc.py +21 -0
  33. classiq/interface/execution/jobs.py +10 -10
  34. classiq/interface/executor/aws_execution_cost.py +37 -20
  35. classiq/interface/executor/execution_preferences.py +1 -2
  36. classiq/interface/executor/execution_request.py +2 -2
  37. classiq/interface/executor/execution_result.py +4 -2
  38. classiq/interface/executor/iqae_result.py +1 -1
  39. classiq/interface/executor/optimizer_preferences.py +14 -10
  40. classiq/interface/executor/quantum_code.py +21 -16
  41. classiq/interface/executor/register_initialization.py +10 -10
  42. classiq/interface/executor/result.py +19 -16
  43. classiq/interface/executor/vqe_result.py +1 -1
  44. classiq/interface/finance/function_input.py +27 -18
  45. classiq/interface/finance/log_normal_model_input.py +2 -2
  46. classiq/interface/finance/model_input.py +3 -2
  47. classiq/interface/generator/amplitude_loading.py +8 -6
  48. classiq/interface/generator/arith/argument_utils.py +24 -0
  49. classiq/interface/generator/arith/arithmetic.py +5 -3
  50. classiq/interface/generator/arith/arithmetic_expression_abc.py +36 -14
  51. classiq/interface/generator/arith/arithmetic_operations.py +6 -3
  52. classiq/interface/generator/arith/binary_ops.py +88 -63
  53. classiq/interface/generator/arith/extremum_operations.py +22 -13
  54. classiq/interface/generator/arith/logical_ops.py +6 -4
  55. classiq/interface/generator/arith/number_utils.py +3 -3
  56. classiq/interface/generator/arith/register_user_input.py +32 -17
  57. classiq/interface/generator/arith/unary_ops.py +5 -4
  58. classiq/interface/generator/chemistry_function_params.py +2 -1
  59. classiq/interface/generator/circuit_code/circuit_code.py +2 -1
  60. classiq/interface/generator/commuting_pauli_exponentiation.py +6 -5
  61. classiq/interface/generator/complex_type.py +14 -18
  62. classiq/interface/generator/control_state.py +32 -26
  63. classiq/interface/generator/expressions/expression.py +6 -5
  64. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +3 -3
  65. classiq/interface/generator/function_params.py +22 -39
  66. classiq/interface/generator/functions/classical_function_declaration.py +1 -1
  67. classiq/interface/generator/functions/classical_type.py +32 -23
  68. classiq/interface/generator/functions/concrete_types.py +8 -7
  69. classiq/interface/generator/functions/function_declaration.py +4 -5
  70. classiq/interface/generator/functions/type_name.py +5 -4
  71. classiq/interface/generator/generated_circuit_data.py +9 -6
  72. classiq/interface/generator/grover_diffuser.py +26 -18
  73. classiq/interface/generator/grover_operator.py +32 -22
  74. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +3 -4
  75. classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
  76. classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +8 -7
  77. classiq/interface/generator/hardware/hardware_data.py +27 -26
  78. classiq/interface/generator/hardware_efficient_ansatz.py +11 -6
  79. classiq/interface/generator/hartree_fock.py +2 -1
  80. classiq/interface/generator/identity.py +7 -2
  81. classiq/interface/generator/linear_pauli_rotations.py +27 -14
  82. classiq/interface/generator/mcu.py +15 -12
  83. classiq/interface/generator/mcx.py +18 -10
  84. classiq/interface/generator/model/constraints.py +4 -2
  85. classiq/interface/generator/model/model.py +2 -1
  86. classiq/interface/generator/model/preferences/preferences.py +30 -32
  87. classiq/interface/generator/oracles/custom_oracle.py +13 -10
  88. classiq/interface/generator/piecewise_linear_amplitude_loading.py +37 -21
  89. classiq/interface/generator/qpe.py +38 -26
  90. classiq/interface/generator/qsvm.py +4 -4
  91. classiq/interface/generator/quantum_function_call.py +57 -44
  92. classiq/interface/generator/quantum_program.py +8 -6
  93. classiq/interface/generator/range_types.py +10 -11
  94. classiq/interface/generator/standard_gates/controlled_standard_gates.py +9 -5
  95. classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
  96. classiq/interface/generator/standard_gates/u_gate.py +7 -10
  97. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
  98. classiq/interface/generator/state_preparation/distributions.py +12 -12
  99. classiq/interface/generator/state_preparation/state_preparation.py +22 -16
  100. classiq/interface/generator/types/enum_declaration.py +2 -1
  101. classiq/interface/generator/ucc.py +2 -1
  102. classiq/interface/generator/unitary_gate.py +2 -1
  103. classiq/interface/generator/user_defined_function_params.py +3 -0
  104. classiq/interface/generator/visitor.py +1 -1
  105. classiq/interface/hardware.py +18 -3
  106. classiq/interface/helpers/custom_pydantic_types.py +38 -47
  107. classiq/interface/helpers/pydantic_model_helpers.py +3 -2
  108. classiq/interface/helpers/versioned_model.py +1 -4
  109. classiq/interface/ide/ide_data.py +5 -5
  110. classiq/interface/ide/visual_model.py +5 -5
  111. classiq/interface/interface_version.py +1 -1
  112. classiq/interface/jobs.py +12 -22
  113. classiq/interface/model/bind_operation.py +2 -1
  114. classiq/interface/model/classical_parameter_declaration.py +10 -4
  115. classiq/interface/model/handle_binding.py +20 -24
  116. classiq/interface/model/inplace_binary_operation.py +16 -9
  117. classiq/interface/model/model.py +21 -11
  118. classiq/interface/model/port_declaration.py +10 -7
  119. classiq/interface/model/quantum_expressions/arithmetic_operation.py +6 -4
  120. classiq/interface/model/quantum_function_declaration.py +22 -11
  121. classiq/interface/model/quantum_statement.py +6 -7
  122. classiq/interface/model/quantum_type.py +22 -19
  123. classiq/interface/model/statement_block.py +9 -9
  124. classiq/interface/server/global_versions.py +4 -5
  125. classiq/interface/server/routes.py +8 -0
  126. classiq/model_expansions/evaluators/parameter_types.py +3 -3
  127. classiq/model_expansions/expression_renamer.py +1 -1
  128. classiq/model_expansions/quantum_operations/control.py +11 -12
  129. classiq/model_expansions/quantum_operations/emitter.py +22 -0
  130. classiq/model_expansions/quantum_operations/expression_operation.py +2 -20
  131. classiq/model_expansions/quantum_operations/inplace_binary_operation.py +65 -14
  132. classiq/model_expansions/quantum_operations/invert.py +1 -1
  133. classiq/model_expansions/quantum_operations/phase.py +4 -5
  134. classiq/model_expansions/quantum_operations/power.py +1 -1
  135. classiq/model_expansions/quantum_operations/quantum_assignment_operation.py +50 -9
  136. classiq/model_expansions/quantum_operations/variable_decleration.py +2 -2
  137. classiq/model_expansions/quantum_operations/within_apply.py +1 -1
  138. classiq/qmod/builtins/__init__.py +1 -3
  139. classiq/qmod/builtins/functions/__init__.py +4 -0
  140. classiq/qmod/builtins/functions/arithmetic.py +10 -0
  141. classiq/qmod/create_model_function.py +14 -8
  142. classiq/qmod/quantum_expandable.py +22 -9
  143. classiq/qmod/quantum_function.py +1 -1
  144. classiq/qmod/semantics/static_semantics_visitor.py +3 -1
  145. classiq/qmod/type_attribute_remover.py +1 -1
  146. classiq/qmod/write_qmod.py +2 -4
  147. classiq/synthesis.py +11 -13
  148. {classiq-0.51.0.dist-info → classiq-0.52.0.dist-info}/METADATA +3 -2
  149. {classiq-0.51.0.dist-info → classiq-0.52.0.dist-info}/RECORD +150 -148
  150. {classiq-0.51.0.dist-info → classiq-0.52.0.dist-info}/WHEEL +0 -0
@@ -17,12 +17,16 @@ from typing import (
17
17
  overload,
18
18
  )
19
19
 
20
+ import pydantic
20
21
  from sympy import Basic
21
22
  from typing_extensions import Self
22
23
 
23
24
  from classiq.interface.exceptions import ClassiqValueError
24
25
  from classiq.interface.generator.expressions.expression import Expression
25
- from classiq.interface.generator.functions.concrete_types import PythonClassicalTypes
26
+ from classiq.interface.generator.functions.concrete_types import (
27
+ NativePythonClassicalTypes,
28
+ PythonClassicalPydanticTypes,
29
+ )
26
30
  from classiq.interface.model.classical_parameter_declaration import (
27
31
  AnonClassicalParameterDeclaration,
28
32
  )
@@ -334,15 +338,24 @@ def prepare_arg(
334
338
  def _validate_classical_arg(
335
339
  arg: Any, arg_decl: AnonClassicalParameterDeclaration, func_name: Optional[str]
336
340
  ) -> None:
341
+ is_native_or_compatible_type = not isinstance(
342
+ arg, (*NativePythonClassicalTypes, CParam, SymbolicExpr, Basic, PythonEnum)
343
+ ) and not is_dataclass(
344
+ arg
345
+ ) # type: ignore[unreachable]
346
+ try:
347
+ is_pydantic_classical_type = isinstance(
348
+ arg, pydantic.BaseModel
349
+ ) and not isinstance(arg, PythonClassicalPydanticTypes)
350
+ except ClassiqValueError:
351
+ is_pydantic_classical_type = False
352
+
353
+ is_incompatible_symbolic_expr = isinstance(arg, SymbolicExpr) and arg.is_quantum
354
+
337
355
  if (
338
- not isinstance(
339
- arg, (*PythonClassicalTypes, CParam, SymbolicExpr, Basic, PythonEnum)
340
- )
341
- and not is_dataclass(arg) # type:ignore[unreachable]
342
- or isinstance(arg, SymbolicExpr)
343
- and arg.is_quantum
344
- ):
345
- func_name_message = "" if func_name is None else f" of function {func_name!r}"
356
+ is_native_or_compatible_type or is_pydantic_classical_type
357
+ ) or is_incompatible_symbolic_expr:
358
+ func_name_message = f" of function {func_name!r}" if func_name else ""
346
359
  raise ClassiqValueError(
347
360
  f"Argument {str(arg)!r} to parameter {arg_decl.name!r}{func_name_message} "
348
361
  f"has incompatible type; expected "
@@ -82,7 +82,7 @@ class QFunc(QExpandable):
82
82
  return
83
83
  super().expand()
84
84
  self._qmodule.native_defs[self.func_decl.name] = NativeFunctionDefinition(
85
- **{**self.func_decl.dict(), **{"body": self.body}}
85
+ **{**self.func_decl.model_dump(), **{"body": self.body}}
86
86
  )
87
87
 
88
88
  def _add_constants_from_classical_code(
@@ -209,7 +209,9 @@ class StaticSemanticsVisitor(Visitor):
209
209
  **self.current_scope.operands,
210
210
  },
211
211
  )
212
- elif isinstance(op, InplaceBinaryOperation):
212
+ elif isinstance(op, InplaceBinaryOperation) and isinstance(
213
+ op.value, HandleBinding
214
+ ):
213
215
  check_no_overlapping_quantum_args(
214
216
  [op.target, op.value], op.operation.value
215
217
  )
@@ -10,7 +10,7 @@ def decl_without_type_attributes(
10
10
  operand_declaration: AnonQuantumOperandDeclaration,
11
11
  ) -> AnonQuantumOperandDeclaration:
12
12
  remover = AttributeRemover()
13
- return operand_declaration.copy(
13
+ return operand_declaration.model_copy(
14
14
  update=dict(
15
15
  positional_arg_declarations=[
16
16
  remover.visit(arg) if isinstance(arg, PortDeclaration) else arg
@@ -31,14 +31,12 @@ def write_qmod(
31
31
  None
32
32
  """
33
33
 
34
- model = Model.parse_raw(serialized_model)
34
+ model = Model.model_validate_json(serialized_model)
35
35
  pretty_printed_model = DSLPrettyPrinter(decimal_precision=decimal_precision).visit(
36
36
  model
37
37
  )
38
38
 
39
- synthesis_options = model.dict(
40
- include={"constraints", "preferences"}, exclude_unset=True
41
- )
39
+ synthesis_options = model.model_dump(include={"constraints", "preferences"})
42
40
 
43
41
  synthesis_options_path = Path(f"{name}.{_SYNTHESIS_OPTIONS_SUFFIX}")
44
42
  if directory is not None:
classiq/synthesis.py CHANGED
@@ -32,8 +32,8 @@ def show(quantum_program: SerializedQuantumProgram) -> None:
32
32
  [Visualization tool](https://docs.classiq.io/latest/reference-manual/analyzer/quantum-program-visualization-tool/)
33
33
  """
34
34
  try:
35
- circuit = QuantumProgram.parse_raw(quantum_program)
36
- except pydantic.error_wrappers.ValidationError as exc:
35
+ circuit = QuantumProgram.model_validate_json(quantum_program)
36
+ except pydantic.ValidationError as exc:
37
37
  raise ClassiqValueError(CANT_PARSE_QUANTUM_PROGRAM_MSG) from exc
38
38
  circuit.show() # type: ignore[attr-defined]
39
39
 
@@ -42,7 +42,7 @@ async def quantum_program_from_qasm_async(qasm: str) -> SerializedQuantumProgram
42
42
  quantum_program = await ApiWrapper.get_generated_circuit_from_qasm(
43
43
  QasmCode(code=qasm)
44
44
  )
45
- return SerializedQuantumProgram(quantum_program.json())
45
+ return SerializedQuantumProgram(quantum_program.model_dump_json())
46
46
 
47
47
 
48
48
  def quantum_program_from_qasm(qasm: str) -> SerializedQuantumProgram:
@@ -61,9 +61,9 @@ def quantum_program_from_qasm(qasm: str) -> SerializedQuantumProgram:
61
61
  async def synthesize_async(
62
62
  serialized_model: SerializedModel,
63
63
  ) -> SerializedQuantumProgram:
64
- model = pydantic.parse_raw_as(Model, serialized_model)
64
+ model = Model.model_validate_json(serialized_model)
65
65
  quantum_program = await ApiWrapper.call_generation_task(model)
66
- return SerializedQuantumProgram(quantum_program.json(indent=2))
66
+ return SerializedQuantumProgram(quantum_program.model_dump_json(indent=2))
67
67
 
68
68
 
69
69
  def synthesize(
@@ -109,7 +109,7 @@ def set_preferences(
109
109
  "Missing preferences. Either pass `Preferences` object or pass keywords"
110
110
  )
111
111
 
112
- model = pydantic.parse_raw_as(Model, serialized_model)
112
+ model = Model.model_validate_json(serialized_model)
113
113
  model.preferences = preferences
114
114
  return model.get_model()
115
115
 
@@ -127,11 +127,10 @@ def update_preferences(
127
127
  Returns:
128
128
  SerializedModel: The updated model with the new preferences applied.
129
129
  """
130
- model = pydantic.parse_raw_as(Model, serialized_model)
130
+ model = Model.model_validate_json(serialized_model)
131
131
 
132
132
  for key, value in kwargs.items():
133
133
  setattr(model.preferences, key, value)
134
-
135
134
  return model.get_model()
136
135
 
137
136
 
@@ -158,7 +157,7 @@ def set_constraints(
158
157
  "Missing constraints. Either pass `Constraints` object or pass keywords"
159
158
  )
160
159
 
161
- model = pydantic.parse_raw_as(Model, serialized_model)
160
+ model = Model.model_validate_json(serialized_model)
162
161
  model.constraints = constraints
163
162
  return model.get_model()
164
163
 
@@ -176,11 +175,10 @@ def update_constraints(
176
175
  Returns:
177
176
  SerializedModel: The updated model with the new constraints applied.
178
177
  """
179
- model = pydantic.parse_raw_as(Model, serialized_model)
178
+ model = Model.model_validate_json(serialized_model)
180
179
 
181
180
  for key, value in kwargs.items():
182
181
  setattr(model.constraints, key, value)
183
-
184
182
  return model.get_model()
185
183
 
186
184
 
@@ -208,7 +206,7 @@ def set_execution_preferences(
208
206
  "Missing execution_preferences. Either pass `ExecutionPreferences` object or pass keywords"
209
207
  )
210
208
 
211
- model = pydantic.parse_raw_as(Model, serialized_model)
209
+ model = Model.model_validate_json(serialized_model)
212
210
  model.execution_preferences = execution_preferences
213
211
  return model.get_model()
214
212
 
@@ -226,7 +224,7 @@ def update_execution_preferences(
226
224
  Returns:
227
225
  SerializedModel: The updated model with the new execution_preferences applied.
228
226
  """
229
- model = pydantic.parse_raw_as(Model, serialized_model)
227
+ model = Model.model_validate_json(serialized_model)
230
228
 
231
229
  for key, value in kwargs.items():
232
230
  setattr(model.execution_preferences, key, value)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: classiq
3
- Version: 0.51.0
3
+ Version: 0.52.0
4
4
  Summary: Classiq's Python SDK for quantum computing
5
5
  Home-page: https://classiq.io
6
6
  License: Proprietary
@@ -46,7 +46,8 @@ Requires-Dist: numpy (>=1.26.0,<2.0.0) ; python_version >= "3.12"
46
46
  Requires-Dist: packaging (>=23.2,<24.0)
47
47
  Requires-Dist: pandas (>=1.4.0,<3.0.0)
48
48
  Requires-Dist: plotly (>=5.7.0,<6.0.0)
49
- Requires-Dist: pydantic (>=1.9.1,<2.0.0)
49
+ Requires-Dist: pydantic (>=2.9.0,<3.0.0)
50
+ Requires-Dist: pydantic-settings (>=2.4.0,<3.0.0)
50
51
  Requires-Dist: scipy (>=1.10.0,<2.0.0) ; python_version < "3.12"
51
52
  Requires-Dist: scipy (>=1.11.0,<2.0.0) ; python_version >= "3.12"
52
53
  Requires-Dist: sympy (>=1.13.0,<2.0.0)