pulsatrix
Loading...
Searching...
No Matches
saliency.hpp
Go to the documentation of this file.
1
6#pragma once
7
8#include <stdexcept>
9#include <string>
10#include <vector>
11
12#include "pulsatrix/assert.hpp"
16#include "pulsatrix/tensor.hpp"
17
18namespace pulsatrix {
19
29class Saliency {
30public:
49 [[nodiscard]] Attribution explain(ExplainerContext& ctx, const Tensor& input, int64_t target_index,
50 DeviceBackend* backend) const {
51 Tensor output = ctx.forward_pass(input);
52 // External boundary (Mission 2, finding 15 systemic sweep; rank check added by
53 // campaign_exai_dl_library_batch_dimension_support) -- escalated from
54 // PULSATRIX_ASSERT-only.
55 if (output.rank() != 2) {
56 throw std::invalid_argument("Saliency::explain: network output must be rank-2 (N, num_classes)");
57 }
58 if (target_index < 0 || target_index >= output.shape().dim(1)) {
59 throw std::invalid_argument("Saliency::explain: target_index out of range");
60 }
61 int64_t N = output.shape().dim(0);
62 int64_t C = output.shape().dim(1);
63
64 std::vector<float> seed_values(static_cast<size_t>(output.numel()), 0.0f);
65 for (int64_t n = 0; n < N; ++n) {
66 seed_values[static_cast<size_t>(n * C + target_index)] = 1.0f;
67 }
68 Tensor seed(output.shape(), explainer_detail::backend_beside(output, backend), seed_values,
69 output.device());
70
71 Tensor grad = ctx.backward_pass(seed);
72
73 // Attribution has no default constructor -- Tensor (its values member) doesn't
74 // either, by design (Phase 0). Aggregate-initialize directly instead.
75 return Attribution{"saliency", std::move(grad), {{"target_index", std::to_string(target_index)}}};
76 }
77};
78
79} // namespace pulsatrix
PULSATRIX_ASSERT – debug-only invariant check for programmer errors, distinct from throw (used for ca...
First-class explanation result type – values, method, and metadata together.
Vendor-agnostic compute/memory backend. CPUBackend, CUDABackend (Phase 1.5), and HIPBackend (Phase 1....
Definition device_backend.hpp:219
Wraps an ordered chain of Modules, running them via Module::forward_traced to build a real Computatio...
Definition explainer_context.hpp:67
Tensor backward_pass(const Tensor &output_grad)
Runs Autograd::backward from the most recent forward_pass()'s output node.
Definition explainer_context.hpp:207
Tensor forward_pass(const Tensor &input)
Runs the full module chain forward, building a fresh graph and caching every node's activation value ...
Definition explainer_context.hpp:95
Raw-gradient saliency: d(output[target_index])/d(input), computed by seeding ExplainerContext::backwa...
Definition saliency.hpp:29
Attribution explain(ExplainerContext &ctx, const Tensor &input, int64_t target_index, DeviceBackend *backend) const
Computes the saliency map for one output index.
Definition saliency.hpp:49
int64_t dim(size_t index) const
Size of a single dimension.
Definition shape.hpp:93
N-dimensional tensor. Owns its data buffer exclusively; a DeviceBackend* is injected (not owned) – th...
Definition tensor.hpp:29
DeviceType device() const
Which device this tensor's buffer conceptually resides on.
Definition tensor.hpp:122
int64_t rank() const
Number of dimensions – shape().rank().
Definition tensor.hpp:119
int64_t numel() const
Total element count – shape().numel().
Definition tensor.hpp:116
const Shape & shape() const
This tensor's shape.
Definition tensor.hpp:113
Abstract interface isolating vendor-specific memory/compute operations from Tensor/ComputationGraph.
Stable interface every explainer gets, regardless of type (charter Part 2 SS2).
DeviceBackend * backend_beside(const Tensor &like, DeviceBackend *backend)
The backend to allocate a tensor through that must live beside like.
Definition attribution.hpp:49
Definition acquisition_functions.hpp:16
An explanation result: the raw attribution values, the method that produced them, and any relevant me...
Definition attribution.hpp:23
N-dimensional tensor – owns a buffer via DeviceBackend*, RAII (Rule of Five).