# `Monty.Frameworks.Models.EvidenceMatching.FeatureEvidence.Scorer.DefaultFeatureEvidenceScorer`
[🔗](https://github.com/d-led/ex.tbp.monty/blob/v0.1.0/packages/ex_tbp_monty_core/lib/monty/frameworks/models/evidence_matching/feature_evidence/scorer/default_feature_evidence_scorer.ex#L1)

Feature evidence per node for one channel of one graph.

Mirrors
`tbp/monty/frameworks/models/evidence_matching/feature_evidence/scorer.py::DefaultFeatureEvidenceScorer`.

Three pieces meet here, all of them injected:

  * the **selector** decides once, at construction, whether each channel is
    matched on its features at all — a channel weighted only on poses still
    contributes pose evidence, but no feature evidence;
  * the **calculator** turns the stored feature rows into a score per node;
  * the **memory** supplies those rows and the observation's query features
    are compared against them.

A channel that is not matched on features answers zeros rather than being
absent: every node of that graph is still a hypothesis, it just learns nothing
from this observation.

# `t`

```elixir
@type t() ::
  %Monty.Frameworks.Models.EvidenceMatching.FeatureEvidence.Scorer.DefaultFeatureEvidenceScorer{
    calculator: term(),
    feature_weights: term(),
    graph_memory: term(),
    increment: term(),
    tolerances: term(),
    use_features_by_channel: term()
  }
```

# `matched_on_features?`

```elixir
@spec matched_on_features?(t(), String.t()) :: boolean()
```

Whether this channel takes part in feature matching at all.

# `new`

```elixir
@spec new(Monty.Frameworks.Models.GraphMatching.GraphMemory.t(), keyword()) :: t()
```

A scorer over `memory`.

`:calculator` and `:selector` name the modules doing the work, `:increment`
scales feature evidence before it is added to a hypothesis' total — it is the
knob an experiment turns to make feature evidence matter more than pose
evidence.

---

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