graph/path: add benchmarks for Dominators

The initial test cases are from Robin Eklind's decomp project, the DOT
files were generated using his instructions:

    git clone https://github.com/decomp/testdata
    go get github.com/decomp/decomp/cmd/ll2dot
    cd testdata/pathological/testdata
    ll2dot *.ll
This commit is contained in:
kortschak
2017-09-06 11:18:01 +09:30
parent c2e0c99d23
commit 9baf9959f7
10 changed files with 20711 additions and 0 deletions

View File

@@ -0,0 +1,258 @@
// Copyright ©2017 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.
// +build go1.7
package path
import (
"fmt"
"io/ioutil"
"math"
"math/rand"
"path/filepath"
"strings"
"testing"
"gonum.org/v1/gonum/graph"
"gonum.org/v1/gonum/graph/encoding"
"gonum.org/v1/gonum/graph/encoding/dot"
"gonum.org/v1/gonum/graph/graphs/gen"
"gonum.org/v1/gonum/graph/simple"
"gonum.org/v1/gonum/graph/topo"
)
func BenchmarkDominators(b *testing.B) {
testdata := filepath.FromSlash("./testdata/flow")
fis, err := ioutil.ReadDir(testdata)
if err != nil {
b.Fatalf("failed to open control flow testdata: %v", err)
}
for _, fi := range fis {
name := fi.Name()
ext := filepath.Ext(name)
if ext != ".dot" {
continue
}
test := name[:len(name)-len(ext)]
data, err := ioutil.ReadFile(filepath.Join(testdata, name))
if err != nil {
b.Errorf("failed to open control flow case: %v", err)
continue
}
g := &labeled{DirectedGraph: simple.NewDirectedGraph()}
err = dot.Unmarshal(data, g)
if err != nil {
b.Errorf("failed to unmarshal graph data: %v", err)
continue
}
want := g.root
if want == nil {
b.Error("no entry node label for graph")
continue
}
b.Run(test, func(b *testing.B) {
for i := 0; i < b.N; i++ {
d := Dominators(g.root, g)
if got := d.Root(); got.ID() != want.ID() {
b.Fatalf("unexpected root node: got:%d want:%d", got.ID(), want.ID())
}
}
})
}
}
type labeled struct {
*simple.DirectedGraph
root *node
}
func (g *labeled) NewNode() graph.Node {
return &node{Node: g.DirectedGraph.NewNode(), g: g}
}
func (g *labeled) SetEdge(e graph.Edge) {
if e.To().ID() == e.From().ID() {
// Do not attempt to add self edges.
return
}
g.DirectedGraph.SetEdge(e)
}
type node struct {
graph.Node
name string
g *labeled
}
func (n *node) SetDOTID(id string) {
n.name = id
}
func (n *node) SetAttribute(attr encoding.Attribute) error {
if attr.Key != "label" {
return nil
}
switch attr.Value {
default:
if attr.Value != `"{%0}"` && !strings.HasPrefix(attr.Value, `"{%0|`) {
return nil
}
fallthrough
case "entry", "root":
if n.g.root != nil {
return fmt.Errorf("set root for graph with existing root: old=%q new=%q", n.g.root.name, n.name)
}
n.g.root = n
}
return nil
}
func BenchmarkRandomGraphDominators(b *testing.B) {
tests := []struct {
name string
g func() *simple.DirectedGraph
}{
{name: "gnm-n=1e3-m=1e3", g: gnm(1e3, 1e3)},
{name: "gnm-n=1e3-m=3e3", g: gnm(1e3, 3e3)},
{name: "gnm-n=1e3-m=1e4", g: gnm(1e3, 1e4)},
{name: "gnm-n=1e3-m=3e4", g: gnm(1e3, 3e4)},
{name: "gnm-n=1e4-m=1e4", g: gnm(1e4, 1e4)},
{name: "gnm-n=1e4-m=3e4", g: gnm(1e4, 3e4)},
{name: "gnm-n=1e4-m=1e5", g: gnm(1e4, 1e5)},
{name: "gnm-n=1e4-m=3e5", g: gnm(1e4, 3e5)},
{name: "gnm-n=1e5-m=1e5", g: gnm(1e5, 1e5)},
{name: "gnm-n=1e5-m=3e5", g: gnm(1e5, 3e5)},
{name: "gnm-n=1e5-m=1e6", g: gnm(1e5, 1e6)},
{name: "gnm-n=1e5-m=3e6", g: gnm(1e5, 3e6)},
{name: "gnm-n=1e6-m=1e6", g: gnm(1e6, 1e6)},
{name: "gnm-n=1e6-m=3e6", g: gnm(1e6, 3e6)},
{name: "gnm-n=1e6-m=1e7", g: gnm(1e6, 1e7)},
{name: "gnm-n=1e6-m=3e7", g: gnm(1e6, 3e7)},
{name: "dup-n=1e3-d=0.8-a=0.1", g: duplication(1e3, 0.8, 0.1, math.NaN())},
{name: "dup-n=1e3-d=0.5-a=0.2", g: duplication(1e3, 0.5, 0.2, math.NaN())},
{name: "dup-n=1e4-d=0.8-a=0.1", g: duplication(1e4, 0.8, 0.1, math.NaN())},
{name: "dup-n=1e4-d=0.5-a=0.2", g: duplication(1e4, 0.5, 0.2, math.NaN())},
{name: "dup-n=1e5-d=0.8-a=0.1", g: duplication(1e5, 0.8, 0.1, math.NaN())},
{name: "dup-n=1e5-d=0.5-a=0.2", g: duplication(1e5, 0.5, 0.2, math.NaN())},
}
for _, test := range tests {
rnd := rand.New(rand.NewSource(1))
g := test.g()
// Guess a maximally expensive entry to the graph.
sort, err := topo.Sort(g)
root := sort[0]
if root == nil {
// If we did not get a node in the first position
// then there must be an unorderable set of nodes
// in the first position of the error. Pick one
// of the nodes at random.
unordered := err.(topo.Unorderable)
root = unordered[0][rnd.Intn(len(unordered[0]))]
}
if root == nil {
b.Error("no entry node label for graph")
continue
}
if len(sort) > 1 {
// Ensure that the graph has a complete path
// through the sorted nodes.
// unordered will only be accessed if there is
// a sort element that is nil, in which case
// unordered will contain a set of nodes from
// an SCC.
unordered, _ := err.(topo.Unorderable)
var ui int
for i, v := range sort[1:] {
u := sort[i]
if u == nil {
u = unordered[ui][rnd.Intn(len(unordered[ui]))]
ui++
}
if v == nil {
v = unordered[ui][rnd.Intn(len(unordered[ui]))]
}
if !g.HasEdgeFromTo(u, v) {
g.SetEdge(g.NewEdge(u, v))
}
}
}
b.Run(test.name, func(b *testing.B) {
for i := 0; i < b.N; i++ {
d := Dominators(root, g)
if got := d.Root(); got.ID() != root.ID() {
b.Fatalf("unexpected root node: got:%d want:%d", got.ID(), root.ID())
}
}
})
}
}
// gnm returns a directed G(n,m) Erdõs-Rényi graph.
func gnm(n, m int) func() *simple.DirectedGraph {
return func() *simple.DirectedGraph {
dg := simple.NewDirectedGraph()
err := gen.Gnm(dg, n, m, rand.New(rand.NewSource(1)))
if err != nil {
panic(err)
}
return dg
}
}
// duplication returns an edge-induced directed subgraph of a
// duplication graph.
func duplication(n int, delta, alpha, sigma float64) func() *simple.DirectedGraph {
return func() *simple.DirectedGraph {
g := undirected{simple.NewDirectedGraph()}
rnd := rand.New(rand.NewSource(1))
err := gen.Duplication(g, n, delta, alpha, sigma, rnd)
if err != nil {
panic(err)
}
for _, e := range g.Edges() {
if rnd.Intn(2) == 0 {
g.RemoveEdge(e)
}
}
return g.DirectedGraph
}
}
type undirected struct {
*simple.DirectedGraph
}
func (g undirected) From(n graph.Node) []graph.Node {
return append(g.DirectedGraph.From(n), g.DirectedGraph.To(n)...)
}
func (g undirected) HasEdgeBetween(x, y graph.Node) bool {
return g.DirectedGraph.HasEdgeFromTo(x, y)
}
func (g undirected) EdgeBetween(x, y graph.Node) graph.Edge {
return g.DirectedGraph.Edge(x, y)
}
func (g undirected) SetEdge(e graph.Edge) {
g.DirectedGraph.SetEdge(e)
g.DirectedGraph.SetEdge(g.DirectedGraph.NewEdge(e.To(), e.From()))
}

