rbbt-util 5.44.1 → 6.0.4

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.
Files changed (175) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/bin/rbbt +67 -90
  4. data/bin/rbbt_exec.rb +2 -2
  5. data/etc/app.d/base.rb +2 -2
  6. data/etc/app.d/semaphores.rb +3 -3
  7. data/lib/rbbt/annotations/annotated_array.rb +207 -207
  8. data/lib/rbbt/annotations/refactor.rb +27 -0
  9. data/lib/rbbt/annotations/util.rb +282 -282
  10. data/lib/rbbt/annotations.rb +343 -320
  11. data/lib/rbbt/association/database.rb +200 -225
  12. data/lib/rbbt/association/index.rb +294 -291
  13. data/lib/rbbt/association/item.rb +227 -227
  14. data/lib/rbbt/association/open.rb +35 -34
  15. data/lib/rbbt/association/util.rb +0 -169
  16. data/lib/rbbt/association.rb +2 -4
  17. data/lib/rbbt/entity/identifiers.rb +119 -118
  18. data/lib/rbbt/entity/refactor.rb +12 -0
  19. data/lib/rbbt/entity.rb +319 -315
  20. data/lib/rbbt/hpc/batch.rb +72 -53
  21. data/lib/rbbt/hpc/lsf.rb +2 -2
  22. data/lib/rbbt/hpc/orchestrate/batches.rb +2 -2
  23. data/lib/rbbt/hpc/orchestrate/chains.rb +25 -5
  24. data/lib/rbbt/hpc/orchestrate/rules.rb +2 -2
  25. data/lib/rbbt/hpc/orchestrate.rb +19 -13
  26. data/lib/rbbt/hpc/slurm.rb +18 -18
  27. data/lib/rbbt/knowledge_base/entity.rb +13 -5
  28. data/lib/rbbt/knowledge_base/query.rb +2 -2
  29. data/lib/rbbt/knowledge_base/registry.rb +32 -31
  30. data/lib/rbbt/knowledge_base/traverse.rb +1 -1
  31. data/lib/rbbt/knowledge_base.rb +1 -1
  32. data/lib/rbbt/monitor.rb +36 -25
  33. data/lib/rbbt/persist/refactor.rb +166 -0
  34. data/lib/rbbt/persist/tsv/tokyocabinet.rb +105 -105
  35. data/lib/rbbt/persist/tsv.rb +187 -185
  36. data/lib/rbbt/persist.rb +556 -551
  37. data/lib/rbbt/refactor.rb +20 -0
  38. data/lib/rbbt/resource/path/refactor.rb +178 -0
  39. data/lib/rbbt/resource/path.rb +317 -497
  40. data/lib/rbbt/resource/util.rb +0 -48
  41. data/lib/rbbt/resource.rb +3 -390
  42. data/lib/rbbt/tsv/accessor.rb +2 -838
  43. data/lib/rbbt/tsv/attach.rb +303 -299
  44. data/lib/rbbt/tsv/change_id.rb +244 -245
  45. data/lib/rbbt/tsv/csv.rb +87 -85
  46. data/lib/rbbt/tsv/dumper.rb +2 -100
  47. data/lib/rbbt/tsv/excel.rb +26 -24
  48. data/lib/rbbt/tsv/field_index.rb +4 -1
  49. data/lib/rbbt/tsv/filter.rb +3 -2
  50. data/lib/rbbt/tsv/index.rb +2 -284
  51. data/lib/rbbt/tsv/manipulate.rb +750 -747
  52. data/lib/rbbt/tsv/marshal.rb +3 -3
  53. data/lib/rbbt/tsv/matrix.rb +2 -2
  54. data/lib/rbbt/tsv/parallel/through.rb +2 -1
  55. data/lib/rbbt/tsv/parallel/traverse.rb +783 -781
  56. data/lib/rbbt/tsv/parser.rb +678 -678
  57. data/lib/rbbt/tsv/refactor.rb +195 -0
  58. data/lib/rbbt/tsv/stream.rb +253 -251
  59. data/lib/rbbt/tsv/util.rb +420 -420
  60. data/lib/rbbt/tsv.rb +210 -208
  61. data/lib/rbbt/util/R/eval.rb +4 -4
  62. data/lib/rbbt/util/R/plot.rb +62 -166
  63. data/lib/rbbt/util/R.rb +21 -18
  64. data/lib/rbbt/util/cmd.rb +2 -318
  65. data/lib/rbbt/util/color.rb +269 -269
  66. data/lib/rbbt/util/colorize.rb +89 -89
  67. data/lib/rbbt/util/concurrency/processes/refactor.rb +22 -0
  68. data/lib/rbbt/util/concurrency/processes/worker.rb +2 -2
  69. data/lib/rbbt/util/concurrency/processes.rb +389 -386
  70. data/lib/rbbt/util/config.rb +169 -167
  71. data/lib/rbbt/util/filecache.rb +1 -1
  72. data/lib/rbbt/util/iruby.rb +20 -0
  73. data/lib/rbbt/util/log/progress/report.rb +241 -241
  74. data/lib/rbbt/util/log/progress/util.rb +99 -99
  75. data/lib/rbbt/util/log/progress.rb +102 -102
  76. data/lib/rbbt/util/log/refactor.rb +49 -0
  77. data/lib/rbbt/util/log.rb +486 -532
  78. data/lib/rbbt/util/migrate.rb +2 -2
  79. data/lib/rbbt/util/misc/concurrent_stream.rb +248 -246
  80. data/lib/rbbt/util/misc/development.rb +12 -11
  81. data/lib/rbbt/util/misc/exceptions.rb +117 -112
  82. data/lib/rbbt/util/misc/format.rb +2 -230
  83. data/lib/rbbt/util/misc/indiferent_hash.rb +2 -107
  84. data/lib/rbbt/util/misc/inspect.rb +2 -476
  85. data/lib/rbbt/util/misc/lock.rb +109 -106
  86. data/lib/rbbt/util/misc/omics.rb +9 -1
  87. data/lib/rbbt/util/misc/pipes.rb +765 -793
  88. data/lib/rbbt/util/misc/refactor.rb +20 -0
  89. data/lib/rbbt/util/misc/ssw.rb +27 -17
  90. data/lib/rbbt/util/misc/system.rb +92 -105
  91. data/lib/rbbt/util/misc.rb +39 -20
  92. data/lib/rbbt/util/named_array/refactor.rb +4 -0
  93. data/lib/rbbt/util/named_array.rb +3 -220
  94. data/lib/rbbt/util/open/refactor.rb +7 -0
  95. data/lib/rbbt/util/open.rb +3 -857
  96. data/lib/rbbt/util/procpath.rb +6 -6
  97. data/lib/rbbt/util/python/paths.rb +27 -0
  98. data/lib/rbbt/util/python/run.rb +115 -0
  99. data/lib/rbbt/util/python/script.rb +110 -0
  100. data/lib/rbbt/util/python/util.rb +3 -3
  101. data/lib/rbbt/util/python.rb +22 -81
  102. data/lib/rbbt/util/semaphore.rb +152 -148
  103. data/lib/rbbt/util/simpleopt.rb +9 -8
  104. data/lib/rbbt/util/ssh/refactor.rb +19 -0
  105. data/lib/rbbt/util/ssh.rb +122 -118
  106. data/lib/rbbt/util/tar.rb +117 -115
  107. data/lib/rbbt/util/tmpfile.rb +69 -67
  108. data/lib/rbbt/util/version.rb +2 -0
  109. data/lib/rbbt/workflow/refactor/entity.rb +11 -0
  110. data/lib/rbbt/workflow/refactor/export.rb +66 -0
  111. data/lib/rbbt/workflow/refactor/inputs.rb +24 -0
  112. data/lib/rbbt/workflow/refactor/recursive.rb +64 -0
  113. data/lib/rbbt/workflow/refactor/task_info.rb +66 -0
  114. data/lib/rbbt/workflow/refactor.rb +150 -0
  115. data/lib/rbbt/workflow/remote_workflow/driver/rest.rb +1 -2
  116. data/lib/rbbt/workflow/remote_workflow/driver/ssh.rb +55 -32
  117. data/lib/rbbt/workflow/remote_workflow/remote_step/rest.rb +3 -1
  118. data/lib/rbbt/workflow/remote_workflow/remote_step/ssh.rb +14 -5
  119. data/lib/rbbt/workflow/remote_workflow/remote_step.rb +19 -7
  120. data/lib/rbbt/workflow/remote_workflow.rb +6 -1
  121. data/lib/rbbt/workflow/step/run.rb +766 -766
  122. data/lib/rbbt/workflow/step/save_load_inputs.rb +254 -254
  123. data/lib/rbbt/workflow/step.rb +2 -362
  124. data/lib/rbbt/workflow/task.rb +118 -118
  125. data/lib/rbbt/workflow/usage.rb +289 -287
  126. data/lib/rbbt/workflow/util/archive.rb +6 -5
  127. data/lib/rbbt/workflow/util/data.rb +1 -1
  128. data/lib/rbbt/workflow/util/orchestrator.rb +249 -246
  129. data/lib/rbbt/workflow/util/trace.rb +79 -44
  130. data/lib/rbbt/workflow.rb +4 -882
  131. data/lib/rbbt-util.rb +21 -13
  132. data/lib/rbbt.rb +16 -3
  133. data/python/rbbt/__init__.py +96 -4
  134. data/python/rbbt/workflow/remote.py +104 -0
  135. data/python/rbbt/workflow.py +64 -0
  136. data/python/test.py +10 -0
  137. data/share/Rlib/plot.R +37 -37
  138. data/share/Rlib/svg.R +22 -5
  139. data/share/install/software/lib/install_helpers +1 -1
  140. data/share/rbbt_commands/hpc/list +2 -3
  141. data/share/rbbt_commands/hpc/orchestrate +4 -4
  142. data/share/rbbt_commands/hpc/tail +2 -0
  143. data/share/rbbt_commands/hpc/task +10 -7
  144. data/share/rbbt_commands/lsf/list +2 -3
  145. data/share/rbbt_commands/lsf/orchestrate +4 -4
  146. data/share/rbbt_commands/lsf/tail +2 -0
  147. data/share/rbbt_commands/lsf/task +10 -7
  148. data/share/rbbt_commands/migrate +1 -1
  149. data/share/rbbt_commands/pbs/list +2 -3
  150. data/share/rbbt_commands/pbs/orchestrate +4 -4
  151. data/share/rbbt_commands/pbs/tail +2 -0
  152. data/share/rbbt_commands/pbs/task +10 -7
  153. data/share/rbbt_commands/resource/produce +8 -1
  154. data/share/rbbt_commands/slurm/list +2 -3
  155. data/share/rbbt_commands/slurm/orchestrate +4 -4
  156. data/share/rbbt_commands/slurm/tail +2 -0
  157. data/share/rbbt_commands/slurm/task +10 -7
  158. data/share/rbbt_commands/system/clean +5 -5
  159. data/share/rbbt_commands/system/status +5 -5
  160. data/share/rbbt_commands/tsv/get +2 -3
  161. data/share/rbbt_commands/tsv/info +10 -13
  162. data/share/rbbt_commands/tsv/keys +18 -14
  163. data/share/rbbt_commands/tsv/slice +2 -2
  164. data/share/rbbt_commands/tsv/transpose +6 -2
  165. data/share/rbbt_commands/workflow/info +20 -24
  166. data/share/rbbt_commands/workflow/list +1 -1
  167. data/share/rbbt_commands/workflow/prov +20 -13
  168. data/share/rbbt_commands/workflow/retry +43 -0
  169. data/share/rbbt_commands/workflow/server +12 -2
  170. data/share/rbbt_commands/workflow/task +80 -73
  171. data/share/rbbt_commands/workflow/write_info +26 -9
  172. data/share/software/opt/ssw/ssw.c +861 -0
  173. data/share/software/opt/ssw/ssw.h +130 -0
  174. data/share/workflow_config.ru +3 -3
  175. metadata +45 -6
