// Copyright ©2015 The gonum Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package gen import ( "math" "testing" "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/simple" ) type duplication struct { UndirectedMutator addBackwards bool addSelfLoop bool addMultipleEdge bool } func (g *duplication) SetEdge(e graph.Edge) { switch { case e.From().ID() == e.To().ID(): g.addSelfLoop = true return case e.From().ID() > e.To().ID(): g.addBackwards = true case g.UndirectedMutator.HasEdgeBetween(e.From(), e.To()): g.addMultipleEdge = true } g.UndirectedMutator.SetEdge(e) } func TestDuplication(t *testing.T) { for n := 2; n <= 50; n++ { for alpha := 0.1; alpha <= 1; alpha += 0.1 { for delta := 0.; delta <= 1; delta += 0.2 { for sigma := 0.; sigma <= 1; sigma += 0.2 { g := &duplication{UndirectedMutator: simple.NewUndirectedGraph(0, math.Inf(1))} err := Duplication(g, n, delta, alpha, sigma, nil) if err != nil { t.Fatalf("unexpected error: n=%d, alpha=%v, delta=%v sigma=%v: %v", n, alpha, delta, sigma, err) } if g.addBackwards { t.Errorf("edge added with From.ID > To.ID: n=%d, alpha=%v, delta=%v sigma=%v", n, alpha, delta, sigma) } if g.addSelfLoop { t.Errorf("unexpected self edge: n=%d, alpha=%v, delta=%v sigma=%v", n, alpha, delta, sigma) } if g.addMultipleEdge { t.Errorf("unexpected multiple edge: n=%d, alpha=%v, delta=%v sigma=%v", n, alpha, delta, sigma) } } } } } }