raitap.transparency¶
- class raitap.transparency.explainers.base_explainer.BaseExplainer¶
Bases:
AdapterMixin,ABCRoot base class for all explainer adapters.
Owns the shared interface:
output_payload_kindandalgorithm_registryclass variables (algorithm_registry is validated at decoration time byTRANSPARENCY.has_algorithm_registry=True). The capability gate (check_backend_compat) is inherited fromAdapterMixin.Extend via
AttributionOnlyExplainerwhen the framework should manage the fullexplainpipeline and you only need to implementcompute_attributions, or viaFullExplainerwhen you own the entireexplainpipeline yourself.
- class raitap.transparency.explainers.base_explainer.AttributionOnlyExplainer¶
Bases:
BaseExplainer,ABCExplainer where you implement one step and the framework handles the rest.
Subclasses implement
compute_attributions()only; batching, normalisation, result construction, and artifact persistence are provided by this class viaexplain().- abstractmethod compute_attributions(model, inputs, **kwargs)¶
Compute attributions for the given inputs.
- Parameters:
model -- The model shape this explainer needs (nn.Module for gradient methods, a predict callable for model-agnostic methods).
inputs -- Input tensor (shape depends on modality).
**kwargs -- Framework-specific keyword arguments. The framework always passes
backendandinput_spec(the inferredInputSpec); a subclass may declare either to use it (e.g. to build a per-modality masker) or let**kwargsabsorb it. Also carriestarget/baselines/background_data.
- Returns:
Attribution tensor matching the input shape.
- explain(model, inputs, *, backend=None, run_dir=None, output_root=None, experiment_name=None, explainer_target=None, explainer_name=None, visualisers=None, raitap_kwargs=None, call_provenance=None, baseline_render_cache=None, **kwargs)¶
Compute attributions (via
compute_attributions()), build anExplanationResult, write artifacts, and return it.
- class raitap.transparency.explainers.full_explainer.FullExplainer¶
Bases:
BaseExplainer,ABCExplainer where you own the full
explainpipeline end-to-end.Subclasses implement
explain()entirely — data conversion, model invocation, result construction, and artifact persistence. Use this when the target library's API does not map to a simplecompute_attributions(model, inputs) → Tensorstep.- abstractmethod explain(model, inputs, *, backend=None, run_dir=None, output_root=None, experiment_name=None, explainer_target=None, explainer_name=None, visualisers=None, **kwargs)¶
Implement the full explanation pipeline.
RAITAP Transparency Module
Provides model explanation / attribution capabilities using SHAP and Captum.
Transparency Public Surface¶
Explainer classes expose explainer.explain(model, inputs, **kwargs), which returns an ExplanationResult. Each explanation can then render one or more visualisations via explanation.visualise(**kwargs).
Explainer classes (used as _target_ values)¶
CaptumExplainer, ShapExplainer
Visualiser classes (used as _target_ values in visualisers list)¶
CaptumImageVisualiser, CaptumTimeSeriesVisualiser, CaptumTextVisualiser ShapBarVisualiser, ShapBeeswarmVisualiser, ShapWaterfallVisualiser, ShapForceVisualiser, ShapImageVisualiser TabularBarChartVisualiser
Module layout (for contributors):
phase.py— pipeline entry point:TransparencyPhase(what the registry assembles) + theassess_transparencywork fn. Start here to follow a run.explain_detection.py— detection-task per-box K-loop (one result per box).factory.py— builds explainer + visualiser instances from config.results.py—ExplanationResult(owns its.visualisations) +VisualisationResult.report.py—TransparencyPhaseResult+ report-section builders.explainers/— the XAI adapters (Captum, SHAP).visualisers/— the figure renderers.
- class raitap.transparency.AttributionOnlyExplainer¶
Bases:
BaseExplainer,ABCExplainer where you implement one step and the framework handles the rest.
Subclasses implement
compute_attributions()only; batching, normalisation, result construction, and artifact persistence are provided by this class viaexplain().- abstractmethod compute_attributions(model, inputs, **kwargs)¶
Compute attributions for the given inputs.
- Parameters:
model -- The model shape this explainer needs (nn.Module for gradient methods, a predict callable for model-agnostic methods).
inputs -- Input tensor (shape depends on modality).
**kwargs -- Framework-specific keyword arguments. The framework always passes
backendandinput_spec(the inferredInputSpec); a subclass may declare either to use it (e.g. to build a per-modality masker) or let**kwargsabsorb it. Also carriestarget/baselines/background_data.
- Returns:
Attribution tensor matching the input shape.
- explain(model, inputs, *, backend=None, run_dir=None, output_root=None, experiment_name=None, explainer_target=None, explainer_name=None, visualisers=None, raitap_kwargs=None, call_provenance=None, baseline_render_cache=None, **kwargs)¶
Compute attributions (via
compute_attributions()), build anExplanationResult, write artifacts, and return it.
- class raitap.transparency.BaseExplainer¶
Bases:
AdapterMixin,ABCRoot base class for all explainer adapters.
Owns the shared interface:
output_payload_kindandalgorithm_registryclass variables (algorithm_registry is validated at decoration time byTRANSPARENCY.has_algorithm_registry=True). The capability gate (check_backend_compat) is inherited fromAdapterMixin.Extend via
AttributionOnlyExplainerwhen the framework should manage the fullexplainpipeline and you only need to implementcompute_attributions, or viaFullExplainerwhen you own the entireexplainpipeline yourself.
- class raitap.transparency.CaptumExplainer(algorithm, **init_kwargs)¶
Bases:
AttributionOnlyExplainerSingle wrapper for ALL Captum attribution methods.
Uses dynamic method loading - no need for class-per-method.
- compute_attributions(model, inputs, backend=None, input_spec=None, target=None, baselines=None, **attr_kwargs)¶
Compute Captum attributions via the per-entry invoker (#266).
Default methods use
_default_captum_invoker(the uniformmethod_class(model).attribute(...)path). Methods with a non-uniform lifecycle (NoiseTunnel) carry a custominvokeron their registry entry.
- class raitap.transparency.CaptumImageVisualiser(method='blended_heat_map', sign='all', show_colorbar=True, title=None, include_original_image=True)¶
Bases:
BaseVisualiserVisualise image attributions using
captum.attr.visualization.visualize_image_attr.Wraps the Captum native function so the output is a Matplotlib Figure that can be saved or returned by
explain().Compatible with ALL Captum attribution algorithms.
Whether
include_original_input=Falsestill leaves a meaningful attribution view.This is instance-level because some visualisers depend on constructor settings such as Captum's
method.
- validate_explanation(explanation, attributions, inputs)¶
Validate that this visualiser can render an explanation's typed semantics.
- visualise(attributions, inputs=None, *, context=None, max_samples=8, **kwargs)¶
- Parameters:
attributions --
(B, C, H, W)or(B, H, W)tensor / array.inputs -- Original images
(B, C, H, W)for overlay.context -- Standard RAITAP metadata (optional).
max_samples -- Maximum number of samples to display (default: 8).
**kwargs -- Forwarded to
visualize_image_attr.
- Returns:
Matplotlib Figure with one column per sample.
- class raitap.transparency.CaptumTextVisualiser¶
Bases:
BaseVisualiserVisualise per-token text attributions as a horizontal bar chart.
This is a lightweight matplotlib-based implementation since Captum's native text visualisation renders HTML (not a Matplotlib Figure).
Compatible with ALL Captum attribution algorithms on text/sequence inputs.
Note:
attributionsshould be a 1-D array of per-token scores for a single input. Passtoken_labelsvia kwargs for readable output.- validate_explanation(explanation, attributions, inputs)¶
Validate that this visualiser can render an explanation's typed semantics.
- visualise(attributions, inputs=None, token_labels=None, **kwargs)¶
- Parameters:
attributions -- 1-D attribution scores (one per token).
inputs -- Ignored.
token_labels -- List of token strings (optional).
**kwargs -- Ignored (for API consistency).
- Returns:
Matplotlib Figure with a horizontal bar chart of token importance.
- class raitap.transparency.CaptumTimeSeriesVisualiser(method='overlay_individual', sign='absolute_value')¶
Bases:
BaseVisualiserVisualise time-series attributions via
captum.attr.visualization.visualize_timeseries_attr.Compatible with ALL Captum attribution algorithms.
- validate_explanation(explanation, attributions, inputs)¶
Validate that this visualiser can render an explanation's typed semantics.
- visualise(attributions, inputs=None, *, context=None, **kwargs)¶
- Parameters:
attributions --
(N, C)numpy array / tensor (channels-last). If a batch of shape(B, N, C)is given, the first sample is used.inputs -- Matching
(N, C)time-series data (optional).context -- Standard RAITAP metadata (not used by this visualiser).
**kwargs -- Forwarded to
visualize_timeseries_attr.
- Returns:
Matplotlib Figure.
- class raitap.transparency.ConfiguredVisualiser(visualiser, call_kwargs=<factory>)¶
Bases:
objectVisualiser instance plus per-call kwargs for
BaseVisualiser.visualise.
- class raitap.transparency.DetectionImageVisualiser(*, method=None, sign=None, show_colorbar=None, title=None)¶
Bases:
BaseVisualiserRender one fig per box: original image + bbox rectangle + heatmap.
Reads the per-box metadata from
context.detection_box(populated by the detection explain phase). The visualiser does not know which box k it is rendering until the context is passed in.- visualise(attributions, inputs=None, *, context=None, **kwargs)¶
Create visualization from attributions.
- Parameters:
attributions -- Attribution values (numpy array or tensor)
inputs -- Original inputs for overlay (optional)
context -- Standard RAITAP pipeline metadata (optional)
**kwargs -- visualiser-specific arguments
- Returns:
Matplotlib figure
- class raitap.transparency.ExplainerAdapter(*args, **kwargs)¶
Bases:
ProtocolHydra explainer:
explainmatchesBaseExplainer.Read
output_payload_kindviaraitap.transparency.contracts.explainer_output_kind()(not via direct attribute access — the attribute is optional and defaults toATTRIBUTIONSwhen absent).
- class raitap.transparency.ExplainerAlgorithmSpec(families, baseline_default=None, baseline_cardinality=None, requires=<factory>, stochastic=False, invoker=None, extra_outputs=())¶
Bases:
objectPer-algorithm metadata carried by a transparency adapter's
algorithm_registry.The transparency analogue of robustness's
AssessorAlgorithmSpec: one entry per algorithm an adapter wraps, holding everything the framework tracks and reports for that algorithm.baseline_defaultis the implicitBaselineModeused when the user omits the baseline kwarg (Nonefor algorithms with no meaningful default, e.g. Saliency / TreeExplainer).baseline_cardinalitydeclares whether the baseline is a single reference or a sample set, so a mismatchedraitap.baselineis flagged (not reshaped);Noneskips the check.
- class raitap.transparency.ExplainerCapability(scope, scope_definition_step, payload_kind, method_families, candidate_output_spaces)¶
Bases:
objectBroad pre-compute semantic capability for an explainer configuration.
- class raitap.transparency.ExplanationOutputSpace(*values)¶
Bases:
StrEnumCoordinate space represented by attribution values.
- class raitap.transparency.ExplanationPayloadKind(*values)¶
Bases:
StrEnumPrimary payload category on
ExplanationResult.
- class raitap.transparency.ExplanationResult(attributions: 'torch.Tensor', inputs: 'torch.Tensor', run_dir: 'Path', experiment_name: 'str | None', adapter_target: 'str', algorithm: 'str', name: 'str | None' = None, kwargs: 'dict[str, Any]'=<factory>, call_kwargs: 'dict[str, Any]'=<factory>, visualiser_targets: 'list[str]' = <factory>, visualisers: 'list[ConfiguredVisualiser]' = <factory>, visualisations: 'list[VisualisationResult]' = <factory>, payload_kind: 'ExplanationPayloadKind' = <ExplanationPayloadKind.ATTRIBUTIONS: 'attributions'>, detection_box: 'DetectionBox | None' = None, original_sample_index: 'int | None' = None, source_library: 'str | None' = None, baseline: 'BaselineRecord | None' = None, structured_payloads: 'list[StructuredPayload]' = <factory>, *, semantics: 'ExplanationSemantics')¶
Bases:
Trackable- log(tracker, artifact_path='transparency', use_subdirectory=True, **kwargs)¶
Log the object's artifacts or metadata to the provided tracker.
- render_visualisation_for_scope(visualiser_index, *, scope, sample_index=None, **render_kwargs)¶
Render one scoped visualisation without persisting it to disk.
Returns
Nonewhen the selected visualiser does not produce the requested scope.
- render_visualisations_for_scope(*, scope, sample_index=None, **render_kwargs)¶
Render scoped visualisations without persisting them to disk.
The returned
VisualisationResultobjects are intended for downstream consumers such as reporting, which own file staging and figure cleanup. Theiroutput_pathvalues are placeholders only and must not be treated as real on-disk artifacts or passed toVisualisationResult.log().
- class raitap.transparency.ExplanationScope(*values)¶
Bases:
StrEnumSemantic breadth represented by an explanation artifact.
- class raitap.transparency.ExplanationSemantics(scope, scope_definition_step, payload_kind, method_families, target, sample_selection, input_spec, output_space, stochastic=False)¶
Bases:
objectTyped contract describing the meaning of an explanation artifact.
- class raitap.transparency.ExplanationTarget(target=None, label=None)¶
Bases:
objectModel output target described by an explanation.
- class raitap.transparency.FullExplainer¶
Bases:
BaseExplainer,ABCExplainer where you own the full
explainpipeline end-to-end.Subclasses implement
explain()entirely — data conversion, model invocation, result construction, and artifact persistence. Use this when the target library's API does not map to a simplecompute_attributions(model, inputs) → Tensorstep.- abstractmethod explain(model, inputs, *, backend=None, run_dir=None, output_root=None, experiment_name=None, explainer_target=None, explainer_name=None, visualisers=None, **kwargs)¶
Implement the full explanation pipeline.
- class raitap.transparency.InputKind(*values)¶
Bases:
StrEnumKnown input modalities used by semantic validation.
- class raitap.transparency.InputSpec(kind, shape, layout, feature_names=None, metadata=None)¶
Bases:
objectInput metadata used for deterministic semantic inference.
- class raitap.transparency.MethodFamily(*values)¶
Bases:
StrEnumExplicit algorithm families supported by the typed transparency contract.
- class raitap.transparency.OutputSpaceSpec(space, shape, layout, layer_path=None, feature_names=None, requires_interpolation=False)¶
Bases:
objectAttribution output-space metadata.
- exception raitap.transparency.PayloadVisualiserIncompatibilityError(*, explainer_target, visualiser, output_payload_kind, supported_payload_kinds)¶
Bases:
ExceptionRaised when a visualiser does not accept the explainer's output payload kind.
- class raitap.transparency.SampleSelection(sample_ids: 'list[str] | None', sample_display_names: 'list[str] | None')¶
Bases:
object
- class raitap.transparency.ScopeDefinitionStep(*values)¶
Bases:
StrEnumPipeline step that defined an artifact's semantic scope.
- class raitap.transparency.ShapBarVisualiser(feature_names=None, max_display=20)¶
Bases:
_TabularSummaryContractMixinMean absolute SHAP value bar chart via
shap.summary_plot(plot_type='bar').Compatible with all SHAP explainer algorithms.
- visualise(attributions, inputs=None, *, context=None, **kwargs)¶
- Parameters:
attributions --
(B, F)SHAP values tensor / array.inputs -- Original feature values
(B, F)(used for colouring).context -- Standard RAITAP metadata (not used by this visualiser).
**kwargs -- Forwarded to
shap.summary_plot.
- class raitap.transparency.ShapBeeswarmVisualiser(feature_names=None, max_display=20)¶
Bases:
_TabularSummaryContractMixinSHAP beeswarm summary plot via
shap.summary_plot().Compatible with all SHAP explainer algorithms.
- visualise(attributions, inputs=None, *, context=None, **kwargs)¶
Create visualization from attributions.
- Parameters:
attributions -- Attribution values (numpy array or tensor)
inputs -- Original inputs for overlay (optional)
context -- Standard RAITAP pipeline metadata (optional)
**kwargs -- visualiser-specific arguments
- Returns:
Matplotlib figure
- class raitap.transparency.ShapExplainer(algorithm, **init_kwargs)¶
Bases:
AttributionOnlyExplainerSingle wrapper for ALL SHAP explainer types.
Uses dynamic explainer loading - no need for class-per-explainer.
- compute_attributions(model, inputs, backend=None, input_spec=None, background_data=None, target=None, **shap_kwargs)¶
Compute SHAP values via the per-entry invoker (legacy or modern).
The modern path additionally returns the SHAP base value, so the raw runtime result may be a
(attributions, base_value)tuple. It is typedtorch.Tensorto match the base contract (as Captum's tuple-returning methods do); the framework's split seam consumes the raw output asobjectand never relies on this annotation. (#101)- Parameters:
model -- PyTorch model
inputs -- Input tensor
input_spec -- Inferred input specification; passed to the invoker.
background_data -- Background dataset (REQUIRED for most explainers) - GradientExplainer: Required - DeepExplainer: Required - KernelExplainer: Required - TreeExplainer: Optional
target -- Target class(es) for attributions (optional) If not specified, returns attributions for all classes
**shap_kwargs -- Additional arguments for .shap_values() method
- Returns:
SHAP values as torch.Tensor
- class raitap.transparency.ShapForceVisualiser(feature_names=None, expected_value=0.0, sample_index=0)¶
Bases:
BaseVisualiserPer-sample SHAP force plot via
shap.plots.force(matplotlib backend).Compatible with all SHAP explainer algorithms.
- visualise(attributions, inputs=None, *, context=None, **kwargs)¶
Create visualization from attributions.
- Parameters:
attributions -- Attribution values (numpy array or tensor)
inputs -- Original inputs for overlay (optional)
context -- Standard RAITAP pipeline metadata (optional)
**kwargs -- visualiser-specific arguments
- Returns:
Matplotlib figure
- class raitap.transparency.ShapImageVisualiser(max_samples=4, title=None, include_original_image=True, show_colorbar=True, cmap=None, overlay_alpha=0.15, outlier_perc=99.9)¶
Bases:
BaseVisualiserRender image-level SHAP attributions with Matplotlib.
This visualiser does not call
shap.image_plotdirectly; instead it renders a RAITAP-managed figure that follows the same rendering recipe asshap.plots.image— a grayscale background atoverlay_alpha=0.15, ared_transparent_bluediverging colormap, and a symmetric±np.nanpercentile(|attribution|, outlier_perc)colormap scale (outlier_perc=99.9by default). RAITAP layers sample-aware titles, the paired-original panel, and the colorbar on top of that recipe.Warning
Only compatible with ``GradientExplainer`` and ``DeepExplainer``. These are the only SHAP explainers that compute pixel-level SHAP values suitable for image visualisation. Passing attributions from other explainers will produce meaningless plots.
Positive contributions are shown in red and negative contributions in blue with a transparent mid-range, matching SHAP's native presentation.
- validate_explanation(explanation, attributions, inputs)¶
Validate that this visualiser can render an explanation's typed semantics.
- visualise(attributions, inputs=None, *, context=None, max_samples=None, title=None, **kwargs)¶
- Parameters:
attributions --
(B, C, H, W)SHAP values tensor / array.inputs -- Original images
(B, C, H, W)for background.context -- Standard RAITAP metadata (optional).
max_samples -- Maximum number of images to display.
title -- Optional attribution panel title. Overrides the algorithm-based default title, even when set to an empty string.
**kwargs -- Optional visual styling overrides.
- Returns:
Matplotlib Figure.
- class raitap.transparency.ShapWaterfallVisualiser(feature_names=None, expected_value=0.0, sample_index=0, max_display=10)¶
Bases:
BaseVisualiserPer-sample SHAP waterfall chart via
shap.plots.waterfall.Compatible with all SHAP explainer algorithms.
- visualise(attributions, inputs=None, *, context=None, **kwargs)¶
Create visualization from attributions.
- Parameters:
attributions -- Attribution values (numpy array or tensor)
inputs -- Original inputs for overlay (optional)
context -- Standard RAITAP pipeline metadata (optional)
**kwargs -- visualiser-specific arguments
- Returns:
Matplotlib figure
- class raitap.transparency.TabularBarChartVisualiser(feature_names=None)¶
Bases:
BaseVisualiserVisualise attributions for tabular data as bar charts.
Works with any attribution method (Captum, SHAP, etc.)
- validate_explanation(explanation, attributions, inputs)¶
Validate that this visualiser can render an explanation's typed semantics.
- visualise(attributions, inputs=None, *, context=None, title=None, **kwargs)¶
Create feature importance bar chart.
- Parameters:
attributions -- (B, num_features) array
inputs -- Not used for tabular visualization
context -- Standard RAITAP metadata (not used by this aggregate visualiser)
title -- Optional chart title override
- Returns:
Matplotlib figure
- class raitap.transparency.TensorLayout(*values)¶
Bases:
StrEnumNamed tensor layouts accepted by built-in visualisers.
- class raitap.transparency.VisualSummarySpec(summary_type, aggregation=None, description=None)¶
Bases:
objectMetadata for visualisers that summarize a set of local explanations.
- class raitap.transparency.VisualisationResult(explanation, figure, visualiser_name, visualiser_target, output_path, scope=ExplanationScope.LOCAL, scope_definition_step=ScopeDefinitionStep.EXPLAINER_OUTPUT, visual_summary=None)¶
Bases:
TrackablePNG is written to
output_path;figureis closed after save to limit memory use.- log(tracker, artifact_path='transparency', use_subdirectory=True, **kwargs)¶
Log the object's artifacts or metadata to the provided tracker.
- exception raitap.transparency.VisualiserIncompatibilityError(framework, visualiser, algorithm, compatible_algorithms)¶
Bases:
ExceptionRaised when a visualiser is not compatible with the chosen explainer algorithm.
- raitap.transparency.explainer_capability(explainer, *, task_kind=None)¶
Return broad pre-compute semantic capabilities for an explainer.
- raitap.transparency.infer_input_spec(inputs=None, *, input_metadata=None, kind=None, layout=None, feature_names=None)¶
Build an
InputSpecfrom explicit metadata and tensor shape.
- raitap.transparency.infer_output_space(*, input_spec, attributions=None, explainer=None, algorithm=None, method_families=None, layer_path=None, feature_names=None, task_kind=None)¶
Infer deterministic output-space metadata from input and method semantics.
- raitap.transparency.method_families_for_explainer(explainer)¶
Return the explicit method-family mapping for a configured explainer.
Resolution order:
type(explainer).algorithm_registry— required class-body ClassVar on every transparency adapter (validated at decoration time by@adapters.transparency's required kwarg).Framework label on the explainer (
framework="shap"/"captum") → matching adapter class's registry.Cross-framework algorithm-name lookup (used by minimal test stubs and config-only entry points where only the algorithm string is known).
- raitap.transparency.contracts.explainer_output_kind(explainer)¶