blob: 56e7d05a1d8898ef979271a3226bdc30f4ac37a3 [file] [log] [blame]
// 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)
}
}
}
}
}
}