5
graph/path/testdata/flow/README vendored Normal file
View File

@@ -0,0 +1,5 @@
DOT files placed in this directory will be used to run benchmarks on the
path.Dominators function. The DOT files included should contain one node
that has the label "entry" or "root". This node will be used as the control
flow entry point to the graph.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,646 @@
digraph main {
// Node definitions.
2 [label=entry];
9;
774;
14;
773;
19;
772;
24;
771;
29;
770;
34;
769;
39;
768;
44;
767;
49;
766;
54;
765;
59;
764;
64;
763;
69;
762;
74;
761;
79;
760;
84;
759;
89;
758;
94;
757;
99;
756;
104;
755;
109;
754;
114;
753;
119;
752;
124;
751;
129;
750;
134;
749;
139;
748;
144;
747;
149;
746;
154;
745;
159;
744;
164;
743;
169;
742;
174;
741;
179;
740;
184;
739;
189;
738;
194;
737;
199;
736;
204;
735;
209;
734;
214;
733;
219;
732;
224;
731;
229;
730;
234;
729;
239;
728;
244;
727;
249;
726;
254;
725;
259;
724;
264;
723;
269;
722;
274;
721;
279;
720;
284;
719;
289;
718;
294;
717;
299;
716;
304;
715;
309;
714;
314;
713;
319;
712;
324;
711;
329;
710;
334;
709;
339;
708;
344;
707;
349;
706;
354;
705;
359;
704;
364;
703;
369;
702;
374;
701;
379;
700;
384;
699;
389;
698;
394;
697;
399;
696;
404;
695;
409;
694;
414;
693;
419;
692;
424;
691;
429;
690;
434;
689;
439;
688;
444;
687;
449;
686;
454;
685;
459;
684;
464;
683;
469;
682;
474;
681;
479;
680;
484;
679;
489;
678;
494;
677;
499;
676;
504;
675;
509;
674;
514;
673;
519;
672;
524;
671;
529;
670;
534;
669;
539;
668;
544;
667;
549;
666;
554;
665;
559;
664;
564;
663;
569;
662;
574;
661;
579;
660;
584;
659;
589;
658;
594;
657;
599;
656;
604;
655;
609;
654;
614;
653;
619;
652;
624;
651;
629;
650;
634;
649;
639;
648;
644;
647;
// Edge definitions.
2 -> 9 [label=true];
2 -> 774 [label=false];
9 -> 14 [label=true];
9 -> 773 [label=false];
14 -> 19 [label=true];
14 -> 772 [label=false];
773 -> 774;
19 -> 24 [label=true];
19 -> 771 [label=false];
772 -> 773;
24 -> 29 [label=true];
24 -> 770 [label=false];
771 -> 772;
29 -> 34 [label=true];
29 -> 769 [label=false];
770 -> 771;
34 -> 39 [label=true];
34 -> 768 [label=false];
769 -> 770;
39 -> 44 [label=true];
39 -> 767 [label=false];
768 -> 769;
44 -> 49 [label=true];
44 -> 766 [label=false];
767 -> 768;
49 -> 54 [label=true];
49 -> 765 [label=false];
766 -> 767;
54 -> 59 [label=true];
54 -> 764 [label=false];
765 -> 766;
59 -> 64 [label=true];
59 -> 763 [label=false];
764 -> 765;
64 -> 69 [label=true];
64 -> 762 [label=false];
763 -> 764;
69 -> 74 [label=true];
69 -> 761 [label=false];
762 -> 763;
74 -> 79 [label=true];
74 -> 760 [label=false];
761 -> 762;
79 -> 84 [label=true];
79 -> 759 [label=false];
760 -> 761;
84 -> 89 [label=true];
84 -> 758 [label=false];
759 -> 760;
89 -> 94 [label=true];
89 -> 757 [label=false];
758 -> 759;
94 -> 99 [label=true];
94 -> 756 [label=false];
757 -> 758;
99 -> 104 [label=true];
99 -> 755 [label=false];
756 -> 757;
104 -> 109 [label=true];
104 -> 754 [label=false];
755 -> 756;
109 -> 114 [label=true];
109 -> 753 [label=false];
754 -> 755;
114 -> 119 [label=true];
114 -> 752 [label=false];
753 -> 754;
119 -> 124 [label=true];
119 -> 751 [label=false];
752 -> 753;
124 -> 129 [label=true];
124 -> 750 [label=false];
751 -> 752;
129 -> 134 [label=true];
129 -> 749 [label=false];
750 -> 751;
134 -> 139 [label=true];
134 -> 748 [label=false];
749 -> 750;
139 -> 144 [label=true];
139 -> 747 [label=false];
748 -> 749;
144 -> 149 [label=true];
144 -> 746 [label=false];
747 -> 748;
149 -> 154 [label=true];
149 -> 745 [label=false];
746 -> 747;
154 -> 159 [label=true];
154 -> 744 [label=false];
745 -> 746;
159 -> 164 [label=true];
159 -> 743 [label=false];
744 -> 745;
164 -> 169 [label=true];
164 -> 742 [label=false];
743 -> 744;
169 -> 174 [label=true];
169 -> 741 [label=false];
742 -> 743;
174 -> 179 [label=true];
174 -> 740 [label=false];
741 -> 742;
179 -> 184 [label=true];
179 -> 739 [label=false];
740 -> 741;
184 -> 189 [label=true];
184 -> 738 [label=false];
739 -> 740;
189 -> 194 [label=true];
189 -> 737 [label=false];
738 -> 739;
194 -> 199 [label=true];
194 -> 736 [label=false];
737 -> 738;
199 -> 204 [label=true];
199 -> 735 [label=false];
736 -> 737;
204 -> 209 [label=true];
204 -> 734 [label=false];
735 -> 736;
209 -> 214 [label=true];
209 -> 733 [label=false];
734 -> 735;
214 -> 219 [label=true];
214 -> 732 [label=false];
733 -> 734;
219 -> 224 [label=true];
219 -> 731 [label=false];
732 -> 733;
224 -> 229 [label=true];
224 -> 730 [label=false];
731 -> 732;
229 -> 234 [label=true];
229 -> 729 [label=false];
730 -> 731;
234 -> 239 [label=true];
234 -> 728 [label=false];
729 -> 730;
239 -> 244 [label=true];
239 -> 727 [label=false];
728 -> 729;
244 -> 249 [label=true];
244 -> 726 [label=false];
727 -> 728;
249 -> 254 [label=true];
249 -> 725 [label=false];
726 -> 727;
254 -> 259 [label=true];
254 -> 724 [label=false];
725 -> 726;
259 -> 264 [label=true];
259 -> 723 [label=false];
724 -> 725;
264 -> 269 [label=true];
264 -> 722 [label=false];
723 -> 724;
269 -> 274 [label=true];
269 -> 721 [label=false];
722 -> 723;
274 -> 279 [label=true];
274 -> 720 [label=false];
721 -> 722;
279 -> 284 [label=true];
279 -> 719 [label=false];
720 -> 721;
284 -> 289 [label=true];
284 -> 718 [label=false];
719 -> 720;
289 -> 294 [label=true];
289 -> 717 [label=false];
718 -> 719;
294 -> 299 [label=true];
294 -> 716 [label=false];
717 -> 718;
299 -> 304 [label=true];
299 -> 715 [label=false];
716 -> 717;
304 -> 309 [label=true];
304 -> 714 [label=false];
715 -> 716;
309 -> 314 [label=true];
309 -> 713 [label=false];
714 -> 715;
314 -> 319 [label=true];
314 -> 712 [label=false];
713 -> 714;
319 -> 324 [label=true];
319 -> 711 [label=false];
712 -> 713;
324 -> 329 [label=true];
324 -> 710 [label=false];
711 -> 712;
329 -> 334 [label=true];
329 -> 709 [label=false];
710 -> 711;
334 -> 339 [label=true];
334 -> 708 [label=false];
709 -> 710;
339 -> 344 [label=true];
339 -> 707 [label=false];
708 -> 709;
344 -> 349 [label=true];
344 -> 706 [label=false];
707 -> 708;
349 -> 354 [label=true];
349 -> 705 [label=false];
706 -> 707;
354 -> 359 [label=true];
354 -> 704 [label=false];
705 -> 706;
359 -> 364 [label=true];
359 -> 703 [label=false];
704 -> 705;
364 -> 369 [label=true];
364 -> 702 [label=false];
703 -> 704;
369 -> 374 [label=true];
369 -> 701 [label=false];
702 -> 703;
374 -> 379 [label=true];
374 -> 700 [label=false];
701 -> 702;
379 -> 384 [label=true];
379 -> 699 [label=false];
700 -> 701;
384 -> 389 [label=true];
384 -> 698 [label=false];
699 -> 700;
389 -> 394 [label=true];
389 -> 697 [label=false];
698 -> 699;
394 -> 399 [label=true];
394 -> 696 [label=false];
697 -> 698;
399 -> 404 [label=true];
399 -> 695 [label=false];
696 -> 697;
404 -> 409 [label=true];
404 -> 694 [label=false];
695 -> 696;
409 -> 414 [label=true];
409 -> 693 [label=false];
694 -> 695;
414 -> 419 [label=true];
414 -> 692 [label=false];
693 -> 694;
419 -> 424 [label=true];
419 -> 691 [label=false];
692 -> 693;
424 -> 429 [label=true];
424 -> 690 [label=false];
691 -> 692;
429 -> 434 [label=true];
429 -> 689 [label=false];
690 -> 691;
434 -> 439 [label=true];
434 -> 688 [label=false];
689 -> 690;
439 -> 444 [label=true];
439 -> 687 [label=false];
688 -> 689;
444 -> 449 [label=true];
444 -> 686 [label=false];
687 -> 688;
449 -> 454 [label=true];
449 -> 685 [label=false];
686 -> 687;
454 -> 459 [label=true];
454 -> 684 [label=false];
685 -> 686;
459 -> 464 [label=true];
459 -> 683 [label=false];
684 -> 685;
464 -> 469 [label=true];
464 -> 682 [label=false];
683 -> 684;
469 -> 474 [label=true];
469 -> 681 [label=false];
682 -> 683;
474 -> 479 [label=true];
474 -> 680 [label=false];
681 -> 682;
479 -> 484 [label=true];
479 -> 679 [label=false];
680 -> 681;
484 -> 489 [label=true];
484 -> 678 [label=false];
679 -> 680;
489 -> 494 [label=true];
489 -> 677 [label=false];
678 -> 679;
494 -> 499 [label=true];
494 -> 676 [label=false];
677 -> 678;
499 -> 504 [label=true];
499 -> 675 [label=false];
676 -> 677;
504 -> 509 [label=true];
504 -> 674 [label=false];
675 -> 676;
509 -> 514 [label=true];
509 -> 673 [label=false];
674 -> 675;
514 -> 519 [label=true];
514 -> 672 [label=false];
673 -> 674;
519 -> 524 [label=true];
519 -> 671 [label=false];
672 -> 673;
524 -> 529 [label=true];
524 -> 670 [label=false];
671 -> 672;
529 -> 534 [label=true];
529 -> 669 [label=false];
670 -> 671;
534 -> 539 [label=true];
534 -> 668 [label=false];
669 -> 670;
539 -> 544 [label=true];
539 -> 667 [label=false];
668 -> 669;
544 -> 549 [label=true];
544 -> 666 [label=false];
667 -> 668;
549 -> 554 [label=true];
549 -> 665 [label=false];
666 -> 667;
554 -> 559 [label=true];
554 -> 664 [label=false];
665 -> 666;
559 -> 564 [label=true];
559 -> 663 [label=false];
664 -> 665;
564 -> 569 [label=true];
564 -> 662 [label=false];
663 -> 664;
569 -> 574 [label=true];
569 -> 661 [label=false];
662 -> 663;
574 -> 579 [label=true];
574 -> 660 [label=false];
661 -> 662;
579 -> 584 [label=true];
579 -> 659 [label=false];
660 -> 661;
584 -> 589 [label=true];
584 -> 658 [label=false];
659 -> 660;
589 -> 594 [label=true];
589 -> 657 [label=false];
658 -> 659;
594 -> 599 [label=true];
594 -> 656 [label=false];
657 -> 658;
599 -> 604 [label=true];
599 -> 655 [label=false];
656 -> 657;
604 -> 609 [label=true];
604 -> 654 [label=false];
655 -> 656;
609 -> 614 [label=true];
609 -> 653 [label=false];
654 -> 655;
614 -> 619 [label=true];
614 -> 652 [label=false];
653 -> 654;
619 -> 624 [label=true];
619 -> 651 [label=false];
652 -> 653;
624 -> 629 [label=true];
624 -> 650 [label=false];
651 -> 652;
629 -> 634 [label=true];
629 -> 649 [label=false];
650 -> 651;
634 -> 639 [label=true];
634 -> 648 [label=false];
649 -> 650;
639 -> 644 [label=true];
639 -> 647 [label=false];
648 -> 649;
644 -> 647;
647 -> 648;
}

