<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -42,7 +42,7 @@ module Cabar
         dependents = dependents_proc.call(e)
         dependents = dependents.select do | c |
           # Update dependent's depth.
-          if depth[c] &lt; d
+          if ! depth[c] || (depth[c] &lt; d)
             depth[c] = d
           end
 
@@ -53,7 +53,7 @@ module Cabar
             false
           else
             # Mark edge as visited.
-            edge_visited[edge] ||= 1
+            edge_visited[edge] ||= 0
             edge_visited[edge] += 1
           end
         end
@@ -96,6 +96,13 @@ module Cabar
     end
     #module_method :sort_topographic
 
+
+    # Returns the topographically sorted subset of all nodes in a directed graph.
+    # all_elements must list all the nodes in the directed graph.
+    def topographic_sort_subset subset, all_nodes, opts = nil
+      topographic_sort(all_nodes, opts) &amp; subset
+    end
+
   end # module
 
 end # module</diff>
      <filename>lib/ruby/cabar/sort.rb</filename>
    </modified>
    <modified>
      <diff>@@ -73,7 +73,7 @@ task :test_specs do
   spec_files = Dir[&quot;test/**/*.spec&quot;].sort
   unless spec_files.empty?
     ENV['RUBYLIB'] = ($:.dup &lt;&lt; 'test/ruby').join(':')
-    sh &quot;spec -f specdoc #{spec_files.join(' ')}&quot;
+    sh &quot;spec -b -f specdoc #{spec_files.join(' ')}&quot;
   end
 end
 </diff>
      <filename>rake_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -10,34 +10,79 @@ describe Cabar::Sort do
   include Cabar::Sort
 
   before do
-    # Test
+=begin
+
+Sort the graph nodes (@unsorted) such that all keys in
+@children are listed before all values listed as dependents:
+
+a ----&gt; c -
+ \         \
+  ----&gt; d ---&gt; x ---&gt; y ---&gt; z ---&gt; 1
+                  /            \
+b ----------------              --&gt; 2
+
+=end
+    @srand ||= srand($$ ^ Time.now.to_i)
+
     @children = {
-      'a' =&gt; [ 'b', 'c' ],
-      'b' =&gt; [ 'x' ],
+      'a' =&gt; [ 'c', 'd' ],
+      'b' =&gt; [ 'y' ],
       'c' =&gt; [ 'x' ],
+      'd' =&gt; [ 'x' ],
       'x' =&gt; [ 'y' ],
       'y' =&gt; [ 'z' ],
       'z' =&gt; [ '1', '2' ],
     }
     @children_proc = lambda { | x | @children[x] || [ ] } 
     @unsorted = (@children.keys + @children.values).flatten.uniq
+    # Correct answers are:
     @sorted = 
       [ 
-       # 'b' and 'c' are mutually independent, but depend on 'a'.
-       [ 'a', 'b', 'c', 'x', 'y', 'z', '1', '2' ],
-       [ 'a', 'b', 'c', 'x', 'y', 'z', '2', '1' ],
-       [ 'a', 'c', 'b', 'x', 'y', 'z', '1', '2' ], 
-       [ 'a', 'c', 'b', 'x', 'y', 'z', '2', '1' ], 
-      ]
+       # eg: 'c' and 'd' are mutually independent, but 'a' depends on both.
+       [ 'a', 'b', 'c', 'd', 'x', 'y', 'z', '1', '2' ],
+       [ 'a', 'b', 'd', 'c', 'x', 'y', 'z', '1', '2' ],
+       [ 'a', 'b', 'c', 'd', 'x', 'y', 'z', '2', '1' ], 
+       [ 'a', 'b', 'd', 'c', 'x', 'y', 'z', '2', '1' ], 
+       [ 'b', 'a', 'c', 'd', 'x', 'y', 'z', '1', '2' ],
+       [ 'b', 'a', 'd', 'c', 'x', 'y', 'z', '1', '2' ],
+       [ 'b', 'a', 'c', 'd', 'x', 'y', 'z', '2', '1' ], 
+       [ 'b', 'a', 'd', 'c', 'x', 'y', 'z', '2', '1' ], 
+       ]
   end
 
   it &quot;sorts random permutations topologically.&quot; do
     1000.times do
       permutation = @unsorted.sort { | a, b | rand(10000) &lt;=&gt; rand(10000) }
       result = topographic_sort(permutation, :dependents =&gt; @children_proc)
-      # puts &quot;permutation = #{permutation.inspect}&quot;
-      # puts &quot;  result    = #{result.inspect}&quot;
-      @sorted.any? { | x | result === x }.should == true
+      correct = @sorted.any? { | x | result === x } == true
+=begin
+      puts &quot;permutation = #{permutation.inspect}&quot;
+      puts &quot;  result    = #{result.inspect}&quot;
+      puts &quot;  correct   = #{correct.inspect}&quot;
+      exit(1) unless correct
+=end
+      correct.should == true
+    end 
+
+  end
+
+  it &quot;sorts random subset permutations topologically.&quot; do
+    1000.times do
+      unsorted = @unsorted.select { | n | rand(2) == 0 }
+      sorted = @sorted.map { | x | x.select { | n | unsorted.include? n } }.uniq
+
+      permutation = unsorted.sort { | a, b | rand(10000) &lt;=&gt; rand(10000) }
+      result = topographic_sort_subset(permutation, @unsorted, :dependents =&gt; @children_proc)
+      # result = topographic_sort(permutation, :dependents =&gt; @children_proc)
+      correct = sorted.any? { | x | result === x } == true
+=begin
+      puts &quot;permutation = #{permutation.inspect}&quot;
+      puts &quot;sorted      = \n  #{sorted.map{|x| x.inspect}.join(&quot;,\n  &quot;)}&quot;
+      puts &quot;  result    = #{result.inspect}&quot;
+      puts &quot;  correct   = #{correct.inspect}&quot;
+#      exit(1) unless correct
+=end
+      correct.should == true
     end 
 
   end
@@ -62,34 +107,39 @@ describe Cabar::Sort do
 
   it &quot;handles cyclical graphs.&quot; do
     @children['z'] &lt;&lt; 'x'
-    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;2&quot;, &quot;1&quot;, &quot;x&quot;, &quot;y&quot;, &quot;z&quot;]
-    @sorted &lt;&lt; [&quot;a&quot;, &quot;c&quot;, &quot;b&quot;, &quot;y&quot;, &quot;z&quot;, &quot;2&quot;, &quot;x&quot;, &quot;1&quot;]
-    @sorted &lt;&lt; [&quot;a&quot;, &quot;c&quot;, &quot;b&quot;, &quot;z&quot;, &quot;x&quot;, &quot;1&quot;, &quot;2&quot;, &quot;y&quot;]
-    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;2&quot;, &quot;x&quot;, &quot;1&quot;, &quot;y&quot;, &quot;z&quot;]
-    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;y&quot;, &quot;z&quot;, &quot;2&quot;, &quot;x&quot;, &quot;1&quot;]
-    @sorted &lt;&lt; [&quot;a&quot;, &quot;c&quot;, &quot;b&quot;, &quot;1&quot;, &quot;x&quot;, &quot;2&quot;, &quot;y&quot;, &quot;z&quot;]
-    @sorted &lt;&lt; [&quot;a&quot;, &quot;c&quot;, &quot;b&quot;, &quot;z&quot;, &quot;1&quot;, &quot;2&quot;, &quot;x&quot;, &quot;y&quot;]
-    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;y&quot;, &quot;z&quot;, &quot;2&quot;, &quot;1&quot;, &quot;x&quot;]
-    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;x&quot;, &quot;1&quot;, &quot;2&quot;, &quot;y&quot;, &quot;z&quot;]
-    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;1&quot;, &quot;x&quot;, &quot;2&quot;, &quot;y&quot;, &quot;z&quot;]
-    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;z&quot;, &quot;2&quot;, &quot;x&quot;, &quot;1&quot;, &quot;y&quot;]
-    @sorted &lt;&lt; [&quot;a&quot;, &quot;c&quot;, &quot;b&quot;, &quot;2&quot;, &quot;x&quot;, &quot;1&quot;, &quot;y&quot;, &quot;z&quot;]
-    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;y&quot;, &quot;z&quot;, &quot;x&quot;, &quot;1&quot;, &quot;2&quot;]
-    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;x&quot;, &quot;2&quot;, &quot;1&quot;, &quot;y&quot;, &quot;z&quot;]
-    @sorted &lt;&lt; [&quot;a&quot;, &quot;c&quot;, &quot;b&quot;, &quot;x&quot;, &quot;1&quot;, &quot;2&quot;, &quot;y&quot;, &quot;z&quot;]
-    @sorted &lt;&lt; [&quot;a&quot;, &quot;c&quot;, &quot;b&quot;, &quot;y&quot;, &quot;z&quot;, &quot;x&quot;, &quot;2&quot;, &quot;1&quot;]
-    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;1&quot;, &quot;2&quot;, &quot;x&quot;, &quot;y&quot;, &quot;z&quot;]
-    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;z&quot;, &quot;1&quot;, &quot;2&quot;, &quot;x&quot;, &quot;y&quot;]
-    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;y&quot;, &quot;z&quot;, &quot;1&quot;, &quot;2&quot;, &quot;x&quot;]
+    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;2&quot;, &quot;1&quot;, &quot;x&quot;, &quot;y&quot;, &quot;z&quot;]
+    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;d&quot;, &quot;c&quot;, &quot;y&quot;, &quot;z&quot;, &quot;2&quot;, &quot;x&quot;, &quot;1&quot;]
+    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;d&quot;, &quot;c&quot;, &quot;z&quot;, &quot;x&quot;, &quot;1&quot;, &quot;2&quot;, &quot;y&quot;]
+    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;2&quot;, &quot;x&quot;, &quot;1&quot;, &quot;y&quot;, &quot;z&quot;]
+    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;y&quot;, &quot;z&quot;, &quot;2&quot;, &quot;x&quot;, &quot;1&quot;]
+    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;d&quot;, &quot;c&quot;, &quot;1&quot;, &quot;x&quot;, &quot;2&quot;, &quot;y&quot;, &quot;z&quot;]
+    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;d&quot;, &quot;c&quot;, &quot;z&quot;, &quot;1&quot;, &quot;2&quot;, &quot;x&quot;, &quot;y&quot;]
+    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;y&quot;, &quot;z&quot;, &quot;2&quot;, &quot;1&quot;, &quot;x&quot;]
+    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;x&quot;, &quot;1&quot;, &quot;2&quot;, &quot;y&quot;, &quot;z&quot;]
+    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;1&quot;, &quot;x&quot;, &quot;2&quot;, &quot;y&quot;, &quot;z&quot;]
+    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;z&quot;, &quot;2&quot;, &quot;x&quot;, &quot;1&quot;, &quot;y&quot;]
+    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;d&quot;, &quot;c&quot;, &quot;2&quot;, &quot;x&quot;, &quot;1&quot;, &quot;y&quot;, &quot;z&quot;]
+    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;y&quot;, &quot;z&quot;, &quot;x&quot;, &quot;1&quot;, &quot;2&quot;]
+    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;x&quot;, &quot;2&quot;, &quot;1&quot;, &quot;y&quot;, &quot;z&quot;]
+    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;d&quot;, &quot;c&quot;, &quot;x&quot;, &quot;1&quot;, &quot;2&quot;, &quot;y&quot;, &quot;z&quot;]
+    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;d&quot;, &quot;c&quot;, &quot;y&quot;, &quot;z&quot;, &quot;x&quot;, &quot;2&quot;, &quot;1&quot;]
+    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;1&quot;, &quot;2&quot;, &quot;x&quot;, &quot;y&quot;, &quot;z&quot;]
+    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;z&quot;, &quot;1&quot;, &quot;2&quot;, &quot;x&quot;, &quot;y&quot;]
+    @sorted &lt;&lt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;y&quot;, &quot;z&quot;, &quot;1&quot;, &quot;2&quot;, &quot;x&quot;]
 
     1000.times do
       permutation = @unsorted.sort { | a, b | rand(10000) &lt;=&gt; rand(10000) }
       result = topographic_sort(permutation, 
                                 :dependents =&gt; @children_proc,
                                 :order =&gt; lambda { | a, b | a &lt;=&gt; b })
