138 lines
3.9 KiB
Python
138 lines
3.9 KiB
Python
"""Generate environment hash for reproducibility tracking."""
|
|
|
|
import platform
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
import numpy as np
|
|
|
|
|
|
def get_blas_info():
|
|
"""Get BLAS library information."""
|
|
try:
|
|
# Try to get BLAS config from numpy
|
|
blas_info = np.show_config()
|
|
return str(blas_info)
|
|
except Exception:
|
|
try:
|
|
# Fallback: try to get from numpy config
|
|
config = np.__config__
|
|
return str(config)
|
|
except Exception:
|
|
return "BLAS info unavailable"
|
|
|
|
|
|
def get_numpy_config():
|
|
"""Get NumPy configuration."""
|
|
try:
|
|
return {
|
|
"version": np.__version__,
|
|
"config": str(np.show_config()),
|
|
}
|
|
except Exception:
|
|
return {"version": np.__version__, "config": "unavailable"}
|
|
|
|
|
|
def generate_env_hash(output_path: Path = Path("audit/env_hash.txt")):
|
|
"""
|
|
Generate environment hash file with system and library information.
|
|
|
|
Args:
|
|
output_path: Path to output file (default: audit/env_hash.txt)
|
|
"""
|
|
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
|
|
lines = []
|
|
lines.append("=" * 80)
|
|
lines.append("Environment Hash")
|
|
lines.append("=" * 80)
|
|
lines.append("")
|
|
|
|
# Python information
|
|
lines.append("Python:")
|
|
lines.append(f" Version: {sys.version}")
|
|
lines.append(f" Executable: {sys.executable}")
|
|
lines.append(f" Platform: {platform.platform()}")
|
|
lines.append("")
|
|
|
|
# OS information
|
|
lines.append("Operating System:")
|
|
lines.append(f" System: {platform.system()}")
|
|
lines.append(f" Release: {platform.release()}")
|
|
lines.append(f" Version: {platform.version()}")
|
|
lines.append(f" Architecture: {platform.machine()}")
|
|
lines.append(f" Processor: {platform.processor()}")
|
|
lines.append("")
|
|
|
|
# CPU information
|
|
try:
|
|
import psutil
|
|
lines.append("CPU:")
|
|
lines.append(f" Physical cores: {psutil.cpu_count(logical=False)}")
|
|
lines.append(f" Logical cores: {psutil.cpu_count(logical=True)}")
|
|
lines.append(f" Frequency: {psutil.cpu_freq()}")
|
|
lines.append("")
|
|
except ImportError:
|
|
lines.append("CPU:")
|
|
lines.append(f" Count: {platform.processor()}")
|
|
lines.append("")
|
|
|
|
# NumPy configuration
|
|
lines.append("NumPy Configuration:")
|
|
np_config = get_numpy_config()
|
|
lines.append(f" Version: {np_config['version']}")
|
|
lines.append(" Config:")
|
|
for line in np_config.get("config", "").split("\n"):
|
|
if line.strip():
|
|
lines.append(f" {line}")
|
|
lines.append("")
|
|
|
|
# BLAS information
|
|
lines.append("BLAS Information:")
|
|
blas_info = get_blas_info()
|
|
for line in blas_info.split("\n"):
|
|
if line.strip():
|
|
lines.append(f" {line}")
|
|
lines.append("")
|
|
|
|
# Python packages (if available)
|
|
try:
|
|
import pkg_resources
|
|
lines.append("Key Packages:")
|
|
key_packages = ["numpy", "scipy", "hypothesis", "pytest"]
|
|
for pkg_name in key_packages:
|
|
try:
|
|
pkg = pkg_resources.get_distribution(pkg_name)
|
|
lines.append(f" {pkg_name}: {pkg.version}")
|
|
except Exception:
|
|
pass
|
|
lines.append("")
|
|
except ImportError:
|
|
pass
|
|
|
|
lines.append("=" * 80)
|
|
|
|
# Write to file
|
|
content = "\n".join(lines)
|
|
with open(output_path, "w") as f:
|
|
f.write(content)
|
|
|
|
print(f"Environment hash written to: {output_path}")
|
|
return output_path
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import argparse
|
|
|
|
parser = argparse.ArgumentParser(description="Generate environment hash")
|
|
parser.add_argument(
|
|
"--output",
|
|
type=Path,
|
|
default=Path("audit/env_hash.txt"),
|
|
help="Output file path (default: audit/env_hash.txt)",
|
|
)
|
|
args = parser.parse_args()
|
|
|
|
generate_env_hash(args.output)
|
|
|