Files
OBLITERATUS/obliteratus/analysis/__init__.py
T
Roxue88 f82518ea13 Make local console and runtime paths portable
Salvage the still-relevant functional work from PR #48: add non-UTF-8 console fallbacks, use platform temporary directories, make pipeline log output encoding-safe, and defer heavyweight analysis imports. The obsolete contributed CI workflow and already-corrected remote URL are intentionally excluded.
2026-08-15 03:13:27 -04:00

89 lines
3.1 KiB
Python

"""Novel analysis techniques for mechanistic interpretability of refusal."""
from __future__ import annotations
from importlib import import_module
__all__ = [
"CrossLayerAlignmentAnalyzer",
"RefusalLogitLens",
"WhitenedSVDExtractor",
"ActivationProbe",
"DefenseRobustnessEvaluator",
"ConceptConeAnalyzer",
"AlignmentImprintDetector",
"MultiTokenPositionAnalyzer",
"SparseDirectionSurgeon",
"CausalRefusalTracer",
"ResidualStreamDecomposer",
"LinearRefusalProbe",
"TransferAnalyzer",
"SteeringVectorFactory",
"SteeringHookManager",
"SparseAutoencoder",
"train_sae",
"identify_refusal_features",
"SAEDecompositionPipeline",
"TunedLensTrainer",
"RefusalTunedLens",
"RiemannianManifoldAnalyzer",
"AntiOuroborosProber",
"ConditionalAbliterator",
"WassersteinRefusalTransfer",
"SpectralCertifier",
"CertificationLevel",
"ActivationPatcher",
"WassersteinOptimalExtractor",
"BayesianKernelProjection",
]
# Defer heavyweight analysis modules until their public object is requested.
# This keeps pure-Python helpers importable in environments without PyTorch.
_LAZY_IMPORTS = {
"CrossLayerAlignmentAnalyzer": "cross_layer",
"RefusalLogitLens": "logit_lens",
"WhitenedSVDExtractor": "whitened_svd",
"ActivationProbe": "activation_probing",
"DefenseRobustnessEvaluator": "defense_robustness",
"ConceptConeAnalyzer": "concept_geometry",
"AlignmentImprintDetector": "alignment_imprint",
"MultiTokenPositionAnalyzer": "multi_token_position",
"SparseDirectionSurgeon": "sparse_surgery",
"CausalRefusalTracer": "causal_tracing",
"ResidualStreamDecomposer": "residual_stream",
"LinearRefusalProbe": "probing_classifiers",
"TransferAnalyzer": "cross_model_transfer",
"SteeringVectorFactory": "steering_vectors",
"SteeringHookManager": "steering_vectors",
"SparseAutoencoder": "sae_abliteration",
"train_sae": "sae_abliteration",
"identify_refusal_features": "sae_abliteration",
"SAEDecompositionPipeline": "sae_abliteration",
"TunedLensTrainer": "tuned_lens",
"RefusalTunedLens": "tuned_lens",
"RiemannianManifoldAnalyzer": "riemannian_manifold",
"AntiOuroborosProber": "anti_ouroboros",
"ConditionalAbliterator": "conditional_abliteration",
"WassersteinRefusalTransfer": "wasserstein_transfer",
"SpectralCertifier": "spectral_certification",
"CertificationLevel": "spectral_certification",
"ActivationPatcher": "activation_patching",
"WassersteinOptimalExtractor": "wasserstein_optimal",
"BayesianKernelProjection": "bayesian_kernel_projection",
}
def __getattr__(name: str):
"""Resolve and cache a public analysis object on first access."""
submodule = _LAZY_IMPORTS.get(name)
if submodule is None:
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
value = getattr(import_module(f"{__name__}.{submodule}"), name)
globals()[name] = value
return value
def __dir__() -> list[str]:
"""Include lazily exported names in interactive discovery."""
return sorted(set(globals()) | _LAZY_IMPORTS.keys())