# `Monty.Frameworks.Models.SensorModules.SurfaceNormalMethod`
[🔗](https://github.com/d-led/ex.tbp.monty/blob/v0.1.0/packages/ex_tbp_monty_core/lib/monty/frameworks/models/sensor_modules/surface_normal_method.ex#L1)

How a sensor module estimates a surface normal from a patch.

Mirrors `tbp/monty/frameworks/models/sensor_modules.py::SurfaceNormalMethod`,
which is an enum of three names: total least squares (the default Monty's
experiments use), ordinary least squares, and a naive cross product of
neighbouring pixels.

Only total least squares is ported — it is the one Monty's configurations ask
for, and the only one `Monty.Frameworks.Utils.SensorProcessing` implements.
Asking for another is an error rather than a silent substitution: a normal
estimated a different way is a different percept.

# `t`

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

# `new`

```elixir
@spec new(String.t() | t() | nil) :: t()
```

The method a config names, which is `"TLS"` unless it says otherwise.

---

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