qilisdk 0.1.5__py3-none-any.whl → 0.1.7__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 (49) hide show
  1. qilisdk/analog/__init__.py +1 -2
  2. qilisdk/analog/hamiltonian.py +4 -71
  3. qilisdk/analog/schedule.py +291 -313
  4. qilisdk/backends/backend.py +5 -1
  5. qilisdk/backends/cuda_backend.py +10 -6
  6. qilisdk/backends/qutip_backend.py +24 -32
  7. qilisdk/{common → core}/__init__.py +4 -0
  8. qilisdk/core/interpolator.py +406 -0
  9. qilisdk/{common → core}/model.py +7 -7
  10. qilisdk/core/parameterizable.py +131 -0
  11. qilisdk/{common → core}/qtensor.py +1 -1
  12. qilisdk/{common → core}/variables.py +192 -11
  13. qilisdk/cost_functions/cost_function.py +1 -1
  14. qilisdk/cost_functions/model_cost_function.py +5 -5
  15. qilisdk/cost_functions/observable_cost_function.py +2 -2
  16. qilisdk/digital/ansatz.py +0 -3
  17. qilisdk/digital/circuit.py +3 -2
  18. qilisdk/digital/circuit_transpiler.py +46 -0
  19. qilisdk/digital/circuit_transpiler_passes/__init__.py +18 -0
  20. qilisdk/digital/circuit_transpiler_passes/circuit_transpiler_pass.py +36 -0
  21. qilisdk/digital/circuit_transpiler_passes/decompose_multi_controlled_gates_pass.py +216 -0
  22. qilisdk/digital/circuit_transpiler_passes/numeric_helpers.py +82 -0
  23. qilisdk/digital/gates.py +15 -5
  24. qilisdk/{speqtrum/experiments → experiments}/__init__.py +13 -2
  25. qilisdk/{speqtrum/experiments → experiments}/experiment_functional.py +90 -2
  26. qilisdk/{speqtrum/experiments → experiments}/experiment_result.py +16 -0
  27. qilisdk/functionals/functional.py +2 -2
  28. qilisdk/functionals/functional_result.py +1 -1
  29. qilisdk/functionals/sampling.py +8 -1
  30. qilisdk/functionals/time_evolution.py +8 -4
  31. qilisdk/functionals/time_evolution_result.py +2 -2
  32. qilisdk/functionals/variational_program.py +58 -0
  33. qilisdk/optimizers/optimizer_result.py +1 -1
  34. qilisdk/speqtrum/__init__.py +2 -0
  35. qilisdk/speqtrum/speqtrum.py +537 -152
  36. qilisdk/speqtrum/speqtrum_models.py +258 -2
  37. qilisdk/utils/openfermion/__init__.py +38 -0
  38. qilisdk/{common/algorithm.py → utils/openfermion/__init__.pyi} +2 -3
  39. qilisdk/utils/openfermion/openfermion.py +45 -0
  40. qilisdk/utils/visualization/schedule_renderers.py +22 -9
  41. {qilisdk-0.1.5.dist-info → qilisdk-0.1.7.dist-info}/METADATA +89 -39
  42. qilisdk-0.1.7.dist-info/RECORD +76 -0
  43. {qilisdk-0.1.5.dist-info → qilisdk-0.1.7.dist-info}/WHEEL +1 -1
  44. qilisdk/analog/linear_schedule.py +0 -118
  45. qilisdk/common/parameterizable.py +0 -75
  46. qilisdk-0.1.5.dist-info/RECORD +0 -69
  47. /qilisdk/{common → core}/exceptions.py +0 -0
  48. /qilisdk/{common → core}/result.py +0 -0
  49. {qilisdk-0.1.5.dist-info → qilisdk-0.1.7.dist-info}/licenses/LICENCE +0 -0
@@ -13,14 +13,18 @@
13
13
  # limitations under the License.
14
14
  from __future__ import annotations
15
15
 
16
+ import functools
17
+ import operator
16
18
  from typing import TYPE_CHECKING, ClassVar, Generic, TypeVar
17
19
 
20
+ from qilisdk.core.variables import BaseVariable, Parameter
18
21
  from qilisdk.functionals.functional import Functional, PrimitiveFunctional
19
22
  from qilisdk.functionals.functional_result import FunctionalResult
20
23
  from qilisdk.functionals.variational_program_result import VariationalProgramResult
21
24
  from qilisdk.yaml import yaml
22
25
 
23
26
  if TYPE_CHECKING:
27
+ from qilisdk.core.variables import ComparisonTerm
24
28
  from qilisdk.cost_functions.cost_function import CostFunction
25
29
  from qilisdk.optimizers.optimizer import Optimizer
26
30
 
@@ -46,6 +50,7 @@ class VariationalProgram(Functional, Generic[TFunctional]):
46
50
  optimizer: Optimizer,
