Go-netrics is a high-performance graph algorithm framework written in Go. It provides efficient tools for graph construction, traversal, and advanced computations such as shortest paths, centrality measures, and graph transformations. The framework supports both sequential and parallel computation modes, making it suitable for handling graphs of various sizes and complexities.
-
Graph Representation
- Supports directed, undirected, weighted, and unweighted graphs.
- Provides adjacency matrix and adjacency list representations.
-
Algorithms
- Shortest path computations and more metrics computations:
- Weighted graphs: Dijkstra's algorithm.
- Unweighted graphs: Breadth-First Search (BFS).
- Parallelized computations for large graphs.
- Shortest path computations and more metrics computations:
-
Modular Design
Unit
: Sequential computation unit for small to medium-sized graphs.ParallelUnit
: Parallel computation unit leveraging multiple CPU cores.
-
Extensible
- Flexible API for adding custom algorithms.
- Clean structure for graph manipulations.
Ensure you have Go installed (version 1.16 or later). Then run:
go get -u github.com/elecbug/go-netrics
package main
import (
"fmt"
"math/rand"
"time"
"github.com/davecgh/go-spew/spew"
netrics "github.com/elecbug/go-netrics"
)
func main() {
cap := 200
g := netrics.NewGraph(netrics.UNDIRECTED_UNWEIGHTED, cap)
for i := 0; i < cap; i++ {
g.AddNode(fmt.Sprintf("%4d", i))
}
for i := 0; i < g.NodeCount()*g.NodeCount()/10; i++ {
r := rand.New(rand.NewSource(time.Now().UnixNano() + int64(i)))
from := netrics.NodeID(r.Intn(g.NodeCount()))
r = rand.New(rand.NewSource(time.Now().UnixNano() + int64(i*i)))
to := netrics.NodeID(r.Intn(g.NodeCount()))
g.AddEdge(from, to)
}
fmt.Printf("\n%s\n", g.String())
{
u := g.ToUnit()
s := time.Now()
fmt.Printf("\nShortestPath: %v\n", spew.Sdump(u.ShortestPath(0, netrics.NodeID(cap-1))))
fmt.Printf("\nAverageShortestPathLength: %v\n", spew.Sdump(u.AverageShortestPathLength()))
fmt.Printf("\nBetweennessCentrality: %v\n", spew.Sdump(u.BetweennessCentrality()))
fmt.Printf("\nClusteringCoefficient: %v\n", spew.Sdump(u.ClusteringCoefficient()))
fmt.Printf("\nDegreeCentrality: %v\n", spew.Sdump(u.DegreeCentrality()))
fmt.Printf("\nDiameter: %v\n", spew.Sdump(u.Diameter()))
fmt.Printf("\nEigenvectorCentrality: %v\n", spew.Sdump(u.EigenvectorCentrality(1000, 1e-6)))
fmt.Printf("\nGlobalEfficiency: %v\n", spew.Sdump(u.GlobalEfficiency()))
fmt.Printf("\nLocalEfficiency: %v\n", spew.Sdump(u.LocalEfficiency()))
fmt.Printf("\nPercentileShortestPathLength: %v\n", spew.Sdump(u.PercentileShortestPathLength(30)))
fmt.Printf("\nRichClubCoefficient: %v\n", spew.Sdump(u.RichClubCoefficient(2)))
duration := time.Since(s)
fmt.Printf("execution time: %s", duration)
}
{
pu := g.ToParallelUnit(20)
s := time.Now()
fmt.Printf("\nShortestPath: %v\n", spew.Sdump(pu.ShortestPath(0, netrics.NodeID(cap-1))))
fmt.Printf("\nAverageShortestPathLength: %v\n", spew.Sdump(pu.AverageShortestPathLength()))
fmt.Printf("\nBetweennessCentrality: %v\n", spew.Sdump(pu.BetweennessCentrality()))
fmt.Printf("\nClusteringCoefficient: %v\n", spew.Sdump(pu.ClusteringCoefficient()))
fmt.Printf("\nDegreeCentrality: %v\n", spew.Sdump(pu.DegreeCentrality()))
fmt.Printf("\nDiameter: %v\n", spew.Sdump(pu.Diameter()))
fmt.Printf("\nEigenvectorCentrality: %v\n", spew.Sdump(pu.EigenvectorCentrality(1000, 1e-6)))
fmt.Printf("\nGlobalEfficiency: %v\n", spew.Sdump(pu.GlobalEfficiency()))
fmt.Printf("\nLocalEfficiency: %v\n", spew.Sdump(pu.LocalEfficiency()))
fmt.Printf("\nPercentileShortestPathLength: %v\n", spew.Sdump(pu.PercentileShortestPathLength(30)))
fmt.Printf("\nRichClubCoefficient: %v\n", spew.Sdump(pu.RichClubCoefficient(2)))
duration := time.Since(s)
fmt.Printf("execution time: %s", duration)
}
}
Go-netrics is an open-source project, and contributions are welcome! Whether it's fixing bugs, improving documentation, or adding new features, your input can make a difference.
- Fork the repository.
- Create a new branch (
git checkout -b feature/my-feature
). - Make your changes and test thoroughly.
- Commit your changes (
git commit -am 'Add new feature'
). - Push the branch to your fork (
git push origin feature/my-feature
). - Open a pull request.
Please ensure your contributions adhere to the project's coding guidelines and include relevant tests.
Go-netrics is licensed under the MIT License. See the LICENSE file for more information.
If you have any questions, feedback, or feature requests, feel free to open an issue on GitHub or contact us via email at Email.