rbbt-util 5.33.7 → 5.33.11

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f4272048a5c86e74b051600f0db895ea42f4ad51509a0de9ce88452d27133746
4
- data.tar.gz: f10d19e028de390beb5e2649c7d2f1e0a7754d3235abe3eeba2790946b347f64
3
+ metadata.gz: e5c26a161d8529f19d32ace8b5565042b4baa6fef3d69580f46aadc523e8cc51
4
+ data.tar.gz: 8ee1305d3a66a55273474da60e84cec3385391ad99c8c87e764fd72eaaf29285
5
5
  SHA512:
6
- metadata.gz: 0667eb9d5783d7722c33f72a66a1c406d330d086a37660aa7682006d10fe15860a9e4cbfcb461f17ed15b146fa294a6f6d8158d937884f14dc7952908f63c357
7
- data.tar.gz: f3ba25b347bc4a7f7b56ecdbd1a0bef932b646ac030b3d98fe6ddb76f36a6863073f4692747ceef32c42e4344538a7ee19b531a25b16cc2fa208b201887b441e
6
+ metadata.gz: 6b9ddf9ff821584ef21f7c30be381965ea9a8cf1cce7e9913cc11c118fa1d31211fe321d72c5d8daabcb14aac5b20df45c527fefa1d142c7a08633c3818b79dd
7
+ data.tar.gz: c0ab742b23fe87fd7f52bfdfe75690a02566547a34a484912c74766cff70c83634434d5a67a9e665bfdffb28be143afdb20028356befe045e19b14bcc83a21ff
@@ -88,8 +88,8 @@ module HPC
88
88
  def rbbt_job_exec_cmd(job, options)
89
89
 
90
90
  jobname = job.clean_name
91
- workflow = job.workflow
92
- task = job.task_name
91
+ workflow = job.original_workflow || job.workflow
92
+ task = job.original_task_name || job.task_name
93
93
 
94
94
  Misc.add_defaults options, :jobname => jobname
95
95
 
@@ -535,8 +535,8 @@ env > #{batch_options[:fenv]}
535
535
  :batch_base_dir, :clean_batch_job, :remove_batch_dir, :batch_procpath, :tail, :batch_dependencies, :dry_run,
536
536
  :batch_base_dir => File.expand_path(File.join('~/rbbt-batch'))
537
537
 
538
- workflow = job.workflow
539
- task_name = job.task_name
538
+ workflow = job.original_workflow ||job.workflow
539
+ task_name = job.original_task_name || job.task_name
540
540
 
541
541
  workflows_to_load = job.rec_dependencies.select{|d| Step === d}.collect{|d| d.workflow }.compact.collect(&:to_s) - [workflow.to_s]
542
542
 
@@ -101,7 +101,9 @@ module HPC
101
101
 
102
102
  batches.each do |batch|
103
103
  job_rules = batch[:jobs].inject(nil) do |acc,job|
104
- task_rules = task_specific_rules(rules, job.workflow, job.task_name)
104
+ workflow = job.original_workflow || job.workflow
105
+ task_name = job.original_task_name || job.task_name
106
+ task_rules = task_specific_rules(rules, workflow, task_name)
105
107
  acc = accumulate_rules(acc, task_rules.dup)
106
108
  end
107
109
 
@@ -120,13 +122,16 @@ module HPC
120
122
  end
121
123
 
122
124
  batches.each do |batch|
125
+ next if batch[:top_level].overriden?
123
126
  next unless batch[:rules][:skip]
124
127
  batch[:rules].delete :skip
125
128
  next if batch[:deps].nil?
126
129
 
127
130
  if batch[:deps].any?
131
+ batch_dep_jobs = batch[:top_level].rec_dependencies
128
132
  target = batch[:deps].select do |target|
129
- (batch[:deps] - [target] - target[:deps]).empty?
133
+ batch_dep_jobs.include?(target[:top_level]) && # Don't piggyback batches that are an input dependency, only real dependencies
134
+ (batch[:deps] - [target] - target[:deps]).empty?
130
135
  end.first
131
136
  next if target.nil?
132
137
  target[:jobs] = batch[:jobs] + target[:jobs]
@@ -4,8 +4,10 @@ module HPC
4
4
  return [] if Symbol === job.overriden
5
5
  matches = []
6
6
  chains.each do |name, chain|
7
- next unless chain[:tasks].include?(job.workflow.to_s)
8
- next unless chain[:tasks][job.workflow.to_s].include?(job.task_name.to_s)
7
+ workflow = job.original_workflow || job.workflow
8
+ task_name = job.original_task_name || job.task_name
9
+ next unless chain[:tasks].include?(workflow.to_s)
10
+ next unless chain[:tasks][workflow.to_s].include?(task_name.to_s)
9
11
  matches << name
10
12
  end
11
13
  matches
@@ -38,46 +40,50 @@ module HPC
38
40
  end
39
41
 
40
42
  def self.job_chains(rules, job)
41
- chains = self.parse_chains(rules)
42
-
43
- matches = check_chains(chains, job)
44
-
45
- dependencies = job_dependencies(job)
46
-
47
- job_chains = []
48
- new_job_chains = {}
49
- dependencies.each do |dep|
50
- dep_matches = check_chains(chains, dep)
51
- common = matches & dep_matches
52
-
53
- dep_chains = job_chains(rules, dep)
54
- found = []
55
- dep_chains.each do |match,info|
56
- if common.include?(match)
57
- found << match
58
- new_info = new_job_chains[match] ||= {}
59
- new_info[:jobs] ||= []
60
- new_info[:jobs].concat info[:jobs]
61
- new_info[:top_level] = job
62
- else
43
+ @@job_chains ||= {}
44
+ @@job_chains[Misc.digest([rules, job.path].inspect)] ||=
45
+ begin
46
+ chains = self.parse_chains(rules)
47
+
48
+ matches = check_chains(chains, job)
49
+
50
+ dependencies = job_dependencies(job)
51
+
52
+ job_chains = []
53
+ new_job_chains = {}
54
+ dependencies.each do |dep|
55
+ dep_matches = check_chains(chains, dep)
56
+ common = matches & dep_matches
57
+
58
+ dep_chains = job_chains(rules, dep)
59
+ found = []
60
+ dep_chains.each do |match,info|
61
+ if common.include?(match)
62
+ found << match
63
+ new_info = new_job_chains[match] ||= {}
64
+ new_info[:jobs] ||= []
65
+ new_info[:jobs].concat info[:jobs]
66
+ new_info[:top_level] = job
67
+ else
68
+ job_chains << [match, info]
69
+ end
70
+ end
71
+
72
+ (common - found).each do |match|
73
+ info = {}
74
+ info[:jobs] = [job, dep]
75
+ info[:top_level] = job
76
+ job_chains << [match, info]
77
+ end
78
+ end
79
+
80
+ new_job_chains.each do |match,info|
81
+ info[:jobs].prepend job
63
82
  job_chains << [match, info]