47
51
  cost_function: CostFunction,
48
52
  store_intermediate_results: bool = False,
53
+ parameter_constraints: list[ComparisonTerm] | None = None,
49
54
  ) -> None:
50
55
  """
51
56
  Args:
@@ -53,11 +58,29 @@ class VariationalProgram(Functional, Generic[TFunctional]):
53
58
  optimizer (Optimizer): Optimization routine controlling parameter updates.
54
59
  cost_function (CostFunction): Metric used to evaluate functional executions.
55
60
  store_intermediate_results (bool, optional): Persist intermediate executions if requested by the optimizer.
61
+ parameter_constraints (list[ComparisonTerm] | None): Optional constraints on parameter values that are
62
+ enforced before optimizer updates are applied.
63
+
64
+ Raises:
65
+ ValueError: if the user applies constraints on parameters that are not present in the variational program.
66
+ Or the constraints contain Objects that are not parameters.
56
67
  """
57
68
  self._functional = functional
58
69
  self._optimizer = optimizer
59
70
  self._cost_function = cost_function
60
71
  self._store_intermediate_results = store_intermediate_results
72
+ parameter_constraints = parameter_constraints or []
73
+ functional_params = self._functional.get_parameters()
74
+ for p in parameter_constraints:
75
+ if not p.lhs.is_parameterized_term() or not p.rhs.is_parameterized_term():
76
+ raise ValueError("Only parameters are allowed to be constrained.")
77
+ variables = p.variables()
78
+ for v in variables:
79
+ if v.label not in functional_params:
80
+ raise ValueError(
81
+ f"Writing a constraint on the parameter ({v}) that is not present in the variational program "
82
+ )
83
+ self._parameter_constraints = parameter_constraints
61
84
 
62
85
  @property
63
86
  def functional(self) -> TFunctional:
@@ -78,3 +101,38 @@ class VariationalProgram(Functional, Generic[TFunctional]):
78
101
  def store_intermediate_results(self) -> bool:
79
102
  """Indicate whether intermediate execution data should be stored."""
80
103
  return self._store_intermediate_results
104
+
105
+ def get_constraints(self) -> list[ComparisonTerm]:
106
+ """Return variational-program-level constraints plus those from the underlying functional."""
107
+ return self._parameter_constraints + self._functional.get_constraints()
108
+
109
+ def _check_constraints(self, parameters: dict[str, float]) -> list[bool]:
110
+ """Evaluate each constraint with a proposed parameter set.
111
+
112
+ Returns:
113
+ list[bool]: list of booleans that correspond to whether each constraint is satisfied or not.
114
+
115
+ Raises:
116
+ ValueError: if the parameter is not defined in the underlying functional.
117
+ """
118
+ params: list[BaseVariable] = functools.reduce(
119
+ operator.iadd, (con.variables() for con in self.get_constraints()), []
120
+ )
121
+ params = list(set(params))
122
+ if any(not isinstance(p, Parameter) for p in params):
123
+ raise ValueError("Only Parameters are allowed.")
124
+ params_dict = {p.label: p for p in params}
125
+ evaluate_dict: dict[BaseVariable, float] = {}
126
+ functional_params = self._functional.get_parameters()
127
+ for label, value in parameters.items():
128
+ if label not in functional_params:
129
+ raise ValueError(f"Parameter {label} is not defined in the functional.")
130
+ if label in params_dict:
131
+ evaluate_dict[params_dict[label]] = value
132
+ constraints = self.get_constraints()
133
+ return [con.evaluate(evaluate_dict) for con in constraints]
134
+
135
+ def check_parameter_constraints(self, parameters: dict[str, float]) -> int:
136
+ """Return a penalty-like score (0 if valid) indicating how many constraints are violated."""
137
+ const_list = self._check_constraints(parameters)
138
+ return sum((100 if not con else 0) for con in const_list)
@@ -13,7 +13,7 @@
13
13
  # limitations under the License.
14
14
  from __future__ import annotations
15
15
 
16
- from qilisdk.common.result import Result
16
+ from qilisdk.core.result import Result
17
17
  from qilisdk.yaml import yaml
18
18
 
19
19
 
@@ -25,6 +25,8 @@ OPTIONAL_FEATURES: list[OptionalFeature] = [
25
25
  Symbol(path="qilisdk.speqtrum.speqtrum", name="SpeQtrum"),
26
26
  Symbol(path="qilisdk.speqtrum.speqtrum_models", name="DeviceStatus"),
27
27
  Symbol(path="qilisdk.speqtrum.speqtrum_models", name="DeviceType"),
28
+ Symbol(path="qilisdk.speqtrum.speqtrum_models", name="JobHandle"),
29
+ Symbol(path="qilisdk.speqtrum.speqtrum_models", name="TypedJobDetail"),
28
30
  ],
29
31
  ),
30
32
  ]