@@ -1,14 +1,16 @@
1
1
  require 'rbbt/util/R'
2
+ require 'rbbt/util/misc/math'
3
+ require 'rbbt/util/misc/manipulation'
2
4
 
3
5
  module Workflow
4
- def self.trace_job_times(jobs, fix_gap = false)
6
+ def self.trace_job_times(jobs, fix_gap = false, report_keys = nil)
5
7
  data = TSV.setup({}, "Job~Code,Workflow,Task,Start,End#:type=:list")
6
8
  min_start = nil
7
9
  max_done = nil
8
10
  jobs.each do |job|
9
- next unless job.info[:done]
10
- started = job.info[:started]
11
- ddone = job.info[:done]
11
+ next unless job.info[:end]
12
+ started = job.info[:start]
13
+ ddone = job.info[:end]
12
14
 
13
15
  started = Time.parse started if String === started
14
16
  ddone = Time.parse ddone if String === ddone
@@ -71,11 +73,42 @@ module Workflow
71
73
  Log.info "Total gaps: #{total_gaps} seconds"
72
74
  end
73
75
 
76
+ if report_keys && report_keys.any?
77
+ job_keys = {}
78
+ jobs.each do |job|
79
+ job_info = IndiferentHash.setup(job.info)
80
+ report_keys.each do |key|
81
+ job_keys[job.path] ||= {}
82
+ job_keys[job.path][key] = job_info[key]
83
+ end
84
+ end
85
+ report_keys.each do |key|
86
+ data.add_field Misc.humanize(key) do |p,values|
87
+ job_keys[p][key]
88
+ end
89
+ end
90
+ end
91
+
74
92
  start = data.column("Start.second").values.flatten.collect{|v| v.to_f}.min
