rbbt-util 5.44.0 → 6.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (169) hide show
  1. checksums.yaml +4 -4
  2. data/bin/rbbt +67 -90
  3. data/etc/app.d/base.rb +3 -3
  4. data/etc/app.d/semaphores.rb +3 -3
  5. data/lib/rbbt/annotations/annotated_array.rb +207 -207
  6. data/lib/rbbt/annotations/refactor.rb +27 -0
  7. data/lib/rbbt/annotations/util.rb +282 -282
  8. data/lib/rbbt/annotations.rb +343 -320
  9. data/lib/rbbt/association/database.rb +200 -225
  10. data/lib/rbbt/association/index.rb +294 -291
  11. data/lib/rbbt/association/item.rb +227 -227
  12. data/lib/rbbt/association/open.rb +35 -34
  13. data/lib/rbbt/association/util.rb +0 -169
  14. data/lib/rbbt/association.rb +2 -4
  15. data/lib/rbbt/entity/identifiers.rb +119 -118
  16. data/lib/rbbt/entity/refactor.rb +12 -0
  17. data/lib/rbbt/entity.rb +319 -315
  18. data/lib/rbbt/hpc/batch.rb +72 -53
  19. data/lib/rbbt/hpc/lsf.rb +2 -2
  20. data/lib/rbbt/hpc/orchestrate/batches.rb +2 -2
  21. data/lib/rbbt/hpc/orchestrate/chains.rb +25 -5
  22. data/lib/rbbt/hpc/orchestrate/rules.rb +2 -2
  23. data/lib/rbbt/hpc/orchestrate.rb +19 -13
  24. data/lib/rbbt/hpc/slurm.rb +18 -18
  25. data/lib/rbbt/knowledge_base/entity.rb +13 -5
  26. data/lib/rbbt/knowledge_base/query.rb +2 -2
  27. data/lib/rbbt/knowledge_base/registry.rb +32 -31
  28. data/lib/rbbt/knowledge_base/traverse.rb +1 -1
  29. data/lib/rbbt/knowledge_base.rb +1 -1
  30. data/lib/rbbt/monitor.rb +36 -25
  31. data/lib/rbbt/persist/refactor.rb +166 -0
  32. data/lib/rbbt/persist/tsv/sharder.rb +1 -1
  33. data/lib/rbbt/persist/tsv/tokyocabinet.rb +105 -105
  34. data/lib/rbbt/persist/tsv.rb +187 -185
  35. data/lib/rbbt/persist.rb +556 -551
  36. data/lib/rbbt/refactor.rb +20 -0
  37. data/lib/rbbt/resource/path/refactor.rb +178 -0
  38. data/lib/rbbt/resource/path.rb +317 -497
  39. data/lib/rbbt/resource/util.rb +0 -48
  40. data/lib/rbbt/resource.rb +3 -390
  41. data/lib/rbbt/tsv/accessor.rb +2 -838
  42. data/lib/rbbt/tsv/attach.rb +303 -299
  43. data/lib/rbbt/tsv/change_id.rb +244 -245
  44. data/lib/rbbt/tsv/csv.rb +87 -85
  45. data/lib/rbbt/tsv/dumper.rb +2 -100
  46. data/lib/rbbt/tsv/excel.rb +26 -24
  47. data/lib/rbbt/tsv/field_index.rb +4 -1
  48. data/lib/rbbt/tsv/filter.rb +3 -2
  49. data/lib/rbbt/tsv/index.rb +2 -284
  50. data/lib/rbbt/tsv/manipulate.rb +750 -747
  51. data/lib/rbbt/tsv/marshal.rb +3 -3
  52. data/lib/rbbt/tsv/matrix.rb +2 -2
  53. data/lib/rbbt/tsv/parallel/through.rb +2 -1
  54. data/lib/rbbt/tsv/parallel/traverse.rb +783 -781
  55. data/lib/rbbt/tsv/parser.rb +678 -678
  56. data/lib/rbbt/tsv/refactor.rb +195 -0
  57. data/lib/rbbt/tsv/stream.rb +253 -251
  58. data/lib/rbbt/tsv/util.rb +420 -420
  59. data/lib/rbbt/tsv.rb +210 -208
  60. data/lib/rbbt/util/R/eval.rb +4 -4
  61. data/lib/rbbt/util/R/plot.rb +62 -166
  62. data/lib/rbbt/util/R.rb +21 -18
  63. data/lib/rbbt/util/cmd.rb +2 -318
  64. data/lib/rbbt/util/color.rb +269 -269
  65. data/lib/rbbt/util/colorize.rb +89 -89
  66. data/lib/rbbt/util/concurrency/processes/refactor.rb +22 -0
  67. data/lib/rbbt/util/concurrency/processes/worker.rb +2 -2
  68. data/lib/rbbt/util/concurrency/processes.rb +389 -386
  69. data/lib/rbbt/util/config.rb +169 -167
  70. data/lib/rbbt/util/iruby.rb +20 -0
  71. data/lib/rbbt/util/log/progress/report.rb +241 -241
  72. data/lib/rbbt/util/log/progress/util.rb +99 -99
  73. data/lib/rbbt/util/log/progress.rb +102 -102
  74. data/lib/rbbt/util/log/refactor.rb +49 -0
  75. data/lib/rbbt/util/log.rb +486 -532
  76. data/lib/rbbt/util/migrate.rb +1 -1
  77. data/lib/rbbt/util/misc/concurrent_stream.rb +248 -246
  78. data/lib/rbbt/util/misc/development.rb +12 -11
  79. data/lib/rbbt/util/misc/exceptions.rb +117 -112
  80. data/lib/rbbt/util/misc/format.rb +2 -230
  81. data/lib/rbbt/util/misc/indiferent_hash.rb +2 -107
  82. data/lib/rbbt/util/misc/inspect.rb +2 -476
  83. data/lib/rbbt/util/misc/lock.rb +109 -106
  84. data/lib/rbbt/util/misc/omics.rb +10 -1
  85. data/lib/rbbt/util/misc/pipes.rb +765 -793
  86. data/lib/rbbt/util/misc/refactor.rb +20 -0
  87. data/lib/rbbt/util/misc/ssw.rb +308 -0
  88. data/lib/rbbt/util/misc/system.rb +0 -15
  89. data/lib/rbbt/util/misc.rb +39 -20
  90. data/lib/rbbt/util/named_array/refactor.rb +4 -0
  91. data/lib/rbbt/util/named_array.rb +3 -220
  92. data/lib/rbbt/util/open/refactor.rb +7 -0
  93. data/lib/rbbt/util/open.rb +3 -857
  94. data/lib/rbbt/util/procpath.rb +6 -6
  95. data/lib/rbbt/util/python/paths.rb +27 -0
  96. data/lib/rbbt/util/python/run.rb +115 -0
  97. data/lib/rbbt/util/python/script.rb +110 -0
  98. data/lib/rbbt/util/python/util.rb +3 -3
  99. data/lib/rbbt/util/python.rb +22 -81
  100. data/lib/rbbt/util/semaphore.rb +152 -148
  101. data/lib/rbbt/util/simpleopt.rb +9 -8
  102. data/lib/rbbt/util/ssh/refactor.rb +19 -0
  103. data/lib/rbbt/util/ssh.rb +122 -118
  104. data/lib/rbbt/util/tar.rb +117 -115
  105. data/lib/rbbt/util/tmpfile.rb +69 -67
  106. data/lib/rbbt/util/version.rb +2 -0
  107. data/lib/rbbt/workflow/refactor/entity.rb +11 -0
  108. data/lib/rbbt/workflow/refactor/export.rb +66 -0
  109. data/lib/rbbt/workflow/refactor/inputs.rb +24 -0
  110. data/lib/rbbt/workflow/refactor/recursive.rb +64 -0
  111. data/lib/rbbt/workflow/refactor/task_info.rb +65 -0
  112. data/lib/rbbt/workflow/refactor.rb +153 -0
  113. data/lib/rbbt/workflow/remote_workflow/driver/ssh.rb +55 -32
  114. data/lib/rbbt/workflow/remote_workflow/remote_step/rest.rb +3 -1
  115. data/lib/rbbt/workflow/remote_workflow/remote_step/ssh.rb +14 -5
  116. data/lib/rbbt/workflow/remote_workflow/remote_step.rb +19 -7
  117. data/lib/rbbt/workflow/remote_workflow.rb +6 -1
  118. data/lib/rbbt/workflow/step/info.rb +2 -2
  119. data/lib/rbbt/workflow/step/run.rb +766 -766
  120. data/lib/rbbt/workflow/step/save_load_inputs.rb +254 -254
  121. data/lib/rbbt/workflow/step.rb +2 -362
  122. data/lib/rbbt/workflow/task.rb +118 -118
  123. data/lib/rbbt/workflow/usage.rb +289 -287
  124. data/lib/rbbt/workflow/util/archive.rb +6 -5
  125. data/lib/rbbt/workflow/util/data.rb +1 -1
  126. data/lib/rbbt/workflow/util/orchestrator.rb +249 -246
  127. data/lib/rbbt/workflow/util/trace.rb +79 -44
  128. data/lib/rbbt/workflow.rb +4 -882
  129. data/lib/rbbt-util.rb +21 -13
  130. data/lib/rbbt.rb +16 -3
  131. data/python/rbbt/__init__.py +19 -1
  132. data/share/Rlib/plot.R +37 -37
  133. data/share/Rlib/svg.R +22 -5
  134. data/share/install/software/lib/install_helpers +1 -1
  135. data/share/rbbt_commands/hpc/list +2 -3
  136. data/share/rbbt_commands/hpc/orchestrate +4 -4
  137. data/share/rbbt_commands/hpc/tail +2 -0
  138. data/share/rbbt_commands/hpc/task +10 -7
  139. data/share/rbbt_commands/lsf/list +2 -3
  140. data/share/rbbt_commands/lsf/orchestrate +4 -4
  141. data/share/rbbt_commands/lsf/tail +2 -0
  142. data/share/rbbt_commands/lsf/task +10 -7
  143. data/share/rbbt_commands/migrate +1 -1
  144. data/share/rbbt_commands/pbs/list +2 -3
  145. data/share/rbbt_commands/pbs/orchestrate +4 -4
  146. data/share/rbbt_commands/pbs/tail +2 -0
  147. data/share/rbbt_commands/pbs/task +10 -7
  148. data/share/rbbt_commands/resource/produce +8 -1
  149. data/share/rbbt_commands/slurm/list +2 -3
  150. data/share/rbbt_commands/slurm/orchestrate +4 -4
  151. data/share/rbbt_commands/slurm/tail +2 -0
  152. data/share/rbbt_commands/slurm/task +10 -7
  153. data/share/rbbt_commands/system/clean +5 -5
  154. data/share/rbbt_commands/system/status +5 -5
  155. data/share/rbbt_commands/tsv/get +2 -3
  156. data/share/rbbt_commands/tsv/info +10 -13
  157. data/share/rbbt_commands/tsv/keys +18 -14
  158. data/share/rbbt_commands/tsv/slice +2 -2
  159. data/share/rbbt_commands/tsv/transpose +6 -2
  160. data/share/rbbt_commands/workflow/info +20 -24
  161. data/share/rbbt_commands/workflow/list +1 -1
  162. data/share/rbbt_commands/workflow/prov +20 -13
  163. data/share/rbbt_commands/workflow/server +16 -1
  164. data/share/rbbt_commands/workflow/task +76 -71
  165. data/share/rbbt_commands/workflow/write_info +26 -9
  166. data/share/software/opt/ssw/ssw.c +861 -0
  167. data/share/software/opt/ssw/ssw.h +130 -0
  168. data/share/workflow_config.ru +3 -3
  169. metadata +42 -3
@@ -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