# `Sidereon.GNSS.PrecisePositioning.MultiEpochSolution`
[🔗](https://github.com/neilberkman/sidereon-ex/blob/main/lib/sidereon/gnss/precise_positioning.ex#L125)

Static multi-epoch float-ambiguity phase positioning solution.

# `covariance`

```elixir
@type covariance() :: %{ecef_m2: [[float()]], enu_m2: [[float()]]}
```

# `epoch_clock`

```elixir
@type epoch_clock() :: %{
  epoch: NaiveDateTime.t(),
  rx_clock_s: float(),
  rx_clock_m: float()
}
```

# `position`

```elixir
@type position() :: %{x_m: float(), y_m: float(), z_m: float()}
```

# `residual`

```elixir
@type residual() :: %{
  :epoch =&gt; NaiveDateTime.t(),
  :satellite_id =&gt; String.t(),
  :code_m =&gt; float(),
  :phase_m =&gt; float(),
  optional(:code_weight) =&gt; float(),
  optional(:phase_weight) =&gt; float()
}
```

# `t`

```elixir
@type t() :: %Sidereon.GNSS.PrecisePositioning.MultiEpochSolution{
  ambiguities_m: %{required(String.t()) =&gt; float()},
  epoch_clocks: [epoch_clock()],
  epochs: [NaiveDateTime.t()],
  formal_position_covariance: covariance(),
  formal_tropo_gradient_covariance_m2: term(),
  metadata: %{
    iterations: pos_integer(),
    converged: boolean(),
    status: :state_tolerance | :max_iterations,
    n_epochs: pos_integer(),
    n_observations: pos_integer(),
    code_rms_m: float(),
    phase_rms_m: float(),
    weighted_rms_m: float(),
    troposphere_applied: boolean(),
    ztd_estimated: boolean()
  },
  position: position(),
  position_covariance: covariance(),
  residual_ionosphere_m: term(),
  residuals_m: [residual()],
  temporal_position_covariance: term(),
  tropo_gradient_covariance_m2: term(),
  tropo_gradient_east_m: term(),
  tropo_gradient_north_m: term(),
  used_sats: [String.t()],
  ztd_residual_m: float() | nil
}
```

---

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