rbbt-util 5.44.1 → 6.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. checksums.yaml +4 -4
  2. data/bin/rbbt +67 -90
  3. data/etc/app.d/base.rb +2 -2
  4. data/etc/app.d/semaphores.rb +3 -3
  5. data/lib/rbbt/annotations/annotated_array.rb +207 -207
  6. data/lib/rbbt/annotations/refactor.rb +27 -0
  7. data/lib/rbbt/annotations/util.rb +282 -282
  8. data/lib/rbbt/annotations.rb +343 -320
  9. data/lib/rbbt/association/database.rb +200 -225
  10. data/lib/rbbt/association/index.rb +294 -291
  11. data/lib/rbbt/association/item.rb +227 -227
  12. data/lib/rbbt/association/open.rb +35 -34
  13. data/lib/rbbt/association/util.rb +0 -169
  14. data/lib/rbbt/association.rb +2 -4
  15. data/lib/rbbt/entity/identifiers.rb +119 -118
  16. data/lib/rbbt/entity/refactor.rb +12 -0
  17. data/lib/rbbt/entity.rb +319 -315
  18. data/lib/rbbt/hpc/batch.rb +72 -53
  19. data/lib/rbbt/hpc/lsf.rb +2 -2
  20. data/lib/rbbt/hpc/orchestrate/batches.rb +2 -2
  21. data/lib/rbbt/hpc/orchestrate/chains.rb +25 -5
  22. data/lib/rbbt/hpc/orchestrate/rules.rb +2 -2
  23. data/lib/rbbt/hpc/orchestrate.rb +19 -13
  24. data/lib/rbbt/hpc/slurm.rb +18 -18
  25. data/lib/rbbt/knowledge_base/entity.rb +13 -5
  26. data/lib/rbbt/knowledge_base/query.rb +2 -2
  27. data/lib/rbbt/knowledge_base/registry.rb +32 -31
  28. data/lib/rbbt/knowledge_base/traverse.rb +1 -1
  29. data/lib/rbbt/knowledge_base.rb +1 -1
  30. data/lib/rbbt/monitor.rb +36 -25
  31. data/lib/rbbt/persist/refactor.rb +166 -0
  32. data/lib/rbbt/persist/tsv/tokyocabinet.rb +105 -105
  33. data/lib/rbbt/persist/tsv.rb +187 -185
  34. data/lib/rbbt/persist.rb +556 -551
  35. data/lib/rbbt/refactor.rb +20 -0
  36. data/lib/rbbt/resource/path/refactor.rb +178 -0
  37. data/lib/rbbt/resource/path.rb +317 -497
  38. data/lib/rbbt/resource/util.rb +0 -48
  39. data/lib/rbbt/resource.rb +3 -390
  40. data/lib/rbbt/tsv/accessor.rb +2 -838
  41. data/lib/rbbt/tsv/attach.rb +303 -299
  42. data/lib/rbbt/tsv/change_id.rb +244 -245
  43. data/lib/rbbt/tsv/csv.rb +87 -85
  44. data/lib/rbbt/tsv/dumper.rb +2 -100
  45. data/lib/rbbt/tsv/excel.rb +26 -24
  46. data/lib/rbbt/tsv/field_index.rb +4 -1
  47. data/lib/rbbt/tsv/filter.rb +3 -2
  48. data/lib/rbbt/tsv/index.rb +2 -284
  49. data/lib/rbbt/tsv/manipulate.rb +750 -747
  50. data/lib/rbbt/tsv/marshal.rb +3 -3
  51. data/lib/rbbt/tsv/matrix.rb +2 -2
  52. data/lib/rbbt/tsv/parallel/through.rb +2 -1
  53. data/lib/rbbt/tsv/parallel/traverse.rb +783 -781
  54. data/lib/rbbt/tsv/parser.rb +678 -678
  55. data/lib/rbbt/tsv/refactor.rb +195 -0
  56. data/lib/rbbt/tsv/stream.rb +253 -251
  57. data/lib/rbbt/tsv/util.rb +420 -420
  58. data/lib/rbbt/tsv.rb +210 -208
  59. data/lib/rbbt/util/R/eval.rb +4 -4
  60. data/lib/rbbt/util/R/plot.rb +62 -166
  61. data/lib/rbbt/util/R.rb +21 -18
  62. data/lib/rbbt/util/cmd.rb +2 -318
  63. data/lib/rbbt/util/color.rb +269 -269
  64. data/lib/rbbt/util/colorize.rb +89 -89
  65. data/lib/rbbt/util/concurrency/processes/refactor.rb +22 -0
  66. data/lib/rbbt/util/concurrency/processes/worker.rb +2 -2
  67. data/lib/rbbt/util/concurrency/processes.rb +389 -386
  68. data/lib/rbbt/util/config.rb +169 -167
  69. data/lib/rbbt/util/iruby.rb +20 -0
  70. data/lib/rbbt/util/log/progress/report.rb +241 -241
  71. data/lib/rbbt/util/log/progress/util.rb +99 -99
  72. data/lib/rbbt/util/log/progress.rb +102 -102
  73. data/lib/rbbt/util/log/refactor.rb +49 -0
  74. data/lib/rbbt/util/log.rb +486 -532
  75. data/lib/rbbt/util/migrate.rb +1 -1
  76. data/lib/rbbt/util/misc/concurrent_stream.rb +248 -246
  77. data/lib/rbbt/util/misc/development.rb +12 -11
  78. data/lib/rbbt/util/misc/exceptions.rb +117 -112
  79. data/lib/rbbt/util/misc/format.rb +2 -230
  80. data/lib/rbbt/util/misc/indiferent_hash.rb +2 -107
  81. data/lib/rbbt/util/misc/inspect.rb +2 -476
  82. data/lib/rbbt/util/misc/lock.rb +109 -106
  83. data/lib/rbbt/util/misc/omics.rb +9 -1
  84. data/lib/rbbt/util/misc/pipes.rb +765 -793
  85. data/lib/rbbt/util/misc/refactor.rb +20 -0
  86. data/lib/rbbt/util/misc/ssw.rb +27 -17
  87. data/lib/rbbt/util/misc/system.rb +0 -15
  88. data/lib/rbbt/util/misc.rb +39 -20
  89. data/lib/rbbt/util/named_array/refactor.rb +4 -0
  90. data/lib/rbbt/util/named_array.rb +3 -220
  91. data/lib/rbbt/util/open/refactor.rb +7 -0
  92. data/lib/rbbt/util/open.rb +3 -857
  93. data/lib/rbbt/util/procpath.rb +6 -6
  94. data/lib/rbbt/util/python/paths.rb +27 -0
  95. data/lib/rbbt/util/python/run.rb +115 -0
  96. data/lib/rbbt/util/python/script.rb +110 -0
  97. data/lib/rbbt/util/python/util.rb +3 -3
  98. data/lib/rbbt/util/python.rb +22 -81
  99. data/lib/rbbt/util/semaphore.rb +152 -148
  100. data/lib/rbbt/util/simpleopt.rb +9 -8
  101. data/lib/rbbt/util/ssh/refactor.rb +19 -0
  102. data/lib/rbbt/util/ssh.rb +122 -118
  103. data/lib/rbbt/util/tar.rb +117 -115
  104. data/lib/rbbt/util/tmpfile.rb +69 -67
  105. data/lib/rbbt/util/version.rb +2 -0
  106. data/lib/rbbt/workflow/refactor/entity.rb +11 -0
  107. data/lib/rbbt/workflow/refactor/export.rb +66 -0
  108. data/lib/rbbt/workflow/refactor/inputs.rb +24 -0
  109. data/lib/rbbt/workflow/refactor/recursive.rb +64 -0
  110. data/lib/rbbt/workflow/refactor/task_info.rb +65 -0
  111. data/lib/rbbt/workflow/refactor.rb +153 -0
  112. data/lib/rbbt/workflow/remote_workflow/driver/ssh.rb +55 -32
  113. data/lib/rbbt/workflow/remote_workflow/remote_step/rest.rb +3 -1
  114. data/lib/rbbt/workflow/remote_workflow/remote_step/ssh.rb +14 -5
  115. data/lib/rbbt/workflow/remote_workflow/remote_step.rb +19 -7
  116. data/lib/rbbt/workflow/remote_workflow.rb +6 -1
  117. data/lib/rbbt/workflow/step/run.rb +766 -766
  118. data/lib/rbbt/workflow/step/save_load_inputs.rb +254 -254
  119. data/lib/rbbt/workflow/step.rb +2 -362
  120. data/lib/rbbt/workflow/task.rb +118 -118
  121. data/lib/rbbt/workflow/usage.rb +289 -287
  122. data/lib/rbbt/workflow/util/archive.rb +6 -5
  123. data/lib/rbbt/workflow/util/data.rb +1 -1
  124. data/lib/rbbt/workflow/util/orchestrator.rb +249 -246
  125. data/lib/rbbt/workflow/util/trace.rb +79 -44
  126. data/lib/rbbt/workflow.rb +4 -882
  127. data/lib/rbbt-util.rb +21 -13
  128. data/lib/rbbt.rb +16 -3
  129. data/python/rbbt/__init__.py +19 -1
  130. data/share/Rlib/plot.R +37 -37
  131. data/share/Rlib/svg.R +22 -5
  132. data/share/install/software/lib/install_helpers +1 -1
  133. data/share/rbbt_commands/hpc/list +2 -3
  134. data/share/rbbt_commands/hpc/orchestrate +4 -4
  135. data/share/rbbt_commands/hpc/tail +2 -0
  136. data/share/rbbt_commands/hpc/task +10 -7
  137. data/share/rbbt_commands/lsf/list +2 -3
  138. data/share/rbbt_commands/lsf/orchestrate +4 -4
  139. data/share/rbbt_commands/lsf/tail +2 -0
  140. data/share/rbbt_commands/lsf/task +10 -7
  141. data/share/rbbt_commands/migrate +1 -1
  142. data/share/rbbt_commands/pbs/list +2 -3
  143. data/share/rbbt_commands/pbs/orchestrate +4 -4
  144. data/share/rbbt_commands/pbs/tail +2 -0
  145. data/share/rbbt_commands/pbs/task +10 -7
  146. data/share/rbbt_commands/resource/produce +8 -1
  147. data/share/rbbt_commands/slurm/list +2 -3
  148. data/share/rbbt_commands/slurm/orchestrate +4 -4
  149. data/share/rbbt_commands/slurm/tail +2 -0
  150. data/share/rbbt_commands/slurm/task +10 -7
  151. data/share/rbbt_commands/system/clean +5 -5
  152. data/share/rbbt_commands/system/status +5 -5
  153. data/share/rbbt_commands/tsv/get +2 -3
  154. data/share/rbbt_commands/tsv/info +10 -13
  155. data/share/rbbt_commands/tsv/keys +18 -14
  156. data/share/rbbt_commands/tsv/slice +2 -2
  157. data/share/rbbt_commands/tsv/transpose +6 -2
  158. data/share/rbbt_commands/workflow/info +20 -24
  159. data/share/rbbt_commands/workflow/list +1 -1
  160. data/share/rbbt_commands/workflow/prov +20 -13
  161. data/share/rbbt_commands/workflow/server +11 -1
  162. data/share/rbbt_commands/workflow/task +76 -71
  163. data/share/rbbt_commands/workflow/write_info +26 -9
  164. data/share/software/opt/ssw/ssw.c +861 -0
  165. data/share/software/opt/ssw/ssw.h +130 -0
  166. data/share/workflow_config.ru +3 -3
  167. metadata +40 -2
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ require 'rbbt-util'
3
4
  require 'rbbt/util/simpleopt'
