# `Latu.ML.Param`
[🔗](https://github.com/zero-one-group/latu_ml/blob/v0.4.2/lib/latu/ml/param.ex#L1)

One parameter an operator accepts.

Read off PySpark's own param tables by `dev/extract_ml_operators.py`, so drift is something a
re-run notices rather than something a reader has to. `Latu.ML.params/1` hands the table for
one operator back.

`name` is the snake_case atom callers pass; `wire` is Spark's own camelCase spelling, and the
key the server reads. `default` is documentation only — a default is never sent, because a
param the caller did not set and a param sent with its default value are different requests.

# `default`

```elixir
@type default() ::
  term() | nil | {:uid_suffix, String.t()} | :server_supplied | :varies | :nan
```

A param's default, where there is one to state.

Most are ordinary values. Four kinds are not, and each says why rather than inventing a
number: `nil` is no default at all, `{:uid_suffix, s}` is the operator's own random uid with
`s` on the end, `:server_supplied` is a value only a running JVM knows, `:varies` is one that
is not the same twice, and `:nan` is NaN, which has no Elixir literal.

# `t`

```elixir
@type t() :: %Latu.ML.Param{
  default: default(),
  doc: String.t() | nil,
  name: atom(),
  type: Latu.ML.Plan.param_type(),
  wire: String.t()
}
```

---

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