# Parameters

Hyperparameters and configuration values for an experiment. Parameters are static key-value pairs set once (or merged across calls) — for time-series data, see [Metrics](/metrics.md).

## Setting Parameters

```python
from ml_dash import Experiment

with Experiment(prefix="alice/project/run-01").run as exp:
    exp.params.set(
        learning_rate=0.001,
        batch_size=32,
        optimizer="adam",
    )
```

Nested dicts are flattened to dot notation:

```python
exp.params.set(
    model={"architecture": "resnet50", "pretrained": True},
    optimizer={"type": "adam", "lr": 0.001},
)
# Stored as: model.architecture, model.pretrained, optimizer.type, optimizer.lr
```

## Updating Parameters

Multiple calls merge — later values overwrite earlier ones:

```python
exp.params.set(learning_rate=0.001, batch_size=32)
exp.params.set(learning_rate=0.0001)  # overrides; batch_size preserved
```

## From Config Objects

Pass class objects directly — works with `params-proto`, plain classes, or any object with attributes. Private attributes (prefixed with `_`) are skipped.

```python
class Args:
    batch_size = 64
    learning_rate = 0.001

exp.params.set(Args=Args)
# → Args.batch_size = 64, Args.learning_rate = 0.001
```

For dataclasses, splat with `asdict`:

```python
from dataclasses import asdict
exp.params.set(**asdict(config))
```

## Reading Parameters

```python
exp.params.get()                # flat dict with dot notation (default)
exp.params.get(flatten=False)   # nested dict
```

## API

- `exp.params.set(**kwargs)` — set or merge parameters. Accepts scalars, nested dicts, and class objects. Returns self.
- `exp.params.log(**kwargs)` — alias for `set()`, identical behavior.
- `exp.params.get(flatten=True)` — retrieve current parameters.

---

**Next:** [Metrics](/metrics.md) for time-series tracking.