64
83
  end
65
- end
66
84
 
67
- (common - found).each do |match|
68
- info = {}
69
- info[:jobs] = [job, dep]
70
- info[:top_level] = job
71
- job_chains << [match, info]
85
+ job_chains
72
86
  end
73
- end
74
-
75
- new_job_chains.each do |match,info|
76
- info[:jobs].prepend job
77
- job_chains << [match, info]
78
- end
79
-
80
- job_chains
81
87
  end
82
88
 
83
89
  end
@@ -13,7 +13,11 @@ module HPC
13
13
  all_deps = rec_dependencies + [job]
14
14
 
15
15
  all_deps.each do |dep|
16
- Step.prepare_for_execution(dep)
16
+ begin
17
+ Step.prepare_for_execution(dep)
18
+ rescue RbbtException
19
+ next
20
+ end
17
21
  end
18
22
 
19
23
  end
@@ -26,6 +30,7 @@ module HPC
26
30
  options.delete "printpath"
27
31
  options.delete "detach"
28
32
  options.delete "jobname"
33
+ options.delete "load_inputs"
29
34
 
30
35
  Log.high "Prepare for exec"
31
36
  prepare_for_execution(job)
@@ -40,8 +45,8 @@ module HPC
40
45
 
41
46
  IndiferentHash.setup(rules)
42
47
 
43
- Log.high "Compute batches"
44
48
  batches = HPC::Orchestration.job_batches(rules, job)
49
+ Log.high "Compute #{batches.length} batches"
45
50
 
46
51
  batch_ids = {}
47
52
  while batches.any?
@@ -77,9 +82,9 @@ module HPC
77
82
 
78
83
  if options[:dry_run]
79
84
  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]}"
80
- puts Log.color(:magenta, "Deps: ") + Log.color(:blue, job_options[:batch_dependencies]*", ")
85
+ puts Log.color(:yellow, "Deps: ") + Log.color(:blue, job_options[:batch_dependencies]*", ")
81
86
  puts Log.color(:yellow, "Path: ") + top[:top_level].path
82
- puts Log.color(:yellow, "Options: ") + Misc.fingerprint(job_options)
87
+ puts Log.color(:yellow, "Options: ") + job_options.inspect
83
88
  batch_ids[top] = top[:top_level].task_signature
84
89
  else
85
90
  id = run_job(top[:top_level], job_options)
@@ -94,8 +94,8 @@ export BATCH_SYSTEM=SLURM
94
94
 
95
95
  return if Open.exists?(fexit)
96
96
 
97
- STDERR.puts Log.color(:magenta, "Issuing SLURM file: #{fcmd}")
98
- STDERR.puts Open.read(fcmd)
97
+ Log.info "Issuing SLURM file: #{fcmd}"
98
+ Log.debug Open.read(fcmd)
99
99
 
100
100
  if File.exists?(fjob)
101
101
  job = Open.read(fjob).to_i
@@ -167,8 +167,7 @@ module Path
167
167
 
168
168
  @path ||= {}
169
169
  rsearch_paths = (resource and resource.respond_to?(:search_paths)) ? resource.search_paths : nil
170
- key_elems = [where, caller_lib, rsearch_paths, paths]
171
- key = Misc.obj2digest(key_elems.inspect)
170
+ key = [where, caller_lib, rsearch_paths, paths].inspect
172
171
  self.sub!('~/', Etc.getpwuid.dir + '/') if self.include? "~"
173
172
 
174
173
  return @path[key] if @path[key]
@@ -1,13 +1,26 @@
1
1
  module Path
2
2
 
3
3
  def self.caller_lib_dir(file = nil, relative_to = ['lib', 'bin'])
4
- file = caller.reject{|l|
5
- l =~ /rbbt\/(?:resource\.rb|workflow\.rb)/ or
6
- l =~ /rbbt\/resource\/path\.rb/ or
7
- l =~ /rbbt\/persist.rb/ or
8
- l =~ /rbbt\/util\/misc\.rb/ or
9
- l =~ /progress-monitor\.rb/
10
- }.first.sub(/\.rb[^\w].*/,'.rb') if file.nil?
4
+ #file = caller.reject{|l|
5
+ # l =~ /rbbt\/(?:resource\.rb|workflow\.rb)/ or
6
+ # l =~ /rbbt\/resource\/path\.rb/ or
7
+ # l =~ /rbbt\/persist.rb/ or
8
+ # l =~ /rbbt\/util\/misc\.rb/ or
9
+ # l =~ /progress-monitor\.rb/
10
+ #}.first.sub(/\.rb[^\w].*/,'.rb') if file.nil?
11
+
12
+
13
+ if file.nil?
14
+ caller_dup = caller.dup
15
+ while file = caller_dup.shift
16
+ break unless file =~ /rbbt\/(?:resource\.rb|workflow\.rb)/ or
17
+ file =~ /rbbt\/resource\/path\.rb/ or
18
+ file =~ /rbbt\/persist.rb/ or
19
+ file =~ /rbbt\/util\/misc\.rb/ or
20
+ file =~ /progress-monitor\.rb/
21
+ end
22
+ file = file.sub(/\.rb[^\w].*/,'.rb')
23
+ end
11
24
 
12
25
  relative_to = [relative_to] unless Array === relative_to
13
26
  file = File.expand_path(file)
@@ -80,7 +80,7 @@ module Misc
80
80
  end
81
81
  when (defined? TSV and TSV)
82
82
  obj.with_unnamed do
83
- "TSV:{"<< fingerprint(obj.all_fields|| []).inspect << ";" << fingerprint(obj.keys).inspect << "}"
83
+ "TSV:{"<< fingerprint(obj.all_fields|| []) << ";" << fingerprint(obj.keys) << "}"
84
84
  end
85
85
  when Hash
86
86
  if obj.length > 10
@@ -297,14 +297,14 @@ module Misc
297
297
  str = case obj
298
298
  when nil
299
299
  'nil'
300
+ when Symbol
301
+ obj.to_s
300
302
  when TrueClass
301
303
  'true'
302
304
  when FalseClass
303
305
  'false'
304
306
  when Hash
305
307
  "{"<< obj.collect{|k,v| obj2str(k) + '=>' << obj2str(v)}*"," << "}"
306
- when Symbol
307
- obj.to_s
308
308
  when (defined?(Path) and Path)
309
309
  if defined?(Step) && Open.exists?(Step.info_file(obj))
310
310
  obj2str(Workflow.load_step(obj))
@@ -324,9 +324,10 @@ module Misc
324
324
  end
325
325
  when String
326
326
  good_filename = Misc.is_filename?(obj, false) && ! %w(. ..).include?(obj) && %w(. /).include?(obj[0])
327
- is_path = Path === obj
328
- if good_filename && ! is_path
329
- obj2str Path.setup(obj.dup)
327
+ if good_filename
328
+ obj = obj.dup
329
+ obj.extend Path
330
+ obj2str obj
330
331
  else