4
5
  require 'rbbt/workflow'
5
- require 'rbbt/workflow/usage'
6
6
  require 'time'
7
7
 
8
8
  def report_options(options)
@@ -25,7 +25,7 @@ def usage(workflow = nil, task = nil, exception=nil, abridge = false)
25
25
 
26
26
  if task.nil?
27
27
  workflow.load_tasks if workflow.respond_to? :load_tasks
28
- workflow.doc nil, abridge
28
+ workflow.usage nil, abridge
29
29
  puts
30
30
  puts "E.g. rbbt workflow task #{workflow.to_s} #{workflow.tasks.keys.first.to_s} -h"
31
31
  else
@@ -40,7 +40,7 @@ def usage(workflow = nil, task = nil, exception=nil, abridge = false)
40
40
  puts Misc.format_paragraph workflow.documentation[:description]
41
41
  end
42
42
  puts
43
- workflow.doc(task, abridge)
43
+ workflow.usage task, abridge
44
44
  end
45
45
 
46
46
  print_error(exception.message, exception.backtrace) if exception
@@ -75,6 +75,7 @@ def fix_options(workflow, task, job_options)
75
75
  job_options.each do |name, value|
76
76
  type = input_types[name]
77
77
  type = type.to_sym if type
78
+ noload = input_options[name] && (input_options[name][:nofile] || input_options[name][:noload])
78
79
 
