rbbt-util 5.32.13 → 5.32.18

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rbbt/annotations/util.rb +1 -0
  3. data/lib/rbbt/entity.rb +6 -1
  4. data/lib/rbbt/hpc/batch.rb +3 -2
  5. data/lib/rbbt/hpc/orchestrate.rb +1 -0
  6. data/lib/rbbt/hpc/slurm.rb +2 -0
  7. data/lib/rbbt/resource/path.rb +6 -6
  8. data/lib/rbbt/tsv.rb +5 -0
  9. data/lib/rbbt/tsv/parallel/traverse.rb +9 -12
  10. data/lib/rbbt/util/log.rb +15 -4
  11. data/lib/rbbt/util/log/progress/util.rb +2 -1
  12. data/lib/rbbt/util/misc/inspect.rb +3 -1
  13. data/lib/rbbt/util/misc/omics.rb +2 -2
  14. data/lib/rbbt/util/misc/system.rb +2 -2
  15. data/lib/rbbt/util/open.rb +1 -0
  16. data/lib/rbbt/util/python.rb +39 -0
  17. data/lib/rbbt/workflow.rb +54 -2
  18. data/lib/rbbt/workflow/accessor.rb +15 -242
  19. data/lib/rbbt/workflow/definition.rb +2 -1
  20. data/lib/rbbt/workflow/dependencies.rb +195 -0
  21. data/lib/rbbt/workflow/step.rb +10 -158
  22. data/lib/rbbt/workflow/step/accessor.rb +1 -311
  23. data/lib/rbbt/workflow/step/dependencies.rb +43 -3
  24. data/lib/rbbt/workflow/step/info.rb +294 -0
  25. data/lib/rbbt/workflow/step/status.rb +146 -0
  26. data/lib/rbbt/workflow/usage.rb +4 -2
  27. data/lib/rbbt/workflow/util/data.rb +5 -1
  28. data/lib/rbbt/workflow/util/orchestrator.rb +1 -1
  29. data/lib/rbbt/workflow/util/provenance.rb +40 -9
  30. data/python/rbbt.py +5 -1
  31. data/share/rbbt_commands/hpc/orchestrate +4 -1
  32. data/share/rbbt_commands/hpc/task +2 -0
  33. data/share/rbbt_commands/lsf/orchestrate +4 -1
  34. data/share/rbbt_commands/lsf/task +2 -0
  35. data/share/rbbt_commands/slurm/orchestrate +4 -1
  36. data/share/rbbt_commands/slurm/task +2 -0
  37. data/share/rbbt_commands/system/clean +1 -0
  38. data/share/rbbt_commands/workflow/prov +1 -1
  39. data/test/rbbt/workflow/util/test_data.rb +15 -2
  40. metadata +5 -2
@@ -67,11 +67,13 @@ end
67
67
 
68
68
  module Workflow
69
69
 
70
- def dep_tree(name)
70
+ def dep_tree(name, seen = [])
71
71
  @dep_tree ||= {}
72
72
  @dep_tree[name] ||= begin
73
73
  dep_tree = {}
74
74
  self.task_dependencies[name.to_sym].reverse.each do |dep|
75
+ next if seen.include? dep
76
+ seen << dep
75
77
  dep = dep.first if Array === dep && dep.length == 1
76
78
  dep = dep.dependency if DependencyBlock === dep
77
79
 
@@ -87,7 +89,7 @@ module Workflow
87
89
 
88
90
  key = [workflow, task]
89
91
 
90
- dep_tree[key] = workflow.dep_tree(task)
92
+ dep_tree[key] = workflow.dep_tree(task, seen)
91
93
  end if name && self.task_dependencies[name.to_sym]
92
94
  dep_tree
93
95
  end
@@ -23,7 +23,11 @@ module Workflow
23
23
  task_info = workflow.task_info(oname)
24
24
  dir_options = Workflow.load_inputs(data_dir.options, task_info[:inputs], task_info[:input_types])
25
25
  data_options = block.call data_dir, dir_options, task_info
26
- {:inputs => data_options.merge(options)}
26
+ if data_options.include?(:inputs)
27
+ data_options
28
+ else
29
+ {:inputs => data_options.merge(options)}
30
+ end
27
31
  end
28
32
  end
29
33
  end
@@ -81,7 +81,7 @@ module Workflow
81
81
  def self.candidates(workload, rules)
82
82
  if rules.empty?
83
83
  candidates = workload.select{|k,v| v.empty? }.
84
- collect{|k,v| k}.
84
+ collect{|k,v| k }.
85
85
  reject{|k| k.done? }
86
86
  else
87
87
  candidates = workload. #select{|k,v| Orchestrator.job_rules(rules, k) }.
