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.
- qilisdk/analog/__init__.py +1 -2
- qilisdk/analog/hamiltonian.py +4 -71
- qilisdk/analog/schedule.py +291 -313
- qilisdk/backends/backend.py +5 -1
- qilisdk/backends/cuda_backend.py +10 -6
- qilisdk/backends/qutip_backend.py +24 -32
- qilisdk/{common → core}/__init__.py +4 -0
- qilisdk/core/interpolator.py +406 -0
- qilisdk/{common → core}/model.py +7 -7
- qilisdk/core/parameterizable.py +131 -0
- qilisdk/{common → core}/qtensor.py +1 -1
- qilisdk/{common → core}/variables.py +192 -11
- qilisdk/cost_functions/cost_function.py +1 -1
- qilisdk/cost_functions/model_cost_function.py +5 -5
- qilisdk/cost_functions/observable_cost_function.py +2 -2
- qilisdk/digital/ansatz.py +0 -3
- qilisdk/digital/circuit.py +3 -2
- qilisdk/digital/circuit_transpiler.py +46 -0
- qilisdk/digital/circuit_transpiler_passes/__init__.py +18 -0
- qilisdk/digital/circuit_transpiler_passes/circuit_transpiler_pass.py +36 -0
- qilisdk/digital/circuit_transpiler_passes/decompose_multi_controlled_gates_pass.py +216 -0
- qilisdk/digital/circuit_transpiler_passes/numeric_helpers.py +82 -0
- qilisdk/digital/gates.py +15 -5
- qilisdk/{speqtrum/experiments → experiments}/__init__.py +13 -2
- qilisdk/{speqtrum/experiments → experiments}/experiment_functional.py +90 -2
- qilisdk/{speqtrum/experiments → experiments}/experiment_result.py +16 -0
- qilisdk/functionals/functional.py +2 -2
- qilisdk/functionals/functional_result.py +1 -1
- qilisdk/functionals/sampling.py +8 -1
- qilisdk/functionals/time_evolution.py +8 -4
- qilisdk/functionals/time_evolution_result.py +2 -2
- qilisdk/functionals/variational_program.py +58 -0
- qilisdk/optimizers/optimizer_result.py +1 -1
- qilisdk/speqtrum/__init__.py +2 -0
- qilisdk/speqtrum/speqtrum.py +537 -152
- qilisdk/speqtrum/speqtrum_models.py +258 -2
- qilisdk/utils/openfermion/__init__.py +38 -0
- qilisdk/{common/algorithm.py → utils/openfermion/__init__.pyi} +2 -3
- qilisdk/utils/openfermion/openfermion.py +45 -0
- qilisdk/utils/visualization/schedule_renderers.py +22 -9
- {qilisdk-0.1.5.dist-info → qilisdk-0.1.7.dist-info}/METADATA +89 -39
- qilisdk-0.1.7.dist-info/RECORD +76 -0
- {qilisdk-0.1.5.dist-info → qilisdk-0.1.7.dist-info}/WHEEL +1 -1
- qilisdk/analog/linear_schedule.py +0 -118
- qilisdk/common/parameterizable.py +0 -75
- qilisdk-0.1.5.dist-info/RECORD +0 -69
- /qilisdk/{common → core}/exceptions.py +0 -0
- /qilisdk/{common → core}/result.py +0 -0
- {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)
|
qilisdk/speqtrum/__init__.py
CHANGED
|
@@ -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
|
]
|