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