331
332
  obj = obj.chomp if String === obj
332
333
  if obj.length > HASH2MD5_MAX_STRING_LENGTH
@@ -339,7 +340,7 @@ module Misc
339
340
  if obj.length > HASH2MD5_MAX_ARRAY_LENGTH
340
341
  "[" << sample_large_obj(obj, HASH2MD5_MAX_ARRAY_LENGTH).collect{|v| obj2str(v)} * "," << "]"
341
342
  else
342
- "[" << obj.collect{|v| obj2str(v)} * "," << "]"
343
+ "[" << obj.collect{|v| obj2str(v) } * "," << "]"
343
344
  end
344
345
  when TSV::Parser
345
346
  remove_long_items(obj)
@@ -354,7 +355,7 @@ module Misc
354
355
  "<IO:" << obj.path << "--" << mtime_str(obj.path) << ">"
355
356
  end
356
357
  when (defined? Step and Step)
357
- "<IO:" << obj.short_path << ">"
358
+ "<IO:" << obj.short_path_real << ">"
358
359
  when IO
359
360
  if obj.respond_to? :filename and obj.filename
360
361
  if defined?(Step) && Open.exists?(Step.info_file(obj.filename))
@@ -113,9 +113,10 @@ end
113
113
  end
114
114
 
115
115
  def self.is_filename?(string, need_to_exists = true)
116
+ return false if string.nil?
116
117
  return true if defined? Path and Path === string
117
118
  return true if string.respond_to? :exists
118
- return true if String === string and string.length < 265 and (File.exist?(string) || ! need_to_exists)
119
+ return true if String === string and string.split("/").select{|p| p.length > 265}.empty? and (! need_to_exists || File.exist?(string))
119
120
  return false
120
121
  end
121
122
 
@@ -72,9 +72,12 @@ module Workflow
72
72
  def setup_override_dependency(dep, workflow, task_name)
73
73
  return [] if dep == :skip || dep == 'skip'
74
74
  dep = Step === dep ? dep.dup : Workflow.load_step(dep)
75
+
76
+ dep.original_workflow ||= dep.workflow if dep.workflow
77
+ dep.original_task_name ||= dep.task_name if dep.workflow
78
+
75
79
  dep.workflow = workflow
76
80
  dep.info[:name] = dep.name
77
- dep.original_task_name ||= dep.task_name if dep.workflow
78
81
 
79
82
 
80
83
  begin
@@ -96,6 +96,10 @@ class Step
96
96
  [task_name, name] * "/"
97
97
  end
98
98
 
99
+ def short_path_real
100
+ [(Symbol === overriden ? overriden : task_name).to_s, name] * "/"
101
+ end
102
+
99
103
  def workflow_short_path
100
104
  return short_path unless workflow
101
105
  workflow.to_s + "#" + short_path
@@ -510,7 +510,7 @@ class Step
510
510
 
511
511
  def overriden?
512
512
  return true if @overriden
513
- return true if dependencies.select{|dep| dep.overriden? }.any?
513
+ return true if dependencies && dependencies.select{|dep| dep.overriden? }.any?
514
514
  info[:archived_info].each do |f,i|
515
515
  next if Symbol === i
516
516
  return true if i[:overriden] || i["overriden"]
@@ -1,4 +1,5 @@
1
1
  module Workflow
2
+
2
3
  def self.load_inputs(dir, input_names, input_types)
3
4
  inputs = {}
4
5
  if File.exists?(dir) && ! File.directory?(dir)
@@ -20,21 +21,59 @@ module Workflow
20
21
  Log.debug "Trying #{ input }: #{file}"
21
22
  next unless file and (File.symlink?(file) || file.exists?)
22
23
 
23
- type = input_types[input]
24
+ type = orig_type = input_types[input]
24
25
 
25
26
  type = :io if file.split(".").last == 'as_io'
26
27
 
28
+ type = :io_array if file.split(".").last == 'as_io_array'
29
+
30
+ type = :step if file.split(".").last == 'as_step'
31
+
32
+ type = :step_array if file.split(".").last == 'as_step_array'
33
+
34
+ type = :step_file if file.split(".").last == 'as_step_file'
35
+
36
+ type = :step_file_array if file.split(".").last == 'as_step_file_array'
37
+
27
38
  type = :path if file.split(".").last == 'as_path'
28
39
 
40
+ type = :path_array if file.split(".").last == 'as_path_array'
41
+
42
+ type = :filename if file.split(".").last == 'as_filename'
43
+
29
44
  type = :nofile if file.split(".").last == 'nofile'
30
45
 
31
46
  case type
32
47
  when :nofile
33
48
  inputs[input.to_sym] = Open.realpath(file)
49
+ when :path_array
50
+ inputs[input.to_sym] = Open.read(file).strip.split("\n")
34
51
  when :path
35
- inputs[input.to_sym] = Open.realpath(Open.read(file).strip)
52
+ inputs[input.to_sym] = Open.read(file).strip.split("\n").first
53
+ when :io
54
+ inputs[input.to_sym] = Open.open(Open.realpath(file)).split("\n")
36
55
  when :io
37
- inputs[input.to_sym] = Open.open(Open.realpath(file))
56
+ inputs[input.to_sym] = Open.realpath(file).split("\n").collect{|f| Open.open(f)}
57
+ when :step_array
58
+ steps = Open.read(file).strip.split("\n").collect{|path| Workflow.load_step(path) }
59
+ inputs[input.to_sym] = steps
60
+ when :step
61
+ steps = Open.read(file).strip.split("\n").collect{|path| Workflow.load_step(path) }
62
+ inputs[input.to_sym] = steps.first
63
+ when :step_file
64
+ path = Open.read(file).strip
65
+ path.extend Path
66
+ step_path = path.match(/(.*)\.files/)[1]
67
+ path.resource = Step.new step_path
68
+ inputs[input.to_sym] = path
69
+ when :step_file_array
70
+ paths = Open.read(file).split("\n")
71
+ paths.each do |path|
72
+ path.extend Path
73
+ step_path = path.match(/(.*)\.files/)[1]
74
+ path.resource = Step.new step_path
75
+ end
76
+ inputs[input.to_sym] = paths
38
77
  when :file, :binary
39
78
  Log.debug "Pointing #{ input } to #{file}"
40
79
  if file =~ /\.yaml/
@@ -87,60 +126,149 @@ module Workflow
87
126
  job(task_name, jobname, inputs)
88
127
  end
89
128
 
