Sequential Quantum Gate Decomposer  v1.9.6
Powerful decomposition of general unitarias into one- and two-qubit gates gates
runtime.py
Go to the documentation of this file.
1 """Runtime test helpers using squander.partitioning only (mirrors benchmarks partitioned_runtime.common)."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 import numpy as np
8 
9 from squander.density_matrix import DensityMatrix
10 from squander.partitioning.noisy_planner import NoisyPartitionDescriptorSet
11 from squander.partitioning.noisy_runtime import (
12  NoisyRuntimeExecutionResult,
13  execute_partitioned_density,
14  execute_partitioned_density_fused,
15  execute_sequential_density_reference,
16 )
17 
18 PHASE3_RUNTIME_DENSITY_TOL = 1e-10
19 PHASE3_RUNTIME_ENERGY_TOL = 1e-8
20 
21 
22 def build_initial_parameters(param_num: int) -> np.ndarray:
23  return np.linspace(0.05, 0.05 * param_num, param_num, dtype=np.float64)
24 
25 
26 def density_energy(hamiltonian, density_matrix: np.ndarray) -> tuple[float, float]:
27  energy = np.trace(hamiltonian.dot(density_matrix))
28  return float(np.real(energy)), float(np.imag(energy))
29 
30 
31 def coerce_density_matrix_array(density_matrix: DensityMatrix | np.ndarray) -> np.ndarray:
32  if isinstance(density_matrix, DensityMatrix):
33  return np.asarray(density_matrix.to_numpy())
34  return np.asarray(density_matrix)
35 
36 
38  partitioned_density: DensityMatrix | np.ndarray,
39  reference_density: DensityMatrix | np.ndarray,
40 ) -> dict[str, Any]:
41  partitioned = coerce_density_matrix_array(partitioned_density)
42  reference = coerce_density_matrix_array(reference_density)
43  delta = partitioned - reference
44  return {
45  "frobenius_norm_diff": float(np.linalg.norm(delta)),
46  "max_abs_diff": float(np.max(np.abs(delta))),
47  }
48 
49 
51  descriptor_set: NoisyPartitionDescriptorSet,
52  parameters: np.ndarray,
53  *,
54  allow_fusion: bool = False,
55 ) -> tuple[NoisyRuntimeExecutionResult, DensityMatrix, dict[str, Any]]:
56  runtime_result = (
57  execute_partitioned_density_fused(descriptor_set, parameters)
58  if allow_fusion
59  else execute_partitioned_density(descriptor_set, parameters)
60  )
61  reference_density = execute_sequential_density_reference(descriptor_set, parameters)
63  runtime_result.density_matrix, reference_density
64  )
65  return runtime_result, reference_density, metrics
66 
67 
69  descriptor_set: NoisyPartitionDescriptorSet,
70  parameters: np.ndarray,
71 ) -> tuple[NoisyRuntimeExecutionResult, DensityMatrix, dict[str, Any]]:
73  descriptor_set, parameters, allow_fusion=True
74  )
def execute_sequential_density_reference
Execute a sequential density reference.