redshift 1.3.15
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +8 -0
- data/README +5 -0
- data/RELEASE-NOTES +455 -0
- data/TODO +431 -0
- data/bench/alg-state.rb +61 -0
- data/bench/bench +26 -0
- data/bench/bench.rb +10 -0
- data/bench/continuous.rb +76 -0
- data/bench/diff-bench +86 -0
- data/bench/discrete.rb +101 -0
- data/bench/euler.rb +50 -0
- data/bench/formula.rb +78 -0
- data/bench/half-strict.rb +103 -0
- data/bench/inertness.rb +116 -0
- data/bench/queue.rb +92 -0
- data/bench/run +66 -0
- data/bench/simple.rb +74 -0
- data/bench/strictness.rb +86 -0
- data/examples/ball-tkar.rb +72 -0
- data/examples/ball.rb +123 -0
- data/examples/collide.rb +70 -0
- data/examples/connect-parallel.rb +48 -0
- data/examples/connect.rb +109 -0
- data/examples/constants.rb +27 -0
- data/examples/delay.rb +80 -0
- data/examples/derivative.rb +77 -0
- data/examples/euler.rb +46 -0
- data/examples/external-lib.rb +33 -0
- data/examples/guard-debugger.rb +77 -0
- data/examples/lotka-volterra.rb +33 -0
- data/examples/persist-ball.rb +68 -0
- data/examples/pid.rb +87 -0
- data/examples/ports.rb +60 -0
- data/examples/queue.rb +56 -0
- data/examples/queue2.rb +98 -0
- data/examples/reset-with-event-val.rb +28 -0
- data/examples/scheduler.rb +104 -0
- data/examples/set-dest.rb +23 -0
- data/examples/simulink/README +1 -0
- data/examples/simulink/delay.mdl +827 -0
- data/examples/simulink/derivative.mdl +655 -0
- data/examples/step-discrete-profiler.rb +103 -0
- data/examples/subsystem.rb +109 -0
- data/examples/sync-deadlock.rb +32 -0
- data/examples/sync-queue.rb +91 -0
- data/examples/sync-retry.rb +20 -0
- data/examples/sync.rb +51 -0
- data/examples/thermostat.rb +53 -0
- data/examples/zeno.rb +53 -0
- data/lib/accessible-index.rb +47 -0
- data/lib/redshift.rb +1 -0
- data/lib/redshift/component.rb +412 -0
- data/lib/redshift/meta.rb +183 -0
- data/lib/redshift/mixins/zeno-debugger.rb +69 -0
- data/lib/redshift/port.rb +57 -0
- data/lib/redshift/queue.rb +104 -0
- data/lib/redshift/redshift.rb +111 -0
- data/lib/redshift/state.rb +31 -0
- data/lib/redshift/syntax.rb +558 -0
- data/lib/redshift/target/c.rb +37 -0
- data/lib/redshift/target/c/component-gen.rb +1303 -0
- data/lib/redshift/target/c/flow-gen.rb +325 -0
- data/lib/redshift/target/c/flow/algebraic.rb +85 -0
- data/lib/redshift/target/c/flow/buffer.rb +74 -0
- data/lib/redshift/target/c/flow/delay.rb +203 -0
- data/lib/redshift/target/c/flow/derivative.rb +101 -0
- data/lib/redshift/target/c/flow/euler.rb +67 -0
- data/lib/redshift/target/c/flow/expr.rb +113 -0
- data/lib/redshift/target/c/flow/rk4.rb +80 -0
- data/lib/redshift/target/c/library.rb +85 -0
- data/lib/redshift/target/c/world-gen.rb +1370 -0
- data/lib/redshift/target/spec.rb +34 -0
- data/lib/redshift/world.rb +300 -0
- data/rakefile +37 -0
- data/test/test.rb +52 -0
- data/test/test_buffer.rb +58 -0
- data/test/test_connect.rb +242 -0
- data/test/test_connect_parallel.rb +47 -0
- data/test/test_connect_strict.rb +135 -0
- data/test/test_constant.rb +74 -0
- data/test/test_delay.rb +145 -0
- data/test/test_derivative.rb +48 -0
- data/test/test_discrete.rb +592 -0
- data/test/test_discrete_isolated.rb +92 -0
- data/test/test_exit.rb +59 -0
- data/test/test_flow.rb +200 -0
- data/test/test_flow_link.rb +288 -0
- data/test/test_flow_sub.rb +100 -0
- data/test/test_flow_trans.rb +292 -0
- data/test/test_inherit.rb +127 -0
- data/test/test_inherit_event.rb +74 -0
- data/test/test_inherit_flow.rb +139 -0
- data/test/test_inherit_link.rb +65 -0
- data/test/test_inherit_setup.rb +56 -0
- data/test/test_inherit_state.rb +66 -0
- data/test/test_inherit_transition.rb +168 -0
- data/test/test_numerics.rb +34 -0
- data/test/test_queue.rb +90 -0
- data/test/test_queue_alone.rb +115 -0
- data/test/test_reset.rb +209 -0
- data/test/test_setup.rb +119 -0
- data/test/test_strict_continuity.rb +410 -0
- data/test/test_strict_reset_error.rb +30 -0
- data/test/test_strictness_error.rb +32 -0
- data/test/test_sync.rb +185 -0
- data/test/test_world.rb +328 -0
- metadata +204 -0
data/bench/bench
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
def bench_one(name)
|
4
|
+
lib = File.join(File.dirname(__FILE__), name)
|
5
|
+
cmd = %{
|
6
|
+
$REDSHIFT_CLIB_NAME = "#{name}"
|
7
|
+
puts "#{name}:"
|
8
|
+
#{name.split(/[-_]/).map {|w|w.capitalize}.join}.do_bench {|l| puts l}
|
9
|
+
}
|
10
|
+
system "ruby", "-r" , "./bench", "-r", lib, "-e", cmd
|
11
|
+
end
|
12
|
+
|
13
|
+
pat = ARGV.pop
|
14
|
+
pat = pat ? Regexp.new(pat) : //
|
15
|
+
%w{
|
16
|
+
alg-state
|
17
|
+
continuous
|
18
|
+
discrete
|
19
|
+
euler
|
20
|
+
formula
|
21
|
+
half-strict
|
22
|
+
inertness
|
23
|
+
queue
|
24
|
+
}.grep(pat).each do |name|
|
25
|
+
bench_one(name)
|
26
|
+
end
|
data/bench/bench.rb
ADDED
data/bench/continuous.rb
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
# Measures performance of redshift as a pure integrator.
|
2
|
+
#
|
3
|
+
# Formulas are minimal to factor out C library time.
|
4
|
+
|
5
|
+
require 'redshift'
|
6
|
+
|
7
|
+
include RedShift
|
8
|
+
|
9
|
+
module Continuous
|
10
|
+
class C < Component
|
11
|
+
strictly_continuous :x, :y
|
12
|
+
flow do
|
13
|
+
diff " x' = y "
|
14
|
+
diff " y' = -x "
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.make_world n=1
|
19
|
+
w = World.new
|
20
|
+
n.times do
|
21
|
+
w.create(C) do |c|
|
22
|
+
c.x = 0.0
|
23
|
+
c.y = 1.0
|
24
|
+
end
|
25
|
+
end
|
26
|
+
w
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.do_bench
|
30
|
+
[ [ 1, 1_000_000],
|
31
|
+
[ 10, 100_000],
|
32
|
+
[ 100, 10_000],
|
33
|
+
[ 1_000, 1_000],
|
34
|
+
[ 10_000, 100],
|
35
|
+
[ 100_000, 10] ].each do
|
36
|
+
| n_c, n_s|
|
37
|
+
|
38
|
+
w = make_world(n_c)
|
39
|
+
w.run 1 # warm up
|
40
|
+
r = bench do
|
41
|
+
w.run(n_s)
|
42
|
+
end
|
43
|
+
|
44
|
+
yield " - %10d comps X %10d steps: %8.2f" % [n_c, n_s, r]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
if __FILE__ == $0
|
50
|
+
|
51
|
+
require 'bench'
|
52
|
+
w = Continuous.make_world(1000)
|
53
|
+
time = bench do
|
54
|
+
w.run(1000)
|
55
|
+
end
|
56
|
+
p time
|
57
|
+
|
58
|
+
exit
|
59
|
+
require File.join(File.dirname(__FILE__), 'bench')
|
60
|
+
puts "continuous:"
|
61
|
+
Continuous.do_bench {|l| puts l}
|
62
|
+
# puts "continuous:", (1..3).map {Continuous.do_bench}
|
63
|
+
|
64
|
+
if false
|
65
|
+
require 'ruby-prof'
|
66
|
+
|
67
|
+
w = Continuous.make_world(10_000)
|
68
|
+
result = RubyProf.profile do
|
69
|
+
w.run(10)
|
70
|
+
end
|
71
|
+
|
72
|
+
printer = RubyProf::GraphPrinter.new(result)
|
73
|
+
printer.print(STDOUT, 0)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
data/bench/diff-bench
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
require 'argos'
|
5
|
+
require 'object-diff'
|
6
|
+
|
7
|
+
defaults = {
|
8
|
+
"d" => 0.01
|
9
|
+
}
|
10
|
+
optdef = {
|
11
|
+
"d" => proc {|d| Float(d)}
|
12
|
+
}
|
13
|
+
opts = defaults.merge(Argos.parse_options(ARGV, optdef))
|
14
|
+
|
15
|
+
case ARGV.size
|
16
|
+
when 2
|
17
|
+
b0, b1 = [0,1].map {|i| YAML.load(File.read(ARGV[i]))}
|
18
|
+
when 1
|
19
|
+
b0 = YAML.load(File.read(ARGV[0]))
|
20
|
+
b1 = YAML.load($stdin.read)
|
21
|
+
end
|
22
|
+
|
23
|
+
module Enumerable
|
24
|
+
def show_results depth=0
|
25
|
+
if size > 1 and depth > 0
|
26
|
+
puts
|
27
|
+
depth*2
|
28
|
+
elsif size == 1 and (first_value.size rescue 0) == 1
|
29
|
+
puts
|
30
|
+
depth*2
|
31
|
+
else
|
32
|
+
0
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class Hash
|
38
|
+
def first_value
|
39
|
+
values.first
|
40
|
+
end
|
41
|
+
|
42
|
+
def show_results depth=0
|
43
|
+
indent = super
|
44
|
+
|
45
|
+
keys.sort.each do |key|
|
46
|
+
val = self[key]
|
47
|
+
case val
|
48
|
+
when Numeric
|
49
|
+
printf "%#{indent}s%#{64-indent}s: %+8.2f\n", "", key, val
|
50
|
+
else
|
51
|
+
printf "%#{indent}s: ", key
|
52
|
+
val.show_results depth + 1
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class Array
|
59
|
+
def first_value
|
60
|
+
first
|
61
|
+
end
|
62
|
+
|
63
|
+
def show_results depth=0
|
64
|
+
indent = super
|
65
|
+
|
66
|
+
each do |val|
|
67
|
+
case val
|
68
|
+
when Numeric
|
69
|
+
printf "%#{indent}s- %+8.2f\n", "", val
|
70
|
+
else
|
71
|
+
printf "%#{indent}s- ", ""
|
72
|
+
val.show_results depth + 1
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
class Numeric
|
79
|
+
def diff other
|
80
|
+
super / to_f
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
d_min = opts["d"]
|
85
|
+
diffs = b0.diff(b1).filter {|d| d.abs >= d_min}
|
86
|
+
diffs.show_results
|
data/bench/discrete.rb
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
# Measures performance of redshift for pure discrete event simulation.
|
2
|
+
# See also the queue.rb benchmark.
|
3
|
+
|
4
|
+
require 'redshift'
|
5
|
+
|
6
|
+
include RedShift
|
7
|
+
|
8
|
+
module Discrete
|
9
|
+
class Clock < Component
|
10
|
+
# the only continuous var in the whole system
|
11
|
+
strictly_continuous :time
|
12
|
+
flow {
|
13
|
+
diff " time' = 1 "
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
class Awakener < Component
|
18
|
+
export :awake
|
19
|
+
end
|
20
|
+
|
21
|
+
class Sleeper < Awakener
|
22
|
+
strict_link :clock => Clock
|
23
|
+
|
24
|
+
constant :next_wakeup
|
25
|
+
strictly_constant :period
|
26
|
+
|
27
|
+
setup do
|
28
|
+
self.next_wakeup = period
|
29
|
+
end
|
30
|
+
|
31
|
+
transition do
|
32
|
+
guard " clock.time >= next_wakeup "
|
33
|
+
reset :next_wakeup => " clock.time + period "
|
34
|
+
## need something between strict and not:
|
35
|
+
## only changes at end of discrete update, and so
|
36
|
+
## strictness optimizations still apply
|
37
|
+
event :awake
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class Watcher < Awakener
|
42
|
+
link :target => Awakener
|
43
|
+
transition do
|
44
|
+
sync :target => :awake
|
45
|
+
event :awake
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.make_world n_sleeper=1, n_watchers=0
|
50
|
+
w = World.new
|
51
|
+
clock = w.create(Clock)
|
52
|
+
n_sleeper.times do |i|
|
53
|
+
sleeper = w.create(Sleeper) do |c|
|
54
|
+
c.clock = clock
|
55
|
+
c.period = ((i % 99)+1) / 10.0
|
56
|
+
end
|
57
|
+
target = sleeper
|
58
|
+
n_watchers.times do
|
59
|
+
target = w.create(Watcher) do |c|
|
60
|
+
c.target = target
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
w
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.do_bench
|
68
|
+
[0, 1, 5].each do |n_w|
|
69
|
+
[ [ 1, 1_000_000 ],
|
70
|
+
[ 10, 100_000 ],
|
71
|
+
[ 100, 10_000 ],
|
72
|
+
[ 1_000, 1_000 ],
|
73
|
+
[ 10_000, 100 ],
|
74
|
+
[ 100_000, 10 ] ].each do
|
75
|
+
| n_c, n_s|
|
76
|
+
if n_w > 1
|
77
|
+
do_bench_one(n_c, n_s/n_w, n_w) {|r| yield r}
|
78
|
+
else
|
79
|
+
do_bench_one(n_c, n_s, n_w) {|r| yield r}
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def self.do_bench_one(n_c, n_s, n_w)
|
86
|
+
w = make_world(n_c, n_w)
|
87
|
+
r = bench do
|
88
|
+
w.run(n_s)
|
89
|
+
end
|
90
|
+
|
91
|
+
yield " - %10d comps X %10d steps X %5d watchers: %8.2f" %
|
92
|
+
[n_c, n_s, n_w, r]
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
if __FILE__ == $0
|
97
|
+
require File.join(File.dirname(__FILE__), 'bench')
|
98
|
+
puts "discrete:"
|
99
|
+
Discrete.do_bench_one(100, 5_000, 5) {|l| puts l}
|
100
|
+
end
|
101
|
+
|
data/bench/euler.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# Measures performance of Euler integration.
|
2
|
+
|
3
|
+
require 'redshift'
|
4
|
+
|
5
|
+
include RedShift
|
6
|
+
|
7
|
+
module Euler
|
8
|
+
class Flow_Euler < Component
|
9
|
+
flow do
|
10
|
+
euler "x' = 1"
|
11
|
+
euler "y' = x" # Very bad!
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.make_world n=1
|
16
|
+
w = World.new
|
17
|
+
n.times do
|
18
|
+
w.create(Flow_Euler)
|
19
|
+
end
|
20
|
+
w
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.do_bench
|
24
|
+
[ [ 1, 1_000_000],
|
25
|
+
[ 10, 100_000],
|
26
|
+
[ 100, 10_000],
|
27
|
+
[ 1_000, 1_000],
|
28
|
+
[ 10_000, 100],
|
29
|
+
[ 100_000, 10] ].each do
|
30
|
+
| n_c, n_s|
|
31
|
+
|
32
|
+
w = make_world(n_c)
|
33
|
+
w.run 1 # warm up
|
34
|
+
r = bench do
|
35
|
+
w.run(n_s)
|
36
|
+
end
|
37
|
+
|
38
|
+
yield " - %10d comps X %10d steps: %8.2f" % [n_c, n_s, r]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
if __FILE__ == $0
|
44
|
+
require 'bench'
|
45
|
+
w = Euler.make_world(1000)
|
46
|
+
time = bench do
|
47
|
+
w.run(1000)
|
48
|
+
end
|
49
|
+
p time
|
50
|
+
end
|
data/bench/formula.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
# Measures performance of redshift as a pure integrator.
|
2
|
+
# using more complex formulas than in continuous.rb.
|
3
|
+
|
4
|
+
# Try replacing
|
5
|
+
# CFLAGS = -fPIC -g -O2
|
6
|
+
# with
|
7
|
+
# CFLAGS = -fPIC -O2 -march=i686 -msse2 -mfpmath=sse
|
8
|
+
|
9
|
+
case RUBY_PLATFORM
|
10
|
+
when /x86_64/
|
11
|
+
$CFLAGS="-fPIC -O2 -march=k8 -msse2 -mfpmath=sse"
|
12
|
+
else
|
13
|
+
$CFLAGS="-fPIC -O2 -march=i686 -msse2 -mfpmath=sse"
|
14
|
+
end
|
15
|
+
|
16
|
+
require 'redshift'
|
17
|
+
|
18
|
+
include RedShift
|
19
|
+
|
20
|
+
module Formula
|
21
|
+
class C < Component
|
22
|
+
strictly_continuous :x, :y
|
23
|
+
flow do
|
24
|
+
diff " x' = pow(y,3) + sqrt(fabs(sin(y))) "
|
25
|
+
diff " y' = -x "
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.make_world n=1
|
30
|
+
w = World.new
|
31
|
+
n.times do
|
32
|
+
w.create(C) do |c|
|
33
|
+
c.x = 0.0
|
34
|
+
c.y = 1.0
|
35
|
+
end
|
36
|
+
end
|
37
|
+
w
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.do_bench
|
41
|
+
[ [ 1, 100_000],
|
42
|
+
[ 10, 10_000],
|
43
|
+
[ 100, 1_000],
|
44
|
+
[ 1_000, 100],
|
45
|
+
[ 10_000, 10] ].each do
|
46
|
+
| n_c, n_s|
|
47
|
+
|
48
|
+
w = make_world(n_c)
|
49
|
+
w.run 1 # warm up
|
50
|
+
r = bench do
|
51
|
+
w.run(n_s)
|
52
|
+
end
|
53
|
+
|
54
|
+
yield " - %10d comps X %10d steps: %8.2f" % [n_c, n_s, r]
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
if __FILE__ == $0
|
60
|
+
|
61
|
+
require File.join(File.dirname(__FILE__), 'bench')
|
62
|
+
puts "continuous:"
|
63
|
+
Formula.do_bench {|l| puts l}
|
64
|
+
|
65
|
+
if false
|
66
|
+
require 'ruby-prof'
|
67
|
+
|
68
|
+
w = Formula.make_world(10_000)
|
69
|
+
result = RubyProf.profile do
|
70
|
+
w.run(10)
|
71
|
+
end
|
72
|
+
|
73
|
+
printer = RubyProf::GraphPrinter.new(result)
|
74
|
+
printer.print(STDOUT, 0)
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# Measures benefit of optimizing the case in which only some of the outgoing
|
2
|
+
# transitions are strict.
|
3
|
+
|
4
|
+
require 'redshift'
|
5
|
+
require 'enumerator'
|
6
|
+
|
7
|
+
include RedShift
|
8
|
+
|
9
|
+
module HalfStrict
|
10
|
+
class Clock < Component
|
11
|
+
# the only continuous var in the whole system
|
12
|
+
strictly_continuous :t_strict
|
13
|
+
flow {
|
14
|
+
diff " t_strict' = 1 "
|
15
|
+
diff " t' = 1 "
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
class Observer < Component
|
20
|
+
strict_link :clock => Clock
|
21
|
+
|
22
|
+
transition do
|
23
|
+
guard " clock.t_strict < 0 "
|
24
|
+
end
|
25
|
+
transition do
|
26
|
+
guard " clock.t_strict < 0 "
|
27
|
+
end
|
28
|
+
transition do
|
29
|
+
guard " clock.t_strict < 0 "
|
30
|
+
end
|
31
|
+
transition do
|
32
|
+
guard " clock.t_strict < 0 "
|
33
|
+
end
|
34
|
+
transition do
|
35
|
+
guard " clock.t_strict < 0 "
|
36
|
+
end
|
37
|
+
|
38
|
+
transition do
|
39
|
+
guard " clock.t < 0 "
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class Dummy < Component
|
44
|
+
n_states = 10
|
45
|
+
my_states = state((0...n_states).map {|i| "S#{i}"})
|
46
|
+
start S0
|
47
|
+
|
48
|
+
flow S0 do
|
49
|
+
diff " t' = 1 "
|
50
|
+
end
|
51
|
+
|
52
|
+
transition S0 => S1 do
|
53
|
+
guard "t > 0"
|
54
|
+
reset :t => 0
|
55
|
+
end
|
56
|
+
|
57
|
+
my_states[1..-1].each_cons(2) do |s, t|
|
58
|
+
transition s => t
|
59
|
+
end
|
60
|
+
transition my_states.last => my_states.first
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.make_world n_observers=1
|
64
|
+
w = World.new
|
65
|
+
w.create(Dummy)
|
66
|
+
clock = w.create(Clock)
|
67
|
+
n_observers.times do |i|
|
68
|
+
observer = w.create(Observer) do |c|
|
69
|
+
c.clock = clock
|
70
|
+
end
|
71
|
+
end
|
72
|
+
w
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.do_bench
|
76
|
+
[ [ 10, 100_000 ],
|
77
|
+
[ 100, 10_000 ],
|
78
|
+
[ 1_000, 1_000 ],
|
79
|
+
[ 10_000, 100 ],
|
80
|
+
[ 100_000, 10 ] ].each do
|
81
|
+
| n_c, n_s|
|
82
|
+
|
83
|
+
do_bench_one(n_c, n_s) {|r| yield r}
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def self.do_bench_one(n_c, n_s)
|
88
|
+
w = make_world(n_c)
|
89
|
+
r = bench do
|
90
|
+
w.run(n_s)
|
91
|
+
end
|
92
|
+
|
93
|
+
yield " - %10d comps X %10d steps: %8.2f" %
|
94
|
+
[n_c, n_s, r]
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
if __FILE__ == $0
|
99
|
+
require File.join(File.dirname(__FILE__), 'bench')
|
100
|
+
puts "half-strict:"
|
101
|
+
HalfStrict.do_bench_one(10_000, 100) {|l| puts l}
|
102
|
+
end
|
103
|
+
|