129
+ #def self.load_inputs_old(dir, input_names, input_types)
130
+ # inputs = {}
131
+ # if File.exists?(dir) && ! File.directory?(dir)
132
+ # Log.debug "Loading inputs from #{dir}, not a directory trying as tar.gz"
133
+ # tarfile = dir
134
+ # digest = CMD.cmd("md5sum '#{tarfile}'").read.split(" ").first
135
+ # tmpdir = Rbbt.tmp.input_bundle[digest].find
136
+ # Misc.untar(tarfile, tmpdir) unless File.exists? tmpdir
137
+ # files = tmpdir.glob("*")
138
+ # if files.length == 1 && File.directory?(files.first)
139
+ # tmpdir = files.first
140
+ # end
141
+ # load_inputs(tmpdir, input_names, input_types)
142
+ # else
143
+ # dir = Path.setup(dir.dup)
144
+ # input_names.each do |input|
145
+ # file = dir[input].find
146
+ # file = dir.glob(input.to_s + ".*").reject{|f| f =~ /\.md5$/}.first if file.nil? or not (File.symlink?(file) || file.exists?)
147
+ # Log.debug "Trying #{ input }: #{file}"
148
+ # next unless file and (File.symlink?(file) || file.exists?)
149
+
150
+ # type = input_types[input]
151
+
152
+ # type = :io if file.split(".").last == 'as_io'
153
+
154
+ # type = :path if file.split(".").last == 'as_path'
155
+
156
+ # type = :filename if file.split(".").last == 'as_filename'
157
+
158
+ # type = :nofile if file.split(".").last == 'nofile'
159
+
160
+ # case type
161
+ # when :nofile
162
+ # inputs[input.to_sym] = Open.realpath(file)
163
+ # when :path
164
+ # inputs[input.to_sym] = Open.realpath(Open.read(file).strip)
165
+ # when :io
166
+ # inputs[input.to_sym] = Open.open(Open.realpath(file))
167
+ # when :file, :binary
168
+ # Log.debug "Pointing #{ input } to #{file}"
169
+ # if file =~ /\.yaml/
170
+ # inputs[input.to_sym] = YAML.load(Open.read(file))
171
+ # else
172
+ # if File.symlink?(file)
173
+ # link_target = File.expand_path(File.readlink(file), File.dirname(file))
174
+ # inputs[input.to_sym] = link_target
175
+ # else
176
+ # inputs[input.to_sym] = Open.realpath(file)
177
+ # end
178
+ # end
179
+ # when :text
180
+ # Log.debug "Reading #{ input } from #{file}"
181
+ # inputs[input.to_sym] = Open.read(file)
182
+ # when :array
183
+ # Log.debug "Reading array #{ input } from #{file}"
184
+ # inputs[input.to_sym] = Open.read(file).split("\n")
185
+ # when :tsv
186
+ # Log.debug "Opening tsv #{ input } from #{file}"
187
+ # inputs[input.to_sym] = TSV.open(file)
188
+ # when :boolean
189
+ # inputs[input.to_sym] = (file.read.strip == 'true')
190
+ # else
191
+ # Log.debug "Loading #{ input } from #{file}"
192
+ # inputs[input.to_sym] = file.read.strip
193
+ # end
194
+
195
+ # end
196
+ # inputs = IndiferentHash.setup(inputs)
197
+
198
+ # dir.glob("*#*").each do |od|
199
+ # name = File.basename(od)
200
+ # value = Open.read(od)
201
+ # Log.debug "Loading override dependency #{ name } as #{value}"
202
+ # inputs[name] = value.chomp
203
+ # end
204
+
205
+ # inputs
206
+ # end
207
+ #end
90
208
  end
91
209
 
92
210
  class Step
93
- def self.save_inputs(inputs, input_types, input_options, dir)
94
- inputs.each do |name,value|
95
- type = input_types[name]
96
- type = type.to_s if type
97
- path = File.join(dir, name.to_s)
98
-
99
- path = path + '.as_io' if (IO === value || Step === value) && ! (input_options[name] && input_options[name][:nofile])
100
- Log.debug "Saving job input #{name} (#{type}) into #{path}"
101
-
102
- case
103
- when IO === value
104
- Open.write(path, value.to_s)
105
- when Step === value
106
- Open.ln_s(value.path, path)
107
- when type.to_s == "binary"
108
- if String === value && File.exists?(value)
109
- value = File.expand_path(value)
110
- Open.ln_s(value, path)
111
- elsif String === value && Misc.is_filename?(value, false)
112
- Open.write(path + '.as_path' , value)
113
- else
114
- Open.write(path, value, :mode => 'wb')
115
- end
116
- when type.to_s == "file"
117
- if String === value && File.exists?(value)
118
- value = File.expand_path(value)
119
- Open.ln_s(value, path)
211
+ def self.save_input(name, value, type, dir)
212
+ path = File.join(dir, name.to_s)
213
+
214
+ case value
215
+ when Path
216
+ if Step === value.resource
217
+ path = path + '.as_step_file'
218
+ else
219
+ path = path + '.as_path'
220
+ end
221
+ when String
222
+ if Misc.is_filename?(value, false)
223
+ value = value.dup
224
+ value.extend Path
225
+ return save_input(name, value, type, dir)
226
+ end
227
+ when IO
228
+ path = path + '.as_io'
229
+ when Step
230
+ value = value.path
231
+ path = path + '.as_step'
232
+ when Array
233
+ case value.first
234
+ when Path
235
+ if Step === value.first.resource
236
+ path = path + '.as_step_file_array'
120
237
  else
121
- value = value.collect{|v| v = "#{v}" if Path === v; v } if Array === value
122
- value = "#{value}" if Path === value
123
- Open.write(path + '.yaml', value.to_yaml)
238
+ path = path + '.as_path_array'
124
239
  end
125
- when Array === value
126
- Open.write(path, value.collect{|v| Step === v ? v.path : v.to_s} * "\n")
127
- when IO === value
128
- if value.filename && String === value.filename && File.exists?(value.filename)
129
- Open.ln_s(value.filename, path)
130
- else
131
- Open.write(path, value)
240
+ when String
241
+ if Misc.is_filename?(value.first, false)
242
+ path = path + '.as_path_array'
132
243
  end
133
- else
134
- Open.write(path, value.to_s)
244
+ when IO
245
+ path = path + '.as_io_array'
246
+ when Step
247
+ path = path + '.as_step_array'
248
+ value = value.collect{|s| s.path }
135
249
  end
250
+
251
+ value = value * "\n"
252
+ end
253
+
254
+ Log.debug "Saving job input #{name} (#{type}) into #{path}"
255
+ Open.write(path, value.to_s)
256
+ end
257
+
258
+ def self.save_inputs(inputs, input_types, input_options, dir)
259
+ inputs.each do |name,value|
260
+ type = input_types[name]
261
+ type = type.to_s if type
262
+
263
+ save_input(name, value, type, dir)
136
264
  end.any?
137
265
  end
138
266
 
139
267
  def self.save_job_inputs(job, dir, options = nil)
140
268
  options = IndiferentHash.setup options.dup if options
141
269
 
142
- task_name = Symbol === job.overriden ? job.overriden : job.task_name
143
- workflow = job.workflow
270
+ task_name = job.original_task_name || job.task_name
271
+ workflow = job.original_workflow || job.workflow
144
272
  workflow = Kernel.const_get workflow if String === workflow
145
273
  if workflow
