quast_decisiontree.algorithms.hybrid
quast_decisiontree.algorithms.hybrid
__all__
module-attribute
__all__ = [
"HybridAlgorithm",
"HybridAlgorithmBuilder",
"QAOAResult",
"QrispQAOA",
"QrispVQE",
"VQEResult",
"VariationalAlgorithm",
"VariationalResult",
]
HybridAlgorithmBuilder
Bases: AutoClassBuilder
Builder specialized for HybridAlgorithm subclasses.
Nodes can discover available hybrid algorithms by scanning for all instances of this class (e.g., in a registry or module-level list).
Source code in src/quast_decisiontree/algorithms/hybrid/builder.py
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | |
input_keys
instance-attribute
input_keys = input_keys
supported_inputs
property
supported_inputs
The INPUT_KEYS of the algorithm this builder constructs.
__init__
__init__(
superclass,
hyperparams,
name=None,
description=None,
input_keys=(),
)
Source code in src/quast_decisiontree/algorithms/hybrid/builder.py
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | |
HybridAlgorithm
Bases: ABC
Base class for hybrid quantum-classical algorithms.
Integrates with AutoClassBuilder: subclasses declare HYPERPARAMS and their init receives kwargs matching those names.
Subclasses declare INPUT_KEYS to specify which problem data they need, then implement run_algorithm() with the actual logic.
Source code in src/quast_decisiontree/algorithms/hybrid/hybrid_algorithm.py
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | |
HYPERPARAMS
class-attribute
HYPERPARAMS = []
List of HyperParam instances; override in subclass.
INPUT_KEYS
class-attribute
INPUT_KEYS = ()
Keys the algorithm expects (e.g., 'qubo_matrix', 'graph', 'cost_operator').
backend
instance-attribute
backend = None
input
property
input
__init__
__init__(**kwargs)
Initialize from keyword arguments matching HYPERPARAMS names.
This constructor signature is compatible with AutoClassBuilder.build().
Source code in src/quast_decisiontree/algorithms/hybrid/hybrid_algorithm.py
32 33 34 35 36 37 38 39 40 41 | |
set_input
set_input(input_dict)
Validate and store input data. Raises on unknown keys.
Source code in src/quast_decisiontree/algorithms/hybrid/hybrid_algorithm.py
49 50 51 52 53 54 55 56 57 58 59 60 | |
reset
reset()
Clear input and backend state after execution.
Source code in src/quast_decisiontree/algorithms/hybrid/hybrid_algorithm.py
71 72 73 74 | |
execute
execute(backend, **kwargs)
Execute the hybrid algorithm.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
backend
|
Backend
|
Backend instance supporting run()/run_batch(). |
required |
**kwargs
|
Any
|
Must match INPUT_KEYS (e.g., qubo_matrix=..., graph=...). |
{}
|
Returns:
| Type | Description |
|---|---|
Any
|
Algorithm-specific result. |
Source code in src/quast_decisiontree/algorithms/hybrid/hybrid_algorithm.py
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | |
run_algorithm
abstractmethod
run_algorithm(backend, input)
Algorithm-specific execution. Override in subclass.
Backend usage
- backend(circuit, shots=None) or backend.run(circuit, shots=None)
- backend.run_batch(circuits, shots=None)
Backends return Dict[str, int] mapping bitstrings to counts.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
backend
|
Backend
|
The quantum backend to submit circuits to. |
required |
input
|
dict[str, Any]
|
Dict with keys from INPUT_KEYS, all guaranteed non-None. |
required |
Returns:
| Type | Description |
|---|---|
Any
|
Algorithm result (solution dict, counts, optimal value, etc.) |
Source code in src/quast_decisiontree/algorithms/hybrid/hybrid_algorithm.py
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | |
get_builder
classmethod
get_builder(name=None, description=None)
Create an AutoClassBuilder for this algorithm class.
Source code in src/quast_decisiontree/algorithms/hybrid/hybrid_algorithm.py
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | |
QAOAResult
dataclass
Bases: VariationalResult
Result container for QrispQAOA execution.
Inherits from VariationalResult
counts, optimal_params, cost_history, num_evals
Additional attributes
best_bitstring: The bitstring with the lowest cost. best_cost: The cost value of the best bitstring.
Source code in src/quast_decisiontree/algorithms/hybrid/qrisp_qaoa.py
27 28 29 30 31 32 33 34 35 36 37 38 39 40 | |
best_bitstring
class-attribute
instance-attribute
best_bitstring = ''
best_cost
class-attribute
instance-attribute
best_cost = float('inf')
__init__
__init__(
counts,
optimal_params=None,
cost_history=list(),
num_evals=0,
best_bitstring="",
best_cost=float("inf"),
)
QrispQAOA
Bases: HybridAlgorithm
QAOA implementation delegating to Qrisp's QAOAProblem.
Keeps all modifiable parameters (reps, optimizer, max_iter, etc.) as hyperparameters configurable via the builder system. Problem-specific inputs (cost_operator, mixer, cl_cost_function, num_qubits) are provided at execution time.
Compatible with the decision tree node flow
SelectLayersNode → sets reps QrispMixerNode → sets mixer (Qrisp-compatible callable) SelectOptimizerNode → sets optimizer QrispQAOASetupNode → instantiates this class HybridAlgorithmExecuteNode → calls execute()
Example usage (standalone)::
qaoa = QrispQAOA(reps=3, max_iter=100, optimizer="COBYLA")
result = qaoa.execute(
backend=my_backend,
cost_operator=my_cost_op,
mixer=my_mixer,
cl_cost_function=my_cl_cost,
num_qubits=5,
)
print(result.best_bitstring, result.best_cost)
Source code in src/quast_decisiontree/algorithms/hybrid/qrisp_qaoa.py
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 | |
HYPERPARAMS
class-attribute
HYPERPARAMS = [
HyperParam(
name="reps",
hparam_type=int,
description="Number of QAOA layers (depth parameter p)",
default=1,
test=lambda x: x > 0,
),
HyperParam(
name="max_iter",
hparam_type=int,
description="Maximum number of classical optimizer iterations",
default=50,
test=lambda x: x > 0,
),
HyperParam(
name="optimizer",
hparam_type=None,
description="Classical optimizer: a string name for scipy.optimize.minimize (e.g. 'COBYLA', 'Nelder-Mead') or an object with a .minimize(fun, x0) method (e.g. from OptimizerBuilder)",
default="COBYLA",
),
HyperParam(
name="init_type",
hparam_type=str,
description="Parameter initialization strategy ('random' or 'tqa')",
default="random",
),
HyperParam(
name="init_params",
hparam_type=None,
description="Initial variational parameters (array-like, optional)",
default=None,
),
]
INPUT_KEYS
class-attribute
INPUT_KEYS = (
"cost_operator",
"mixer",
"cl_cost_function",
"num_qubits",
)
run_algorithm
run_algorithm(backend, input)
Execute QAOA via Qrisp's QAOAProblem.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
backend
|
Backend
|
The backend to run quantum circuits on. |
required |
input
|
dict[str, Any]
|
Dict with keys from INPUT_KEYS. |
required |
Returns:
| Type | Description |
|---|---|
QAOAResult
|
QAOAResult with counts, best solution, and metadata. |
Source code in src/quast_decisiontree/algorithms/hybrid/qrisp_qaoa.py
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | |
QrispVQE
Bases: HybridAlgorithm
Measurement-based VQE implementation using Qrisp circuits.
Uses a sampling approach: prepare parameterized state → measure → compute energy from counts by iterating over Hamiltonian terms. This avoids Qrisp's VQEProblem.expectation_value() which has memory issues with large Hamiltonians due to JAX graph accumulation.
Energy evaluation uses QubitOperator.terms_dict to iterate over Hamiltonian terms and QubitTerm.factor_dict for per-qubit Pauli type lookup. For diagonal (Z-only) Hamiltonians, this yields exact per-bitstring energies. Non-Z terms contribute zero in the computational basis and are handled gracefully.
Compatible with the decision tree node flow
QrispAnsatzNode → sets ansatz_function + num_params SelectOptimizerNode → sets optimizer SelectBackendNode → sets backend QrispVQESetupNode → instantiates this class HybridAlgorithmExecuteNode → calls execute()
Example usage (standalone)::
vqe = QrispVQE(depth=1, max_iter=100, optimizer="COBYLA")
result = vqe.execute(
backend=my_backend,
hamiltonian=my_hamiltonian,
ansatz_function=my_ansatz,
num_params=8,
num_qubits=4,
)
print(result.energy, result.best_bitstring)
Source code in src/quast_decisiontree/algorithms/hybrid/qrisp_vqe.py
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 | |
HYPERPARAMS
class-attribute
HYPERPARAMS = [
HyperParam(
name="depth",
hparam_type=int,
description="Number of ansatz repetitions (layers)",
default=1,
test=lambda x: x > 0,
),
HyperParam(
name="max_iter",
hparam_type=int,
description="Maximum number of classical optimizer iterations",
default=50,
test=lambda x: x > 0,
),
HyperParam(
name="optimizer",
hparam_type=None,
description="Classical optimizer: a string name for scipy.optimize.minimize (e.g. 'COBYLA', 'Nelder-Mead') or an object with a .minimize(fun, x0) method (e.g. from OptimizerBuilder)",
default="COBYLA",
),
HyperParam(
name="shots",
hparam_type=int,
description="Number of measurement shots per evaluation",
default=1024,
test=lambda x: x > 0,
),
HyperParam(
name="init_params",
hparam_type=None,
description="Initial variational parameters (array-like, optional)",
default=None,
),
]
INPUT_KEYS
class-attribute
INPUT_KEYS = (
"hamiltonian",
"ansatz_function",
"num_params",
"num_qubits",
)
run_algorithm
run_algorithm(backend, input)
Execute measurement-based VQE.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
backend
|
Backend
|
The backend to run quantum circuits on. |
required |
input
|
dict[str, Any]
|
Dict with keys from INPUT_KEYS. |
required |
Returns:
| Type | Description |
|---|---|
VQEResult
|
VQEResult with energy, counts, best solution, and metadata. |
Source code in src/quast_decisiontree/algorithms/hybrid/qrisp_vqe.py
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 | |
VQEResult
dataclass
Bases: VariationalResult
Result container for QrispVQE execution.
Inherits from VariationalResult
counts, optimal_params, cost_history, num_evals
Additional attributes
energy: The minimized energy eigenvalue. best_bitstring: The bitstring with the lowest energy (from final measurement).
Source code in src/quast_decisiontree/algorithms/hybrid/qrisp_vqe.py
28 29 30 31 32 33 34 35 36 37 38 39 40 41 | |
energy
class-attribute
instance-attribute
energy = float('inf')
best_bitstring
class-attribute
instance-attribute
best_bitstring = ''
__init__
__init__(
counts,
optimal_params=None,
cost_history=list(),
num_evals=0,
energy=float("inf"),
best_bitstring="",
)
VariationalAlgorithm
Bases: HybridAlgorithm
Template for custom variational quantum-classical optimization loops.
Implements the standard variational pattern
- Initialize parameters for the ansatz
- Variational loop (driven by optimizer): ansatz(qv, params) → backend.run() → cl_cost_function(counts) → scalar cost
- Final measurement with optimized parameters → return VariationalResult
The optimizer (built by OptimizerBuilder) drives the loop via its .minimize() method. The template builds a cost closure that the optimizer calls repeatedly.
Hyperparameters (set by upstream nodes via problem_data):
- ansatz: Callable(QuantumVariable, np.ndarray) → None.
Applies parameterized gates to a QuantumVariable.
Must expose a num_params attribute (int) indicating the parameter count.
- optimizer: Optimizer instance (built by OptimizerBuilder).
Must have a .minimize(fun, x0, bounds=None) method returning a result with .x.
- shots: Number of measurement shots per circuit evaluation.
- init_params: Optional initial parameter array for warm-starting.
If None, random initialization in [0, 2π) is used.
Input keys (problem-specific data): - cl_cost_function: Callable(Dict[str, int]) → float. Maps measurement counts to a scalar cost value. - num_qubits: int. Number of qubits for the problem.
Source code in src/quast_decisiontree/algorithms/hybrid/variational.py
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 | |
HYPERPARAMS
class-attribute
HYPERPARAMS = [
HyperParam(
name="ansatz",
hparam_type=None,
description="Parameterized ansatz: callable(qv, params) with .num_params attribute",
),
HyperParam(
name="optimizer",
hparam_type=None,
description="Optimizer instance with .minimize(fun, x0, bounds=None) → result with .x. Built by OptimizerBuilder.",
),
HyperParam(
name="shots",
hparam_type=int,
description="Number of shots per circuit evaluation",
default=1024,
test=lambda x: x > 0,
),
HyperParam(
name="init_params",
hparam_type=None,
description="Optional initial parameter array for warm-starting (None = random)",
default=None,
),
]
INPUT_KEYS
class-attribute
INPUT_KEYS = ('cl_cost_function', 'num_qubits')
reset
reset()
Clear input, backend, and algorithm state after execution.
Source code in src/quast_decisiontree/algorithms/hybrid/variational.py
99 100 101 102 | |
run_algorithm
run_algorithm(backend, input)
Execute the variational optimization loop.
Returns:
| Type | Description |
|---|---|
VariationalResult
|
VariationalResult with counts, optimal parameters, and cost history. |
Source code in src/quast_decisiontree/algorithms/hybrid/variational.py
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | |
VariationalResult
dataclass
Result of a variational algorithm execution.
Attributes:
| Name | Type | Description |
|---|---|---|
counts |
dict[str, int]
|
Final measurement counts from the optimized circuit. |
optimal_params |
ndarray | None
|
Optimized parameter array. |
cost_history |
list[float]
|
List of cost values recorded during optimization. |
num_evals |
int
|
Total number of cost function evaluations. |
Source code in src/quast_decisiontree/algorithms/hybrid/variational.py
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | |
counts
instance-attribute
counts
optimal_params
class-attribute
instance-attribute
optimal_params = None
cost_history
class-attribute
instance-attribute
cost_history = field(default_factory=list)
num_evals
class-attribute
instance-attribute
num_evals = 0
__init__
__init__(
counts,
optimal_params=None,
cost_history=list(),
num_evals=0,
)