# `Yog.Layout.GraphViz`
[🔗](https://github.com/code-shoily/yog_ex/blob/v1.0.0/lib/yog/layout/graphviz.ex#L1)

Optional layout adapter that shells out to GraphViz and imports computed
coordinates back into `Yog.Layout` position maps.

This module requires an external installation of GraphViz (the `dot`, `neato`,
etc. commands) to be present on your system's PATH.

## Coordinates and Scaling

GraphViz computes coordinates in inches by default in its `-Tplain` output.
To align with typical screen pixels, this module scales coordinates by `72.0`
(since standard resolution is 72 points per inch). You can customize this
using the `:position_scale` option.

# `layout`

```elixir
@spec layout(
  Yog.Graph.t() | Yog.DAG.t() | Yog.Multi.Graph.t(),
  keyword()
) :: %{required(any()) =&gt; {float(), float()}}
```

Positions nodes using a GraphViz layout engine.

Supports both simple graphs (`Yog.Graph`) and multigraphs (`Yog.Multi.Graph`).

## Options

  * `:engine` - The GraphViz engine to execute (e.g. `:dot`, `:neato`, `:fdp`, `:circo`, `:twopi`) (default: `:dot`).
  * `:position_scale` - Factor to multiply GraphViz coordinates by (default: `72.0` to convert inches to screen points/pixels).
  * `:dot_options` - Map of custom DOT renderer options passed to the exporter.

## Error Handling

Raises a `RuntimeError` if the GraphViz engine executable is not found on the
system's PATH, or if the command fails during execution.

## Example

    graph = Yog.directed() |> Yog.add_nodes_from([1, 2])
    # Requires GraphViz installed on system PATH:
    # positions = Yog.Layout.GraphViz.layout(graph, engine: :dot)
    # => %{1 => {27.0, 90.0}, 2 => {27.0, 18.0}}

---

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