gonum.org/v1/gonum@v0.14.0/graph/testgraph/testcases.go (about)

     1  // Copyright ©2018 The Gonum Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package testgraph
     6  
     7  import (
     8  	"math"
     9  
    10  	"gonum.org/v1/gonum/graph"
    11  )
    12  
    13  // node is a graph.Node implementation that is not exported
    14  // so that other packages will not be aware of its implementation.
    15  type node int64
    16  
    17  func (n node) ID() int64 { return int64(n) }
    18  
    19  // line is an extended graph.Edge implementation that is not exported
    20  // so that other packages will not be aware of its implementation. It
    21  // covers all the edge types exported by graph.
    22  type line struct {
    23  	F, T graph.Node
    24  	UID  int64
    25  	W    float64
    26  }
    27  
    28  func (e line) From() graph.Node         { return e.F }
    29  func (e line) To() graph.Node           { return e.T }
    30  func (e line) ReversedEdge() graph.Edge { e.F, e.T = e.T, e.F; return e }
    31  func (e line) ID() int64                { return e.UID }
    32  func (e line) Weight() float64          { return e.W }
    33  
    34  var testCases = []struct {
    35  	// name is the name of the test.
    36  	name string
    37  
    38  	// nodes is the set of nodes that should be used
    39  	// to construct the graph.
    40  	nodes []graph.Node
    41  
    42  	// edges is the set of edges that should be used
    43  	// to construct the graph.
    44  	edges []WeightedLine
    45  
    46  	// nonexist is a set of nodes that should not be
    47  	// found within the graph.
    48  	nonexist []graph.Node
    49  
    50  	// self is the weight value associated with
    51  	// a self edge for simple graphs that do not
    52  	// store individual self edges.
    53  	self float64
    54  
    55  	// absent is the weight value associated
    56  	// with absent edges.
    57  	absent float64
    58  }{
    59  	{
    60  		name:     "empty",
    61  		nonexist: []graph.Node{node(-1), node(0), node(1)},
    62  		self:     0,
    63  		absent:   math.Inf(1),
    64  	},
    65  	{
    66  		name:     "one - negative",
    67  		nodes:    []graph.Node{node(-1)},
    68  		nonexist: []graph.Node{node(0), node(1)},
    69  		self:     0,
    70  		absent:   math.Inf(1),
    71  	},
    72  	{
    73  		name:     "one - zero",
    74  		nodes:    []graph.Node{node(0)},
    75  		nonexist: []graph.Node{node(-1), node(1)},
    76  		self:     0,
    77  		absent:   math.Inf(1),
    78  	},
    79  	{
    80  		name:     "one - positive",
    81  		nodes:    []graph.Node{node(1)},
    82  		nonexist: []graph.Node{node(-1), node(0)},
    83  		self:     0,
    84  		absent:   math.Inf(1),
    85  	},
    86  
    87  	{
    88  		name:     "one - self loop",
    89  		nodes:    []graph.Node{node(0)},
    90  		edges:    []WeightedLine{line{F: node(0), T: node(0), UID: 0, W: 0.5}},
    91  		nonexist: []graph.Node{node(-1), node(1)},
    92  		self:     0,
    93  		absent:   math.Inf(1),
    94  	},
    95  
    96  	{
    97  		name:     "two - positive",
    98  		nodes:    []graph.Node{node(1), node(2)},
    99  		edges:    []WeightedLine{line{F: node(1), T: node(2), UID: 0, W: 0.5}},
   100  		nonexist: []graph.Node{node(-1), node(0)},
   101  		self:     0,
   102  		absent:   math.Inf(1),
   103  	},
   104  	{
   105  		name:     "two - negative",
   106  		nodes:    []graph.Node{node(-1), node(-2)},
   107  		edges:    []WeightedLine{line{F: node(-1), T: node(-2), UID: 0, W: 0.5}},
   108  		nonexist: []graph.Node{node(0), node(-3)},
   109  		self:     0,
   110  		absent:   math.Inf(1),
   111  	},
   112  	{
   113  		name:     "two - zero spanning",
   114  		nodes:    []graph.Node{node(-1), node(1)},
   115  		edges:    []WeightedLine{line{F: node(-1), T: node(1), UID: 0, W: 0.5}},
   116  		nonexist: []graph.Node{node(0), node(2)},
   117  		self:     0,
   118  		absent:   math.Inf(1),
   119  	},
   120  	{
   121  		name:     "two - zero contiguous",
   122  		nodes:    []graph.Node{node(0), node(1)},
   123  		edges:    []WeightedLine{line{F: node(0), T: node(1), UID: 0, W: 0.5}},
   124  		nonexist: []graph.Node{node(-1), node(2)},
   125  		self:     0,
   126  		absent:   math.Inf(1),
   127  	},
   128  
   129  	{
   130  		name:     "three - positive",
   131  		nodes:    []graph.Node{node(1), node(2), node(3)},
   132  		edges:    []WeightedLine{line{F: node(1), T: node(2), UID: 0, W: 0.5}},
   133  		nonexist: []graph.Node{node(-1), node(0)},
   134  		self:     0,
   135  		absent:   math.Inf(1),
   136  	},
   137  	{
   138  		name:     "three - negative",
   139  		nodes:    []graph.Node{node(-1), node(-2), node(-3)},
   140  		edges:    []WeightedLine{line{F: node(-1), T: node(-2), UID: 0, W: 0.5}},
   141  		nonexist: []graph.Node{node(0), node(1)},
   142  		self:     0,
   143  		absent:   math.Inf(1),
   144  	},
   145  	{
   146  		name:     "three - zero spanning",
   147  		nodes:    []graph.Node{node(-1), node(0), node(1)},
   148  		edges:    []WeightedLine{line{F: node(-1), T: node(1), UID: 0, W: 0.5}},
   149  		nonexist: []graph.Node{node(-2), node(2)},
   150  		self:     0,
   151  		absent:   math.Inf(1),
   152  	},
   153  	{
   154  		name:     "three - zero contiguous",
   155  		nodes:    []graph.Node{node(0), node(1), node(2)},
   156  		edges:    []WeightedLine{line{F: node(0), T: node(1), UID: 0, W: 0.5}},
   157  		nonexist: []graph.Node{node(-1), node(3)},
   158  		self:     0,
   159  		absent:   math.Inf(1),
   160  	},
   161  
   162  	{
   163  		name:  "three in only",
   164  		nodes: []graph.Node{node(0), node(1), node(2), node(3)},
   165  		edges: []WeightedLine{
   166  			line{F: node(1), T: node(0), UID: 0, W: 0.5},
   167  			line{F: node(2), T: node(0), UID: 1, W: 0.5},
   168  			line{F: node(3), T: node(0), UID: 2, W: 0.5},
   169  		},
   170  		nonexist: []graph.Node{node(-1), node(4)},
   171  		self:     0,
   172  		absent:   math.Inf(1),
   173  	},
   174  	{
   175  		name:  "three out only",
   176  		nodes: []graph.Node{node(0), node(1), node(2), node(3)},
   177  		edges: []WeightedLine{
   178  			line{F: node(0), T: node(1), UID: 0, W: 0.5},
   179  			line{F: node(0), T: node(2), UID: 1, W: 0.5},
   180  			line{F: node(0), T: node(3), UID: 2, W: 0.5},
   181  		},
   182  		nonexist: []graph.Node{node(-1), node(4)},
   183  		self:     0,
   184  		absent:   math.Inf(1),
   185  	},
   186  
   187  	{
   188  		name: "4-clique - single(non-prepared)",
   189  		edges: func() []WeightedLine {
   190  			const n = 4
   191  			var uid int64
   192  			var edges []WeightedLine
   193  			for i := 0; i < n; i++ {
   194  				for j := i + 1; j < 4; j++ {
   195  					edges = append(edges, line{F: node(i), T: node(j), UID: uid, W: 0.5})
   196  					uid++
   197  				}
   198  			}
   199  			return edges
   200  		}(),
   201  		nonexist: []graph.Node{node(-1), node(4)},
   202  		self:     0,
   203  		absent:   math.Inf(1),
   204  	},
   205  	{
   206  		name: "4-clique+ - single(non-prepared)",
   207  		edges: func() []WeightedLine {
   208  			const n = 4
   209  			var uid int64
   210  			var edges []WeightedLine
   211  			for i := 0; i < n; i++ {
   212  				for j := i; j < 4; j++ {
   213  					edges = append(edges, line{F: node(i), T: node(j), UID: uid, W: 0.5})
   214  					uid++
   215  				}
   216  			}
   217  			return edges
   218  		}(),
   219  		nonexist: []graph.Node{node(-1), node(4)},
   220  		self:     0,
   221  		absent:   math.Inf(1),
   222  	},
   223  	{
   224  		name: "4-clique - single(prepared)",
   225  		nodes: func() []graph.Node {
   226  			const n = 4
   227  			nodes := make([]graph.Node, n)
   228  			for i := range nodes {
   229  				nodes[i] = node(i)
   230  			}
   231  			return nodes
   232  		}(),
   233  		edges: func() []WeightedLine {
   234  			const n = 4
   235  			var uid int64
   236  			var edges []WeightedLine
   237  			for i := 0; i < n; i++ {
   238  				for j := i + 1; j < n; j++ {
   239  					edges = append(edges, line{F: node(i), T: node(j), UID: uid, W: 0.5})
   240  					uid++
   241  				}
   242  			}
   243  			return edges
   244  		}(),
   245  		nonexist: []graph.Node{node(-1), node(4)},
   246  		self:     0,
   247  		absent:   math.Inf(1),
   248  	},
   249  	{
   250  		name: "4-clique+ - single(prepared)",
   251  		nodes: func() []graph.Node {
   252  			const n = 4
   253  			nodes := make([]graph.Node, n)
   254  			for i := range nodes {
   255  				nodes[i] = node(i)
   256  			}
   257  			return nodes
   258  		}(),
   259  		edges: func() []WeightedLine {
   260  			const n = 4
   261  			var uid int64
   262  			var edges []WeightedLine
   263  			for i := 0; i < n; i++ {
   264  				for j := i; j < n; j++ {
   265  					edges = append(edges, line{F: node(i), T: node(j), UID: uid, W: 0.5})
   266  					uid++
   267  				}
   268  			}
   269  			return edges
   270  		}(),
   271  		nonexist: []graph.Node{node(-1), node(4)},
   272  		self:     0,
   273  		absent:   math.Inf(1),
   274  	},
   275  
   276  	{
   277  		name: "4-clique - double(non-prepared)",
   278  		edges: func() []WeightedLine {
   279  			const n = 4
   280  			var uid int64
   281  			var edges []WeightedLine
   282  			for i := 0; i < n; i++ {
   283  				for j := i + 1; j < n; j++ {
   284  					edges = append(edges, line{F: node(i), T: node(j), UID: uid, W: 0.5})
   285  					uid++
   286  					edges = append(edges, line{F: node(j), T: node(i), UID: uid, W: 0.5})
   287  					uid++
   288  				}
   289  			}
   290  			return edges
   291  		}(),
   292  		nonexist: []graph.Node{node(-1), node(4)},
   293  		self:     0,
   294  		absent:   math.Inf(1),
   295  	},
   296  	{
   297  		name: "4-clique+ - double(non-prepared)",
   298  		edges: func() []WeightedLine {
   299  			const n = 4
   300  			var uid int64
   301  			var edges []WeightedLine
   302  			for i := 0; i < n; i++ {
   303  				for j := i; j < n; j++ {
   304  					edges = append(edges, line{F: node(i), T: node(j), UID: uid, W: 0.5})
   305  					uid++
   306  					edges = append(edges, line{F: node(j), T: node(i), UID: uid, W: 0.5})
   307  					uid++
   308  				}
   309  			}
   310  			return edges
   311  		}(),
   312  		nonexist: []graph.Node{node(-1), node(4)},
   313  		self:     0,
   314  		absent:   math.Inf(1),
   315  	},
   316  	{
   317  		name: "4-clique - double(prepared)",
   318  		nodes: func() []graph.Node {
   319  			const n = 4
   320  			nodes := make([]graph.Node, n)
   321  			for i := range nodes {
   322  				nodes[i] = node(i)
   323  			}
   324  			return nodes
   325  		}(),
   326  		edges: func() []WeightedLine {
   327  			const n = 4
   328  			var uid int64
   329  			var edges []WeightedLine
   330  			for i := 0; i < n; i++ {
   331  				for j := i + 1; j < n; j++ {
   332  					edges = append(edges, line{F: node(i), T: node(j), UID: uid, W: 0.5})
   333  					uid++
   334  					edges = append(edges, line{F: node(j), T: node(i), UID: uid, W: 0.5})
   335  					uid++
   336  				}
   337  			}
   338  			return edges
   339  		}(),
   340  		nonexist: []graph.Node{node(-1), node(4)},
   341  		self:     0,
   342  		absent:   math.Inf(1),
   343  	},
   344  	{
   345  		name: "4-clique+ - double(prepared)",
   346  		nodes: func() []graph.Node {
   347  			const n = 4
   348  			nodes := make([]graph.Node, n)
   349  			for i := range nodes {
   350  				nodes[i] = node(i)
   351  			}
   352  			return nodes
   353  		}(),
   354  		edges: func() []WeightedLine {
   355  			const n = 4
   356  			var uid int64
   357  			var edges []WeightedLine
   358  			for i := 0; i < n; i++ {
   359  				for j := i; j < n; j++ {
   360  					edges = append(edges, line{F: node(i), T: node(j), UID: uid, W: 0.5})
   361  					uid++
   362  					edges = append(edges, line{F: node(j), T: node(i), UID: uid, W: 0.5})
   363  					uid++
   364  				}
   365  			}
   366  			return edges
   367  		}(),
   368  		nonexist: []graph.Node{node(-1), node(4)},
   369  		self:     0,
   370  		absent:   math.Inf(1),
   371  	},
   372  	{
   373  		name:  "issue 1686",
   374  		nodes: []graph.Node{node(0), node(1), node(2)},
   375  		edges: []WeightedLine{
   376  			line{F: node(0), T: node(1), UID: 0, W: 0.5},
   377  			line{F: node(1), T: node(2), UID: 0, W: 0.5},
   378  		},
   379  		nonexist: []graph.Node{node(-1), node(4)},
   380  		self:     0,
   381  		absent:   math.Inf(1),
   382  	},
   383  }