README.md

# PregelEx

PregelEx - A distributed graph processing framework in Elixir

## Installation

If [available in Hex](https://hex.pm/docs/publish), the package can be installed
by adding `pregel_ex` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:pregel_ex, "~> 0.1.0"}
  ]
end
```

## Example 
```elixir
assert [] = Supervisor.which_children(PregelEx.GraphSupervisor)

add_one = fn context ->
  case context.aggregated_messages do
    nil -> %{sum: 1}
    %{sum: sum} -> %{sum: sum + 1}
  end
end

# Create graph
{:ok, graph_id, _} = PregelEx.create_graph("sum_graph")

# Create vertices
{:ok, start_vertex_id, _} =
  PregelEx.create_vertex(
    graph_id,
    "start",
    fn _ -> %{sum: 0} end,
    type: :source
  )

{:ok, vertex_1, _} = PregelEx.create_vertex(graph_id, "v1", add_one)
{:ok, vertex_2, _} = PregelEx.create_vertex(graph_id, "v2", add_one)

{:ok, final_vertex_id, _} =
  PregelEx.create_vertex(
    graph_id,
    "final",
    fn context -> context.aggregated_messages end,
    type: :final
  )

# Create edges
PregelEx.create_edge(graph_id, start_vertex_id, vertex_1)
PregelEx.create_edge(graph_id, vertex_1, vertex_2)
PregelEx.create_edge(graph_id, vertex_2, final_vertex_id)

# Run the graph
:ok = PregelEx.run(graph_id)
{:ok, final} = PregelEx.get_final_value(graph_id)

assert final.value == %{sum: 2}
```