146
274
  task_info = IndiferentHash.setup(workflow.task_info(task_name))
@@ -176,4 +304,60 @@ class Step
176
304
 
177
305
  inputs.keys
178
306
  end
307
+
308
+ #def self.save_inputs_old(inputs, input_types, input_options, dir)
309
+ # inputs.each do |name,value|
310
+ # type = input_types[name]
311
+ # type = type.to_s if type
312
+ # path = File.join(dir, name.to_s)
313
+
314
+ # if (IO === value || Step === value) && ! (input_options[name] && input_options[name][:nofile])
315
+ # path = path + '.as_io'
316
+ # elsif Misc.is_filename?(value, false)
317
+ # path = path + '.as_filename'
318
+ # end
319
+
320
+ # Log.debug "Saving job input #{name} (#{type}) into #{path}"
321
+
322
+ # case
323
+ # when IO === value
324
+ # Open.write(path, value.to_s)
325
+ # when Step === value
326
+ # Open.ln_s(value.path, path)
327
+ # when type.to_s == "binary"
328
+ # if String === value && File.exists?(value)
329
+ # value = File.expand_path(value)
330
+ # Open.ln_s(value, path)
331
+ # elsif String === value && Misc.is_filename?(value, false)
332
+ # Open.write(path + '.as_path' , value)
333
+ # else
334
+ # Open.write(path, value, :mode => 'wb')
335
+ # end
336
+ # when TSV === value
337
+ # Open.write(path, value.to_s)
338
+ # when Array === value
339
+ # Open.write(path, value.collect{|v| Step === v ? v.path : v.to_s} * "\n")
340
+ # when %w(file tsv array).include?(type.to_s)
341
+ # if String === value && File.exists?(value)
342
+ # value = File.expand_path(value)
343
+ # Open.ln_s(value, path)
344
+ # elsif String === value && Misc.is_filename?(value, false)
345
+ # Open.write(path + '.as_path' , value)
346
+ # else
347
+ # value = value.collect{|v| v = "#{v}" if Path === v; v } if Array === value
348
+ # value = "#{value}" if Path === value
349
+ # Open.write(path + '.yaml', value.to_yaml)
350
+ # end
351
+ # when IO === value
352
+ # if value.filename && String === value.filename && File.exists?(value.filename)
353
+ # Open.ln_s(value.filename, path)
354
+ # else
355
+ # Open.write(path, value)
356
+ # end
357
+ # else
358
+ # Open.write(path, value.to_s)
359
+ # end
360
+ # end.any?
361
+ #end
362
+
179
363
  end
@@ -15,7 +15,7 @@ class Step
15
15
  attr_accessor :exec
16
16
  attr_accessor :relocated
17
17
  attr_accessor :result, :mutex, :seen
18
- attr_accessor :real_inputs, :original_task_name
18
+ attr_accessor :real_inputs, :original_task_name, :original_workflow
19
19
 
20
20
  RBBT_DEBUG_CLEAN = ENV["RBBT_DEBUG_CLEAN"] == 'true'
21
21
 
@@ -376,9 +376,9 @@ class Step
376
376
  }
377
377
  raise "Dependency step not found: #{ name }" if deps.empty?
378
378
  if (deps & self.dependencies).any?
379
- (deps & self.dependencies).first
379
+ (deps & self.dependencies).last
380
380
  else
381
- deps.first
381
+ deps.last
382
382
  end
383
383
  end
384
384
  end
