[macruby-changes] [3451] MacRuby/trunk
source_changes at macosforge.org
source_changes at macosforge.org
Mon Feb 8 15:04:58 PST 2010
Revision: 3451
http://trac.macosforge.org/projects/ruby/changeset/3451
Author: ernest.prabhakar at gmail.com
Date: 2010-02-08 15:04:57 -0800 (Mon, 08 Feb 2010)
Log Message:
-----------
Borked implementation of mapreduce
Modified Paths:
--------------
MacRuby/trunk/lib/dispatch/dispatch.rb
MacRuby/trunk/lib/dispatch/enumerable.rb
MacRuby/trunk/spec/macruby/library/dispatch/enumerable_spec.rb
Modified: MacRuby/trunk/lib/dispatch/dispatch.rb
===================================================================
--- MacRuby/trunk/lib/dispatch/dispatch.rb 2010-02-08 23:04:45 UTC (rev 3450)
+++ MacRuby/trunk/lib/dispatch/dispatch.rb 2010-02-08 23:04:57 UTC (rev 3451)
@@ -5,9 +5,10 @@
# Returns a unique label based on the ancestor chain and ID of +obj+
# plus the current time
def label_for(obj)
- label = obj.class.ancestors.uniq.reverse.join("_").downcase
+ ancestors = obj.class.ancestors.map {|a| a.to_s}
+ label = ancestors.uniq.reverse.join("_").downcase
now = Time.now.to_f.to_s.gsub(".","_")
- "#{label}_%x_%s" % [obj.object_id, now]
+ "#{label}__%x__%s" % [obj.object_id, now]
end
# Returns a new serial queue with a unique label based on +obj+
Modified: MacRuby/trunk/lib/dispatch/enumerable.rb
===================================================================
--- MacRuby/trunk/lib/dispatch/enumerable.rb 2010-02-08 23:04:45 UTC (rev 3450)
+++ MacRuby/trunk/lib/dispatch/enumerable.rb 2010-02-08 23:04:57 UTC (rev 3451)
@@ -30,17 +30,23 @@
end
# Parallel +collect+ plus +inject+
- # Accumulates in +initial+ via +op+ (default = '<<')
- def p_mapreduce(initial, op=:<<, &block)
- raise ArgumentError if not initial.respond_to? :op
+ # Accumulates from +initial+ via +op+ (default = '+')
+ def p_mapreduce(initial, op=:+, &block)
+ raise ArgumentError if not initial.respond_to? op
# Since exceptions from a Dispatch block act funky
- p_result = Dispatch.wrap(initial)
- self.p_each_with_index do |obj, i|
- val = block.call(obj)
- p_result.send(op, val)
+ q = Dispatch.queue_for(initial)
+ ivar = "@#{Dispatch.label_for(initial)}"
+ p ivar
+ self.instance_variable_set(ivar, initial) #is creating an ivar thread-safe?
+ self.p_each do |obj|
+ val = block.call(obj)
+ q.async do
+ sum = self.instance_variable_get(ivar).send(op, val)
+ self.instance_variable_set(ivar, sum)
+ end
end
- p_result
- ._done_
+ q.sync {}
+ self.send(:remove_instance_variable, ivar)
end
Modified: MacRuby/trunk/spec/macruby/library/dispatch/enumerable_spec.rb
===================================================================
--- MacRuby/trunk/spec/macruby/library/dispatch/enumerable_spec.rb 2010-02-08 23:04:45 UTC (rev 3450)
+++ MacRuby/trunk/spec/macruby/library/dispatch/enumerable_spec.rb 2010-02-08 23:04:57 UTC (rev 3451)
@@ -18,10 +18,10 @@
@sum2 = 0
@q = Dispatch.queue_for(@sum2)
@ary.p_each {|v| temp = v*v; @q.sync {@sum2 += temp} }
- @sum1.should == @sum2
+ @sum2.should == @sum1
end
- it "executes concurrently" do
+ it "should execute concurrently" do
true.should == true
end
end
@@ -37,10 +37,10 @@
@sum2 = 0
@q = Dispatch.queue_for(@sum2)
@ary.p_each_with_index {|v, i| temp = v**i; @q.sync {@sum2 += temp} }
- @sum1.should == @sum2
+ @sum2.should == @sum1
end
- it "executes concurrently" do
+ it "should execute concurrently" do
true.should == true
end
end
@@ -52,10 +52,10 @@
it "should behave like map" do
map1 = @ary.map {|v| v*v}
map2 = @ary.p_map {|v| v*v}
- map1.should == map2
+ map2.should == map1
end
- it "executes concurrently" do
+ it "should execute concurrently" do
true.should == true
end
end
@@ -71,20 +71,22 @@
map1.should == map2.sort
end
- it "should use any result that takes :<< " do
- map1 = @ary.map {|v| "%x" % 10+v}
- map2 = @ary.p_mapreduce("") {|v| "%x" % 10+v}
+ it "should accumulate any object that takes :<< " do
+ map1 = @ary.map {|v| "%x" % (10+v)}
+ map2 = @ary.p_mapreduce("") {|v| "%x" % (10+v)}
map1.each do |s|
map2.index(s).should_not == nil
end
end
it "should allow custom accumulator methods" do
- map2 = @ary.p_mapreduce(0, :|) {|v| v**2}
- map2.should == (2 | 4 | 8)
+ map1 = @ary.map {|v| v**2}
+ sum1 = map1.inject(0) {|s,v| s | v}
+ sum2 = @ary.p_mapreduce(0, :|) {|v| v**2}
+ sum2.should == sum1
end
- it "executes concurrently" do
+ it "should execute concurrently" do
true.should == true
end
end
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100208/539035ff/attachment-0001.html>
More information about the macruby-changes
mailing list