rbbt-util 5.30.6 → 5.30.7
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/orchestrate.rb +101 -36
- data/lib/rbbt/tsv/manipulate.rb +1 -1
- data/lib/rbbt/workflow.rb +1 -1
- data/lib/rbbt/workflow/step.rb +7 -3
- data/lib/rbbt/workflow/step/accessor.rb +4 -0
- data/share/Rlib/util.R +8 -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: 3275cafa7bc74ca88f5d487287ff736113dad5ee6e607bb13f283bb4aa5e0562
|
4
|
+
data.tar.gz: 1a7642c60ce3f3828790599c2522ad1e083bd877c53de10401b93735e952934d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bc9717f6611646c099305587bdcf224243102a500ba68047e382df49e583a3c764489e09b7c9aa4993eab3953d72dc9ce206d5450213e1ae832b1622c96fd309
|
7
|
+
data.tar.gz: 791cdba47b74e1f1fd47c439bb3f2b025e540002ec2b1e18d846bab08c6fd858cc25a94f9c84056383c5125cca22c19f00d43ae0c53a8c77ef4de423c19f0d8c
|
data/lib/rbbt/hpc/orchestrate.rb
CHANGED
@@ -8,7 +8,7 @@ module HPC
|
|
8
8
|
task_name = job.overriden.to_s if Symbol === job.overriden
|
9
9
|
|
10
10
|
defaults = rules["defaults"] || {}
|
11
|
-
defaults.merge(rules[workflow]["defaults"] || {}) if rules[workflow]
|
11
|
+
defaults = defaults.merge(rules[workflow]["defaults"] || {}) if rules[workflow]
|
12
12
|
|
13
13
|
job_rules = IndiferentHash.setup(defaults.dup)
|
14
14
|
|
@@ -53,50 +53,88 @@ module HPC
|
|
53
53
|
job_rules
|
54
54
|
end
|
55
55
|
|
56
|
-
def self.get_job_dependencies(job, job_rules)
|
56
|
+
def self.get_job_dependencies(job, job_rules = nil)
|
57
57
|
deps = job.dependencies || []
|
58
58
|
deps += job.input_dependencies || []
|
59
59
|
deps
|
60
60
|
end
|
61
61
|
|
62
|
-
def self.
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
options.delete "recursive_clean"
|
68
|
-
options.delete "clean_task"
|
69
|
-
options.delete "clean"
|
70
|
-
options.delete "tail"
|
71
|
-
options.delete "printfile"
|
72
|
-
options.delete "detach"
|
62
|
+
def self.get_recursive_job_dependencies(job)
|
63
|
+
deps = get_job_dependencies(job)
|
64
|
+
(deps + deps.collect{|dep| get_recursive_job_dependencies(dep) }).flatten
|
65
|
+
end
|
73
66
|
|
74
|
-
|
75
|
-
|
76
|
-
|
67
|
+
def self.piggyback(job, job_rules, job_deps)
|
68
|
+
return false unless job_rules["skip"]
|
69
|
+
final_deps = job_deps - job_deps.collect{|dep| get_recursive_job_dependencies(dep)}.flatten.uniq
|
70
|
+
return final_deps.first if final_deps.length == 1
|
71
|
+
return false
|
72
|
+
end
|
77
73
|
|
74
|
+
def self.get_chains(job, rules, chains = {})
|
78
75
|
job_rules = self.job_rules(rules, job)
|
76
|
+
job_deps = get_job_dependencies(job)
|
79
77
|
|
80
|
-
|
78
|
+
input_deps = []
|
79
|
+
job.rec_dependencies.each do |dep|
|
80
|
+
input_deps.concat dep.input_dependencies
|
81
|
+
end
|
81
82
|
|
82
|
-
|
83
|
-
|
84
|
-
|
83
|
+
job_deps.each do |dep|
|
84
|
+
input_deps.concat dep.input_dependencies
|
85
|
+
get_chains(dep, rules, chains)
|
86
|
+
end
|
87
|
+
|
88
|
+
job_deps.select do |dep|
|
89
|
+
chained = job_rules["chain_tasks"] &&
|
85
90
|
job_rules["chain_tasks"][job.workflow.to_s] && job_rules["chain_tasks"][job.workflow.to_s].include?(job.task_name.to_s) &&
|
86
91
|
job_rules["chain_tasks"][dep.workflow.to_s] && job_rules["chain_tasks"][dep.workflow.to_s].include?(dep.task_name.to_s)
|
87
92
|
|
88
|
-
|
93
|
+
dep_skip = dep.done? && ! input_deps.include?(dep) && self.job_rules(rules, dep)["skip"]
|
94
|
+
chained || dep_skip
|
95
|
+
end.each do |dep|
|
96
|
+
chains[job] ||= []
|
97
|
+
chains[job] << dep
|
98
|
+
chains[job].concat chains[dep] if chains[dep]
|
99
|
+
end
|
100
|
+
|
101
|
+
chains
|
102
|
+
end
|
89
103
|
|
90
|
-
|
91
|
-
|
92
|
-
|
104
|
+
def self.workload(job, rules, chains, options, seen = nil)
|
105
|
+
return [] if job.done?
|
106
|
+
if seen.nil?
|
107
|
+
seen = {}
|
108
|
+
target_job = true
|
109
|
+
end
|
110
|
+
|
111
|
+
job_rules = self.job_rules(rules, job)
|
112
|
+
job_deps = get_job_dependencies(job)
|
113
|
+
|
114
|
+
|
115
|
+
chain = chains[job]
|
116
|
+
chain -= seen.keys if chain
|
117
|
+
piggyback = piggyback(job, job_rules, job_deps)
|
118
|
+
dep_ids = job_deps.collect do |dep|
|
119
|
+
seen[dep] = nil if chain && chain.include?(dep) #&& ! job.input_dependencies.include?(dep)
|
120
|
+
next_options = IndiferentHash.setup(options.dup)
|
121
|
+
if piggyback and piggyback == dep
|
122
|
+
next_options[:piggyback] ||= []
|
123
|
+
next_options[:piggyback].push job
|
124
|
+
ids = workload(dep, rules, chains, next_options, seen)
|
93
125
|
else
|
94
|
-
|
126
|
+
next_options.delete :piggyback
|
127
|
+
ids = workload(dep, rules, chains, next_options, seen)
|
95
128
|
end
|
96
|
-
end.flatten.compact.uniq
|
97
129
|
|
98
|
-
|
99
|
-
|
130
|
+
ids = [ids].flatten.compact.collect{|id| ['canfail', id] * ":"} if job.canfail_paths.include? dep.path
|
131
|
+
|
132
|
+
seen[dep] = ids
|
133
|
+
ids
|
134
|
+
end.compact.flatten.uniq
|
135
|
+
|
136
|
+
return seen[job] || dep_ids if seen.include?(job)
|
137
|
+
return seen[piggyback] if piggyback
|
100
138
|
|
101
139
|
job_rules.delete :chain_tasks
|
102
140
|
job_rules.delete :tasks
|
@@ -111,21 +149,48 @@ module HPC
|
|
111
149
|
job_options[:config_keys] = job_options[:config_keys] ? config_keys + "," + job_options[:config_keys] : config_keys
|
112
150
|
end
|
113
151
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
manifest
|
118
|
-
|
152
|
+
|
153
|
+
if options[:piggyback]
|
154
|
+
manifest = options[:piggyback].uniq
|
155
|
+
manifest += [job]
|
156
|
+
manifest.concat chain if chain
|
157
|
+
job = options[:piggyback].first
|
158
|
+
job_options.delete :piggyback
|
159
|
+
else
|
160
|
+
manifest = [job]
|
161
|
+
manifest.concat chain if chain
|
119
162
|
end
|
120
163
|
|
121
|
-
|
164
|
+
manifest.uniq!
|
165
|
+
|
166
|
+
job_options[:manifest] = manifest.collect{|j| j.workflow_short_path }
|
122
167
|
|
123
168
|
if options[:dry_run]
|
124
|
-
puts Log.color(:
|
125
|
-
[]
|
169
|
+
puts Log.color(:magenta, "Manifest: ") + Log.color(:blue, job_options[:manifest] * ", ") + " - tasks: #{job_options[:task_cpus] || 1} - time: #{job_options[:time]} - config: #{job_options[:config_keys]}"
|
170
|
+
puts Log.color(:yellow, "Deps: ") + Log.color(:blue, job_options[:slurm_dependencies]*", ")
|
171
|
+
job_options[:manifest].first
|
126
172
|
else
|
127
173
|
run_job(job, job_options)
|
128
174
|
end
|
129
175
|
end
|
176
|
+
|
177
|
+
|
178
|
+
def self.orchestrate_job(job, options)
|
179
|
+
options.delete "recursive_clean"
|
180
|
+
options.delete "clean_task"
|
181
|
+
options.delete "clean"
|
182
|
+
options.delete "tail"
|
183
|
+
options.delete "printfile"
|
184
|
+
options.delete "detach"
|
185
|
+
|
186
|
+
rules = YAML.load(Open.read(options[:orchestration_rules])) if options[:orchestration_rules]
|
187
|
+
rules ||= {}
|
188
|
+
IndiferentHash.setup(rules)
|
189
|
+
|
190
|
+
chains = get_chains(job, rules)
|
191
|
+
|
192
|
+
workload(job, rules, chains, options)
|
193
|
+
end
|
194
|
+
|
130
195
|
end
|
131
196
|
end
|
data/lib/rbbt/tsv/manipulate.rb
CHANGED
data/lib/rbbt/workflow.rb
CHANGED
@@ -379,7 +379,7 @@ module Workflow
|
|
379
379
|
has_overriden_inputs = false
|
380
380
|
|
381
381
|
inputs.each do |k,v|
|
382
|
-
has_overriden_inputs = true if String === k and k.include? "#"
|
382
|
+
#has_overriden_inputs = true if String === k and k.include? "#"
|
383
383
|
next unless (task_inputs.include?(k.to_sym) or task_inputs.include?(k.to_s))
|
384
384
|
default = all_defaults[k]
|
385
385
|
next if default == v
|
data/lib/rbbt/workflow/step.rb
CHANGED
@@ -114,9 +114,13 @@ class Step
|
|
114
114
|
|
115
115
|
def copy_files_dir
|
116
116
|
if File.symlink?(self.files_dir)
|
117
|
-
|
118
|
-
|
119
|
-
|
117
|
+
begin
|
118
|
+
realpath = Open.realpath(self.files_dir)
|
119
|
+
Open.rm self.files_dir
|
120
|
+
Open.cp realpath, self.files_dir
|
121
|
+
rescue
|
122
|
+
Log.warn "Copy files_dir for #{self.workflow_short_path}: " + $!.message
|
123
|
+
end
|
120
124
|
end
|
121
125
|
end
|
122
126
|
|
data/share/Rlib/util.R
CHANGED
@@ -484,7 +484,7 @@ rbbt.model.inpute <- function(data, formula, ...){
|
|
484
484
|
data
|
485
485
|
}
|
486
486
|
|
487
|
-
rbbt.tsv.melt <- function(tsv, variable = NULL, value = NULL, key.field = NULL){
|
487
|
+
rbbt.tsv.melt <- function(tsv, variable = NULL, value = NULL, key.field = NULL, ...){
|
488
488
|
rbbt.require('reshape2')
|
489
489
|
if (is.null(key.field)){ key.field = attributes(data)$key.field;}
|
490
490
|
if (is.null(key.field)){ key.field = "ID" }
|
@@ -494,7 +494,7 @@ rbbt.tsv.melt <- function(tsv, variable = NULL, value = NULL, key.field = NULL){
|
|
494
494
|
|
495
495
|
tsv[key.field] = rownames(tsv)
|
496
496
|
|
497
|
-
m <- melt(tsv)
|
497
|
+
m <- melt(tsv, id.vars=c(key.field), ...)
|
498
498
|
|
499
499
|
names(m) <- c(key.field, variable, value)
|
500
500
|
|
@@ -784,6 +784,12 @@ rbbt.plot.venn <- function(data, a=NULL, category=NULL, fill=NULL, ...) {
|
|
784
784
|
return(out)
|
785
785
|
}
|
786
786
|
|
787
|
+
rbbt.plot.upset <- function(data, variable = NULL, ...){
|
788
|
+
rbbt.require('UpSetR')
|
789
|
+
data[data == TRUE] = 1
|
790
|
+
return(upset(data, ...))
|
791
|
+
}
|
792
|
+
|
787
793
|
rbbt.plot.pca <- function(data, center = TRUE, scale. = TRUE, ...) {
|
788
794
|
rbbt.require('vqv/ggbiplot')
|
789
795
|
data <- rbbt.impute(data)
|
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.30.
|
4
|
+
version: 5.30.7
|
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-02-
|
11
|
+
date: 2021-02-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|