rbbt-util 5.34.24 → 5.34.26
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.
- checksums.yaml +4 -4
- data/lib/rbbt/hpc/batch.rb +6 -1
- data/lib/rbbt/workflow/dependencies.rb +30 -11
- data/lib/rbbt/workflow/step/dependencies.rb +2 -1
- data/lib/rbbt/workflow/step/save_load_inputs.rb +7 -0
- data/lib/rbbt/workflow.rb +16 -18
- data/share/rbbt_commands/hpc/orchestrate +2 -1
- data/share/rbbt_commands/lsf/orchestrate +2 -1
- data/share/rbbt_commands/slurm/orchestrate +2 -1
- data/test/rbbt/test_workflow.rb +43 -2
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: da3b496fd0fb7d9ff645cba0fb4ba3914288fb0b88bf80f43a79d02bd1ee2cfd
|
|
4
|
+
data.tar.gz: ab120f9bb96f1b0628f1edc6dc114a43c32ed39a5c29ce5252bbf85383d24359
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3f5b5326a834f1f972756919ea2f04c9626998be3c9ca058fd386c06787011ad021798e6091eb8eae1f7873dcceb9adcfa02de14a5269dadef4a2902d5475a9d
|
|
7
|
+
data.tar.gz: d74344affb899a6b62a494d02e9058dc338a7be4138b9ce32331d0657bc121035b312da21f48827751dc13e1bdee4511fb6f1eeaf481d39f73e5967ff3243800
|
data/lib/rbbt/hpc/batch.rb
CHANGED
|
@@ -101,6 +101,11 @@ module HPC
|
|
|
101
101
|
|
|
102
102
|
task = Symbol === job.overriden ? job.overriden : job.task_name
|
|
103
103
|
|
|
104
|
+
#override_deps = job.overriden_deps.collect do |dep|
|
|
105
|
+
# name = [dep.workflow.to_s, dep.task_name] * "#"
|
|
106
|
+
# [name, dep.path] * "="
|
|
107
|
+
#end.uniq * ","
|
|
108
|
+
|
|
104
109
|
if job.overriden?
|
|
105
110
|
#override_deps = job.rec_dependencies.
|
|
106
111
|
# select{|dep| Symbol === dep.overriden }.
|
|
@@ -568,7 +573,7 @@ env > #{batch_options[:fenv]}
|
|
|
568
573
|
Misc.add_defaults options,
|
|
569
574
|
:batch_dir => batch_dir,
|
|
570
575
|
:inputs_dir => File.join(batch_dir, "inputs_dir"),
|
|
571
|
-
:workflows => workflows_to_load.uniq * ","
|
|
576
|
+
:workflows => workflows_to_load.any? ? workflows_to_load.uniq * "," : nil
|
|
572
577
|
|
|
573
578
|
options[:procpath_performance] ||= File.join(batch_dir, "procpath##{procpath.gsub(',', '#')}") if procpath
|
|
574
579
|
|
|
@@ -72,10 +72,7 @@ module Workflow
|
|
|
72
72
|
def setup_override_dependency(dep, workflow, task_name)
|
|
73
73
|
return [] if dep == :skip || dep == 'skip'
|
|
74
74
|
|
|
75
|
-
if not Step === dep
|
|
76
|
-
located = Open.exists?(dep)
|
|
77
|
-
dep = Workflow.load_step(dep)
|
|
78
|
-
end
|
|
75
|
+
dep = Workflow.load_step(dep) if not Step === dep
|
|
79
76
|
|
|
80
77
|
dep.original_workflow ||= dep.workflow if dep.workflow
|
|
81
78
|
dep.original_task_name ||= dep.task_name if dep.task_name
|
|
@@ -86,7 +83,6 @@ module Workflow
|
|
|
86
83
|
dep.workflow = workflow
|
|
87
84
|
dep.info[:name] = dep.name
|
|
88
85
|
|
|
89
|
-
|
|
90
86
|
begin
|
|
91
87
|
workflow = Kernel.const_get workflow if String === workflow
|
|
92
88
|
dep.task = workflow.tasks[task_name] if dep.task.nil? && workflow.tasks.include?(task_name)
|
|
@@ -95,13 +91,17 @@ module Workflow
|
|
|
95
91
|
end
|
|
96
92
|
|
|
97
93
|
dep.task_name = task_name
|
|
98
|
-
dep.overriden = dep.original_task_name.to_sym if dep.original_task_name
|
|
94
|
+
dep.overriden = dep.original_task_name.to_sym if dep.original_task_name
|
|
99
95
|
|
|
100
96
|
dep.extend step_module
|
|
101
97
|
|
|
102
98
|
dep
|
|
103
99
|
end
|
|
104
100
|
|
|
101
|
+
def unlocated_override?(dep)
|
|
102
|
+
String === dep && ! (Open.exists?(dep) || Open.exists?(dep + '.info'))
|
|
103
|
+
end
|
|
104
|
+
|
|
105
105
|
def assign_dep_inputs(_inputs, options, all_d, task_info)
|
|
106
106
|
IndiferentHash.setup(_inputs)
|
|
107
107
|
|
|
@@ -153,6 +153,7 @@ module Workflow
|
|
|
153
153
|
|
|
154
154
|
override_dependencies = override_dependencies(inputs)
|
|
155
155
|
|
|
156
|
+
overriden = false
|
|
156
157
|
dependencies.each do |dependency|
|
|
157
158
|
_inputs = IndiferentHash.setup(inputs.dup)
|
|
158
159
|
jobname = orig_jobname
|
|
@@ -163,6 +164,7 @@ module Workflow
|
|
|
163
164
|
workflow, dep_task, options = dependency
|
|
164
165
|
|
|
165
166
|
if override_dependencies[workflow.to_s] && value = override_dependencies[workflow.to_s][dep_task]
|
|
167
|
+
overriden = true if (options.nil? || ! options[:not_overriden]) && ! unlocated_override?(value)
|
|
166
168
|
setup_override_dependency(value, workflow, dep_task)
|
|
167
169
|
else
|
|
168
170
|
|
|
@@ -175,15 +177,23 @@ module Workflow
|
|
|
175
177
|
|
|
176
178
|
job = workflow._job(dep_task, jobname, _inputs)
|
|
177
179
|
ComputeDependency.setup(job, compute) if compute
|
|
180
|
+
|
|
181
|
+
overriden = true if TrueClass === job.overriden && (options.nil? || ! options[:not_overriden])
|
|
182
|
+
|
|
178
183
|
job
|
|
179
184
|
end
|
|
180
185
|
when Step
|
|
181
|
-
dependency
|
|
186
|
+
job = dependency
|
|
187
|
+
overriden = true if TrueClass === job.overriden && (options.nil? || ! options[:not_overriden])
|
|
188
|
+
job
|
|
182
189
|
when Symbol
|
|
183
190
|
if override_dependencies[self.to_s] && value = override_dependencies[self.to_s][dependency]
|
|
191
|
+
overriden = true if (options.nil? || ! options[:not_overriden]) && ! unlocated_override?(value)
|
|
184
192
|
setup_override_dependency(value, self, dependency)
|
|
185
193
|
else
|
|
186
|
-
_job(dependency, jobname, _inputs)
|
|
194
|
+
job = _job(dependency, jobname, _inputs)
|
|
195
|
+
overriden = true if TrueClass === job.overriden && (options.nil? || ! options[:not_overriden])
|
|
196
|
+
job
|
|
187
197
|
end
|
|
188
198
|
when Proc
|
|
189
199
|
if DependencyBlock === dependency
|
|
@@ -191,6 +201,7 @@ module Workflow
|
|
|
191
201
|
wf, task_name, options = orig_dep
|
|
192
202
|
|
|
193
203
|
if override_dependencies[wf.to_s] && value = override_dependencies[wf.to_s][task_name]
|
|
204
|
+
overriden = true if (options.nil? || ! options[:not_overriden]) && ! unlocated_override?(value)
|
|
194
205
|
dep = setup_override_dependency(value, wf, task_name)
|
|
195
206
|
else
|
|
196
207
|
|
|
@@ -206,16 +217,20 @@ module Workflow
|
|
|
206
217
|
dep.each{|d|
|
|
207
218
|
next if d.nil?
|
|
208
219
|
if Hash === d
|
|
220
|
+
d = d.merge(options)
|
|
209
221
|
d[:workflow] ||= wf
|
|
210
222
|
d[:task] ||= task_name
|
|
211
223
|
_override_dependencies = override_dependencies.merge(override_dependencies(d[:inputs] || {}))
|
|
212
224
|
d = if _override_dependencies[d[:workflow].to_s] && value = _override_dependencies[d[:workflow].to_s][d[:task]]
|
|
225
|
+
overriden = true if (options.nil? || ! options[:not_overriden]) && ! unlocated_override?(value)
|
|
213
226
|
setup_override_dependency(value, d[:workflow], d[:task])
|
|
214
227
|
else
|
|
215
228
|
task_info = d[:workflow].task_info(d[:task])
|
|
216
229
|
|
|
217
230
|
_inputs = assign_dep_inputs({}, options.merge(d[:inputs] || {}), real_dependencies, task_info)
|
|
218
|
-
d[:workflow]._job(d[:task], d[:jobname], _inputs)
|
|
231
|
+
job = d[:workflow]._job(d[:task], d[:jobname], _inputs)
|
|
232
|
+
overriden = true if TrueClass === job.overriden && (d.nil? || ! d[:not_overriden])
|
|
233
|
+
job
|
|
219
234
|
end
|
|
220
235
|
end
|
|
221
236
|
ComputeDependency.setup(d, compute) if compute
|
|
@@ -230,11 +245,15 @@ module Workflow
|
|
|
230
245
|
dep[:workflow] ||= wf || self
|
|
231
246
|
_override_dependencies = override_dependencies.merge(override_dependencies(dep[:inputs] || {}))
|
|
232
247
|
if _override_dependencies[dep[:workflow].to_s] && value = _override_dependencies[dep[:workflow].to_s][dep[:task]]
|
|
248
|
+
overriden = true if (options.nil? || ! options[:not_overriden]) && ! unlocated_override?(value)
|
|
233
249
|
setup_override_dependency(value, dep[:workflow], dep[:task])
|
|
234
250
|
else
|
|
235
251
|
task_info = (dep[:task] && dep[:workflow]) ? dep[:workflow].task_info(dep[:task]) : nil
|
|
236
252
|
_inputs = assign_dep_inputs({}, dep[:inputs], real_dependencies, task_info)
|
|
237
|
-
|
|
253
|
+
job = dep[:workflow]._job(dep[:task], dep[:jobname], _inputs)
|
|
254
|
+
job = d[:workflow]._job(d[:task], d[:jobname], _inputs)
|
|
255
|
+
overriden = true if TrueClass === job.overriden && (d.nil? || ! d[:not_overriden])
|
|
256
|
+
job
|
|
238
257
|
end
|
|
239
258
|
end
|
|
240
259
|
end
|
|
@@ -246,6 +265,6 @@ module Workflow
|
|
|
246
265
|
|
|
247
266
|
real_dependencies << real_dep
|
|
248
267
|
end
|
|
249
|
-
real_dependencies.flatten.compact
|
|
268
|
+
[real_dependencies.flatten.compact, overriden]
|
|
250
269
|
end
|
|
251
270
|
end
|
|
@@ -526,8 +526,9 @@ class Step
|
|
|
526
526
|
end
|
|
527
527
|
|
|
528
528
|
def overriden?
|
|
529
|
+
return @overriden
|
|
529
530
|
return true if @overriden
|
|
530
|
-
return true if dependencies && dependencies.select{|dep| dep.overriden
|
|
531
|
+
return true if dependencies && dependencies.select{|dep| TrueClass === dep.overriden }.any?
|
|
531
532
|
info[:archived_info].each do |f,i|
|
|
532
533
|
next if Symbol === i
|
|
533
534
|
return true if i[:overriden] || i["overriden"]
|
|
@@ -31,6 +31,8 @@ module Workflow
|
|
|
31
31
|
|
|
32
32
|
type = :step_array if file.split(".").last == 'as_step_array'
|
|
33
33
|
|
|
34
|
+
type = :number_array if file.split(".").last == 'as_number_array'
|
|
35
|
+
|
|
34
36
|
type = :step_file if file.split(".").last == 'as_step_file'
|
|
35
37
|
|
|
36
38
|
type = :step_file_array if file.split(".").last == 'as_step_file_array'
|
|
@@ -57,6 +59,9 @@ module Workflow
|
|
|
57
59
|
when :step_array
|
|
58
60
|
steps = Open.read(file).strip.split("\n").collect{|path| Workflow.load_step(path) }
|
|
59
61
|
inputs[input.to_sym] = steps
|
|
62
|
+
when :number_array
|
|
63
|
+
numbers = Open.read(file).strip.split("\n").collect{|num| num.to_f }
|
|
64
|
+
inputs[input.to_sym] = numbers
|
|
60
65
|
when :step
|
|
61
66
|
steps = Open.read(file).strip.split("\n").collect{|path| Workflow.load_step(path) }
|
|
62
67
|
inputs[input.to_sym] = steps.first
|
|
@@ -176,6 +181,8 @@ class Step
|
|
|
176
181
|
when Step
|
|
177
182
|
path = path + '.as_step_array'
|
|
178
183
|
value = value.collect{|s| s.path }
|
|
184
|
+
when Numeric
|
|
185
|
+
path = path + '.as_number_array'
|
|
179
186
|
end
|
|
180
187
|
|
|
181
188
|
value = value * "\n"
|
data/lib/rbbt/workflow.rb
CHANGED
|
@@ -285,6 +285,7 @@ module Workflow
|
|
|
285
285
|
|
|
286
286
|
workdir[taskname][tagged_jobname].find
|
|
287
287
|
end
|
|
288
|
+
|
|
288
289
|
def import_task(workflow, orig, new)
|
|
289
290
|
orig_task = workflow.tasks[orig]
|
|
290
291
|
new_task = orig_task.dup
|
|
@@ -437,15 +438,13 @@ module Workflow
|
|
|
437
438
|
jobname_input = nil
|
|
438
439
|
end
|
|
439
440
|
|
|
440
|
-
if jobname_input &&
|
|
441
|
-
inputs[jobname_input] = jobname
|
|
441
|
+
if jobname_input && inputs[jobname_input].nil?
|
|
442
|
+
inputs[jobname_input] = jobname || DEFAULT_NAME
|
|
442
443
|
end
|
|
443
444
|
|
|
444
445
|
real_inputs = {}
|
|
445
|
-
has_overriden_inputs = false
|
|
446
446
|
|
|
447
447
|
inputs.each do |k,v|
|
|
448
|
-
#has_overriden_inputs = true if String === k and k.include? "#"
|
|
449
448
|
next unless (task_inputs.include?(k.to_sym) or task_inputs.include?(k.to_s))
|
|
450
449
|
default = all_defaults[k]
|
|
451
450
|
next if default == v
|
|
@@ -461,12 +460,10 @@ module Workflow
|
|
|
461
460
|
|
|
462
461
|
jobname = DEFAULT_NAME if jobname.nil? or jobname.empty?
|
|
463
462
|
|
|
464
|
-
dependencies = real_dependencies(task, jobname, defaults.merge(inputs), task_dependencies[taskname] || [])
|
|
465
|
-
|
|
466
|
-
overriden_deps = dependencies.select{|d| d.overriden }
|
|
467
|
-
true_overriden_deps = overriden_deps.select{|d| TrueClass === d.overriden }
|
|
463
|
+
dependencies, overriden = real_dependencies(task, jobname, defaults.merge(inputs), task_dependencies[taskname] || [])
|
|
468
464
|
|
|
469
|
-
|
|
465
|
+
#overriden_deps = dependencies.select{|d| Symbol === d.overriden }
|
|
466
|
+
#overriden_target_deps = overriden_deps.select{|d| TrueClass === d.overriden }
|
|
470
467
|
|
|
471
468
|
extension = task.extension
|
|
472
469
|
|
|
@@ -492,19 +489,20 @@ module Workflow
|
|
|
492
489
|
step_path = step_path taskname, jobname, input_values, dependencies, extension
|
|
493
490
|
end
|
|
494
491
|
|
|
495
|
-
|
|
496
492
|
job = get_job_step step_path, task, input_values, dependencies
|
|
497
493
|
job.workflow = self
|
|
494
|
+
job.overriden ||= overriden
|
|
498
495
|
job.clean_name = jobname
|
|
499
496
|
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
497
|
+
#iif [job, not_overriden]
|
|
498
|
+
#case not_overriden
|
|
499
|
+
#when TrueClass
|
|
500
|
+
# job.overriden = false
|
|
501
|
+
#when :not_overriden_dep
|
|
502
|
+
# job.overriden = true if overriden_target_deps.any?
|
|
503
|
+
#else
|
|
504
|
+
# job.overriden = true if overriden_deps.any?
|
|
505
|
+
#end
|
|
508
506
|
|
|
509
507
|
job.real_inputs = real_inputs.keys
|
|
510
508
|
job
|
|
@@ -61,7 +61,8 @@ class Step
|
|
|
61
61
|
else
|
|
62
62
|
begin
|
|
63
63
|
Log.debug "Issuing SLURM job for #{self.path}"
|
|
64
|
-
|
|
64
|
+
#@batch_job_id, @batch_job_dir = HPC::BATCH_MODULE.orchestrate_job(self, SOPT::GOT_OPTIONS.merge($slurm_options))
|
|
65
|
+
@batch_job_id, @batch_job_dir = HPC::BATCH_MODULE.orchestrate_job(self, $slurm_options)
|
|
65
66
|
if no_load
|
|
66
67
|
self
|
|
67
68
|
else
|
|
@@ -61,7 +61,8 @@ class Step
|
|
|
61
61
|
else
|
|
62
62
|
begin
|
|
63
63
|
Log.debug "Issuing SLURM job for #{self.path}"
|
|
64
|
-
|
|
64
|
+
#@batch_job_id, @batch_job_dir = HPC::BATCH_MODULE.orchestrate_job(self, SOPT::GOT_OPTIONS.merge($slurm_options))
|
|
65
|
+
@batch_job_id, @batch_job_dir = HPC::BATCH_MODULE.orchestrate_job(self, $slurm_options)
|
|
65
66
|
if no_load
|
|
66
67
|
self
|
|
67
68
|
else
|
|
@@ -61,7 +61,8 @@ class Step
|
|
|
61
61
|
else
|
|
62
62
|
begin
|
|
63
63
|
Log.debug "Issuing SLURM job for #{self.path}"
|
|
64
|
-
|
|
64
|
+
#@batch_job_id, @batch_job_dir = HPC::BATCH_MODULE.orchestrate_job(self, SOPT::GOT_OPTIONS.merge($slurm_options))
|
|
65
|
+
@batch_job_id, @batch_job_dir = HPC::BATCH_MODULE.orchestrate_job(self, $slurm_options)
|
|
65
66
|
if no_load
|
|
66
67
|
self
|
|
67
68
|
else
|
data/test/rbbt/test_workflow.rb
CHANGED
|
@@ -166,6 +166,33 @@ for this dependency
|
|
|
166
166
|
dep = dependencies.flatten.first
|
|
167
167
|
end
|
|
168
168
|
|
|
169
|
+
task :overr_orig => :string do
|
|
170
|
+
"over"
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
task :overr_alt => :string do
|
|
174
|
+
"alt"
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
dep :overr_orig
|
|
178
|
+
task :overr_target => :string do
|
|
179
|
+
step(:overr_orig).load.reverse
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
dep :overr_alt, :not_overriden => true
|
|
183
|
+
dep :overr_target, "TestWF#overr_orig" => :overr_alt, :not_overriden => true
|
|
184
|
+
task :overr_action => :string do
|
|
185
|
+
step(:overr_target).load.upcase
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
dep :overr_alt, :not_overriden => true
|
|
190
|
+
dep :overr_target, "TestWF#overr_orig" => :overr_alt
|
|
191
|
+
task :overr_action2 => :string do
|
|
192
|
+
step(:overr_target).load.upcase
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
|
|
169
196
|
end
|
|
170
197
|
|
|
171
198
|
TestWF.workdir = Rbbt.tmp.test.jobs.TestWF
|
|
@@ -419,7 +446,7 @@ class TestWorkflow < Test::Unit::TestCase
|
|
|
419
446
|
TmpFile.with_file do |dir|
|
|
420
447
|
Path.setup(dir)
|
|
421
448
|
Step.save_job_inputs(job, dir)
|
|
422
|
-
assert_equal Dir.glob(dir + "/*"), [dir.file.find]
|
|
449
|
+
assert_equal Dir.glob(dir + "/*"), [dir.file.find + '.as_path']
|
|
423
450
|
end
|
|
424
451
|
end
|
|
425
452
|
|
|
@@ -427,7 +454,7 @@ class TestWorkflow < Test::Unit::TestCase
|
|
|
427
454
|
TmpFile.with_file do |dir|
|
|
428
455
|
Path.setup(dir)
|
|
429
456
|
Step.save_job_inputs(job, dir)
|
|
430
|
-
assert_equal Dir.glob(dir + "/*"), [dir.file.find + '.
|
|
457
|
+
assert_equal Dir.glob(dir + "/*"), [dir.file.find + '.as_path']
|
|
431
458
|
inputs = Workflow.load_inputs(dir, [:file], :file => :file)
|
|
432
459
|
assert_equal inputs, {:file => 'code'}
|
|
433
460
|
end
|
|
@@ -472,4 +499,18 @@ class TestWorkflow < Test::Unit::TestCase
|
|
|
472
499
|
end
|
|
473
500
|
end
|
|
474
501
|
end
|
|
502
|
+
|
|
503
|
+
def test_overriden
|
|
504
|
+
job = TestWF.job(:overr_action)
|
|
505
|
+
job.recursive_clean
|
|
506
|
+
assert_equal "TLA", job.run
|
|
507
|
+
|
|
508
|
+
assert Symbol === job.step(:overr_orig).overriden
|
|
509
|
+
assert TrueClass === job.step(:overr_target).overriden
|
|
510
|
+
assert ! job.overriden
|
|
511
|
+
|
|
512
|
+
job = TestWF.job(:overr_action2)
|
|
513
|
+
assert_equal "TLA", job.run
|
|
514
|
+
assert job.overriden
|
|
515
|
+
end
|
|
475
516
|
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.34.
|
|
4
|
+
version: 5.34.26
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Miguel Vazquez
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-12-
|
|
11
|
+
date: 2022-12-14 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rake
|