View Source UnrootedPolytree

A data type and related functions to support an unrooted (multiple starting nodes) polytree (a tree-like graph with edges).

Pictoral example:

O--->O--->O              O--->O
            \            ˄
            ˅          /
  O--->O--->O--->O--->O--->O--->O--->O
                        \
                        ˅
                        O

installation

Installation

This package can be installed by adding unrooted_polytree to your list of dependencies in mix.exs:

def deps do
  [
    {:unrooted_polytree, "~> 0.1.0"}
  ]
end

usage

Usage

Construct an UnrootedPolytree struct by passing a list of lists to UnrootedPolytree.from_lists/1. The values in the inner list should be a 2-item tuple composed of:

  • An ID string
  • A value of any type

IDs are treatead as unique within the UnrootedPolytree struct, and are used to determine branching structures.

The first item in each inner list is a starting node in the UnrootedPolytree struct.

Example:

unrooted_polytree = UnrootedPolytree.from_lists([
  [
    {"a1", %{ id: "a1" }},
    {"a2", %{ id: "a2" }},
    {"m1", %{ id: "m1" }},
    {"m2", %{ id: "m2" }}
  ],
  [
    {"b1", %{ id: "b1" }},
    {"b2", %{ id: "b2" }},
    {"b3", %{ id: "b3" }},
    {"m1", %{ id: "m1" }},
    {"m2", %{ id: "m2" }},
    {"m3", %{ id: "m3" }},
    {"y1", %{ id: "y1" }}
  ],
  [
    {"c1", %{ id: "c1" }},
    {"c2", %{ id: "c2" }},
    {"m2", %{ id: "m2" }},
    {"m3", %{ id: "m3" }},
    {"x1", %{ id: "x1" }},
    {"x2", %{ id: "x2" }},
  ],
])

This results in the branching structure:

        a1 ---> a2                          x1 ---> x2
                      \                    ˄
                        ˅                  /
b1 ---> b2 ---> b3 ---> m1 ---> m2 ---> m3
                                ˄          \
                              /            ˅
                c1 ---> c2                  y1

with the starting nodes:

["a1", "b1", "c1"]

Retrieve the value of a node:

> UnrootedPolytree.node_for_id(unrooted_polytree, "m1")
{:ok, %UnrootedPolytree.Node{id: "m1", value: %{id: "m1"}}}

Retrieve the edges for a node:

> UnrootedPolytree.edges_for_id(unrooted_polytree, "m1")
%Edges{next: ["m2"], previous: ["a2", "b3"]}

documentation

Documentation

Full documentation is available on HexDocs.

license

License

UnrootedPolytree is licensed under the MIT license.