qig.generic_decomposition
High-Level GENERIC Decomposition Interface
This module provides a user-friendly interface for executing the complete 12-step GENERIC decomposition procedure systematically.
The GenericDecomposition class orchestrates all steps from initial state
to final diagnostics, providing comprehensive results with validation checks.
Classes
- class qig.generic_decomposition.GenericDecomposition(exp_fam, method='duhamel', compute_diffusion=False)[source]
Bases:
objectComplete GENERIC decomposition with diagnostics.
This class orchestrates the full 12-step procedure for computing the GENERIC decomposition of quantum inaccessible game dynamics:
1. Initial state and density matrix 2-8. Information geometry (ψ, μ, G, h_i, a, ν, ∇ν, M) 9. Symmetric/antisymmetric decomposition (S, A) 10. Effective Hamiltonian extraction (η, H_eff) 11. Diffusion operator construction (D[ρ]) 12. Comprehensive diagnostics and validation
Examples
>>> exp_fam = QuantumExponentialFamily(n_pairs=1, d=2, pair_basis=True) >>> decomp = GenericDecomposition(exp_fam) >>> theta = np.random.randn(exp_fam.n_params) * 0.1 >>> results = decomp.compute_all(theta) >>> decomp.print_summary()
- Parameters:
exp_fam (QuantumExponentialFamily)
method (str)
compute_diffusion (bool)
- __init__(exp_fam, method='duhamel', compute_diffusion=False)[source]
Initialize GENERIC decomposition.
Functions
- qig.generic_decomposition.run_generic_decomposition(theta, exp_fam, method='duhamel', compute_diffusion=False, verbose=True, print_summary=True)[source]
Convenience function for complete GENERIC decomposition.
- Parameters:
theta (
np.ndarray) – Natural parametersexp_fam (
QuantumExponentialFamily) – Exponential familymethod (
str, optional) – Derivative method: ‘duhamel’ or ‘sld’compute_diffusion (
bool, optional) – Whether to compute diffusion operator (expensive!)verbose (
bool, optional) – Print progress during computationprint_summary (
bool, optional) – Print summary at end
- Returns:
results – Complete GENERIC decomposition results
- Return type:
Examples
>>> exp_fam = QuantumExponentialFamily(n_pairs=1, d=2, pair_basis=True) >>> theta = np.zeros(exp_fam.n_params) >>> results = run_generic_decomposition(theta, exp_fam)
The 12-Step Procedure
The complete GENERIC decomposition executes these steps systematically:
Initial State: Density matrix \(\rho(\theta)\) from parameters
Cumulant Function: \(\psi(\theta) = \log \text{Tr}[e^{\sum_a \theta_a F_a}]\)
Mean Parameters: \(\mu = \nabla\psi(\theta)\)
Fisher Information: \(G(\theta)\) (BKM metric)
Marginal Entropies: \(h_i\) for each subsystem
Constraint Gradient: \(a = \nabla C\) where \(C = \sum_i h_i\)
Lagrange Multiplier: \(\nu(\theta)\) for constraint enforcement
Lagrange Multiplier Gradient: \(\nabla\nu(\theta)\)
Flow Jacobian: \(M = \partial F/\partial\theta\)
GENERIC Decomposition: \(M = S + A\) (symmetric + antisymmetric)
Effective Hamiltonian: \(H_{\text{eff}} = \sum_a \eta_a F_a\) from \(A\)
Diffusion Operator: \(\mathcal{D}[\rho]\) from \(S\) (optional)
Diagnostics: Comprehensive validation of all properties
Examples
Basic Usage
import numpy as np
from qig.exponential_family import QuantumExponentialFamily
from qig.generic_decomposition import run_generic_decomposition
# Initialize 2-qubit system
exp_fam = QuantumExponentialFamily(n_pairs=1, d=2, pair_basis=True)
# Choose state near LME origin
theta = 0.1 * np.random.randn(exp_fam.n_params)
# Run complete decomposition
results = run_generic_decomposition(
theta, exp_fam,
compute_diffusion=False, # Skip expensive D[ρ] computation
verbose=True, # Print progress
print_summary=True # Show results summary
)
# Access results
print(f"Effective Hamiltonian: {results['H_eff']}")
print(f"All checks passed: {results['diagnostics']['all_checks_pass']}")
Using the Class Directly
from qig.generic_decomposition import GenericDecomposition
# Create decomposition object
decomp = GenericDecomposition(
exp_fam,
method='duhamel', # High-precision derivatives
compute_diffusion=False
)
# Execute all steps
results = decomp.compute_all(theta, verbose=False)
# Print summary
decomp.print_summary(detailed=True)
# Access specific results
H_eff = results['H_eff']
S = results['S']
A = results['A']
diagnostics = results['diagnostics']
Diagnostics and Validation
The diagnostics include automatic validation of all mathematical properties:
# Check which properties pass
checks = results['diagnostics']['checks']
for property_name, passed in checks.items():
status = "✓" if passed else "✗"
print(f"{status} {property_name}")
# Get detailed error metrics
diag = results['diagnostics']
print(f"S symmetry error: {diag['S_symmetry_error']:.2e}")
print(f"H_eff Hermiticity error: {diag['H_eff_hermiticity_error']:.2e}")
print(f"Degeneracy condition (S): {diag['degeneracy_S_condition']:.2e}")
See Also
qig.generic- Individual GENERIC componentsqig.dynamics.GenericDynamics- Dynamics with GENERIC monitoringGENERIC Decomposition - User guide
GENERIC Structure - Theoretical background