@@ -26,7 +26,7 @@ class Step
26
26
  Log.color(color, status.to_s)
27
27
  end
28
28
 
29
- def self.prov_report_msg(status, name, path, info = nil)
29
+ def self.prov_report_msg(status, name, path, info, input = nil)
30
30
  parts = path.sub(/\{.*/,'').split "/"
31
31
 
32
32
  parts.pop
@@ -43,10 +43,19 @@ class Step
43
43
  rescue Exception
44
44
  nil
45
45
  end
46
+
47
+ if input.nil? || input.empty?
48
+ input_str = nil
49
+ else
50
+ input = input.reject{|dep,name| (input & dep.dependencies.collect{|d| [d,name]}).any? }
51
+ input = input.reject{|dep,name| (input & dep.input_dependencies.collect{|d| [d,name]}).any? }
52
+ input_str = Log.color(:magenta, "-> ") + input.collect{|dep,name| Log.color(:yellow, dep.task_name.to_s) + ":" + Log.color(:yellow, name) }.uniq * " "
53
+ end
54
+
46
55
  str = if ! (Open.remote?(path) || Open.ssh?(path)) && (Open.exists?(path) && $main_mtime && path_mtime && ($main_mtime - path_mtime) < -2)
47
- prov_status_msg(status.to_s) << " " << [workflow, task, path].compact * " " << " (#{Log.color(:red, "Mtime out of sync") })"
56
+ prov_status_msg(status.to_s) << " " << [workflow, task, path, input_str].compact * " " << " (#{Log.color(:red, "Mtime out of sync") })"
48
57
  else
49
- prov_status_msg(status.to_s) << " " << [workflow, task, path].compact * " "
58
+ prov_status_msg(status.to_s) << " " << [workflow, task, path, input_str].compact * " "
50
59
  end
51
60
 
52
61
  if $inputs and $inputs.any?
@@ -74,7 +83,7 @@ class Step
74
83
  str << "\n"
75
84
  end
76
85
 
77
- def self.prov_report(step, offset = 0, task = nil, seen = [], expand_repeats = false)
86
+ def self.prov_report(step, offset = 0, task = nil, seen = [], expand_repeats = false, input = nil)
78
87
  info = step.info || {}
79
88
  info[:task_name] = task
80
89
  path = step.path
@@ -84,14 +93,33 @@ class Step
84
93
  status = :unsync if status == :done and not Open.exist?(path)
85
94
  status = :notfound if status == :noinfo and not Open.exist?(path)
86
95
 
87
- str = " " * offset
88
- str << prov_report_msg(status, name, path, info)
89
- step.dependencies.reverse.each do |dep|
96
+
97
+ this_step_msg = prov_report_msg(status, name, path, info, input)
98
+
99
+ input_dependencies = {}
100
+ step.dependencies.each do |dep|
101
+ if dep.input_dependencies.any?
102
+ dep.input_dependencies.each do |id|
103
+ input_name = dep.recursive_inputs.fields.zip(dep.recursive_inputs).select{|f,d|
104
+ d == id || (String === d && d.start_with?(id.files_dir)) || (Array === d && d.include?(id))
105
+ }.last.first
106
+ input_dependencies[id] ||= []
107
+ input_dependencies[id] << [dep, input_name]
108
+ end
109
+ end
110
+ end
111
+
112
+ str = ""
113
+ str = " " * offset + this_step_msg if ENV["RBBT_ORIGINAL_STACK"] == 'true'
114
+
115
+ step.dependencies.dup.tap{|l|
116
+ l.reverse! if ENV["RBBT_ORIGINAL_STACK"] == 'true'
117
+ }.each do |dep|
90
118
  path = dep.path
91
119
  new = ! seen.include?(path)
92
120
  if new
93
121
  seen << path
94
- str << prov_report(dep, offset + 1, task, seen, expand_repeats)
122
+ str << prov_report(dep, offset + 1, task, seen, expand_repeats, input_dependencies[dep])
95
123
  else
96
124
  if expand_repeats
97
125
  str << Log.color(Step.status_color(dep.status), Log.uncolor(prov_report(dep, offset+1, task)))
@@ -103,10 +131,13 @@ class Step
103
131
  status = :unsync if status == :done and not Open.exist?(path)
104
132
  status = :notfound if status == :noinfo and not Open.exist?(path)
105
133
 
106
- str << Log.color(Step.status_color(status), " " * (offset + 1) + Log.uncolor(prov_report_msg(status, name, path, info)))
134
+ str << Log.color(Step.status_color(status), " " * (offset + 1) + Log.uncolor(prov_report_msg(status, name, path, info, input_dependencies[dep])))
107
135
  end
108
136
  end
109
137
  end if step.dependencies
138
+
139
+ str += (" " * offset) + this_step_msg unless ENV["RBBT_ORIGINAL_STACK"] == 'true'
140
+
110
141
  str
111
142
  end
112
143
  end
data/python/rbbt.py CHANGED
@@ -1,3 +1,7 @@
1
+ import warnings
2
+ import sys
3
+ import os
4
+ os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
5
+
1
6
  def rbbt():
2
7
  print("Rbbt")
3
-
@@ -28,12 +28,15 @@ $slurm_options = SOPT.get <<EOF
28
28
  -t--task_cpus* Tasks
29
29
  -tm--time* Time
30
30
  -m--mem* SLURM minimum memory
31
+ --gres* SLURM Generic resources
31
32
  -mcpu--mem_per_cpu* SLURM minimum memory per CPU
32
33
  -lin--licenses* SLURM licenses
33
34
  -cons--constraint* SLURM constraint
34
35
  -W--workflows* Additional workflows
35
- -OR--orchestration_rules* Orchestration rules
36
36
  -rmb--remove_batch_basedir Remove the SLURM working directory (command, STDIN, exit status, ...)
37
+ -lmod--lua_modules* Lua Modules to load
38
+ -bs--batch_system* Batch system to use: auto, lsf, slurm (default is auto-detect)
39
+ -OR--orchestration_rules* Orchestration rules
37
40
  EOF
38
41
 
39
42
  batch_system = $slurm_options.delete :batch_system
@@ -27,11 +27,13 @@ $slurm_options = SOPT.get <<EOF
27
27
  -t--task_cpus* Tasks
28
28
  -tm--time* Time
29
29
  -m--mem* SLURM minimum memory
30
+ --gres* SLURM Generic resources
30
31
  -mcpu--mem_per_cpu* SLURM minimum memory per CPU
31
32
  -lin--licenses* SLURM licenses
32
33
  -cons--constraint* SLURM constraint
33
34
  -W--workflows* Additional workflows
34
35
  -rmb--remove_batch_dir Remove the batch working directory (command, STDIN, exit status, ...)
36
+ -lmod--lua_modules* Lua Modules to load
35
37
  -bs--batch_system* Batch system to use: auto, lsf, slurm (default is auto-detect)
36
38
  EOF
37
39
 
@@ -28,12 +28,15 @@ $slurm_options = SOPT.get <<EOF
28
28
  -t--task_cpus* Tasks
29
29
  -tm--time* Time
30
30
  -m--mem* SLURM minimum memory
31
+ --gres* SLURM Generic resources
31
32
  -mcpu--mem_per_cpu* SLURM minimum memory per CPU
32
33
  -lin--licenses* SLURM licenses
33
34
  -cons--constraint* SLURM constraint
34
35
  -W--workflows* Additional workflows
35
- -OR--orchestration_rules* Orchestration rules
36
36
  -rmb--remove_batch_basedir Remove the SLURM working directory (command, STDIN, exit status, ...)
37
+ -lmod--lua_modules* Lua Modules to load
38
+ -bs--batch_system* Batch system to use: auto, lsf, slurm (default is auto-detect)
39
+ -OR--orchestration_rules* Orchestration rules
37
40
  EOF
38
41
 
39
42
  batch_system = $slurm_options.delete :batch_system
@@ -27,11 +27,13 @@ $slurm_options = SOPT.get <<EOF
27
27
  -t--task_cpus* Tasks
28
28
  -tm--time* Time
29
29
  -m--mem* SLURM minimum memory
30
+ --gres* SLURM Generic resources
30
31
  -mcpu--mem_per_cpu* SLURM minimum memory per CPU
31
32
  -lin--licenses* SLURM licenses
32
33
  -cons--constraint* SLURM constraint
33
34
  -W--workflows* Additional workflows
34
35
  -rmb--remove_batch_dir Remove the batch working directory (command, STDIN, exit status, ...)
36
+ -lmod--lua_modules* Lua Modules to load
35
37
  -bs--batch_system* Batch system to use: auto, lsf, slurm (default is auto-detect)
36
38
  EOF
37
39
 
@@ -28,12 +28,15 @@ $slurm_options = SOPT.get <<EOF
28
28
  -t--task_cpus* Tasks
29
29
  -tm--time* Time
30
30
  -m--mem* SLURM minimum memory
31
+ --gres* SLURM Generic resources
31
32
  -mcpu--mem_per_cpu* SLURM minimum memory per CPU
32
33
  -lin--licenses* SLURM licenses
33
34
  -cons--constraint* SLURM constraint
34
35
  -W--workflows* Additional workflows
35
- -OR--orchestration_rules* Orchestration rules
36
36
  -rmb--remove_batch_basedir Remove the SLURM working directory (command, STDIN, exit status, ...)
37
+ -lmod--lua_modules* Lua Modules to load
38
+ -bs--batch_system* Batch system to use: auto, lsf, slurm (default is auto-detect)
39
+ -OR--orchestration_rules* Orchestration rules
37
40
  EOF
38
41
 
39
42
  batch_system = $slurm_options.delete :batch_system
@@ -27,11 +27,13 @@ $slurm_options = SOPT.get <<EOF
27
27
  -t--task_cpus* Tasks
28
28
  -tm--time* Time
29
29
  -m--mem* SLURM minimum memory
30
+ --gres* SLURM Generic resources
30
31
  -mcpu--mem_per_cpu* SLURM minimum memory per CPU
31
32
  -lin--licenses* SLURM licenses
32
33
  -cons--constraint* SLURM constraint
33
34
  -W--workflows* Additional workflows
34
35
  -rmb--remove_batch_dir Remove the batch working directory (command, STDIN, exit status, ...)
36
+ -lmod--lua_modules* Lua Modules to load
35
37
  -bs--batch_system* Batch system to use: auto, lsf, slurm (default is auto-detect)
36
38
  EOF
37
39
 
@@ -34,6 +34,7 @@ force = options.delete :force
34
34
  dirty = options.delete :dirty
35
35
  time = options.delete :older
36
36
 
37
+ ENV["RBBT_DEBUG_CLEAN"] = 'false'
37
38
  ENV["RBBT_UPDATE"] = 'true' if dirty
38
39
 
39
40
  time = Misc.timespan time, 'd' if time
@@ -131,6 +131,6 @@ if options[:plot]
131
131
  end
132
132
 
133
133
  else
134
- puts Step.prov_report(step, 0, nil, [], options[:expand_repeats]).strip
134
+ puts Step.prov_report(step, 0, nil, [], options[:expand_repeats])
135
135
  end
136
136
 
@@ -5,15 +5,24 @@ module TestDataWF
5
5
  extend Workflow
6
6
  extend Workflow::Data
7
7
 
8
+ input :salutation, :string
9
+ task :salute_luis => :string do |name,salutation|
10
+ "Hi Luis: #{salutation}"
11
+ end
12
+
8
13
  input :name, :string
9
14
  input :salutation, :string
10
15
  task :salute => :string do |name,salutation|
11
16
  "Hi #{name}: #{salutation}"
12
17
  end
13
18
 
14
- data_task :salute_data, TestDataWF, :salute do |directory,options|
19
+ data_task :salute_data, TestDataWF, :salute, :salutation => :placeholder do |directory,options|
15
20
  options.merge({:salutation => directory.salutation.read})
16
21
  end
22
+
23
+ data_task :salute_data2, TestDataWF, :salute, :salutation => :placeholder do |directory,options|
24
+ {:task => :salute_luis, :inputs => options.merge({:salutation => directory.salutation.read})}
25
+ end
17
26
  end
18
27
 
19
28
  class TestWorkflowData < Test::Unit::TestCase
@@ -28,7 +37,11 @@ class TestWorkflowData < Test::Unit::TestCase
28
37
 
29
38
  job = TestDataWF.job(:salute_data, "TestDir")
30
39
  job.recursive_clean.run
31
- ppp job.run
40
+ assert job.run.include? "Miguel"
41
+
42
+ job = TestDataWF.job(:salute_data2, "TestDir")
43
+ job.recursive_clean.run
44
+ assert job.run.include? "Luis"
32
45
  end
33
46
  end
34
47
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbbt-util
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.32.13
4
+ version: 5.32.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Vazquez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-26 00:00:00.000000000 Z
11
+ date: 2021-07-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -322,6 +322,7 @@ files:
322
322
  - lib/rbbt/workflow/accessor.rb
323
323
  - lib/rbbt/workflow/annotate.rb
324
324
  - lib/rbbt/workflow/definition.rb
325
+ - lib/rbbt/workflow/dependencies.rb
325
326
  - lib/rbbt/workflow/doc.rb
326
327
  - lib/rbbt/workflow/examples.rb
327
328
  - lib/rbbt/workflow/integration/ansible.rb
@@ -339,8 +340,10 @@ files:
339
340
  - lib/rbbt/workflow/step.rb
340
341
  - lib/rbbt/workflow/step/accessor.rb
341
342
  - lib/rbbt/workflow/step/dependencies.rb
343
+ - lib/rbbt/workflow/step/info.rb
342
344
  - lib/rbbt/workflow/step/prepare.rb
343
345
  - lib/rbbt/workflow/step/run.rb
346
+ - lib/rbbt/workflow/step/status.rb
344
347
  - lib/rbbt/workflow/task.rb
345
348
  - lib/rbbt/workflow/usage.rb
346
349
  - lib/rbbt/workflow/util/archive.rb