79
80
  if Step === value
80
81
  job_options_cleaned[name] = value
@@ -82,19 +83,19 @@ def fix_options(workflow, task, job_options)
82
83
  end
83
84
 
84
85
  if Path === value && Step === value.resource
85
- job_options_cleaned[name] = value
86
- next
86
+ job_options_cleaned[name] = value
87
+ next
87
88
  end
88
89
 
89
90
  value = case type
90
91
  when nil
91
- value
92
+ value
92
93
  when :boolean
93
94
  TrueClass === value or %w(true TRUE T yes).include? value
94
95
  when :float
95
96
  value.to_f
96
97
  when :path
97
- Path.setup(value)
98
+ Path.setup(value.dup)
98
99
  when :integer
99
100
  value.to_i
100
101
  when :text
@@ -111,10 +112,12 @@ def fix_options(workflow, task, job_options)
111
112
  end
112
113
  end
113
114
  when :array
114
- if input_options[name] && input_options[name][:stream] && String === value && Misc.is_filename?(value) && !! input_options[name][:nofile]
115
+ if input_options[name] && input_options[name][:stream] && String === value && Misc.is_filename?(value) && noload
115
116
  get_value_stream(value)
116
117
  elsif input_options[name] and input_options[name][:stream] and value == "-"
117
118
  STDIN
