...

Text file src/go/doc/testdata/examples/issue43658.golden

Documentation: go/doc/testdata/examples

     1-- Profile_simple.Play --
     2package main
     3
     4import (
     5	"fmt"
     6	"log"
     7	"sort"
     8
     9	"golang.org/x/exp/rand"
    10
    11	"gonum.org/v1/gonum/graph/community"
    12	"gonum.org/v1/gonum/graph/internal/ordered"
    13	"gonum.org/v1/gonum/graph/simple"
    14)
    15
    16func main() {
    17	// Profile calls Modularize which implements the Louvain modularization algorithm.
    18	// Since this is a randomized algorithm we use a defined random source to ensure
    19	// consistency between test runs. In practice, results will not differ greatly
    20	// between runs with different PRNG seeds.
    21	src := rand.NewSource(1)
    22
    23	// Create dumbell graph:
    24	//
    25	//  0       4
    26	//  |\     /|
    27	//  | 2 - 3 |
    28	//  |/     \|
    29	//  1       5
    30	//
    31	g := simple.NewUndirectedGraph()
    32	for u, e := range smallDumbell {
    33		for v := range e {
    34			g.SetEdge(simple.Edge{F: simple.Node(u), T: simple.Node(v)})
    35		}
    36	}
    37
    38	// Get the profile of internal node weight for resolutions
    39	// between 0.1 and 10 using logarithmic bisection.
    40	p, err := community.Profile(
    41		community.ModularScore(g, community.Weight, 10, src),
    42		true, 1e-3, 0.1, 10,
    43	)
    44	if err != nil {
    45		log.Fatal(err)
    46	}
    47
    48	// Print out each step with communities ordered.
    49	for _, d := range p {
    50		comm := d.Communities()
    51		for _, c := range comm {
    52			sort.Sort(ordered.ByID(c))
    53		}
    54		sort.Sort(ordered.BySliceIDs(comm))
    55		fmt.Printf("Low:%.2v High:%.2v Score:%v Communities:%v Q=%.3v\n",
    56			d.Low, d.High, d.Score, comm, community.Q(g, comm, d.Low))
    57	}
    58
    59}
    60
    61// intset is an integer set.
    62type intset map[int]struct{}
    63
    64func linksTo(i ...int) intset {
    65	if len(i) == 0 {
    66		return nil
    67	}
    68	s := make(intset)
    69	for _, v := range i {
    70		s[v] = struct{}{}
    71	}
    72	return s
    73}
    74
    75var smallDumbell = []intset{
    76	0: linksTo(1, 2),
    77	1: linksTo(2),
    78	2: linksTo(3),
    79	3: linksTo(4, 5),
    80	4: linksTo(5),
    81	5: nil,
    82}
    83
    84-- Profile_simple.Output --
    85Low:0.1 High:0.29 Score:14 Communities:[[0 1 2 3 4 5]] Q=0.9
    86Low:0.29 High:2.3 Score:12 Communities:[[0 1 2] [3 4 5]] Q=0.714
    87Low:2.3 High:3.5 Score:4 Communities:[[0 1] [2] [3] [4 5]] Q=-0.31
    88Low:3.5 High:10 Score:0 Communities:[[0] [1] [2] [3] [4] [5]] Q=-0.607
    89
    90-- Profile_multiplex.Play --
    91
    92package main
    93
    94import (
    95	"fmt"
    96	"log"
    97	"sort"
    98
    99	"golang.org/x/exp/rand"
   100
   101	"gonum.org/v1/gonum/graph/community"
   102	"gonum.org/v1/gonum/graph/internal/ordered"
   103	"gonum.org/v1/gonum/graph/simple"
   104)
   105
   106var friends, enemies *simple.WeightedUndirectedGraph
   107
   108func main() {
   109	// Profile calls ModularizeMultiplex which implements the Louvain modularization
   110	// algorithm. Since this is a randomized algorithm we use a defined random source
   111	// to ensure consistency between test runs. In practice, results will not differ
   112	// greatly between runs with different PRNG seeds.
   113	src := rand.NewSource(1)
   114
   115	// The undirected graphs, friends and enemies, are the political relationships
   116	// in the Middle East as described in the Slate article:
   117	// http://www.slate.com/blogs/the_world_/2014/07/17/the_middle_east_friendship_chart.html
   118	g, err := community.NewUndirectedLayers(friends, enemies)
   119	if err != nil {
   120		log.Fatal(err)
   121	}
   122	weights := []float64{1, -1}
   123
   124	// Get the profile of internal node weight for resolutions
   125	// between 0.1 and 10 using logarithmic bisection.
   126	p, err := community.Profile(
   127		community.ModularMultiplexScore(g, weights, true, community.WeightMultiplex, 10, src),
   128		true, 1e-3, 0.1, 10,
   129	)
   130	if err != nil {
   131		log.Fatal(err)
   132	}
   133
   134	// Print out each step with communities ordered.
   135	for _, d := range p {
   136		comm := d.Communities()
   137		for _, c := range comm {
   138			sort.Sort(ordered.ByID(c))
   139		}
   140		sort.Sort(ordered.BySliceIDs(comm))
   141		fmt.Printf("Low:%.2v High:%.2v Score:%v Communities:%v Q=%.3v\n",
   142			d.Low, d.High, d.Score, comm, community.QMultiplex(g, comm, weights, []float64{d.Low}))
   143	}
   144
   145}
   146-- Profile_multiplex.Output --
   147Low:0.1 High:0.72 Score:26 Communities:[[0] [1 7 9 12] [2 8 11] [3 4 5 10] [6]] Q=[24.7 1.97]
   148Low:0.72 High:1.1 Score:24 Communities:[[0 6] [1 7 9 12] [2 8 11] [3 4 5 10]] Q=[16.9 14.1]
   149Low:1.1 High:1.2 Score:18 Communities:[[0 2 6 11] [1 7 9 12] [3 4 5 8 10]] Q=[9.16 25.1]
   150Low:1.2 High:1.6 Score:10 Communities:[[0 3 4 5 6 10] [1 7 9 12] [2 8 11]] Q=[10.5 26.7]
   151Low:1.6 High:1.6 Score:8 Communities:[[0 1 6 7 9 12] [2 8 11] [3 4 5 10]] Q=[5.56 39.8]
   152Low:1.6 High:1.8 Score:2 Communities:[[0 2 3 4 5 6 10] [1 7 8 9 11 12]] Q=[-1.82 48.6]
   153Low:1.8 High:2.3 Score:-6 Communities:[[0 2 3 4 5 6 8 10 11] [1 7 9 12]] Q=[-5 57.5]
   154Low:2.3 High:2.4 Score:-10 Communities:[[0 1 2 6 7 8 9 11 12] [3 4 5 10]] Q=[-11.2 79]
   155Low:2.4 High:4.3 Score:-52 Communities:[[0 1 2 3 4 5 6 7 8 9 10 11 12]] Q=[-46.1 117]
   156Low:4.3 High:10 Score:-54 Communities:[[0 1 2 3 4 6 7 8 9 10 11 12] [5]] Q=[-82 254]

View as plain text