rubyvis 0.3.4 → 0.3.5
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +0 -0
- data/History.txt +8 -0
- data/Manifest.txt +7 -0
- data/README.txt +23 -6
- data/examples/2_medium/horizon.rb +58 -0
- data/examples/5_pv_hierarchies/dendogram.rb +2 -2
- data/examples/6_pv_networks/arc.rb +32 -0
- data/examples/6_pv_networks/miserables_data.rb +348 -0
- data/lib/rubyvis.rb +1 -1
- data/lib/rubyvis/color/color.rb +32 -34
- data/lib/rubyvis/format/number.rb +1 -1
- data/lib/rubyvis/layout.rb +3 -2
- data/lib/rubyvis/layout/arc.rb +188 -0
- data/lib/rubyvis/layout/horizon.rb +153 -0
- data/lib/rubyvis/mark/shorcut_methods.rb +29 -1
- data/lib/rubyvis/scene/svg_panel.rb +6 -4
- data/lib/rubyvis/sceneelement.rb +1 -1
- data/spec/color_spec.rb +79 -0
- data/spec/layout_horizon_spec.rb +78 -0
- data/spec/layout_stack_spec.rb +3 -5
- data/web/index.haml +20 -12
- metadata +11 -4
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
Binary file
|
data/History.txt
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
=== 0.3.5 / 2010-12-20
|
2
|
+
|
3
|
+
* Horizon and Arc layouts implemented
|
4
|
+
* Bug fix: Error on Layout::Stack spec
|
5
|
+
* Bug fix: Inconsistent behaviour of Rubyvis.color and Rubyvis::Hsl
|
6
|
+
* Bug fix: Rubyvis::Color.color fails on ruby 1.8.7
|
7
|
+
* Bug fix: Raise error with negative number on Format.format
|
8
|
+
|
1
9
|
=== 0.3.4 / 2010-12-11
|
2
10
|
|
3
11
|
* Implemented Layout::Grid and Layout::Tree
|
data/Manifest.txt
CHANGED
@@ -17,6 +17,7 @@ examples/2_medium/censo_agropecuario/censo_agropecuario_chile_data.rb
|
|
17
17
|
examples/2_medium/censo_agropecuario/census_treemap.rb
|
18
18
|
examples/2_medium/censo_agropecuario/create_data.rb
|
19
19
|
examples/2_medium/censo_agropecuario/resultset.csv
|
20
|
+
examples/2_medium/horizon.rb
|
20
21
|
examples/2_medium/nested_grid.rb
|
21
22
|
examples/3_pv_conventional/area.rb
|
22
23
|
examples/3_pv_conventional/bar_column_chart.rb
|
@@ -44,6 +45,8 @@ examples/5_pv_hierarchies/indent.rb
|
|
44
45
|
examples/5_pv_hierarchies/node_link_tree.rb
|
45
46
|
examples/5_pv_hierarchies/sunburst.rb
|
46
47
|
examples/5_pv_hierarchies/treemap.rb
|
48
|
+
examples/6_pv_networks/arc.rb
|
49
|
+
examples/6_pv_networks/miserables_data.rb
|
47
50
|
lib/rubyvis.rb
|
48
51
|
lib/rubyvis/color/color.rb
|
49
52
|
lib/rubyvis/color/colors.rb
|
@@ -56,9 +59,11 @@ lib/rubyvis/histogram.rb
|
|
56
59
|
lib/rubyvis/internals.rb
|
57
60
|
lib/rubyvis/javascript_behaviour.rb
|
58
61
|
lib/rubyvis/layout.rb
|
62
|
+
lib/rubyvis/layout/arc.rb
|
59
63
|
lib/rubyvis/layout/cluster.rb
|
60
64
|
lib/rubyvis/layout/grid.rb
|
61
65
|
lib/rubyvis/layout/hierarchy.rb
|
66
|
+
lib/rubyvis/layout/horizon.rb
|
62
67
|
lib/rubyvis/layout/indent.rb
|
63
68
|
lib/rubyvis/layout/network.rb
|
64
69
|
lib/rubyvis/layout/pack.rb
|
@@ -101,11 +106,13 @@ lib/rubyvis/transform.rb
|
|
101
106
|
spec/anchor_spec.rb
|
102
107
|
spec/area_spec.rb
|
103
108
|
spec/bar_spec.rb
|
109
|
+
spec/color_spec.rb
|
104
110
|
spec/dom_spec.rb
|
105
111
|
spec/histogram_spec.rb
|
106
112
|
spec/internal_spec.rb
|
107
113
|
spec/javascript_behaviour_spec.rb
|
108
114
|
spec/label_spec.rb
|
115
|
+
spec/layout_horizon_spec.rb
|
109
116
|
spec/layout_stack_spec.rb
|
110
117
|
spec/line_spec.rb
|
111
118
|
spec/mark_spec.rb
|
data/README.txt
CHANGED
@@ -8,20 +8,31 @@ Ruby port of Protovis[http://vis.stanford.edu/protovis/], a great visualization
|
|
8
8
|
|
9
9
|
== FEATURES/PROBLEMS:
|
10
10
|
|
11
|
+
This library implements almost completely the core API of protovis, including all static marks, SVG builder class and data classes.
|
12
|
+
|
11
13
|
Implemented:
|
14
|
+
|
12
15
|
* Marks: All, except transient and transitions.
|
13
|
-
* Layout: Partition, Stack and Treemap.
|
16
|
+
* Layout: Cluster, Grid, Horizon, Indent, Pack, Partition, Stack, Tree and Treemap. To implement: Bullet, Arc, Force, Matrix, Rollup.
|
14
17
|
|
15
18
|
Using protovis examples[http://vis.stanford.edu/protovis/ex/] as reference
|
16
19
|
|
17
20
|
* Conventional: All working
|
18
21
|
* Custom:
|
19
22
|
* Backer's Barley
|
20
|
-
* Burtin's Antibiotics
|
23
|
+
* Burtin's Antibiotics: Scatterplot matrix
|
24
|
+
* Cars: Parallel Coordinates
|
25
|
+
* Crimea war: Grouped bar chart and line chart
|
21
26
|
* Hierarchies:
|
22
|
-
*
|
23
|
-
*
|
24
|
-
*
|
27
|
+
* Treemap
|
28
|
+
* Bubble Charts
|
29
|
+
* Circle Packing
|
30
|
+
* Dendogram
|
31
|
+
* Icicle
|
32
|
+
* Indent
|
33
|
+
* Node-Link Tree
|
34
|
+
* Sunburst
|
35
|
+
* Treemap
|
25
36
|
|
26
37
|
|
27
38
|
I try to maintain, when posible, complete compatibility with Javascript API, including camel case naming of functions. Johnson [http://github.com/jbarnette/johnson] - the lovely Javascript wrapper inside Ruby embrace - is our friend to test implementation of basic object.
|
@@ -43,12 +54,18 @@ User could use +pv+ freely, cause is defined as a global method which call Rubyv
|
|
43
54
|
* data/QuantitativeScale.js
|
44
55
|
* data/OrdinalScale.js
|
45
56
|
* data/Scale.js
|
46
|
-
* layout/Hierarchy.js
|
47
57
|
* layout/Layout.js
|
58
|
+
* layout/Cluster.js
|
59
|
+
* layout/Grid.js
|
48
60
|
* layout/Hierarchy.js
|
61
|
+
* layout/Horizon.js
|
62
|
+
* layout/Indent.js
|
49
63
|
* layout/Network.js
|
64
|
+
* layout/Pack.js
|
50
65
|
* layout/Partition.js
|
51
66
|
* layout/Stack.js
|
67
|
+
* layout/Tree.js
|
68
|
+
* layout/Treemap.js
|
52
69
|
* mark/Anchor.js
|
53
70
|
* mark/Area.js
|
54
71
|
* mark/Bar.js
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# = Horizon
|
2
|
+
# Horizon graphs increase data density while preserving resolution.
|
3
|
+
# While horizon graphs may require learning, they have been found to be more effective than standard line and area plots when chart sizes are small. For more, see "Sizing the Horizon: The Effects of Chart Size and Layering on the Graphical Perception of Time Series Visualizations" by Heer et al., CHI 2009.
|
4
|
+
# This example shows +offset+ and +mirror+ modes for the quadratic equation x^2-10
|
5
|
+
$:.unshift(File.dirname(__FILE__)+"/../../lib")
|
6
|
+
require 'rubyvis'
|
7
|
+
|
8
|
+
data = Rubyvis.range(-5, 5, 0.1).map {|x|
|
9
|
+
OpenStruct.new({:x=> x, :y=> x**2-10})
|
10
|
+
}
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
#p data
|
15
|
+
w = 400
|
16
|
+
h = 100
|
17
|
+
x = pv.Scale.linear(data, lambda {|d| d.x}).range(0, w)
|
18
|
+
y = pv.Scale.linear(data, lambda {|d| d.y}).range(-50, h*2);
|
19
|
+
|
20
|
+
#/* The root panel. */
|
21
|
+
vis = pv.Panel.new()
|
22
|
+
.width(w)
|
23
|
+
.height(h*2+20)
|
24
|
+
.bottom(20)
|
25
|
+
.left(20)
|
26
|
+
.right(10)
|
27
|
+
.top(5)
|
28
|
+
|
29
|
+
types=["offset","mirror"]
|
30
|
+
|
31
|
+
|
32
|
+
pan=vis.add(Rubyvis::Panel).
|
33
|
+
data(types).
|
34
|
+
height(80).
|
35
|
+
top(lambda { index*110+30})
|
36
|
+
pan.add(Rubyvis::Rule).
|
37
|
+
data(x.ticks).
|
38
|
+
left(x).
|
39
|
+
anchor("bottom").
|
40
|
+
add(Rubyvis::Label).
|
41
|
+
text(x.tick_format)
|
42
|
+
|
43
|
+
|
44
|
+
pan.add(Rubyvis::Layout::Horizon)
|
45
|
+
.bands(3)
|
46
|
+
.mode(lambda {|d| d})
|
47
|
+
.band.add(Rubyvis::Area)
|
48
|
+
.data(data)
|
49
|
+
.left(lambda {|d| x[d.x]})
|
50
|
+
.height(lambda {|d| y[d.y]})
|
51
|
+
|
52
|
+
pan.anchor("top").add(Rubyvis::Label)
|
53
|
+
.top(-15)
|
54
|
+
|
55
|
+
vis.render();
|
56
|
+
|
57
|
+
|
58
|
+
puts vis.to_svg
|
@@ -19,7 +19,7 @@ def get_files(path)
|
|
19
19
|
h
|
20
20
|
end
|
21
21
|
|
22
|
-
files=get_files(File.dirname(__FILE__)+"/../../")
|
22
|
+
files=get_files(File.dirname(__FILE__)+"/../../lib/")
|
23
23
|
|
24
24
|
|
25
25
|
vis = Rubyvis::Panel.new do
|
@@ -31,7 +31,7 @@ vis = Rubyvis::Panel.new do
|
|
31
31
|
bottom 10
|
32
32
|
layout_cluster do
|
33
33
|
nodes pv.dom(files).root("rubyvis").sort(lambda {|a,b| a.node_name<=>b.node_name}).nodes
|
34
|
-
group
|
34
|
+
group 0.2
|
35
35
|
orient "left"
|
36
36
|
|
37
37
|
link.line do
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# = Arc Diagrams
|
2
|
+
# An arc diagram uses a one-dimensional layout of nodes, with circular arcs to represent links. Though an arc diagram may not convey the overall structure of the graph as effectively as a two-dimensional layout, with a good ordering of nodes it is easy to identify cliques and bridges. Further, as with the indented tree, multivariate data can easily be displayed alongside nodes.
|
3
|
+
# This network represents character co-occurrence in the chapters of Victor Hugo's classic novel, Les Misérables. Node colors depict cluster memberships computed by a community-detection algorithm. Source: Knuth, D. E. 1993. The Stanford GraphBase: A Platform for Combinatorial Computing, Addison-Wesley.
|
4
|
+
|
5
|
+
$:.unshift(File.dirname(__FILE__)+"/../../lib")
|
6
|
+
require 'rubyvis'
|
7
|
+
load(File.dirname(__FILE__)+"/miserables_data.rb")
|
8
|
+
c=Rubyvis::Colors.category19()
|
9
|
+
|
10
|
+
vis = Rubyvis::Panel.new() do
|
11
|
+
width 880
|
12
|
+
height 310
|
13
|
+
bottom 90
|
14
|
+
layout_arc do
|
15
|
+
nodes $miserables.nodes
|
16
|
+
links $miserables.links
|
17
|
+
sort {|a,b|
|
18
|
+
a.group==b.group ? b.link_degree<=>a.link_degree : b.group <=>a.group}
|
19
|
+
|
20
|
+
link.line
|
21
|
+
|
22
|
+
node.dot do
|
23
|
+
shape_size {|d| d.link_degree + 4}
|
24
|
+
fill_style {|d| c[d.group]}
|
25
|
+
stroke_style {|d| c[d.group].darker()}
|
26
|
+
end
|
27
|
+
|
28
|
+
node_label.label
|
29
|
+
end
|
30
|
+
end
|
31
|
+
vis.render();
|
32
|
+
puts vis.to_svg
|
@@ -0,0 +1,348 @@
|
|
1
|
+
# This file contains the weighted network of coappearances of characters in
|
2
|
+
# Victor Hugo's novel "Les Miserables". Nodes represent characters as indicated
|
3
|
+
# by the labels, and edges connect any pair of characters that appear in the
|
4
|
+
# same chapter of the book. The values on the edges are the number of such
|
5
|
+
# coappearances. The data on coappearances were taken from D. E. Knuth, The
|
6
|
+
# Stanford GraphBase: A Platform for Combinatorial Computing, Addison-Wesley,
|
7
|
+
# Reading, MA (1993).
|
8
|
+
#
|
9
|
+
# The group labels were transcribed from "Finding and evaluating community
|
10
|
+
# structure in networks" by M. E. J. Newman and M. Girvan.
|
11
|
+
|
12
|
+
$miserables = OpenStruct.new({
|
13
|
+
:nodes=>[
|
14
|
+
OpenStruct.new({:node_value=>"Myriel", :group=>1}),
|
15
|
+
OpenStruct.new({:node_value=>"Napoleon", :group=>1}),
|
16
|
+
OpenStruct.new({:node_value=>"Mlle. Baptistine", :group=>1}),
|
17
|
+
OpenStruct.new({:node_value=>"Mme. Magloire", :group=>1}),
|
18
|
+
OpenStruct.new({:node_value=>"Countess de Lo", :group=>1}),
|
19
|
+
OpenStruct.new({:node_value=>"Geborand", :group=>1}),
|
20
|
+
OpenStruct.new({:node_value=>"Champtercier", :group=>1}),
|
21
|
+
OpenStruct.new({:node_value=>"Cravatte", :group=>1}),
|
22
|
+
OpenStruct.new({:node_value=>"Count", :group=>1}),
|
23
|
+
OpenStruct.new({:node_value=>"Old Man", :group=>1}),
|
24
|
+
OpenStruct.new({:node_value=>"Labarre", :group=>2}),
|
25
|
+
OpenStruct.new({:node_value=>"Valjean", :group=>2}),
|
26
|
+
OpenStruct.new({:node_value=>"Marguerite", :group=>3}),
|
27
|
+
OpenStruct.new({:node_value=>"Mme. de R", :group=>2}),
|
28
|
+
OpenStruct.new({:node_value=>"Isabeau", :group=>2}),
|
29
|
+
OpenStruct.new({:node_value=>"Gervais", :group=>2}),
|
30
|
+
OpenStruct.new({:node_value=>"Tholomyes", :group=>3}),
|
31
|
+
OpenStruct.new({:node_value=>"Listolier", :group=>3}),
|
32
|
+
OpenStruct.new({:node_value=>"Fameuil", :group=>3}),
|
33
|
+
OpenStruct.new({:node_value=>"Blacheville", :group=>3}),
|
34
|
+
OpenStruct.new({:node_value=>"Favourite", :group=>3}),
|
35
|
+
OpenStruct.new({:node_value=>"Dahlia", :group=>3}),
|
36
|
+
OpenStruct.new({:node_value=>"Zephine", :group=>3}),
|
37
|
+
OpenStruct.new({:node_value=>"Fantine", :group=>3}),
|
38
|
+
OpenStruct.new({:node_value=>"Mme. Thenardier", :group=>4}),
|
39
|
+
OpenStruct.new({:node_value=>"Thenardier", :group=>4}),
|
40
|
+
OpenStruct.new({:node_value=>"Cosette", :group=>5}),
|
41
|
+
OpenStruct.new({:node_value=>"Javert", :group=>4}),
|
42
|
+
OpenStruct.new({:node_value=>"Fauchelevent", :group=>0}),
|
43
|
+
OpenStruct.new({:node_value=>"Bamatabois", :group=>2}),
|
44
|
+
OpenStruct.new({:node_value=>"Perpetue", :group=>3}),
|
45
|
+
OpenStruct.new({:node_value=>"Simplice", :group=>2}),
|
46
|
+
OpenStruct.new({:node_value=>"Scaufflaire", :group=>2}),
|
47
|
+
OpenStruct.new({:node_value=>"Woman 1", :group=>2}),
|
48
|
+
OpenStruct.new({:node_value=>"Judge", :group=>2}),
|
49
|
+
OpenStruct.new({:node_value=>"Champmathieu", :group=>2}),
|
50
|
+
OpenStruct.new({:node_value=>"Brevet", :group=>2}),
|
51
|
+
OpenStruct.new({:node_value=>"Chenildieu", :group=>2}),
|
52
|
+
OpenStruct.new({:node_value=>"Cochepaille", :group=>2}),
|
53
|
+
OpenStruct.new({:node_value=>"Pontmercy", :group=>4}),
|
54
|
+
OpenStruct.new({:node_value=>"Boulatruelle", :group=>6}),
|
55
|
+
OpenStruct.new({:node_value=>"Eponine", :group=>4}),
|
56
|
+
OpenStruct.new({:node_value=>"Anzelma", :group=>4}),
|
57
|
+
OpenStruct.new({:node_value=>"Woman 2", :group=>5}),
|
58
|
+
OpenStruct.new({:node_value=>"Mother Innocent", :group=>0}),
|
59
|
+
OpenStruct.new({:node_value=>"Gribier", :group=>0}),
|
60
|
+
OpenStruct.new({:node_value=>"Jondrette", :group=>7}),
|
61
|
+
OpenStruct.new({:node_value=>"Mme. Burgon", :group=>7}),
|
62
|
+
OpenStruct.new({:node_value=>"Gavroche", :group=>8}),
|
63
|
+
OpenStruct.new({:node_value=>"Gillenormand", :group=>5}),
|
64
|
+
OpenStruct.new({:node_value=>"Magnon", :group=>5}),
|
65
|
+
OpenStruct.new({:node_value=>"Mlle. Gillenormand", :group=>5}),
|
66
|
+
OpenStruct.new({:node_value=>"Mme. Pontmercy", :group=>5}),
|
67
|
+
OpenStruct.new({:node_value=>"Mlle. Vaubois", :group=>5}),
|
68
|
+
OpenStruct.new({:node_value=>"Lt. Gillenormand", :group=>5}),
|
69
|
+
OpenStruct.new({:node_value=>"Marius", :group=>8}),
|
70
|
+
OpenStruct.new({:node_value=>"Baroness T", :group=>5}),
|
71
|
+
OpenStruct.new({:node_value=>"Mabeuf", :group=>8}),
|
72
|
+
OpenStruct.new({:node_value=>"Enjolras", :group=>8}),
|
73
|
+
OpenStruct.new({:node_value=>"Combeferre", :group=>8}),
|
74
|
+
OpenStruct.new({:node_value=>"Prouvaire", :group=>8}),
|
75
|
+
OpenStruct.new({:node_value=>"Feuilly", :group=>8}),
|
76
|
+
OpenStruct.new({:node_value=>"Courfeyrac", :group=>8}),
|
77
|
+
OpenStruct.new({:node_value=>"Bahorel", :group=>8}),
|
78
|
+
OpenStruct.new({:node_value=>"Bossuet", :group=>8}),
|
79
|
+
OpenStruct.new({:node_value=>"Joly", :group=>8}),
|
80
|
+
OpenStruct.new({:node_value=>"Grantaire", :group=>8}),
|
81
|
+
OpenStruct.new({:node_value=>"Mother Plutarch", :group=>9}),
|
82
|
+
OpenStruct.new({:node_value=>"Gueulemer", :group=>4}),
|
83
|
+
OpenStruct.new({:node_value=>"Babet", :group=>4}),
|
84
|
+
OpenStruct.new({:node_value=>"Claquesous", :group=>4}),
|
85
|
+
OpenStruct.new({:node_value=>"Montparnasse", :group=>4}),
|
86
|
+
OpenStruct.new({:node_value=>"Toussaint", :group=>5}),
|
87
|
+
OpenStruct.new({:node_value=>"Child 1", :group=>10}),
|
88
|
+
OpenStruct.new({:node_value=>"Child 2", :group=>10}),
|
89
|
+
OpenStruct.new({:node_value=>"Brujon", :group=>4}),
|
90
|
+
OpenStruct.new({:node_value=>"Mme. Hucheloup", :group=>8})
|
91
|
+
],
|
92
|
+
:links=>[
|
93
|
+
OpenStruct.new({:source=>1, :target=>0, :value=>1}),
|
94
|
+
OpenStruct.new({:source=>2, :target=>0, :value=>8}),
|
95
|
+
OpenStruct.new({:source=>3, :target=>0, :value=>10}),
|
96
|
+
OpenStruct.new({:source=>3, :target=>2, :value=>6}),
|
97
|
+
OpenStruct.new({:source=>4, :target=>0, :value=>1}),
|
98
|
+
OpenStruct.new({:source=>5, :target=>0, :value=>1}),
|
99
|
+
OpenStruct.new({:source=>6, :target=>0, :value=>1}),
|
100
|
+
OpenStruct.new({:source=>7, :target=>0, :value=>1}),
|
101
|
+
OpenStruct.new({:source=>8, :target=>0, :value=>2}),
|
102
|
+
OpenStruct.new({:source=>9, :target=>0, :value=>1}),
|
103
|
+
OpenStruct.new({:source=>11, :target=>10, :value=>1}),
|
104
|
+
OpenStruct.new({:source=>11, :target=>3, :value=>3}),
|
105
|
+
OpenStruct.new({:source=>11, :target=>2, :value=>3}),
|
106
|
+
OpenStruct.new({:source=>11, :target=>0, :value=>5}),
|
107
|
+
OpenStruct.new({:source=>12, :target=>11, :value=>1}),
|
108
|
+
OpenStruct.new({:source=>13, :target=>11, :value=>1}),
|
109
|
+
OpenStruct.new({:source=>14, :target=>11, :value=>1}),
|
110
|
+
OpenStruct.new({:source=>15, :target=>11, :value=>1}),
|
111
|
+
OpenStruct.new({:source=>17, :target=>16, :value=>4}),
|
112
|
+
OpenStruct.new({:source=>18, :target=>16, :value=>4}),
|
113
|
+
OpenStruct.new({:source=>18, :target=>17, :value=>4}),
|
114
|
+
OpenStruct.new({:source=>19, :target=>16, :value=>4}),
|
115
|
+
OpenStruct.new({:source=>19, :target=>17, :value=>4}),
|
116
|
+
OpenStruct.new({:source=>19, :target=>18, :value=>4}),
|
117
|
+
OpenStruct.new({:source=>20, :target=>16, :value=>3}),
|
118
|
+
OpenStruct.new({:source=>20, :target=>17, :value=>3}),
|
119
|
+
OpenStruct.new({:source=>20, :target=>18, :value=>3}),
|
120
|
+
OpenStruct.new({:source=>20, :target=>19, :value=>4}),
|
121
|
+
OpenStruct.new({:source=>21, :target=>16, :value=>3}),
|
122
|
+
OpenStruct.new({:source=>21, :target=>17, :value=>3}),
|
123
|
+
OpenStruct.new({:source=>21, :target=>18, :value=>3}),
|
124
|
+
OpenStruct.new({:source=>21, :target=>19, :value=>3}),
|
125
|
+
OpenStruct.new({:source=>21, :target=>20, :value=>5}),
|
126
|
+
OpenStruct.new({:source=>22, :target=>16, :value=>3}),
|
127
|
+
OpenStruct.new({:source=>22, :target=>17, :value=>3}),
|
128
|
+
OpenStruct.new({:source=>22, :target=>18, :value=>3}),
|
129
|
+
OpenStruct.new({:source=>22, :target=>19, :value=>3}),
|
130
|
+
OpenStruct.new({:source=>22, :target=>20, :value=>4}),
|
131
|
+
OpenStruct.new({:source=>22, :target=>21, :value=>4}),
|
132
|
+
OpenStruct.new({:source=>23, :target=>16, :value=>3}),
|
133
|
+
OpenStruct.new({:source=>23, :target=>17, :value=>3}),
|
134
|
+
OpenStruct.new({:source=>23, :target=>18, :value=>3}),
|
135
|
+
OpenStruct.new({:source=>23, :target=>19, :value=>3}),
|
136
|
+
OpenStruct.new({:source=>23, :target=>20, :value=>4}),
|
137
|
+
OpenStruct.new({:source=>23, :target=>21, :value=>4}),
|
138
|
+
OpenStruct.new({:source=>23, :target=>22, :value=>4}),
|
139
|
+
OpenStruct.new({:source=>23, :target=>12, :value=>2}),
|
140
|
+
OpenStruct.new({:source=>23, :target=>11, :value=>9}),
|
141
|
+
OpenStruct.new({:source=>24, :target=>23, :value=>2}),
|
142
|
+
OpenStruct.new({:source=>24, :target=>11, :value=>7}),
|
143
|
+
OpenStruct.new({:source=>25, :target=>24, :value=>13}),
|
144
|
+
OpenStruct.new({:source=>25, :target=>23, :value=>1}),
|
145
|
+
OpenStruct.new({:source=>25, :target=>11, :value=>12}),
|
146
|
+
OpenStruct.new({:source=>26, :target=>24, :value=>4}),
|
147
|
+
OpenStruct.new({:source=>26, :target=>11, :value=>31}),
|
148
|
+
OpenStruct.new({:source=>26, :target=>16, :value=>1}),
|
149
|
+
OpenStruct.new({:source=>26, :target=>25, :value=>1}),
|
150
|
+
OpenStruct.new({:source=>27, :target=>11, :value=>17}),
|
151
|
+
OpenStruct.new({:source=>27, :target=>23, :value=>5}),
|
152
|
+
OpenStruct.new({:source=>27, :target=>25, :value=>5}),
|
153
|
+
OpenStruct.new({:source=>27, :target=>24, :value=>1}),
|
154
|
+
OpenStruct.new({:source=>27, :target=>26, :value=>1}),
|
155
|
+
OpenStruct.new({:source=>28, :target=>11, :value=>8}),
|
156
|
+
OpenStruct.new({:source=>28, :target=>27, :value=>1}),
|
157
|
+
OpenStruct.new({:source=>29, :target=>23, :value=>1}),
|
158
|
+
OpenStruct.new({:source=>29, :target=>27, :value=>1}),
|
159
|
+
OpenStruct.new({:source=>29, :target=>11, :value=>2}),
|
160
|
+
OpenStruct.new({:source=>30, :target=>23, :value=>1}),
|
161
|
+
OpenStruct.new({:source=>31, :target=>30, :value=>2}),
|
162
|
+
OpenStruct.new({:source=>31, :target=>11, :value=>3}),
|
163
|
+
OpenStruct.new({:source=>31, :target=>23, :value=>2}),
|
164
|
+
OpenStruct.new({:source=>31, :target=>27, :value=>1}),
|
165
|
+
OpenStruct.new({:source=>32, :target=>11, :value=>1}),
|
166
|
+
OpenStruct.new({:source=>33, :target=>11, :value=>2}),
|
167
|
+
OpenStruct.new({:source=>33, :target=>27, :value=>1}),
|
168
|
+
OpenStruct.new({:source=>34, :target=>11, :value=>3}),
|
169
|
+
OpenStruct.new({:source=>34, :target=>29, :value=>2}),
|
170
|
+
OpenStruct.new({:source=>35, :target=>11, :value=>3}),
|
171
|
+
OpenStruct.new({:source=>35, :target=>34, :value=>3}),
|
172
|
+
OpenStruct.new({:source=>35, :target=>29, :value=>2}),
|
173
|
+
OpenStruct.new({:source=>36, :target=>34, :value=>2}),
|
174
|
+
OpenStruct.new({:source=>36, :target=>35, :value=>2}),
|
175
|
+
OpenStruct.new({:source=>36, :target=>11, :value=>2}),
|
176
|
+
OpenStruct.new({:source=>36, :target=>29, :value=>1}),
|
177
|
+
OpenStruct.new({:source=>37, :target=>34, :value=>2}),
|
178
|
+
OpenStruct.new({:source=>37, :target=>35, :value=>2}),
|
179
|
+
OpenStruct.new({:source=>37, :target=>36, :value=>2}),
|
180
|
+
OpenStruct.new({:source=>37, :target=>11, :value=>2}),
|
181
|
+
OpenStruct.new({:source=>37, :target=>29, :value=>1}),
|
182
|
+
OpenStruct.new({:source=>38, :target=>34, :value=>2}),
|
183
|
+
OpenStruct.new({:source=>38, :target=>35, :value=>2}),
|
184
|
+
OpenStruct.new({:source=>38, :target=>36, :value=>2}),
|
185
|
+
OpenStruct.new({:source=>38, :target=>37, :value=>2}),
|
186
|
+
OpenStruct.new({:source=>38, :target=>11, :value=>2}),
|
187
|
+
OpenStruct.new({:source=>38, :target=>29, :value=>1}),
|
188
|
+
OpenStruct.new({:source=>39, :target=>25, :value=>1}),
|
189
|
+
OpenStruct.new({:source=>40, :target=>25, :value=>1}),
|
190
|
+
OpenStruct.new({:source=>41, :target=>24, :value=>2}),
|
191
|
+
OpenStruct.new({:source=>41, :target=>25, :value=>3}),
|
192
|
+
OpenStruct.new({:source=>42, :target=>41, :value=>2}),
|
193
|
+
OpenStruct.new({:source=>42, :target=>25, :value=>2}),
|
194
|
+
OpenStruct.new({:source=>42, :target=>24, :value=>1}),
|
195
|
+
OpenStruct.new({:source=>43, :target=>11, :value=>3}),
|
196
|
+
OpenStruct.new({:source=>43, :target=>26, :value=>1}),
|
197
|
+
OpenStruct.new({:source=>43, :target=>27, :value=>1}),
|
198
|
+
OpenStruct.new({:source=>44, :target=>28, :value=>3}),
|
199
|
+
OpenStruct.new({:source=>44, :target=>11, :value=>1}),
|
200
|
+
OpenStruct.new({:source=>45, :target=>28, :value=>2}),
|
201
|
+
OpenStruct.new({:source=>47, :target=>46, :value=>1}),
|
202
|
+
OpenStruct.new({:source=>48, :target=>47, :value=>2}),
|
203
|
+
OpenStruct.new({:source=>48, :target=>25, :value=>1}),
|
204
|
+
OpenStruct.new({:source=>48, :target=>27, :value=>1}),
|
205
|
+
OpenStruct.new({:source=>48, :target=>11, :value=>1}),
|
206
|
+
OpenStruct.new({:source=>49, :target=>26, :value=>3}),
|
207
|
+
OpenStruct.new({:source=>49, :target=>11, :value=>2}),
|
208
|
+
OpenStruct.new({:source=>50, :target=>49, :value=>1}),
|
209
|
+
OpenStruct.new({:source=>50, :target=>24, :value=>1}),
|
210
|
+
OpenStruct.new({:source=>51, :target=>49, :value=>9}),
|
211
|
+
OpenStruct.new({:source=>51, :target=>26, :value=>2}),
|
212
|
+
OpenStruct.new({:source=>51, :target=>11, :value=>2}),
|
213
|
+
OpenStruct.new({:source=>52, :target=>51, :value=>1}),
|
214
|
+
OpenStruct.new({:source=>52, :target=>39, :value=>1}),
|
215
|
+
OpenStruct.new({:source=>53, :target=>51, :value=>1}),
|
216
|
+
OpenStruct.new({:source=>54, :target=>51, :value=>2}),
|
217
|
+
OpenStruct.new({:source=>54, :target=>49, :value=>1}),
|
218
|
+
OpenStruct.new({:source=>54, :target=>26, :value=>1}),
|
219
|
+
OpenStruct.new({:source=>55, :target=>51, :value=>6}),
|
220
|
+
OpenStruct.new({:source=>55, :target=>49, :value=>12}),
|
221
|
+
OpenStruct.new({:source=>55, :target=>39, :value=>1}),
|
222
|
+
OpenStruct.new({:source=>55, :target=>54, :value=>1}),
|
223
|
+
OpenStruct.new({:source=>55, :target=>26, :value=>21}),
|
224
|
+
OpenStruct.new({:source=>55, :target=>11, :value=>19}),
|
225
|
+
OpenStruct.new({:source=>55, :target=>16, :value=>1}),
|
226
|
+
OpenStruct.new({:source=>55, :target=>25, :value=>2}),
|
227
|
+
OpenStruct.new({:source=>55, :target=>41, :value=>5}),
|
228
|
+
OpenStruct.new({:source=>55, :target=>48, :value=>4}),
|
229
|
+
OpenStruct.new({:source=>56, :target=>49, :value=>1}),
|
230
|
+
OpenStruct.new({:source=>56, :target=>55, :value=>1}),
|
231
|
+
OpenStruct.new({:source=>57, :target=>55, :value=>1}),
|
232
|
+
OpenStruct.new({:source=>57, :target=>41, :value=>1}),
|
233
|
+
OpenStruct.new({:source=>57, :target=>48, :value=>1}),
|
234
|
+
OpenStruct.new({:source=>58, :target=>55, :value=>7}),
|
235
|
+
OpenStruct.new({:source=>58, :target=>48, :value=>7}),
|
236
|
+
OpenStruct.new({:source=>58, :target=>27, :value=>6}),
|
237
|
+
OpenStruct.new({:source=>58, :target=>57, :value=>1}),
|
238
|
+
OpenStruct.new({:source=>58, :target=>11, :value=>4}),
|
239
|
+
OpenStruct.new({:source=>59, :target=>58, :value=>15}),
|
240
|
+
OpenStruct.new({:source=>59, :target=>55, :value=>5}),
|
241
|
+
OpenStruct.new({:source=>59, :target=>48, :value=>6}),
|
242
|
+
OpenStruct.new({:source=>59, :target=>57, :value=>2}),
|
243
|
+
OpenStruct.new({:source=>60, :target=>48, :value=>1}),
|
244
|
+
OpenStruct.new({:source=>60, :target=>58, :value=>4}),
|
245
|
+
OpenStruct.new({:source=>60, :target=>59, :value=>2}),
|
246
|
+
OpenStruct.new({:source=>61, :target=>48, :value=>2}),
|
247
|
+
OpenStruct.new({:source=>61, :target=>58, :value=>6}),
|
248
|
+
OpenStruct.new({:source=>61, :target=>60, :value=>2}),
|
249
|
+
OpenStruct.new({:source=>61, :target=>59, :value=>5}),
|
250
|
+
OpenStruct.new({:source=>61, :target=>57, :value=>1}),
|
251
|
+
OpenStruct.new({:source=>61, :target=>55, :value=>1}),
|
252
|
+
OpenStruct.new({:source=>62, :target=>55, :value=>9}),
|
253
|
+
OpenStruct.new({:source=>62, :target=>58, :value=>17}),
|
254
|
+
OpenStruct.new({:source=>62, :target=>59, :value=>13}),
|
255
|
+
OpenStruct.new({:source=>62, :target=>48, :value=>7}),
|
256
|
+
OpenStruct.new({:source=>62, :target=>57, :value=>2}),
|
257
|
+
OpenStruct.new({:source=>62, :target=>41, :value=>1}),
|
258
|
+
OpenStruct.new({:source=>62, :target=>61, :value=>6}),
|
259
|
+
OpenStruct.new({:source=>62, :target=>60, :value=>3}),
|
260
|
+
OpenStruct.new({:source=>63, :target=>59, :value=>5}),
|
261
|
+
OpenStruct.new({:source=>63, :target=>48, :value=>5}),
|
262
|
+
OpenStruct.new({:source=>63, :target=>62, :value=>6}),
|
263
|
+
OpenStruct.new({:source=>63, :target=>57, :value=>2}),
|
264
|
+
OpenStruct.new({:source=>63, :target=>58, :value=>4}),
|
265
|
+
OpenStruct.new({:source=>63, :target=>61, :value=>3}),
|
266
|
+
OpenStruct.new({:source=>63, :target=>60, :value=>2}),
|
267
|
+
OpenStruct.new({:source=>63, :target=>55, :value=>1}),
|
268
|
+
OpenStruct.new({:source=>64, :target=>55, :value=>5}),
|
269
|
+
OpenStruct.new({:source=>64, :target=>62, :value=>12}),
|
270
|
+
OpenStruct.new({:source=>64, :target=>48, :value=>5}),
|
271
|
+
OpenStruct.new({:source=>64, :target=>63, :value=>4}),
|
272
|
+
OpenStruct.new({:source=>64, :target=>58, :value=>10}),
|
273
|
+
OpenStruct.new({:source=>64, :target=>61, :value=>6}),
|
274
|
+
OpenStruct.new({:source=>64, :target=>60, :value=>2}),
|
275
|
+
OpenStruct.new({:source=>64, :target=>59, :value=>9}),
|
276
|
+
OpenStruct.new({:source=>64, :target=>57, :value=>1}),
|
277
|
+
OpenStruct.new({:source=>64, :target=>11, :value=>1}),
|
278
|
+
OpenStruct.new({:source=>65, :target=>63, :value=>5}),
|
279
|
+
OpenStruct.new({:source=>65, :target=>64, :value=>7}),
|
280
|
+
OpenStruct.new({:source=>65, :target=>48, :value=>3}),
|
281
|
+
OpenStruct.new({:source=>65, :target=>62, :value=>5}),
|
282
|
+
OpenStruct.new({:source=>65, :target=>58, :value=>5}),
|
283
|
+
OpenStruct.new({:source=>65, :target=>61, :value=>5}),
|
284
|
+
OpenStruct.new({:source=>65, :target=>60, :value=>2}),
|
285
|
+
OpenStruct.new({:source=>65, :target=>59, :value=>5}),
|
286
|
+
OpenStruct.new({:source=>65, :target=>57, :value=>1}),
|
287
|
+
OpenStruct.new({:source=>65, :target=>55, :value=>2}),
|
288
|
+
OpenStruct.new({:source=>66, :target=>64, :value=>3}),
|
289
|
+
OpenStruct.new({:source=>66, :target=>58, :value=>3}),
|
290
|
+
OpenStruct.new({:source=>66, :target=>59, :value=>1}),
|
291
|
+
OpenStruct.new({:source=>66, :target=>62, :value=>2}),
|
292
|
+
OpenStruct.new({:source=>66, :target=>65, :value=>2}),
|
293
|
+
OpenStruct.new({:source=>66, :target=>48, :value=>1}),
|
294
|
+
OpenStruct.new({:source=>66, :target=>63, :value=>1}),
|
295
|
+
OpenStruct.new({:source=>66, :target=>61, :value=>1}),
|
296
|
+
OpenStruct.new({:source=>66, :target=>60, :value=>1}),
|
297
|
+
OpenStruct.new({:source=>67, :target=>57, :value=>3}),
|
298
|
+
OpenStruct.new({:source=>68, :target=>25, :value=>5}),
|
299
|
+
OpenStruct.new({:source=>68, :target=>11, :value=>1}),
|
300
|
+
OpenStruct.new({:source=>68, :target=>24, :value=>1}),
|
301
|
+
OpenStruct.new({:source=>68, :target=>27, :value=>1}),
|
302
|
+
OpenStruct.new({:source=>68, :target=>48, :value=>1}),
|
303
|
+
OpenStruct.new({:source=>68, :target=>41, :value=>1}),
|
304
|
+
OpenStruct.new({:source=>69, :target=>25, :value=>6}),
|
305
|
+
OpenStruct.new({:source=>69, :target=>68, :value=>6}),
|
306
|
+
OpenStruct.new({:source=>69, :target=>11, :value=>1}),
|
307
|
+
OpenStruct.new({:source=>69, :target=>24, :value=>1}),
|
308
|
+
OpenStruct.new({:source=>69, :target=>27, :value=>2}),
|
309
|
+
OpenStruct.new({:source=>69, :target=>48, :value=>1}),
|
310
|
+
OpenStruct.new({:source=>69, :target=>41, :value=>1}),
|
311
|
+
OpenStruct.new({:source=>70, :target=>25, :value=>4}),
|
312
|
+
OpenStruct.new({:source=>70, :target=>69, :value=>4}),
|
313
|
+
OpenStruct.new({:source=>70, :target=>68, :value=>4}),
|
314
|
+
OpenStruct.new({:source=>70, :target=>11, :value=>1}),
|
315
|
+
OpenStruct.new({:source=>70, :target=>24, :value=>1}),
|
316
|
+
OpenStruct.new({:source=>70, :target=>27, :value=>1}),
|
317
|
+
OpenStruct.new({:source=>70, :target=>41, :value=>1}),
|
318
|
+
OpenStruct.new({:source=>70, :target=>58, :value=>1}),
|
319
|
+
OpenStruct.new({:source=>71, :target=>27, :value=>1}),
|
320
|
+
OpenStruct.new({:source=>71, :target=>69, :value=>2}),
|
321
|
+
OpenStruct.new({:source=>71, :target=>68, :value=>2}),
|
322
|
+
OpenStruct.new({:source=>71, :target=>70, :value=>2}),
|
323
|
+
OpenStruct.new({:source=>71, :target=>11, :value=>1}),
|
324
|
+
OpenStruct.new({:source=>71, :target=>48, :value=>1}),
|
325
|
+
OpenStruct.new({:source=>71, :target=>41, :value=>1}),
|
326
|
+
OpenStruct.new({:source=>71, :target=>25, :value=>1}),
|
327
|
+
OpenStruct.new({:source=>72, :target=>26, :value=>2}),
|
328
|
+
OpenStruct.new({:source=>72, :target=>27, :value=>1}),
|
329
|
+
OpenStruct.new({:source=>72, :target=>11, :value=>1}),
|
330
|
+
OpenStruct.new({:source=>73, :target=>48, :value=>2}),
|
331
|
+
OpenStruct.new({:source=>74, :target=>48, :value=>2}),
|
332
|
+
OpenStruct.new({:source=>74, :target=>73, :value=>3}),
|
333
|
+
OpenStruct.new({:source=>75, :target=>69, :value=>3}),
|
334
|
+
OpenStruct.new({:source=>75, :target=>68, :value=>3}),
|
335
|
+
OpenStruct.new({:source=>75, :target=>25, :value=>3}),
|
336
|
+
OpenStruct.new({:source=>75, :target=>48, :value=>1}),
|
337
|
+
OpenStruct.new({:source=>75, :target=>41, :value=>1}),
|
338
|
+
OpenStruct.new({:source=>75, :target=>70, :value=>1}),
|
339
|
+
OpenStruct.new({:source=>75, :target=>71, :value=>1}),
|
340
|
+
OpenStruct.new({:source=>76, :target=>64, :value=>1}),
|
341
|
+
OpenStruct.new({:source=>76, :target=>65, :value=>1}),
|
342
|
+
OpenStruct.new({:source=>76, :target=>66, :value=>1}),
|
343
|
+
OpenStruct.new({:source=>76, :target=>63, :value=>1}),
|
344
|
+
OpenStruct.new({:source=>76, :target=>62, :value=>1}),
|
345
|
+
OpenStruct.new({:source=>76, :target=>48, :value=>1}),
|
346
|
+
OpenStruct.new({:source=>76, :target=>58, :value=>1})
|
347
|
+
]
|
348
|
+
})
|