Source code for atlas_q.ir_enhanced.tdvp_observables
"""
IR-Enhanced TDVP Observable Grouping
======================================
Applies IR coherence-based grouping to observable measurements during
time evolution with TDVP (Time-Dependent Variational Principle).
Key Insight:
-----------
TDVP simulates real-time dynamics: |ψ(t)⟩ = exp(-iHt)|ψ(0)⟩
At each time step, we measure multiple observables:
- Energy: ⟨H⟩
- Magnetization: ⟨Σ Zᵢ⟩
- Correlations: ⟨ZᵢZⱼ⟩
- Custom operators
Many observables commute → can be grouped for simultaneous measurement
IR optimizes grouping and shot allocation
Target: 5-100× shot reduction per timestep
Author: ATLAS-Q + IR Integration
Date: November 2025
"""
from dataclasses import dataclass
from typing import List
import numpy as np
[docs]
@dataclass
class TDVPObservableGroupingResult:
"""Result of TDVP observable grouping"""
groups: List[List[int]] # Groups of observable indices
shots_per_group: np.ndarray # Optimal shot allocation
variance_reduction: float # vs baseline
method: str # Grouping method
n_observables: int # Total observables
n_groups: int # Number of groups
[docs]
def ir_tdvp_observable_grouping(
observable_paulis: List[str],
observable_coeffs: np.ndarray,
total_shots: int = 10000,
max_group_size: int = 10
) -> TDVPObservableGroupingResult:
"""
IR-enhanced grouping for TDVP observable measurements.
Groups commuting observables and allocates shots optimally.
Parameters
----------
observable_paulis : List[str]
Pauli strings for each observable
observable_coeffs : np.ndarray
Coefficients/weights for each observable
total_shots : int
Total measurement budget per timestep
max_group_size : int
Maximum observables per group
Returns
-------
TDVPObservableGroupingResult
Grouping strategy with shot allocation
Examples
--------
>>> # Energy + correlation measurements
>>> paulis = ["ZZ", "XX", "YY", "ZI", "IZ"]
>>> coeffs = np.array([1.0, 0.5, 0.5, 0.3, 0.3])
>>> result = ir_tdvp_observable_grouping(paulis, coeffs)
>>> print(f"Variance reduction: {result.variance_reduction:.2f}×")
"""
from .vqe_grouping import (
allocate_shots_neyman,
compute_variance_reduction,
estimate_pauli_coherence_matrix,
group_by_variance_minimization,
)
# Use VQE grouping infrastructure (same Pauli commutativ logic)
Sigma = estimate_pauli_coherence_matrix(observable_coeffs, observable_paulis)
groups = group_by_variance_minimization(
Sigma, observable_coeffs,
max_group_size=max_group_size,
pauli_strings=observable_paulis,
check_commutativity=True
)
shots_per_group = allocate_shots_neyman(Sigma, observable_coeffs, groups, total_shots)
variance_reduction = compute_variance_reduction(Sigma, observable_coeffs, groups, total_shots)
return TDVPObservableGroupingResult(
groups=groups,
shots_per_group=shots_per_group,
variance_reduction=variance_reduction,
method="ir_tdvp_observables",
n_observables=len(observable_paulis),
n_groups=len(groups)
)