-      # puts &quot;permutation = #{permutation.inspect}&quot;
-      # puts &quot;  result    = #{result.inspect}&quot;
-      @sorted.any? { | x | result === x }.should == true
+      correct = @sorted.any? { | x | result === x } == true
+=begin
+      puts &quot;permutation = #{permutation.inspect}&quot;
+      puts &quot;  result    = #{result.inspect}&quot;
+      puts &quot;  correct   = #{correct.inspect}&quot;
+      exit(1) unless correct
+=end
+      correct.should == true
     end 
   end
 </diff>
      <filename>test/ruby/cabar/sort.spec</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>9673fd454cfea99a87e7fa97006e5c930ad0b413</id>
    </parent>
  </parents>
  <author>
    <name>kstephens</name>
    <email>kstephens@3b289f47-807e-410a-85af-7ee1d5ead6e2</email>
  </author>
  <url>http://github.com/jlawler/cabar/commit/cc4b0a9ba65b66b55204d97ffd5b2b05820b954b</url>
  <id>cc4b0a9ba65b66b55204d97ffd5b2b05820b954b</id>
  <committed-date>2008-06-04T16:39:00-07:00</committed-date>
  <authored-date>2008-06-04T16:39:00-07:00</authored-date>
  <message>Added topographic_sort_subset.

git-svn-id: http://cabar.rubyforge.org/svn/cabar/trunk@325 3b289f47-807e-410a-85af-7ee1d5ead6e2</message>
  <tree>e2daf258faab20ea5fc2fd95e56b851b00bb9778</tree>
  <committer>
    <name>kstephens</name>
    <email>kstephens@3b289f47-807e-410a-85af-7ee1d5ead6e2</email>
  </committer>
</commit>