View File

@@ -0,0 +1,86 @@
digraph main {
// Node definitions.
2 [label=entry];
9;
102;
14;
101;
19;
100;
24;
99;
29;
98;
34;
97;
39;
96;
44;
95;
49;
94;
54;
93;
59;
92;
64;
91;
69;
90;
74;
89;
79;
88;
84;
87;
// Edge definitions.
2 -> 9 [label=true];
2 -> 102 [label=false];
9 -> 14 [label=true];
9 -> 101 [label=false];
14 -> 19 [label=true];
14 -> 100 [label=false];
101 -> 102;
19 -> 24 [label=true];
19 -> 99 [label=false];
100 -> 101;
24 -> 29 [label=true];
24 -> 98 [label=false];
99 -> 100;
29 -> 34 [label=true];
29 -> 97 [label=false];
98 -> 99;
34 -> 39 [label=true];
34 -> 96 [label=false];
97 -> 98;
39 -> 44 [label=true];
39 -> 95 [label=false];
96 -> 97;
44 -> 49 [label=true];
44 -> 94 [label=false];
95 -> 96;
49 -> 54 [label=true];
49 -> 93 [label=false];
94 -> 95;
54 -> 59 [label=true];
54 -> 92 [label=false];
93 -> 94;
59 -> 64 [label=true];
59 -> 91 [label=false];
92 -> 93;
64 -> 69 [label=true];
64 -> 90 [label=false];
91 -> 92;
69 -> 74 [label=true];
69 -> 89 [label=false];
90 -> 91;
74 -> 79 [label=true];
74 -> 88 [label=false];
89 -> 90;
79 -> 84 [label=true];
79 -> 87 [label=false];
88 -> 89;
84 -> 87;
87 -> 88;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,166 @@
digraph main {
// Node definitions.
2 [label=entry];
9;
198;
14;
197;
19;
196;
24;
195;
29;
194;
34;
193;
39;
192;
44;
191;
49;
190;
54;
189;
59;
188;
64;
187;
69;
186;
74;
185;
79;
184;
84;
183;
89;
182;
94;
181;
99;
180;
104;
179;
109;
178;
114;
177;
119;
176;
124;
175;
129;
174;
134;
173;
139;
172;
144;
171;
149;
170;
154;
169;
159;
168;
164;
167;
// Edge definitions.
2 -> 9 [label=true];
2 -> 198 [label=false];
9 -> 14 [label=true];
9 -> 197 [label=false];
14 -> 19 [label=true];
14 -> 196 [label=false];
197 -> 198;
19 -> 24 [label=true];
19 -> 195 [label=false];
196 -> 197;
24 -> 29 [label=true];
24 -> 194 [label=false];
195 -> 196;
29 -> 34 [label=true];
29 -> 193 [label=false];
194 -> 195;
34 -> 39 [label=true];
34 -> 192 [label=false];
193 -> 194;
39 -> 44 [label=true];
39 -> 191 [label=false];
192 -> 193;
44 -> 49 [label=true];
44 -> 190 [label=false];
191 -> 192;
49 -> 54 [label=true];
49 -> 189 [label=false];
190 -> 191;
54 -> 59 [label=true];
54 -> 188 [label=false];
189 -> 190;
59 -> 64 [label=true];
59 -> 187 [label=false];
188 -> 189;
64 -> 69 [label=true];
64 -> 186 [label=false];
187 -> 188;
69 -> 74 [label=true];
69 -> 185 [label=false];
186 -> 187;
74 -> 79 [label=true];
74 -> 184 [label=false];
185 -> 186;
79 -> 84 [label=true];
79 -> 183 [label=false];
184 -> 185;
84 -> 89 [label=true];
84 -> 182 [label=false];
183 -> 184;
89 -> 94 [label=true];
89 -> 181 [label=false];
182 -> 183;
94 -> 99 [label=true];
94 -> 180 [label=false];
181 -> 182;
99 -> 104 [label=true];
99 -> 179 [label=false];
180 -> 181;
104 -> 109 [label=true];
104 -> 178 [label=false];
179 -> 180;
109 -> 114 [label=true];
109 -> 177 [label=false];
178 -> 179;
114 -> 119 [label=true];
114 -> 176 [label=false];
177 -> 178;
119 -> 124 [label=true];
119 -> 175 [label=false];
176 -> 177;
124 -> 129 [label=true];
124 -> 174 [label=false];
175 -> 176;
129 -> 134 [label=true];
129 -> 173 [label=false];
174 -> 175;
134 -> 139 [label=true];
134 -> 172 [label=false];
173 -> 174;
139 -> 144 [label=true];
139 -> 171 [label=false];
172 -> 173;
144 -> 149 [label=true];
144 -> 170 [label=false];
171 -> 172;
149 -> 154 [label=true];
149 -> 169 [label=false];
170 -> 171;
154 -> 159 [label=true];
154 -> 168 [label=false];
169 -> 170;
159 -> 164 [label=true];
159 -> 167 [label=false];
168 -> 169;
164 -> 167;
167 -> 168;
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,326 @@
digraph main {
// Node definitions.
2 [label=entry];
9;
390;
14;
389;
19;
388;
24;
387;
29;
386;
34;
385;
39;
384;
44;
383;
49;
382;
54;
381;
59;
380;
64;
379;
69;
378;
74;
377;
79;
376;
84;
375;
89;
374;
94;
373;
99;
372;
104;
371;
109;
370;
114;
369;
119;
368;
124;
367;
129;
366;
134;
365;
139;
364;
144;
363;
149;
362;
154;
361;
159;
360;
164;
359;
169;
358;
174;
357;
179;
356;
184;
355;
189;
354;
194;
353;
199;
352;
204;
351;
209;
350;
214;
349;
219;
348;
224;
347;
229;
346;
234;
345;
239;
344;
244;
343;
249;
342;
254;
341;
259;
340;
264;
339;
269;
338;
274;
337;
279;
336;
284;
335;
289;
334;
294;
333;
299;
332;
304;
331;
309;
330;
314;
329;
319;
328;
324;
327;
// Edge definitions.
2 -> 9 [label=true];
2 -> 390 [label=false];
9 -> 14 [label=true];
9 -> 389 [label=false];
14 -> 19 [label=true];
14 -> 388 [label=false];
389 -> 390;
19 -> 24 [label=true];
19 -> 387 [label=false];
388 -> 389;
24 -> 29 [label=true];
24 -> 386 [label=false];
387 -> 388;
29 -> 34 [label=true];
29 -> 385 [label=false];
386 -> 387;
34 -> 39 [label=true];
34 -> 384 [label=false];
385 -> 386;
39 -> 44 [label=true];
39 -> 383 [label=false];
384 -> 385;
44 -> 49 [label=true];
44 -> 382 [label=false];
383 -> 384;
49 -> 54 [label=true];
49 -> 381 [label=false];
382 -> 383;
54 -> 59 [label=true];
54 -> 380 [label=false];
381 -> 382;
59 -> 64 [label=true];
59 -> 379 [label=false];
380 -> 381;
64 -> 69 [label=true];
64 -> 378 [label=false];
379 -> 380;
69 -> 74 [label=true];
69 -> 377 [label=false];
378 -> 379;
74 -> 79 [label=true];
74 -> 376 [label=false];
377 -> 378;
79 -> 84 [label=true];
79 -> 375 [label=false];
376 -> 377;
84 -> 89 [label=true];
84 -> 374 [label=false];
375 -> 376;
89 -> 94 [label=true];
89 -> 373 [label=false];
374 -> 375;
94 -> 99 [label=true];
94 -> 372 [label=false];
373 -> 374;
99 -> 104 [label=true];
99 -> 371 [label=false];
372 -> 373;
104 -> 109 [label=true];
104 -> 370 [label=false];
371 -> 372;
109 -> 114 [label=true];
109 -> 369 [label=false];
370 -> 371;
114 -> 119 [label=true];
114 -> 368 [label=false];
369 -> 370;
119 -> 124 [label=true];
119 -> 367 [label=false];
368 -> 369;
124 -> 129 [label=true];
124 -> 366 [label=false];
367 -> 368;
129 -> 134 [label=true];
129 -> 365 [label=false];
366 -> 367;
134 -> 139 [label=true];
134 -> 364 [label=false];
365 -> 366;
139 -> 144 [label=true];
139 -> 363 [label=false];
364 -> 365;
144 -> 149 [label=true];
144 -> 362 [label=false];
363 -> 364;
149 -> 154 [label=true];
149 -> 361 [label=false];
362 -> 363;
154 -> 159 [label=true];
154 -> 360 [label=false];
361 -> 362;
159 -> 164 [label=true];
159 -> 359 [label=false];
360 -> 361;
164 -> 169 [label=true];
164 -> 358 [label=false];
359 -> 360;
169 -> 174 [label=true];
169 -> 357 [label=false];
358 -> 359;
174 -> 179 [label=true];
174 -> 356 [label=false];
357 -> 358;
179 -> 184 [label=true];
179 -> 355 [label=false];
356 -> 357;
184 -> 189 [label=true];
184 -> 354 [label=false];
355 -> 356;
189 -> 194 [label=true];
189 -> 353 [label=false];
354 -> 355;
194 -> 199 [label=true];
194 -> 352 [label=false];
353 -> 354;
199 -> 204 [label=true];
199 -> 351 [label=false];
352 -> 353;
204 -> 209 [label=true];
204 -> 350 [label=false];
351 -> 352;
209 -> 214 [label=true];
209 -> 349 [label=false];
350 -> 351;
214 -> 219 [label=true];
214 -> 348 [label=false];
349 -> 350;
219 -> 224 [label=true];
219 -> 347 [label=false];
348 -> 349;
224 -> 229 [label=true];
224 -> 346 [label=false];
347 -> 348;
229 -> 234 [label=true];
229 -> 345 [label=false];
346 -> 347;
234 -> 239 [label=true];
234 -> 344 [label=false];
345 -> 346;
239 -> 244 [label=true];
239 -> 343 [label=false];
344 -> 345;
244 -> 249 [label=true];
244 -> 342 [label=false];
343 -> 344;
249 -> 254 [label=true];
249 -> 341 [label=false];
342 -> 343;
254 -> 259 [label=true];
254 -> 340 [label=false];
341 -> 342;
259 -> 264 [label=true];
259 -> 339 [label=false];
340 -> 341;
264 -> 269 [label=true];
264 -> 338 [label=false];
339 -> 340;
269 -> 274 [label=true];
269 -> 337 [label=false];
338 -> 339;
274 -> 279 [label=true];
274 -> 336 [label=false];
337 -> 338;
279 -> 284 [label=true];
279 -> 335 [label=false];
336 -> 337;
284 -> 289 [label=true];
284 -> 334 [label=false];
335 -> 336;
289 -> 294 [label=true];
289 -> 333 [label=false];
334 -> 335;
294 -> 299 [label=true];
294 -> 332 [label=false];
333 -> 334;
299 -> 304 [label=true];
299 -> 331 [label=false];
332 -> 333;
304 -> 309 [label=true];
304 -> 330 [label=false];
331 -> 332;
309 -> 314 [label=true];
309 -> 329 [label=false];
330 -> 331;
314 -> 319 [label=true];
314 -> 328 [label=false];
329 -> 330;
319 -> 324 [label=true];
319 -> 327 [label=false];
328 -> 329;
324 -> 327;
327 -> 328;
}