75
93
  eend = data.column("End.second").values.flatten.collect{|v| v.to_f}.max
76
94
  total = eend - start unless eend.nil? || start.nil?
77
95
  Log.info "Total time elapsed: #{total} seconds" if total
78
96
 
97
+ if report_keys && report_keys.any?
98
+ job_keys = {}
99
+ report_keys.each do |key|
100
+ jobs.each do |job|
101
+ job_keys[job.path] ||= {}
102
+ job_keys[job.path][key] = job.info[key]
103
+ end
104
+ end
105
+ report_keys.each do |key|
106
+ data.add_field Misc.humanize(key) do |p,values|
107
+ job_keys[p][key]
108
+ end
109
+ end
110
+ end
111
+
79
112
  data
80
113
  end
81
114
 
@@ -95,41 +128,41 @@ data$Project = data$Workflow
95
128
  tasks = data
96
129
 
97
130
  #theme_gantt <- function(base_size=11, base_family="Source Sans Pro Light") {
98
- theme_gantt <- function(base_size=11, base_family="Sans Serif") {
99
- ret <- theme_bw(base_size, base_family) %+replace%
100
- theme(panel.background = element_rect(fill="#ffffff", colour=NA),
101
- axis.title.x=element_text(vjust=-0.2), axis.title.y=element_text(vjust=1.5),
102
- title=element_text(vjust=1.2, family="Source Sans Pro Semibold"),
103
- panel.border = element_blank(), axis.line=element_blank(),
104
- panel.grid.minor=element_blank(),
105
- panel.grid.major.y = element_blank(),
106
- panel.grid.major.x = element_line(size=0.5, colour="grey80"),
107
- axis.ticks=element_blank(),
108
- legend.position="bottom",
109
- axis.title=element_text(size=rel(1.2), family="Source Sans Pro Semibold"),
110
- strip.text=element_text(size=rel(1.5), family="Source Sans Pro Semibold"),
111
- strip.background=element_rect(fill="#ffffff", colour=NA),
112
- panel.spacing.y=unit(1.5, "lines"),
113
- legend.key = element_blank())
114
-
115
- ret
116
- }
117
-
118
- tasks.long <- tasks %>%
119
- gather(date.type, task.date, -c(Code,Project, Task, id, Start.second, End.second)) %>%
120
- arrange(date.type, task.date) %>%
121
- mutate(id = factor(id, levels=rev(unique(id)), ordered=TRUE))
122
-
123
- x.breaks <- seq(length(tasks$Task) + 0.5 - 3, 0, by=-3)
124
-
125
- timeline <- ggplot(tasks.long, aes(y=id, yend=id, x=Start.second, xend=End.second, colour=Task)) +
126
- geom_segment() +
127
- geom_vline(xintercept=x.breaks, colour="grey80", linetype="dotted") +
128
- guides(colour=guide_legend(title=NULL)) +
129
- labs(x=NULL, y=NULL) +
130
- theme_gantt() + theme(axis.text.x=element_text(angle=45, hjust=1))
131
-
132
- rbbt.png_plot('#{plot}', 'plot(timeline)', width=#{width}, height=#{height}, pointsize=6)
131
+ theme_gantt <- function(base_size=11, base_family="Sans Serif") {
132
+ ret <- theme_bw(base_size, base_family) %+replace%
133
+ theme(panel.background = element_rect(fill="#ffffff", colour=NA),
134
+ axis.title.x=element_text(vjust=-0.2), axis.title.y=element_text(vjust=1.5),
135
+ title=element_text(vjust=1.2, family="Source Sans Pro Semibold"),
136
+ panel.border = element_blank(), axis.line=element_blank(),
137
+ panel.grid.minor=element_blank(),
138
+ panel.grid.major.y = element_blank(),
139
+ panel.grid.major.x = element_line(size=0.5, colour="grey80"),
140
+ axis.ticks=element_blank(),
141
+ legend.position="bottom",
142
+ axis.title=element_text(size=rel(1.2), family="Source Sans Pro Semibold"),
143
+ strip.text=element_text(size=rel(1.5), family="Source Sans Pro Semibold"),
144
+ strip.background=element_rect(fill="#ffffff", colour=NA),
145
+ panel.spacing.y=unit(1.5, "lines"),
146
+ legend.key = element_blank())
147
+
148
+ ret
149
+ }
150
+
151
+ tasks.long <- tasks %>%
152
+ gather(date.type, task.date, -c(Code,Project, Task, id, Start.second, End.second)) %>%
153
+ arrange(date.type, task.date) %>%
154
+ mutate(id = factor(id, levels=rev(unique(id)), ordered=TRUE))
155
+
156
+ x.breaks <- seq(length(tasks$Task) + 0.5 - 3, 0, by=-3)
157
+
158
+ timeline <- ggplot(tasks.long, aes(y=id, yend=id, x=Start.second, xend=End.second, colour=Task)) +
159
+ geom_segment() +
160
+ geom_vline(xintercept=x.breaks, colour="grey80", linetype="dotted") +
161
+ guides(colour=guide_legend(title=NULL)) +
162
+ labs(x=NULL, y=NULL) +
163
+ theme_gantt() + theme(axis.text.x=element_text(angle=45, hjust=1))
164
+
165
+ rbbt.png_plot('#{plot}', 'plot(timeline)', width=#{width}, height=#{height}, pointsize=6)
133
166
  EOF
134
167
  end
135
168
 
@@ -139,13 +172,13 @@ rbbt.png_plot('#{plot}', 'plot(timeline)', width=#{width}, height=#{height}, poi
139
172
  report_keys = report_keys.collect{|k| k.to_s}
140
173
 
141
174
  jobs.each do |dep|
142
- next unless dep.info[:done]
175
+ next unless dep.info[:end]
143
176
  task = [dep.workflow, dep.task_name].compact.collect{|s| s.to_s} * "#"
144
177
  info = tasks_info[task] ||= IndiferentHash.setup({})
145
178
  dep_info = IndiferentHash.setup(dep.info)
146
179
 
147
- ddone = dep_info[:done]
148
- started = dep_info[:started]
180
+ ddone = dep_info[:end]
181
+ started = dep_info[:start]
149
182
 
150
183
  started = Time.parse started if String === started
151
184
  ddone = Time.parse ddone if String === ddone
@@ -209,12 +242,14 @@ rbbt.png_plot('#{plot}', 'plot(timeline)', width=#{width}, height=#{height}, poi
209
242
 
210
243
  jobs = jobs.uniq.sort_by{|job| [job, job.info]; t = job.info[:started] || Open.mtime(job.path) || Time.now; Time === t ? t : Time.parse(t) }
211
244
 
212
- data = trace_job_times(jobs, options[:fix_gap])
213
-
214
245
  report_keys = options[:report_keys] || ""
215
246
  report_keys = report_keys.split(/,\s*/) if String === report_keys
247
+
248
+ data = trace_job_times(jobs, options[:fix_gap], report_keys)
249
+
216
250
  summary = trace_job_summary(jobs, report_keys)
217
251
 
252
+
218
253
  raise "No jobs to process" if data.size == 0
219
254
 
220
255
  plot, size, width, height = options.values_at :plot, :size, :width, :height