119
+ elsif Path.is_filename?(value) && (Path.step_file?(value) || Open.exists?(value))
120
+ value
118
121
  else
119
122
  if Array === value || IO === value
120
123
  value
@@ -124,7 +127,7 @@ def fix_options(workflow, task, job_options)
124
127
  when value == '-'
125
128
  array_separator ||= "\n"
126
129
  STDIN.read
127
- when (String === value and File.exist?(value) and not (input_options[name] && input_options[name][:nofile]))
130
+ when (String === value and File.exist?(value) and ! noload)
128
131
  array_separator ||= "\n"
129
132
  Open.read(value)
130
133
  else
@@ -141,6 +144,8 @@ def fix_options(workflow, task, job_options)
141
144
  when :tsv
142
145
  if input_options[name] and input_options[name][:stream] and String === value
143
146
  TSV::Parser.new(value == '-' ? STDIN : Open.open(value), :filename => value )
147
+ elsif noload
148
+ value
144
149
  else
145
150
  case value
146
151
  when TSV
@@ -180,7 +185,7 @@ available. Examples can be enacted using `rbbt workflow example <workflow>
180
185
  [<task>] [<example>]`.
181
186
 
182
187
  When a task is enacted a job is instantiated. This job is identified by the
183
- `jobname` (which is *#{Workflow::DEFAULT_NAME}* unless specified otherwise) and the values of the
188
+ `jobname` (which is *#{Task::DEFAULT_NAME}* unless specified otherwise) and the values of the
184
189
  parameters; these two things determine the filename under which the job result
185
190
  will be saved. If the taks is enacted using the same `jobname` and parameters
186
191
  it will result in the same job, pointing to the same result file.
@@ -196,12 +201,13 @@ The `recursive_clean` cleans all the job dependency steps recursively.
196
201
  -wda--workdir_all* Change the working directory of ALL workflow
197
202
  -as--array_separator* Change the character that separates elements of Arrays, ',', '|', or '\\n' by default
198
203
  -fs--field_separator* Change the character that separates fields of TSV files '\\t' by default
199
- -jn--jobname* Job name to use. The name '#{Workflow::DEFAULT_NAME}' is used by default
204
+ -jn--jobname* Job name to use. The name '#{Task::DEFAULT_NAME}' is used by default
200
205
  -pn--printname Print the name of the job and exit without starting it
201
206
  -pf--printpath Print the path of the job result
202
207
  -cl--clean Clean the last step of the job so that it gets recomputed
203
208
  -ct--clean_task* Clean a particular dependency task
204
209
  -rcl--recursive_clean Clean the last step and its dependencies to recompute the job completely
210
+ -u--update Update jobs if dependencies are newer
205
211
  -uaj--update_all_jobs Consider all dependencies when checking for updates, even when they have no info files
206
212
  --fork Run job asyncronously and monitor progress. It monitors detached processes as well
207
213
  --orchestrate* Run the job through the orchestrator
@@ -217,6 +223,7 @@ The `recursive_clean` cleans all the job dependency steps recursively.
217
223
  -R--requires* Require a list of files
218
224
  -pro--produce* Prepare dependencies
219
225
  -proc--produce_cpus* Number of dependencies prepared in parallel
226
+ -prot--produce_timer* Time step for refreshing the orchestrator status
220
227
  -rwt--remote_workflow_tasks* Load a yaml file describing remote workflow tasks
221
228
  -od--override_deps* Override deps using 'Workflow#task=<path>' array_separated
222
229
  -PERF--procpath_performance* Measure performance using procpath
@@ -229,7 +236,9 @@ EOF
229
236
  workflow = ARGV.shift
230
237
  usage and exit! -1 if workflow.nil?
231
238
 
232
- task = ARGV.shift
239
+ task_name = ARGV.shift
240
+
241
+ task_name = task_name.to_sym if task_name
233
242
 
234
243
  # Set log, fork, clean, recursive_clean and help
235
244
  help = !!options.delete(:help)
@@ -241,6 +250,7 @@ clean = !!options.delete(:clean) || clean_task
241
250
  override_deps = options.delete(:override_deps)
242
251
  recursive_clean = !!options.delete(:recursive_clean)
243
252
  out = options.include?(:output) ? File.open(options[:output], 'wb') : STDOUT
253
+ provenance = options.delete(:provenance)
244
254
 
245
255
  $array_separator = options.delete(:array_separator)
246
256
  $field_separator = options.delete(:field_separator) || "\t"
@@ -257,14 +267,17 @@ end
257
267
  Workflow.workdir.search_paths.merge!({:workdir => File.expand_path(options.delete(:workdir_all)), :default => :workdir }) if options[:workdir_all]
258
268
 
259
269
  workflow = Workflow.require_workflow workflow
260
-
261
270
  if clean_task
262
- ENV["RBBT_UPDATE"] = 'true'
271
+ ENV["SCOUT_UPDATE"] = 'true'
272
+ end
273
+
274
+ if options[:update]
275
+ ENV["SCOUT_UPDATE"] = 'true'
263
276
  end
264
277
 
265
278
  if options[:update_all_jobs]
266
- ENV["RBBT_UPDATE_ALL_JOBS"] = 'true'
267
- ENV["RBBT_UPDATE"] = 'true'
279
+ ENV["SCOUT_UPDATE_ALL_JOBS"] = 'true'
280
+ ENV["SCOUT_UPDATE"] = 'true'
268
281
  end
269
282
 
270
283
  if options[:workflows]
@@ -291,39 +304,36 @@ end
291
304
  # Set task
292
305
  namespace = nil, nil
293
306
 
294
- case
295
- when task.nil?
296
- usage workflow, nil, nil, options[:abridge] and exit 0
297
- else
298
- task_name = task.to_sym
299
- begin
300
- task = workflow.tasks[task_name]
301
- raise Workflow::TaskNotFoundException.new workflow, task_name if task.nil?
302
- rescue Workflow::TaskNotFoundException
303
- usage workflow, nil, nil, options[:abridge]
304
-
305
- puts
306
- puts Log.color :magenta, "## Error"
307
- puts
308
- puts $!.message
309
- puts
307
+ help = options[:help] = true if task_name.nil?
310
308
 
311
- exit -1
309
+ if help
310
+ if defined? scout_usage
311
+ scout_usage
312
+ else
313
+ puts SOPT.doc
312
314
  end
315
+
316
+ puts workflow.usage(task_name) if workflow
317
+ exit 0
318
+ else
319
+ task = workflow.tasks[task_name.to_sym] if task_name
320
+ raise ParameterException, "Task #{task_name} not found" if task.nil?
313
321
  end
314
322
 
315
- usage workflow, task, nil, options[:abridge] and exit 0 if help
323
+ #usage workflow, task, nil, options[:abridge] and exit 0 if help
324
+ #puts workflow.usage(task, options[:abridge]) and exit 0 if help
316
325
 
317
326
  name = options.delete(:jobname)
318
327
 
319
328
  # get job args
320
- job_options = workflow.get_SOPT(task)
329
+ job_options = task.get_SOPT
321
330
 
322
331
  if options[:load_inputs]
323
332
  task_info = workflow.task_info(task_name)
324
- job_options = Workflow.load_inputs(options[:load_inputs], task_info[:inputs], task_info[:input_types]).merge(job_options)
333
+ job_options = workflow.tasks[task_name].load_inputs(options[:load_inputs]).merge(job_options)
325
334
  end
326
335
 
336
+
327
337
  job_options = fix_options(workflow, task, job_options)
328
338
  saved_job_options = job_options
329
339
 
@@ -343,7 +353,13 @@ $job = job
343
353
 
344
354
  # clean job
345
355
  if clean
346
- job.clean
356
+ if job.info[:task_alias]
357
+ Log.info "Cleaning task_alias #{Log.fingerprint job.dependencies.last}"
358
+ job.dependencies.last.clean
359
+ job.clean
360
+ else
361
+ job.clean
362
+ end
347
363
  sleep 1
348
364
  end
349
365
 
@@ -368,11 +384,11 @@ if recursive_clean
368
384
  job.recursive_clean
369
385
  end
370
386
 
371
- require 'pp'
372
387
 
373
388
  # run
374
389
  begin
375
390
  if options[:info]
391
+ require 'pp'
376
392
  pp job.info
377
393
  exit 0
378
394
  end
@@ -385,11 +401,17 @@ begin
385
401
  if do_exec or (job.respond_to?(:is_exec) and job.is_exec)
386
402
  res = job.exec(:stream)
387
403
 
388
- result_type = job.result_type
404
+ result_type = job.type
389
405
 
390
406
  res = JSON.parse(res.read) if (defined?(RemoteStep) and RemoteStep === job) && %w(array float integer boolean).include?(result_type.to_s)
391
407
 
392
408
  case
409
+ when res.respond_to?(:stream)
410
+ begin
411
+ Misc.consume_stream(res.stream, false, out)
412
+ rescue EOFError, IOError
413
+ end
414
+ res.join if res.respond_to? :join
393
415
  when res.respond_to?(:gets)
394
416
  begin
395
417
  Misc.consume_stream(res, false, out)
@@ -412,7 +434,7 @@ begin
412
434
  exit 0
413
435
  end
414
436
 
415
- if options.delete(:provenance)
437
+ if provenance
416
438
  if options.delete(:printpath)
417
439
  puts job.path
418
440
  else
@@ -455,32 +477,21 @@ begin
455
477
  else
456
478
  RemoteWorkflow::SSH.relay_job_list([@job], @host, :run_type => run_type, :migrate => true, :produce_dependencies => @produce_dependencies)
457
479
  Step.migrate(@job, 'user', :source => @host)
458
- load
480
+ nil
459
481
  end
460
482
  end
461
- #job.dependencies = []
462
-
463
- #([job] + job.rec_dependencies).each do |j|
464
- # next if job.done?
465
- # jmeta = class << j; self; end
466
-
467
- # j.instance_variable_set(:@job, job)
468
- # j.instance_variable_set(:@host, server)
469
- # j.instance_variable_set(:@produce_dependencies, produce_dependencies_for_relay)
470
-
471
- # jmeta.define_method :run do |*args|
472
- # if done?
473
- # load
474
- # else
475
- # RemoteWorkflow::SSH.relay_job_list([@job], @host, :run_type => run_type, :migrate => true, :produce_dependencies => @produce_dependencies)
476
- # Step.migrate(@job, 'user', :source => @host)
477
- # load
478
- # end
479
- # end
480
- #end
481
483
  end
482
484
  end
483
485
 
486
+ if tasks = options.delete(:produce)
487
+ tasks = tasks.split(",")
488
+ produce_cpus = (options[:produce_cpus] || 1)
489
+ produce_timer = (options[:produce_timer] || 5)
490
+ jobs = Workflow.produce_dependencies(job, tasks, produce_cpus, produce_timer.to_f)
491
+ puts "Produced #{jobs.length} dependency jobs: #{Log.fingerprint jobs}"
492
+ exit 0
493
+ end
494
+
484
495
 
485
496
  if server = options.delete(:relay)
486
497
  require 'rbbt/workflow/remote_workflow'
@@ -491,6 +502,7 @@ begin
491
502
  jobs_to_relay.reject!{|d| d.done? }
492
503
 
493
504
  replace_relayed_jobs(jobs_to_relay, server, produce_dependencies_for_relay, :run)
505
+ RemoteWorkflow::SSH.relay_job_list(jobs_to_relay, server, :run_type => :run, :migrate => true, :produce_dependencies => produce_dependencies_for_relay)
494
506
  end
495
507
 
496
508
  if server = options.delete(:batch_relay)
@@ -501,6 +513,7 @@ begin
501
513
  jobs_to_relay.reject!{|d| d.done? }
502
514
 
503
515
  replace_relayed_jobs(jobs_to_relay, server, produce_dependencies_for_relay, :orchestrate)
516
+ RemoteWorkflow::SSH.relay_job_list(jobs_to_relay, server, :run_type => :orchestrate, :migrate => true, :produce_dependencies => produce_dependencies_for_relay)
504
517
  end
505
518
 
506
519
 
@@ -522,16 +535,8 @@ begin
522
535
  end
523
536
  end
524
537
 
525
- if tasks = options.delete(:produce)
526
- tasks = tasks.split(",")
527
- produce_cpus = (options[:produce_cpus] || 1)
528
- puts Step.produce_dependencies(job, tasks, produce_cpus)
529
- exit 0
530
- end
531
-
532
-
533
538
  if do_fork
534
- ENV["RBBT_NO_PROGRESS"] = "true"
539
+ ENV["SCOUT_NO_PROGRESS"] = "true"
535
540
  if detach
536
541
  job.fork
537
542
  Process.detach job.pid if job.pid
@@ -690,7 +695,7 @@ when Step
690
695
  exit! 0
691
696
  else
692
697
  res.join if res.running?
693
- if %w(float integer string boolean).include?(res.result_type.to_s)
698
+ if %w(float integer string boolean).include?(res.type.to_s)
694
699
  out.puts res.load
695
700
  else
696
701
  Open.open(res.path, :mode => 'rb') do |io|
@@ -42,16 +42,33 @@ step = get_step file
42
42
 
43
43
  step.set_info key, value if force || ! step.info.include?(key)
44
44
 
45
- pid = step.info[:pid]
46
- host = step.info[:pid_hostname]
47
-
48
- step.rec_dependencies.each do |dep|
49
- begin
50
- dep.set_info key, value if (force || ! dep.info.include?(key)) && (!check_pid || dep.info[:pid].to_s == pid and dep.info[:pid_hostname] == host)
51
- rescue
52
- Log.warn "Could no set info #{key} for #{dep.path}: #{$!.message}"
45
+ def recursive_write(step, key, value, force, check_pid)
46
+ pid = step.info[:pid]
47
+ host = step.info[:pid_hostname]
48
+
49
+ dependencies = step.dependencies + step.input_dependencies
50
+ dependencies.each do |dep|
51
+ next if check_pid && (dep.info[:pid].to_s != pid.to_s || dep.info[:pid_hostname] != host)
52
+ if force || !dep.info.include?(key)
53
+ begin
54
+ dep.set_info key, value
55
+ rescue
56
+ Log.warn "Could no set info #{key} for #{dep.path}: #{$!.message}"
57
+ end
58
+ end
59
+ recursive_write(dep, key, value, force, check_pid)
53
60
  end
54
- end if recursive
61
+ end
62
+
63
+ recursive_write(step, key, value, force, check_pid) if recursive
64
+
65
+ #step.rec_dependencies.each do |dep|
66
+ # begin
67
+ # dep.set_info key, value if (force || ! dep.info.include?(key)) && (!check_pid || dep.info[:pid].to_s == pid and dep.info[:pid_hostname] == host)
68
+ # rescue
69
+ # Log.warn "Could no set info #{key} for #{dep.path}: #{$!.message}"
70
+ # end
71
+ #end if recursive
55
72
 
56
73
  if recursive && step.info[:archived_info]
57
74
  ad = step.info[:archived_info]