graphos 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5cfe336de6a10ae14a29bc67b90f4af411f795f2
4
- data.tar.gz: 29c44144d25742d02f9a4deb2d2576bdbe76763f
3
+ metadata.gz: 1ba60b53a39cf6c34299ed5a55f7372618c1a4c2
4
+ data.tar.gz: 89cb915d41ae66525516851b699187cff654caa5
5
5
  SHA512:
6
- metadata.gz: 7b6e21253d41a19dbf2885dbd5fa2986a1b28872cb9984648594a7c0609cb0cb683a5bcd9b0117162b6161cd3fee3ae8528f60daf5ff765f2cddd7c8c3087f00
7
- data.tar.gz: f7ee06141d139fc25a40a65eba7c1290995ac8d98e0f032affea302e179c08daf5c63ca0496d2ed3b806fe684265018e978334f0598baa88808c80799fc99247
6
+ metadata.gz: f1ba13a86d3c753a036db4fcbf844ade4959b28a5c12cbc1a2ddb568990adf2f04a51b21db188e147979e695145f8d0fa5880e80b203a2b48dcb7d0f7e578a73
7
+ data.tar.gz: 50f395bccfe7da8e2cb0d41b4fba2ff05ff11967228fc65109a8f1e240d922763589e951cc74cc18f7f8facd78e40c4215610344a0836d6423ec74179a28f1f1
@@ -12,6 +12,9 @@ module Graphos
12
12
 
13
13
  heap = BinaryHeap.new{|x,y| x.value <=> y.value}
14
14
  heap.push(initial, 0)
15
+ costs.each_with_index do |v,i|
16
+ heap.push(i,v)
17
+ end
15
18
 
16
19
  visited = Array.new(graph.size, false)
17
20
 
@@ -40,7 +43,6 @@ module Graphos
40
43
  fathers.each_with_index do |f,c|
41
44
  if f
42
45
  result.add_edge(f, c, costs[c])
43
- count += 1
44
46
  end
45
47
  end
46
48
  result
@@ -26,8 +26,9 @@ module Graphos
26
26
  def change key, new_value
27
27
  if has_key? key
28
28
  @values[key] = new_value
29
+ parent_val = @values[parent(@indexes[key])]
29
30
  move_up key
30
- move_down key
31
+ heapify key
31
32
  end
32
33
  end
33
34
 
@@ -42,6 +43,7 @@ module Graphos
42
43
  if size > 0
43
44
  @keys[0] = last
44
45
  @indexes[last] = 0
46
+ heapify last
45
47
  end
46
48
 
47
49
  result
@@ -51,6 +53,9 @@ module Graphos
51
53
  @keys.size
52
54
  end
53
55
 
56
+ def ordered
57
+ end
58
+
54
59
  private
55
60
  KeyVal = Struct.new(:key, :value)
56
61
 
@@ -66,19 +71,20 @@ module Graphos
66
71
  move_up key
67
72
  end
68
73
 
69
- def move_down key
74
+ def heapify key
70
75
  left_key = @keys[left(@indexes[key])]
71
76
  right_key = @keys[right(@indexes[key])]
77
+
72
78
  return if !left_key && !right_key
73
79
 
74
- max_key = [key, left_key, right_key].select{|x| !!x}.sort do |x,y|
80
+ min_key = [key, left_key, right_key].select{|x| !!x}.sort do |x,y|
75
81
  @compare.call(key_val(x), key_val(y))
76
82
  end.first
77
83
 
78
- return if max_key == key
84
+ return if min_key == key
79
85
 
80
- swap(@indexes[key], @indexes[max_key])
81
- move_down max_key
86
+ swap(@indexes[key], @indexes[min_key])
87
+ heapify key
82
88
  end
83
89
 
84
90
  def move_up key
@@ -1,3 +1,3 @@
1
1
  module Graphos
2
- VERSION = "0.3.3"
2
+ VERSION = "0.3.4"
3
3
  end
@@ -29,4 +29,57 @@ class BinaryHeapTest < MiniTest::Test
29
29
  bh.change(99,0)
30
30
  assert_equal(99,bh.next.key)
31
31
  end
32
+
33
+ def test_infinity
34
+ bh = Graphos::BinaryHeap.new{|x,y| x.value <=> y.value}
35
+ bh.extend(Simulator)
36
+ costs = Array.new(30, Float::INFINITY)
37
+ [0,3,7,16,22,28].each do |i|
38
+ costs[i] = i
39
+ end
40
+
41
+ costs.each_with_index do |v,i|
42
+ bh.push(i,v)
43
+ end
44
+
45
+ last = -1
46
+ while pop = bh.pop
47
+ assert_operator last, :<=, pop.value
48
+ last = pop.value
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ module Simulator
55
+ def get_vals
56
+ @keys.map{|k| @values[k]}
57
+ end
58
+ def simulate index=0, &block
59
+ return if index >= size
60
+ block.call(@values[@keys[index]])
61
+ l = left(index)
62
+ r = right(index)
63
+ if(r < size)
64
+ if(smaller(key_val(@keys[l]), key_val(@keys[r])))
65
+ simulate l, &block
66
+ simulate r, &block
67
+ else
68
+ simulate r, &block
69
+ simulate l, &block
70
+ end
71
+ elsif(l < size)
72
+ simulate l, &block
73
+ end
74
+ end
75
+ end
76
+
77
+ def assert_ordered bh
78
+ last = -1
79
+ bh.simulate do |v|
80
+ puts "#{v}"
81
+ assert_operator last, :<=, v
82
+ last = v
83
+ end
84
+ end
32
85
  end
@@ -22,12 +22,23 @@ class PrimTest < MiniTest::Test
22
22
  assert_equal(4, mst.edge(2,3).weight)
23
23
  end
24
24
 
25
+ def test_line
26
+ graph = Graphos::Weighted::Graph.new 4
27
+ graph.add_edge 0, 1, 3
28
+ graph.add_edge 1, 2, 1
29
+ graph.add_edge 2, 3, 2
30
+
31
+ mst = Graphos::Algorithm.prim graph, 0
32
+
33
+ refute_equal(nil, mst.edge(0,1))
34
+ end
35
+
25
36
  def test_100
26
37
  graph = Graphos::Weighted::TextFactory.read("test/fixtures/grafo_1.txt")
27
38
 
28
39
  mst = Graphos::Algorithm.prim graph, 0
29
40
  sum = mst.nodes.map(&:edges).flatten.map(&:weight).reduce(:+)/2
30
41
 
31
- assert_equal(253, sum)
42
+ assert_equal(336, sum)
32
43
  end
33
44
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphos
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bernardo Amorim
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-11-10 00:00:00.000000000 Z
12
+ date: 2014-11-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler