# `Monty.Frameworks.Models.Salience.Telemetry.SalienceSMTelemetry`
[🔗](https://github.com/d-led/ex.tbp.monty/blob/v0.1.0/packages/ex_tbp_monty_core/lib/monty/frameworks/models/salience/telemetry/salience_sm_telemetry.ex#L1)

Where a salience module records what it judged, and why.

Mirrors
`tbp/monty/frameworks/models/salience/telemetry.py::SalienceSMTelemetry`, a
`Protocol` in Monty. Here it is a behaviour, and — because a struct is a value
— every callback answers the telemetry it leaves behind, so a module can
record a step without mutating anything a reader might be holding.

The three implementations are: this interface, a recorder that keeps nothing
(`...Telemetry.NoopSalienceSMTelemetry`, Monty's default) and one that keeps
everything (`...Telemetry.DetailedSalienceSMTelemetry`).

# `t`

```elixir
@type t() :: struct()
```

# `attention_region`

```elixir
@callback attention_region(t(), Monty.Cmp.AttentionRegion.t()) :: t()
```

Records the region this step proposed.

# `goals`

```elixir
@callback goals(t(), [Monty.Cmp.Goal.t()]) :: t()
```

Records the goals this step proposed.

# `raw_observation`

```elixir
@callback raw_observation(t(), map(), Monty.Geometry.Rotation.t(), [float()]) :: t()
```

Records an observation and the sensor's pose when it was taken.

# `reset`

```elixir
@callback reset(t()) :: t()
```

Forgets every episode's records.

# `salience_map`

```elixir
@callback salience_map(t(), [[float()]]) :: t()
```

Records one step's salience map.

# `segmentation_map`

```elixir
@callback segmentation_map(t(), [[number()]]) :: t()
```

Records one step's segmentation mask.

# `state_dict`

```elixir
@callback state_dict(t()) :: map()
```

Everything recorded, as Monty's `state_dict` reports it.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
