redshift 1.3.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/TODO
ADDED
@@ -0,0 +1,431 @@
|
|
1
|
+
Publishing RedShift
|
2
|
+
===================
|
3
|
+
|
4
|
+
core for 1.3 release
|
5
|
+
|
6
|
+
clean up world (save/load etc)
|
7
|
+
tracer
|
8
|
+
event value conditions in sync clause?
|
9
|
+
sync :client => check(:accept){|val| val==self}
|
10
|
+
# from sync-queue.rb
|
11
|
+
|
12
|
+
doc, tutorial, web site
|
13
|
+
|
14
|
+
clean up tests, examples
|
15
|
+
|
16
|
+
user tools
|
17
|
+
zeno and other debuggers
|
18
|
+
shell
|
19
|
+
visualization interfaces: tkar, gnuplot, opengl
|
20
|
+
|
21
|
+
benchmarks
|
22
|
+
- compare with stateflow and simulink examples
|
23
|
+
- try to scale these examples up
|
24
|
+
- compare with Ptolemy -- ask devs for good benchmarks
|
25
|
+
|
26
|
+
packaging and project mgmt
|
27
|
+
- windows w/ several compilers
|
28
|
+
|
29
|
+
notify
|
30
|
+
- shift-dev folks, hs researchers (e.g., Joao Hispanha, Ed Lee)
|
31
|
+
- contacts who have expressed interest in redshift or shift
|
32
|
+
- others:
|
33
|
+
http://www.dis.anl.gov/exp/cas/index.html
|
34
|
+
http://www.artcompsci.org
|
35
|
+
Sylvain Joyeux (esp. re: distributed simulation)
|
36
|
+
Martin Fowler (see http://martinfowler.com/dslwip/)
|
37
|
+
|
38
|
+
publicize
|
39
|
+
- http://path.berkeley.edu/shift/
|
40
|
+
(this is still the first google hit for "hybrid system simulation")
|
41
|
+
- ruby-talk, sciruby
|
42
|
+
- comp.simulation, comp.soft-sys.(matlab|ptolemy), scs.org
|
43
|
+
- paper?
|
44
|
+
|
45
|
+
funding
|
46
|
+
- nsf or sbir
|
47
|
+
- need to emphasize research goals:
|
48
|
+
- distributed hybrid simulation
|
49
|
+
- further optimizations like strict
|
50
|
+
- approach potential users in industry
|
51
|
+
- GM, with wrapping for CarSim dll
|
52
|
+
|
53
|
+
long-term goals
|
54
|
+
- multiple clocks and threshold crossing detection, as in:
|
55
|
+
http://repository.upenn.edu/ese_papers/123/
|
56
|
+
- vector-valued signals
|
57
|
+
- need proper C parsing first
|
58
|
+
- user-friendly interface and related tools
|
59
|
+
- distributed simulation (HLA. CERTI?)
|
60
|
+
- library of integrators/flows and components
|
61
|
+
- jruby/jvm port (and use duby for actions etc)
|
62
|
+
- import models from simulink, Ptolemy, HSIF, etc.
|
63
|
+
- interface at run time with simulink etc.
|
64
|
+
- redshift as simulink block
|
65
|
+
- rt code generation?
|
66
|
+
- HLA support for interoperability
|
67
|
+
|
68
|
+
backronym: Ruby-based Efficient Deterministic SHIFT
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
To do
|
74
|
+
=====
|
75
|
+
|
76
|
+
Project
|
77
|
+
|
78
|
+
Subversion, gems, etc.
|
79
|
+
|
80
|
+
Docs and tutorial
|
81
|
+
|
82
|
+
Bugs
|
83
|
+
|
84
|
+
Make sure the arrays used internally are not shared:
|
85
|
+
call rb_ary_modify() before setting len or etc.
|
86
|
+
|
87
|
+
what happens if an exception (or throw or break) happens inside
|
88
|
+
of a block during discrete_update? (e.g. an action, reset, or
|
89
|
+
guard block)
|
90
|
+
|
91
|
+
Syntax
|
92
|
+
|
93
|
+
better sync syntax to avoid the :l=>:e, :l=>:f prob
|
94
|
+
sync {l.e, l.f} ?
|
95
|
+
|
96
|
+
should define, for each link, a TransitionParser method which returns
|
97
|
+
a dummy link object that responds to #event and returns
|
98
|
+
a dummy event that responds to #==(value) so that you can write
|
99
|
+
|
100
|
+
guard link_var.some_event == 123
|
101
|
+
|
102
|
+
instead of
|
103
|
+
|
104
|
+
[:link_var, :some_event, 123]
|
105
|
+
|
106
|
+
should be possible to allow:
|
107
|
+
|
108
|
+
reset x => ... instead of reset :x => ...
|
109
|
+
|
110
|
+
replace strictly_* with strict_* and alias back for compat
|
111
|
+
|
112
|
+
express flows, guards, etc, in ruby syntax and use something to parse:
|
113
|
+
|
114
|
+
nodedump/nodewrap
|
115
|
+
|
116
|
+
ripper
|
117
|
+
|
118
|
+
"expansion.rb"
|
119
|
+
|
120
|
+
vars are class methods returning Var obejcts
|
121
|
+
|
122
|
+
resets and even assignment to cont-vars can use '<<'
|
123
|
+
|
124
|
+
equations can use '=='
|
125
|
+
|
126
|
+
reset syntax:
|
127
|
+
|
128
|
+
reset do
|
129
|
+
x 3
|
130
|
+
y "x+2"
|
131
|
+
z { (x-y).abs }
|
132
|
+
|
133
|
+
check for symbol conflicts
|
134
|
+
user attributes may conflict with Component's attrs
|
135
|
+
ditto for flows and other methods defined in subclasses
|
136
|
+
can we 'hook' method def and attr def to check for conflict?
|
137
|
+
or just use a consistent naming scheme to keep internals separate?
|
138
|
+
|
139
|
+
flow /Foo.*/ ...
|
140
|
+
matches on name of states
|
141
|
+
|
142
|
+
Semantics
|
143
|
+
|
144
|
+
export event _to_ comp? and sync on event alone w/o link?
|
145
|
+
export [:e, 4] => :lnk # sender
|
146
|
+
sync :e # receiver
|
147
|
+
|
148
|
+
add check for values of event after sync
|
149
|
+
(and then repeat sync loop)
|
150
|
+
"sync :l => {:e => 3}" or better syntax
|
151
|
+
|
152
|
+
option to initialize all float vars to NaN?
|
153
|
+
|
154
|
+
ideas from Verilog?
|
155
|
+
|
156
|
+
ideas from DEVS? (http://moncs.cs.mcgill.ca/people/tfeng/thesis/node12.html)
|
157
|
+
|
158
|
+
"Buffer" could be used for:
|
159
|
+
|
160
|
+
- recurrence relations/ difference equations:
|
161
|
+
|
162
|
+
recurrence " x = x[-0.1] + x[-0.2] "
|
163
|
+
|
164
|
+
- input data (possibly interpolated) from table/file/etc
|
165
|
+
|
166
|
+
- output to data (or file) faster than ruby array of double
|
167
|
+
|
168
|
+
( record " expr " => file ? )
|
169
|
+
|
170
|
+
Use NArray of doubles for this?
|
171
|
+
|
172
|
+
Better: array of ptr to 1K blocks of float/double
|
173
|
+
|
174
|
+
Per state syntax:
|
175
|
+
|
176
|
+
some_state.record var => "expr"
|
177
|
+
|
178
|
+
var refers to array of bocks of raw data
|
179
|
+
|
180
|
+
expr is evaled after discrete update
|
181
|
+
|
182
|
+
- need a language for piping data streams:
|
183
|
+
|
184
|
+
src | x | integrate | ... | dst
|
185
|
+
|
186
|
+
register event observers:
|
187
|
+
on comp=>event do ... end
|
188
|
+
|
189
|
+
Does permissive make sense?
|
190
|
+
|
191
|
+
inheritance among states:
|
192
|
+
|
193
|
+
"state Foo has everything that Bar has, plus ...."
|
194
|
+
|
195
|
+
a transition that can happen only once per discrete step, to easily
|
196
|
+
prevent zeno pb (useful for utility transitions, such as output)
|
197
|
+
|
198
|
+
better: a "pre-strict" var that can only get reset once per step
|
199
|
+
|
200
|
+
per-state strictness?
|
201
|
+
|
202
|
+
if guard "strictvar && something" is checked and strictvar is false,
|
203
|
+
then the guard doesn't need to be checked again, regardless of "something"
|
204
|
+
similarly for: guard "strictvar"; guard "something"
|
205
|
+
|
206
|
+
"finalizers" for components -- called when component exits, world
|
207
|
+
is finalized, or app quits
|
208
|
+
|
209
|
+
more generally, code that executes when a given state is entered:
|
210
|
+
|
211
|
+
state Exit do
|
212
|
+
# do some finalization stuff here
|
213
|
+
end
|
214
|
+
|
215
|
+
Or:
|
216
|
+
|
217
|
+
entering SomeState do...end
|
218
|
+
exiting SomeState do...end
|
219
|
+
|
220
|
+
Maybe this is better handled by adding another state (PreSomeState)
|
221
|
+
|
222
|
+
abstract classes (no code generated)
|
223
|
+
|
224
|
+
input events (in place of interrupts?)
|
225
|
+
|
226
|
+
as opposed to normal events, which are output (pull vs. push)
|
227
|
+
|
228
|
+
but does this mean arriving events are queued?
|
229
|
+
|
230
|
+
this would be useful for timers so that client component doesn't
|
231
|
+
have to manage a ref to the timer
|
232
|
+
|
233
|
+
wait/sleep
|
234
|
+
|
235
|
+
in a transition, saying "sleep n" says that the component will not
|
236
|
+
check guards for the rest of that discrete update and for n time units.
|
237
|
+
|
238
|
+
exception handler clauses in transitions (or use interrupts?)
|
239
|
+
on LockFailed { |var, value| ... }
|
240
|
+
|
241
|
+
state stack:
|
242
|
+
a transition (or interrupt) can push the current state or pop back
|
243
|
+
to a previously saved state (like Kader's idea)
|
244
|
+
syntax:
|
245
|
+
transition ... do
|
246
|
+
push [or pop, in which case the dest. state is ignored]
|
247
|
+
end
|
248
|
+
|
249
|
+
interrupts
|
250
|
+
a way of enabling a transition without evaluating guards
|
251
|
+
-faster
|
252
|
+
can do sender-receiver, rather than broadcast
|
253
|
+
can register with global interrupt manager
|
254
|
+
notify after T seconds
|
255
|
+
notify when global event happens (like what?)
|
256
|
+
receive in any state, switch to new state optional (push ok)
|
257
|
+
synchronous in the sense that no other components act in between
|
258
|
+
the send and receive, and the receiver action happens before the
|
259
|
+
sender action finishes (?)
|
260
|
+
but not parallel assignment
|
261
|
+
based on methods
|
262
|
+
in sender's action clause: 'x.foo args'
|
263
|
+
in receiver:
|
264
|
+
interrupt :foo => NewState do
|
265
|
+
action { |args| ...}
|
266
|
+
event ...
|
267
|
+
end
|
268
|
+
|
269
|
+
signals
|
270
|
+
maybe better than interrupts, more general
|
271
|
+
|
272
|
+
transition ... do
|
273
|
+
signal value => receiver_collection, ...
|
274
|
+
end
|
275
|
+
|
276
|
+
on value do ... end
|
277
|
+
|
278
|
+
is this better than a simple method call?
|
279
|
+
yes: can implement queue
|
280
|
+
|
281
|
+
discrete evolution
|
282
|
+
more flexibility:
|
283
|
+
start actions as well as finish actions
|
284
|
+
(before/after)
|
285
|
+
enter and exit blocks for each state
|
286
|
+
start_when and finish_when to implement sync
|
287
|
+
transitions like in statechart
|
288
|
+
parametric transitions?
|
289
|
+
attach :all, ...
|
290
|
+
syncronization
|
291
|
+
explicit?
|
292
|
+
|
293
|
+
exceptions
|
294
|
+
catch them if they arise in action
|
295
|
+
pass them on to handler where?
|
296
|
+
|
297
|
+
might be better not to raise or rb_raise, but to call redshift_error on the
|
298
|
+
world class, which the class could override as needed
|
299
|
+
|
300
|
+
Component#teardown called after exit
|
301
|
+
maybe #setup should only be called at last moment before running,
|
302
|
+
so that setup clauses can be added later
|
303
|
+
|
304
|
+
Implementation
|
305
|
+
|
306
|
+
use static functions where possible
|
307
|
+
|
308
|
+
decouple expr code from particular states/transitions so that
|
309
|
+
two state can share code
|
310
|
+
changing state name doesn't cause (much) recompile
|
311
|
+
etc.
|
312
|
+
|
313
|
+
option to dump all C code to one file (amalgam), so compiler can optimize more
|
314
|
+
|
315
|
+
improve performance of event and local storage by using native (NVector)
|
316
|
+
where possible, but keeping ruby array for ruby values
|
317
|
+
|
318
|
+
remove -g (if not debug) from CFLAGS
|
319
|
+
add -march=i686 -msse2 -mfpmath=sse (keep -fPIC?)
|
320
|
+
or whatever current hw is (how to determine that?)
|
321
|
+
|
322
|
+
possible to use only 1 tmp value for rk4?
|
323
|
+
|
324
|
+
optimization: no ContState object, just a pointer in the comp. shadow struct
|
325
|
+
could point to area at end of component's shadow struct
|
326
|
+
|
327
|
+
revert to on-demand var evaluation during continuous update?
|
328
|
+
|
329
|
+
optimization: transitive closure of strict sleep, based on declaration
|
330
|
+
that prevents setters
|
331
|
+
|
332
|
+
optimization: weaken "strict" so that resets can apply at end of
|
333
|
+
discrete update, but still get all the optimizations (see bench/discrete.rb)
|
334
|
+
|
335
|
+
- a new kind of flow that applies an "impulse" to a strict var at the
|
336
|
+
beginning of the next cont step, or
|
337
|
+
|
338
|
+
- a declaration that a var becomes strict for the rest of the discrete
|
339
|
+
step
|
340
|
+
|
341
|
+
Allow c-coded actions:
|
342
|
+
|
343
|
+
transition do
|
344
|
+
action " func(self, x*2, lnk.y) "
|
345
|
+
end
|
346
|
+
|
347
|
+
cdef <<END
|
348
|
+
func(SelfShadowClass *self, double arg1, double arg2) {
|
349
|
+
...
|
350
|
+
}
|
351
|
+
END
|
352
|
+
|
353
|
+
Debug mode that uses hooks to add extra checking:
|
354
|
+
|
355
|
+
- rollover check for d_tick, step_count
|
356
|
+
|
357
|
+
- check_strict (and make it *not* the default)
|
358
|
+
|
359
|
+
Instead of caching flow function in each cont var, maybe just have pointer
|
360
|
+
to a single per state object? This can also have the outgoing transitions,
|
361
|
+
and so __update_cache can be somewhat faster.
|
362
|
+
|
363
|
+
share mark and free funcs where possible (e.g., guards)
|
364
|
+
|
365
|
+
guards should not be written in numerical order (".._0", "..._1"), but
|
366
|
+
in a more meaningful way so that changing order doesn't force recompile
|
367
|
+
|
368
|
+
unified internal repr. for phases
|
369
|
+
|
370
|
+
insert a mnemonic for quick detection of phase type in discrete update
|
371
|
+
|
372
|
+
distribute Init_clib better
|
373
|
+
|
374
|
+
break flow-gen.rb and world-gen.rb into several files each
|
375
|
+
flow-gen files can be loaded on demand as flow types are needed
|
376
|
+
most of world-gen can be a .c file used as a template
|
377
|
+
|
378
|
+
optimization
|
379
|
+
profiling
|
380
|
+
use valgrind, gprof, etc. to profile the C code
|
381
|
+
compare with shift, matlab
|
382
|
+
|
383
|
+
compile time error checking:
|
384
|
+
translate C compiler error (e.g. bad result type in expr) to ruby exception
|
385
|
+
|
386
|
+
run time error checking
|
387
|
+
more 'if $DEBUG ...' checks
|
388
|
+
catch definition of flows after commit, etc.
|
389
|
+
|
390
|
+
exception handling
|
391
|
+
syntax and math errors, esp. in flows, guards
|
392
|
+
use Exception classes
|
393
|
+
|
394
|
+
error messages
|
395
|
+
|
396
|
+
Current file/line position must be saved by many constructs, e.g. reset,
|
397
|
+
so that it can be shown later if there is an error message
|
398
|
+
|
399
|
+
use ", []" to avoid showing backtrace when it is not helpful
|
400
|
+
|
401
|
+
exceptions in C code sometimes don't give symbolic info, like var names
|
402
|
+
|
403
|
+
check against ruby 1.9
|
404
|
+
|
405
|
+
replace RARRAY(x)->len with RARRAY_LEN(x)
|
406
|
+
|
407
|
+
libtcc backend
|
408
|
+
|
409
|
+
dot backend (see file in lib dir)
|
410
|
+
|
411
|
+
optimization: split diff_list for different integrators, so comps with
|
412
|
+
only euler flows don't get iterated over as much
|
413
|
+
|
414
|
+
User interface
|
415
|
+
|
416
|
+
yaml and pp outputs
|
417
|
+
|
418
|
+
Tools
|
419
|
+
|
420
|
+
profiler mixin for World (also an executable script?)
|
421
|
+
|
422
|
+
debugger mixin for World (also an executable script?)
|
423
|
+
|
424
|
+
generalize the irb-shell.rb and TO4230 shells, and make RedShift::Shell
|
425
|
+
|
426
|
+
use this in ZenoDebugger, too
|
427
|
+
|
428
|
+
can this be a mixin for World
|
429
|
+
|
430
|
+
general vis interface using TkCanvas/tkar or opengl
|
431
|
+
|
data/bench/alg-state.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'redshift'
|
2
|
+
require 'enumerator'
|
3
|
+
|
4
|
+
include RedShift
|
5
|
+
|
6
|
+
module AlgState
|
7
|
+
class PureAlg < Component
|
8
|
+
# An algebraic state is one that has no diff flows in its
|
9
|
+
# current state. However, algebraic flows are allowed.
|
10
|
+
#
|
11
|
+
# The diff_list optimization improves performance by about
|
12
|
+
# a factor of 5.
|
13
|
+
#
|
14
|
+
flow do
|
15
|
+
alg " x = 1 "
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class NonAlg < Component
|
20
|
+
flow do
|
21
|
+
diff " t' = 1 "
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.make_world n_alg, n_non_alg=0
|
26
|
+
w = World.new
|
27
|
+
n_alg.times {w.create(PureAlg)}
|
28
|
+
n_non_alg.times {w.create(NonAlg)}
|
29
|
+
w
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.do_bench
|
33
|
+
[0].each do |n_non_alg|
|
34
|
+
[ [ 0, 1_000],
|
35
|
+
[ 10, 1_000],
|
36
|
+
[ 100, 1_000],
|
37
|
+
[ 1000, 1_000],
|
38
|
+
[ 10000, 1_000] # cache nonlinearity happens here!
|
39
|
+
].each do
|
40
|
+
| n_alg, n_s|
|
41
|
+
|
42
|
+
w = make_world(n_alg, n_non_alg)
|
43
|
+
w.run 1 # warm up
|
44
|
+
r = bench do
|
45
|
+
w.run(n_s)
|
46
|
+
end
|
47
|
+
|
48
|
+
yield " - %10d comps X %10d steps X %10d non-alg: %8.2f" %
|
49
|
+
[n_alg, n_s, n_non_alg, r]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
if __FILE__ == $0
|
56
|
+
|
57
|
+
require File.join(File.dirname(__FILE__), 'bench')
|
58
|
+
puts "alg-state:"
|
59
|
+
AlgState.do_bench {|l| puts l}
|
60
|
+
|
61
|
+
end
|