@@ -185,6 +185,10 @@ compile(){
185
185
  local name=$1; shift
186
186
  local extra="$@"
187
187
 
188
+ if [ -f bootstrap ]; then
189
+ ./bootstrap
190
+ fi
191
+
188
192
  if [ -f Makefile -o -f makefile ]; then
189
193
  make -j 4 || exit -1
190
194
  make install || echo "No install"
@@ -22,6 +22,7 @@ $ rbbt slurm list [options]
22
22
  -s--search* Regular expression
23
23
  -t--tail* Show the last lines of the STDERR
24
24
  -l--long Show more entries
25
+ -c--compressed Show compressed information about entries
25
26
  -p--progress Report progress of job and the dependencies
26
27
  -BP--batch_parameters show batch parameters
27
28
  -BPP--batch_procpath show Procpath performance summary
@@ -140,7 +141,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
140
141
  rescue
141
142
  nodes = []
142
143
  end
143
- elsif job_nodes[id]
144
+ elsif job_nodes && job_nodes[id]
144
145
  nodes = job_nodes[id].reject{|n| n.include? "("}
145
146
  else
146
147
  nodes = []
@@ -185,6 +186,42 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
185
186
  end
186
187
 
187
188
 
189
+ count += 1
190
+
191
+ if options[:compressed]
192
+ status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) : Log.color(:green, id)
193
+ if different_system
194
+ status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : Log.color(:green, id)
195
+ else
196
+ status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : (running_jobs.include?(id) || $norunningjobs ? Log.color(:green, id) : Log.color(:red, id) )
197
+ end
198
+ prog_rep = []
199
+ if options[:progress]
200
+ step_line = Open.read(fcmd).split("\n").select{|line| line =~ /^#STEP_PATH:/}.first
201
+ if step_line
202
+ require 'rbbt/workflow'
203
+ step_path = step_line.split(": ").last.strip
204
+ step = Step.new step_path
205
+ step.load_dependencies_from_info
206
+ has_bar = false
207
+ (step.rec_dependencies + [step]).reverse.each do |j|
208
+ next if j.done?
209
+ if j.file(:progress).exists?
210
+ bar = Log::ProgressBar.new
211
+ bar.load(j.file(:progress).yaml)
212
+ rep = bar.report_msg.split("·")[1]
213
+ rep = rep.sub(/.*?(\d+%)/, Log.color(:blue,'\1')).sub(/\-.*/,'')
214
+ prog_rep << [rep]
215
+ end
216
+ end
217
+ end
218
+ end
219
+ workflow, task, name = step_path.split("/")[-3..-1]
220
+ job_str = [Log.color(:yellow, workflow), Log.color(:magenta, task), name] * "/"
221
+ puts [job_str, status, prog_rep ].flatten * " "
222
+ next
223
+ end
224
+
188
225
  puts Log.color :blue, dir
189
226
  puts Log.color(:magenta, "Creation: ") << File.mtime(File.join(dir, 'command.batch')).to_s if long
190
227
  puts Log.color(:magenta, "Started: ") << File.ctime(File.join(dir, 'std.err')).to_s if File.exist?(File.join(dir, 'std.err')) && long
@@ -232,22 +269,22 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
232
269
  cpu_average = {}
233
270
  rss_average = {}
234
271
  perf.through :key, ["ts", 'stat_pid', "stat_utime", "stat_stime", "stat_cutime", "stat_cstime", "stat_rss"] do |k, values|
235
- time, stat_pid, ucpu, scpu, ccpu, cscpu, rss = values
236
- time = time.to_f
237
-
238
- cpu = Misc.sum([ucpu, scpu].collect{|v| v.to_f})
239
- cpu_average[stat_pid] ||= {}
240
- cpu_average[stat_pid][time] ||= []
241
- cpu_average[stat_pid][time] << cpu.to_f
242
- rss_average[time] ||= []
243
- rss_average[time] << rss.to_f * page_size
272
+ time, stat_pid, ucpu, scpu, ccpu, cscpu, rss = values
273
+ time = time.to_f
274
+
275
+ cpu = Misc.sum([ucpu, scpu].collect{|v| v.to_f})
276
+ cpu_average[stat_pid] ||= {}
277
+ cpu_average[stat_pid][time] ||= []
278
+ cpu_average[stat_pid][time] << cpu.to_f
279
+ rss_average[time] ||= []
280
+ rss_average[time] << rss.to_f * page_size
244
281
  end
245
282
 
246
283
  ticks = 0
247
284
  cpu_average.each do |stat_pid, cpu_average_pid|
248
- start = cpu_average_pid.keys.sort.first
249
- eend = cpu_average_pid.keys.sort.last
250
- ticks += Misc.sum(cpu_average_pid[eend]) - Misc.sum(cpu_average_pid[start])
285
+ start = cpu_average_pid.keys.sort.first
286
+ eend = cpu_average_pid.keys.sort.last
287
+ ticks += Misc.sum(cpu_average_pid[eend]) - Misc.sum(cpu_average_pid[start])
251
288
  end
252
289
  start = rss_average.keys.sort.first
253
290
  eend = rss_average.keys.sort.last
@@ -305,12 +342,13 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
305
342
  has_bar = true
306
343
  end
307
344
  end
308
- puts Log.color(:magenta, "Progress: ") + Log.color(:yellow, step.task_signature) + " #{step.status}" unless has_bar
345
+ step_status = step.status
346
+ step_status = Log.color :red, step_status if step_status.to_s == 'cleaned'
347
+ step_status = Log.color :green, step_status if step_status.to_s == 'done'
348
+ puts Log.color(:magenta, "Progress: ") + Log.color(:yellow, step.task_signature) + " #{step_status}" unless has_bar
309
349
  end
310
350
  end
311
351
 
312
- count += 1
313
-
314
352
  end
315
353
 
316
354
  puts
@@ -60,5 +60,6 @@ class Step
60
60
  end
61
61
  end
62
62
 
63
- ARGV.concat ["-W", $slurm_options[:workflows], '--detach'] if $slurm_options[:workflows]
63
+ ARGV.concat ['--detach']
64
+ ARGV.concat ["-W", $slurm_options[:workflows]] if $slurm_options[:workflows]
64
65
  load Rbbt.share.rbbt_commands.workflow.task.find
@@ -57,6 +57,7 @@ else
57
57
  step_path = nil
58
58
  end
59
59
 
60
+ puts Log.color(:magenta, "Directory: ") + directory if directory
60
61
  puts Log.color(:magenta, "Step path: ") + step_path if step_path
61
62
 
62
63
  HPC::BATCH_MODULE.follow_job directory, true
@@ -22,6 +22,7 @@ $ rbbt slurm list [options]
22
22
  -s--search* Regular expression
23
23
  -t--tail* Show the last lines of the STDERR
24
24
  -l--long Show more entries
25
+ -c--compressed Show compressed information about entries
25
26
  -p--progress Report progress of job and the dependencies
26
27
  -BP--batch_parameters show batch parameters
27
28
  -BPP--batch_procpath show Procpath performance summary
@@ -140,7 +141,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
140
141
  rescue
141
142
  nodes = []
142
143
  end
143
- elsif job_nodes[id]
144
+ elsif job_nodes && job_nodes[id]
144
145
  nodes = job_nodes[id].reject{|n| n.include? "("}
145
146
  else
146
147
  nodes = []
@@ -185,6 +186,42 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
185
186
  end
186
187
 
187
188
 
189
+ count += 1
190
+
191
+ if options[:compressed]
192
+ status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) : Log.color(:green, id)
193
+ if different_system
194
+ status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : Log.color(:green, id)
195
+ else
196
+ status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : (running_jobs.include?(id) || $norunningjobs ? Log.color(:green, id) : Log.color(:red, id) )
197
+ end
198
+ prog_rep = []
199
+ if options[:progress]
200
+ step_line = Open.read(fcmd).split("\n").select{|line| line =~ /^#STEP_PATH:/}.first
201
+ if step_line
202
+ require 'rbbt/workflow'
203
+ step_path = step_line.split(": ").last.strip
204
+ step = Step.new step_path
205
+ step.load_dependencies_from_info
206
+ has_bar = false
207
+ (step.rec_dependencies + [step]).reverse.each do |j|
208
+ next if j.done?
209
+ if j.file(:progress).exists?
210
+ bar = Log::ProgressBar.new
211
+ bar.load(j.file(:progress).yaml)
212
+ rep = bar.report_msg.split("·")[1]
213
+ rep = rep.sub(/.*?(\d+%)/, Log.color(:blue,'\1')).sub(/\-.*/,'')
214
+ prog_rep << [rep]
215
+ end
216
+ end
217
+ end
218
+ end
219
+ workflow, task, name = step_path.split("/")[-3..-1]
220
+ job_str = [Log.color(:yellow, workflow), Log.color(:magenta, task), name] * "/"
221
+ puts [job_str, status, prog_rep ].flatten * " "
222
+ next
223
+ end
224
+
188
225
  puts Log.color :blue, dir
189
226
  puts Log.color(:magenta, "Creation: ") << File.mtime(File.join(dir, 'command.batch')).to_s if long
190
227
  puts Log.color(:magenta, "Started: ") << File.ctime(File.join(dir, 'std.err')).to_s if File.exist?(File.join(dir, 'std.err')) && long
@@ -232,22 +269,22 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
232
269
  cpu_average = {}
233
270
  rss_average = {}
234
271
  perf.through :key, ["ts", 'stat_pid', "stat_utime", "stat_stime", "stat_cutime", "stat_cstime", "stat_rss"] do |k, values|
235
- time, stat_pid, ucpu, scpu, ccpu, cscpu, rss = values
236
- time = time.to_f
237
-
238
- cpu = Misc.sum([ucpu, scpu].collect{|v| v.to_f})
239
- cpu_average[stat_pid] ||= {}
240
- cpu_average[stat_pid][time] ||= []
241
- cpu_average[stat_pid][time] << cpu.to_f
242
- rss_average[time] ||= []
243
- rss_average[time] << rss.to_f * page_size
272
+ time, stat_pid, ucpu, scpu, ccpu, cscpu, rss = values
273
+ time = time.to_f
274
+
275
+ cpu = Misc.sum([ucpu, scpu].collect{|v| v.to_f})
276
+ cpu_average[stat_pid] ||= {}
277
+ cpu_average[stat_pid][time] ||= []
278
+ cpu_average[stat_pid][time] << cpu.to_f
279
+ rss_average[time] ||= []
280
+ rss_average[time] << rss.to_f * page_size
244
281
  end
245
282
 
246
283
  ticks = 0
247
284
  cpu_average.each do |stat_pid, cpu_average_pid|
248
- start = cpu_average_pid.keys.sort.first
249
- eend = cpu_average_pid.keys.sort.last
250
- ticks += Misc.sum(cpu_average_pid[eend]) - Misc.sum(cpu_average_pid[start])
285
+ start = cpu_average_pid.keys.sort.first
286
+ eend = cpu_average_pid.keys.sort.last
287
+ ticks += Misc.sum(cpu_average_pid[eend]) - Misc.sum(cpu_average_pid[start])
251
288
  end
252
289
  start = rss_average.keys.sort.first
253
290
  eend = rss_average.keys.sort.last
@@ -305,12 +342,13 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
305
342
  has_bar = true
306
343
  end
307
344
  end
308
- puts Log.color(:magenta, "Progress: ") + Log.color(:yellow, step.task_signature) + " #{step.status}" unless has_bar
345
+ step_status = step.status
346
+ step_status = Log.color :red, step_status if step_status.to_s == 'cleaned'
347
+ step_status = Log.color :green, step_status if step_status.to_s == 'done'
348
+ puts Log.color(:magenta, "Progress: ") + Log.color(:yellow, step.task_signature) + " #{step_status}" unless has_bar
309
349
  end
310
350
  end
311
351
 
312
- count += 1
313
-
314
352
  end
315
353
 
316
354
  puts
@@ -60,5 +60,6 @@ class Step
60
60
  end
61
61
  end
62
62
 
63
- ARGV.concat ["-W", $slurm_options[:workflows], '--detach'] if $slurm_options[:workflows]
63
+ ARGV.concat ['--detach']
64
+ ARGV.concat ["-W", $slurm_options[:workflows]] if $slurm_options[:workflows]
64
65
  load Rbbt.share.rbbt_commands.workflow.task.find
@@ -57,6 +57,7 @@ else
57
57
  step_path = nil
58
58
  end
59
59
 
60
+ puts Log.color(:magenta, "Directory: ") + directory if directory
60
61
  puts Log.color(:magenta, "Step path: ") + step_path if step_path
61
62
 
62
63
  HPC::BATCH_MODULE.follow_job directory, true
@@ -22,6 +22,7 @@ $ rbbt slurm list [options]
22
22
  -s--search* Regular expression
23
23
  -t--tail* Show the last lines of the STDERR
24
24
  -l--long Show more entries
25
+ -c--compressed Show compressed information about entries
25
26
  -p--progress Report progress of job and the dependencies
26
27
  -BP--batch_parameters show batch parameters
27
28
  -BPP--batch_procpath show Procpath performance summary
@@ -140,7 +141,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
140
141
  rescue
141
142
  nodes = []
142
143
  end
143
- elsif job_nodes[id]
144
+ elsif job_nodes && job_nodes[id]
144
145
  nodes = job_nodes[id].reject{|n| n.include? "("}
145
146
  else
146
147
  nodes = []
@@ -185,6 +186,42 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
185
186
  end
186
187
 
187
188
 
189
+ count += 1
190
+
191
+ if options[:compressed]
192
+ status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) : Log.color(:green, id)
193
+ if different_system
194
+ status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : Log.color(:green, id)
195
+ else
196
+ status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : (running_jobs.include?(id) || $norunningjobs ? Log.color(:green, id) : Log.color(:red, id) )
197
+ end
198
+ prog_rep = []
199
+ if options[:progress]
200
+ step_line = Open.read(fcmd).split("\n").select{|line| line =~ /^#STEP_PATH:/}.first
201
+ if step_line
202
+ require 'rbbt/workflow'
203
+ step_path = step_line.split(": ").last.strip
204
+ step = Step.new step_path
205
+ step.load_dependencies_from_info
206
+ has_bar = false
207
+ (step.rec_dependencies + [step]).reverse.each do |j|
208
+ next if j.done?
209
+ if j.file(:progress).exists?
210
+ bar = Log::ProgressBar.new
211
+ bar.load(j.file(:progress).yaml)
212
+ rep = bar.report_msg.split("·")[1]
213
+ rep = rep.sub(/.*?(\d+%)/, Log.color(:blue,'\1')).sub(/\-.*/,'')
214
+ prog_rep << [rep]
215
+ end
216
+ end
217
+ end
218
+ end
219
+ workflow, task, name = step_path.split("/")[-3..-1]
220
+ job_str = [Log.color(:yellow, workflow), Log.color(:magenta, task), name] * "/"
221
+ puts [job_str, status, prog_rep ].flatten * " "
222
+ next
223
+ end
224
+
188
225
  puts Log.color :blue, dir
189
226
  puts Log.color(:magenta, "Creation: ") << File.mtime(File.join(dir, 'command.batch')).to_s if long
190
227
  puts Log.color(:magenta, "Started: ") << File.ctime(File.join(dir, 'std.err')).to_s if File.exist?(File.join(dir, 'std.err')) && long
@@ -232,22 +269,22 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
232
269
  cpu_average = {}
233
270
  rss_average = {}
234
271
  perf.through :key, ["ts", 'stat_pid', "stat_utime", "stat_stime", "stat_cutime", "stat_cstime", "stat_rss"] do |k, values|
235
- time, stat_pid, ucpu, scpu, ccpu, cscpu, rss = values
236
- time = time.to_f
237
-
238
- cpu = Misc.sum([ucpu, scpu].collect{|v| v.to_f})
239
- cpu_average[stat_pid] ||= {}
240
- cpu_average[stat_pid][time] ||= []
241
- cpu_average[stat_pid][time] << cpu.to_f
242
- rss_average[time] ||= []
243
- rss_average[time] << rss.to_f * page_size
272
+ time, stat_pid, ucpu, scpu, ccpu, cscpu, rss = values
273
+ time = time.to_f
274
+
275
+ cpu = Misc.sum([ucpu, scpu].collect{|v| v.to_f})
276
+ cpu_average[stat_pid] ||= {}
277
+ cpu_average[stat_pid][time] ||= []
278
+ cpu_average[stat_pid][time] << cpu.to_f
279
+ rss_average[time] ||= []
280
+ rss_average[time] << rss.to_f * page_size
244
281
  end
245
282
 
246
283
  ticks = 0
247
284
  cpu_average.each do |stat_pid, cpu_average_pid|
248
- start = cpu_average_pid.keys.sort.first
249
- eend = cpu_average_pid.keys.sort.last
250
- ticks += Misc.sum(cpu_average_pid[eend]) - Misc.sum(cpu_average_pid[start])
285
+ start = cpu_average_pid.keys.sort.first
286
+ eend = cpu_average_pid.keys.sort.last
287
+ ticks += Misc.sum(cpu_average_pid[eend]) - Misc.sum(cpu_average_pid[start])
251
288
  end
252
289
  start = rss_average.keys.sort.first
253
290
  eend = rss_average.keys.sort.last
@@ -305,12 +342,13 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
305
342
  has_bar = true
306
343
  end
307
344
  end
308
- puts Log.color(:magenta, "Progress: ") + Log.color(:yellow, step.task_signature) + " #{step.status}" unless has_bar
345
+ step_status = step.status
346
+ step_status = Log.color :red, step_status if step_status.to_s == 'cleaned'
347
+ step_status = Log.color :green, step_status if step_status.to_s == 'done'
348
+ puts Log.color(:magenta, "Progress: ") + Log.color(:yellow, step.task_signature) + " #{step_status}" unless has_bar
309
349
  end
310
350
  end
311
351
 
312
- count += 1
313
-
314
352
  end
315
353
 
316
354
  puts
@@ -60,5 +60,6 @@ class Step
60
60
  end
61
61
  end
62
62
 
63
- ARGV.concat ["-W", $slurm_options[:workflows], '--detach'] if $slurm_options[:workflows]
63
+ ARGV.concat ['--detach']
64
+ ARGV.concat ["-W", $slurm_options[:workflows]] if $slurm_options[:workflows]
64
65
  load Rbbt.share.rbbt_commands.workflow.task.find
@@ -57,6 +57,7 @@ else
57
57
  step_path = nil
58
58
  end
59
59
 
60
+ puts Log.color(:magenta, "Directory: ") + directory if directory
60
61
  puts Log.color(:magenta, "Step path: ") + step_path if step_path
61
62
 
62
63
  HPC::BATCH_MODULE.follow_job directory, true
@@ -76,6 +76,16 @@ def fix_options(workflow, task, job_options)
76
76
  type = input_types[name]
77
77
  type = type.to_sym if type
78
78
 
79
+ if Step === value
80
+ job_options_cleaned[name] = value
81
+ next
82
+ end
83
+
84
+ if Path === value && Step === value.resource
85
+ job_options_cleaned[name] = value
86
+ next
87
+ end
88
+
79
89
  value = case type
80
90
  when nil
81
91
  value
@@ -148,6 +158,7 @@ def fix_options(workflow, task, job_options)
148
158
  else
149
159
  value
150
160
  end
161
+
151
162
  job_options_cleaned[name] = value
152
163
  end
153
164
 
@@ -26,11 +26,26 @@ module TestSaveLoadWF
26
26
  task :prefix => :array do
27
27
  step(:reverse).run.collect{|e| "A-#{e}" }
28
28
  end
29
+
30
+ input :integer, :integer
31
+ input :float, :float
32
+ input :file, :file
33
+ input :file_no_file, :file, "", nil, :nofile => true
34
+ input :string, :string
35
+ input :select, :select
36
+ input :array, :array
37
+ input :array_no_file, :array, "", nil, :nofile => true
38
+ input :tsv, :tsv, "", nil, :nofile => true
39
+ input :tsv_no_file, :tsv, "", nil, :nofile => true
40
+ input :binary, :binary, "", nil, :nofile => true
41
+ input :binary_no_file, :tsv, "", nil, :nofile => true
42
+ task :save_test => :string do
43
+ "DONE"
44
+ end
29
45
  end
30
46
 
31
47
  class TestSaveLoad < Test::Unit::TestCase
32
48
  def test_save
33
- Log.with_severity 0 do
34
49
  job = TestSaveLoadWF.job(:prefix)
35
50
  job.recursive_clean
36
51
  job = TestSaveLoadWF.job(:prefix)
@@ -40,6 +55,81 @@ class TestSaveLoad < Test::Unit::TestCase
40
55
  newjob = TestSaveLoadWF.job_for_directory_inputs(:reverse, directory)
41
56
  assert_equal job.rec_dependencies.last.path, newjob.path
42
57
  end
58
+ end
59
+
60
+ def test_save_all_normal
61
+ tsv = TSV.setup({}, "Key~Value#:type=:single")
62
+ tsv["key"] = "value"
63
+ options = {
64
+ :float => 0.5,
65
+ :integer => 15,
66
+ :string => "STRING",
67
+ :select => "option",
68
+ :array => [0,1,2,3],
69
+ :tsv => tsv,
70
+ }
71
+ Log.with_severity 0 do
72
+ Misc.with_env "RBBT_DEBUG_JOB_HASH", "true" do
73
+ job = TestSaveLoadWF.job(:save_test, nil, options)
74
+ TmpFile.with_file do |directory|
75
+ Step.save_job_inputs(job, directory)
76
+ newjob = TestSaveLoadWF.job_for_directory_inputs(:save_test, directory)
77
+ assert_equal job.path, newjob.path
78
+ end
79
+ end
80
+ end
81
+ end
82
+
83
+ def test_save_all_file
84
+ tsv = TSV.setup({}, "Key~Value#:type=:single")
85
+ tsv["key"] = "value"
86
+ Log.with_severity 0 do
87
+ Misc.with_env "RBBT_DEBUG_JOB_HASH", "true" do
88
+ TmpFile.with_file do |input_file|
89
+ Path.setup(input_file)
90
+ options = {
91
+ :float => input_file.float,
92
+ :integer => input_file.integer,
93
+ :string => input_file.string,
94
+ :select => input_file.select,
95
+ :array => input_file.array,
96
+ :tsv => input_file.tsv_file,
97
+ }
98
+ job = TestSaveLoadWF.job(:save_test, nil, options)
99
+ TmpFile.with_file do |directory|
100
+ Step.save_job_inputs(job, directory)
101
+ newjob = TestSaveLoadWF.job_for_directory_inputs(:save_test, directory)
102
+ assert_equal job.path, newjob.path
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
108
+
109
+ def test_save_all_job_file
110
+ tsv = TSV.setup({}, "Key~Value#:type=:single")
111
+ tsv["key"] = "value"
112
+ Log.with_severity 0 do
113
+ Misc.with_env "RBBT_DEBUG_JOB_HASH", "true" do
114
+ TmpFile.with_file do |input_file|
115
+ Path.setup(input_file)
116
+ options = {
117
+ :float => input_file.float,
118
+ :integer => input_file.integer,
119
+ :string => input_file.string,
120
+ :select => input_file.select,
121
+ :array => TestSaveLoadWF.job(:list),
122
+ :binary => TestSaveLoadWF.job(:list).file('binary'),
123
+ :tsv => input_file.tsv_file,
124
+ }
125
+ job = TestSaveLoadWF.job(:save_test, nil, options)
126
+ TmpFile.with_file do |directory|
127
+ Step.save_job_inputs(job, directory)
128
+ newjob = TestSaveLoadWF.job_for_directory_inputs(:save_test, directory)
129
+ assert_equal job.path, newjob.path
130
+ end
131
+ end
132
+ end
43
133
  end
44
134
  end
45
135
  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.33.7
4
+ version: 5.33.11
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-03-10 00:00:00.000000000 Z
11
+ date: 2022-04-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake