sierra-research 1.3.11__py3-none-any.whl → 1.5.0__py3-none-any.whl

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 (254) hide show
  1. sierra/__init__.py +3 -3
  2. sierra/core/__init__.py +3 -3
  3. sierra/core/batchroot.py +223 -0
  4. sierra/core/cmdline.py +681 -1057
  5. sierra/core/compare.py +11 -0
  6. sierra/core/config.py +96 -88
  7. sierra/core/engine.py +306 -0
  8. sierra/core/execenv.py +380 -0
  9. sierra/core/expdef.py +11 -0
  10. sierra/core/experiment/__init__.py +1 -0
  11. sierra/core/experiment/bindings.py +150 -101
  12. sierra/core/experiment/definition.py +414 -245
  13. sierra/core/experiment/spec.py +83 -85
  14. sierra/core/exproot.py +44 -0
  15. sierra/core/generators/__init__.py +10 -0
  16. sierra/core/generators/experiment.py +528 -0
  17. sierra/core/generators/generator_factory.py +138 -137
  18. sierra/core/graphs/__init__.py +23 -0
  19. sierra/core/graphs/bcbridge.py +94 -0
  20. sierra/core/graphs/heatmap.py +245 -324
  21. sierra/core/graphs/pathset.py +27 -0
  22. sierra/core/graphs/schema.py +77 -0
  23. sierra/core/graphs/stacked_line.py +341 -0
  24. sierra/core/graphs/summary_line.py +506 -0
  25. sierra/core/logging.py +3 -2
  26. sierra/core/models/__init__.py +3 -1
  27. sierra/core/models/info.py +19 -0
  28. sierra/core/models/interface.py +52 -122
  29. sierra/core/pipeline/__init__.py +2 -5
  30. sierra/core/pipeline/pipeline.py +228 -126
  31. sierra/core/pipeline/stage1/__init__.py +10 -0
  32. sierra/core/pipeline/stage1/pipeline_stage1.py +45 -31
  33. sierra/core/pipeline/stage2/__init__.py +10 -0
  34. sierra/core/pipeline/stage2/pipeline_stage2.py +8 -11
  35. sierra/core/pipeline/stage2/runner.py +401 -0
  36. sierra/core/pipeline/stage3/__init__.py +12 -0
  37. sierra/core/pipeline/stage3/gather.py +321 -0
  38. sierra/core/pipeline/stage3/pipeline_stage3.py +37 -84
  39. sierra/core/pipeline/stage4/__init__.py +12 -2
  40. sierra/core/pipeline/stage4/pipeline_stage4.py +36 -354
  41. sierra/core/pipeline/stage5/__init__.py +12 -0
  42. sierra/core/pipeline/stage5/pipeline_stage5.py +33 -208
  43. sierra/core/pipeline/yaml.py +48 -0
  44. sierra/core/plugin.py +529 -62
  45. sierra/core/proc.py +11 -0
  46. sierra/core/prod.py +11 -0
  47. sierra/core/ros1/__init__.py +5 -1
  48. sierra/core/ros1/callbacks.py +22 -21
  49. sierra/core/ros1/cmdline.py +59 -88
  50. sierra/core/ros1/generators.py +159 -175
  51. sierra/core/ros1/variables/__init__.py +3 -0
  52. sierra/core/ros1/variables/exp_setup.py +122 -116
  53. sierra/core/startup.py +106 -76
  54. sierra/core/stat_kernels.py +4 -5
  55. sierra/core/storage.py +13 -32
  56. sierra/core/trampoline.py +30 -0
  57. sierra/core/types.py +116 -71
  58. sierra/core/utils.py +103 -106
  59. sierra/core/variables/__init__.py +1 -1
  60. sierra/core/variables/base_variable.py +12 -17
  61. sierra/core/variables/batch_criteria.py +387 -481
  62. sierra/core/variables/builtin.py +135 -0
  63. sierra/core/variables/exp_setup.py +19 -39
  64. sierra/core/variables/population_size.py +72 -76
  65. sierra/core/variables/variable_density.py +44 -68
  66. sierra/core/vector.py +1 -1
  67. sierra/main.py +256 -88
  68. sierra/plugins/__init__.py +119 -0
  69. sierra/plugins/compare/__init__.py +14 -0
  70. sierra/plugins/compare/graphs/__init__.py +19 -0
  71. sierra/plugins/compare/graphs/cmdline.py +120 -0
  72. sierra/plugins/compare/graphs/comparator.py +291 -0
  73. sierra/plugins/compare/graphs/inter_controller.py +531 -0
  74. sierra/plugins/compare/graphs/inter_scenario.py +297 -0
  75. sierra/plugins/compare/graphs/namecalc.py +53 -0
  76. sierra/plugins/compare/graphs/outputroot.py +73 -0
  77. sierra/plugins/compare/graphs/plugin.py +147 -0
  78. sierra/plugins/compare/graphs/preprocess.py +172 -0
  79. sierra/plugins/compare/graphs/schema.py +37 -0
  80. sierra/plugins/engine/__init__.py +14 -0
  81. sierra/plugins/engine/argos/__init__.py +18 -0
  82. sierra/plugins/{platform → engine}/argos/cmdline.py +144 -151
  83. sierra/plugins/{platform/argos/variables → engine/argos/generators}/__init__.py +5 -0
  84. sierra/plugins/engine/argos/generators/engine.py +394 -0
  85. sierra/plugins/engine/argos/plugin.py +393 -0
  86. sierra/plugins/{platform/argos/generators → engine/argos/variables}/__init__.py +5 -0
  87. sierra/plugins/engine/argos/variables/arena_shape.py +183 -0
  88. sierra/plugins/engine/argos/variables/cameras.py +240 -0
  89. sierra/plugins/engine/argos/variables/constant_density.py +112 -0
  90. sierra/plugins/engine/argos/variables/exp_setup.py +82 -0
  91. sierra/plugins/{platform → engine}/argos/variables/physics_engines.py +83 -87
  92. sierra/plugins/engine/argos/variables/population_constant_density.py +178 -0
  93. sierra/plugins/engine/argos/variables/population_size.py +115 -0
  94. sierra/plugins/engine/argos/variables/population_variable_density.py +123 -0
  95. sierra/plugins/engine/argos/variables/rendering.py +108 -0
  96. sierra/plugins/engine/ros1gazebo/__init__.py +18 -0
  97. sierra/plugins/engine/ros1gazebo/cmdline.py +175 -0
  98. sierra/plugins/{platform/ros1robot → engine/ros1gazebo}/generators/__init__.py +5 -0
  99. sierra/plugins/engine/ros1gazebo/generators/engine.py +125 -0
  100. sierra/plugins/engine/ros1gazebo/plugin.py +404 -0
  101. sierra/plugins/engine/ros1gazebo/variables/__init__.py +15 -0
  102. sierra/plugins/engine/ros1gazebo/variables/population_size.py +214 -0
  103. sierra/plugins/engine/ros1robot/__init__.py +18 -0
  104. sierra/plugins/engine/ros1robot/cmdline.py +159 -0
  105. sierra/plugins/{platform/ros1gazebo → engine/ros1robot}/generators/__init__.py +4 -0
  106. sierra/plugins/engine/ros1robot/generators/engine.py +95 -0
  107. sierra/plugins/engine/ros1robot/plugin.py +410 -0
  108. sierra/plugins/{hpc/local → engine/ros1robot/variables}/__init__.py +5 -0
  109. sierra/plugins/engine/ros1robot/variables/population_size.py +146 -0
  110. sierra/plugins/execenv/__init__.py +11 -0
  111. sierra/plugins/execenv/hpc/__init__.py +18 -0
  112. sierra/plugins/execenv/hpc/adhoc/__init__.py +18 -0
  113. sierra/plugins/execenv/hpc/adhoc/cmdline.py +30 -0
  114. sierra/plugins/execenv/hpc/adhoc/plugin.py +131 -0
  115. sierra/plugins/execenv/hpc/cmdline.py +137 -0
  116. sierra/plugins/execenv/hpc/local/__init__.py +18 -0
  117. sierra/plugins/execenv/hpc/local/cmdline.py +31 -0
  118. sierra/plugins/execenv/hpc/local/plugin.py +145 -0
  119. sierra/plugins/execenv/hpc/pbs/__init__.py +18 -0
  120. sierra/plugins/execenv/hpc/pbs/cmdline.py +30 -0
  121. sierra/plugins/execenv/hpc/pbs/plugin.py +121 -0
  122. sierra/plugins/execenv/hpc/slurm/__init__.py +18 -0
  123. sierra/plugins/execenv/hpc/slurm/cmdline.py +30 -0
  124. sierra/plugins/execenv/hpc/slurm/plugin.py +133 -0
  125. sierra/plugins/execenv/prefectserver/__init__.py +18 -0
  126. sierra/plugins/execenv/prefectserver/cmdline.py +66 -0
  127. sierra/plugins/execenv/prefectserver/dockerremote/__init__.py +18 -0
  128. sierra/plugins/execenv/prefectserver/dockerremote/cmdline.py +66 -0
  129. sierra/plugins/execenv/prefectserver/dockerremote/plugin.py +132 -0
  130. sierra/plugins/execenv/prefectserver/flow.py +66 -0
  131. sierra/plugins/execenv/prefectserver/local/__init__.py +18 -0
  132. sierra/plugins/execenv/prefectserver/local/cmdline.py +29 -0
  133. sierra/plugins/execenv/prefectserver/local/plugin.py +133 -0
  134. sierra/plugins/{hpc/adhoc → execenv/robot}/__init__.py +1 -0
  135. sierra/plugins/execenv/robot/turtlebot3/__init__.py +18 -0
  136. sierra/plugins/execenv/robot/turtlebot3/plugin.py +204 -0
  137. sierra/plugins/expdef/__init__.py +14 -0
  138. sierra/plugins/expdef/json/__init__.py +14 -0
  139. sierra/plugins/expdef/json/plugin.py +504 -0
  140. sierra/plugins/expdef/xml/__init__.py +14 -0
  141. sierra/plugins/expdef/xml/plugin.py +386 -0
  142. sierra/{core/hpc → plugins/proc}/__init__.py +1 -1
  143. sierra/plugins/proc/collate/__init__.py +15 -0
  144. sierra/plugins/proc/collate/cmdline.py +47 -0
  145. sierra/plugins/proc/collate/plugin.py +271 -0
  146. sierra/plugins/proc/compress/__init__.py +18 -0
  147. sierra/plugins/proc/compress/cmdline.py +47 -0
  148. sierra/plugins/proc/compress/plugin.py +123 -0
  149. sierra/plugins/proc/decompress/__init__.py +18 -0
  150. sierra/plugins/proc/decompress/plugin.py +96 -0
  151. sierra/plugins/proc/imagize/__init__.py +15 -0
  152. sierra/plugins/proc/imagize/cmdline.py +49 -0
  153. sierra/plugins/proc/imagize/plugin.py +270 -0
  154. sierra/plugins/proc/modelrunner/__init__.py +16 -0
  155. sierra/plugins/proc/modelrunner/plugin.py +250 -0
  156. sierra/plugins/proc/statistics/__init__.py +15 -0
  157. sierra/plugins/proc/statistics/cmdline.py +64 -0
  158. sierra/plugins/proc/statistics/plugin.py +390 -0
  159. sierra/plugins/{hpc → prod}/__init__.py +1 -0
  160. sierra/plugins/prod/graphs/__init__.py +18 -0
  161. sierra/plugins/prod/graphs/cmdline.py +269 -0
  162. sierra/plugins/prod/graphs/collate.py +279 -0
  163. sierra/plugins/prod/graphs/inter/__init__.py +13 -0
  164. sierra/plugins/prod/graphs/inter/generate.py +83 -0
  165. sierra/plugins/prod/graphs/inter/heatmap.py +86 -0
  166. sierra/plugins/prod/graphs/inter/line.py +134 -0
  167. sierra/plugins/prod/graphs/intra/__init__.py +15 -0
  168. sierra/plugins/prod/graphs/intra/generate.py +202 -0
  169. sierra/plugins/prod/graphs/intra/heatmap.py +74 -0
  170. sierra/plugins/prod/graphs/intra/line.py +114 -0
  171. sierra/plugins/prod/graphs/plugin.py +103 -0
  172. sierra/plugins/prod/graphs/targets.py +63 -0
  173. sierra/plugins/prod/render/__init__.py +18 -0
  174. sierra/plugins/prod/render/cmdline.py +72 -0
  175. sierra/plugins/prod/render/plugin.py +282 -0
  176. sierra/plugins/storage/__init__.py +5 -0
  177. sierra/plugins/storage/arrow/__init__.py +18 -0
  178. sierra/plugins/storage/arrow/plugin.py +38 -0
  179. sierra/plugins/storage/csv/__init__.py +9 -0
  180. sierra/plugins/storage/csv/plugin.py +12 -5
  181. sierra/version.py +3 -2
  182. sierra_research-1.5.0.dist-info/METADATA +238 -0
  183. sierra_research-1.5.0.dist-info/RECORD +186 -0
  184. {sierra_research-1.3.11.dist-info → sierra_research-1.5.0.dist-info}/WHEEL +1 -2
  185. sierra/core/experiment/xml.py +0 -454
  186. sierra/core/generators/controller_generator_parser.py +0 -34
  187. sierra/core/generators/exp_creator.py +0 -351
  188. sierra/core/generators/exp_generators.py +0 -142
  189. sierra/core/graphs/scatterplot2D.py +0 -109
  190. sierra/core/graphs/stacked_line_graph.py +0 -251
  191. sierra/core/graphs/stacked_surface_graph.py +0 -220
  192. sierra/core/graphs/summary_line_graph.py +0 -371
  193. sierra/core/hpc/cmdline.py +0 -142
  194. sierra/core/models/graphs.py +0 -87
  195. sierra/core/pipeline/stage2/exp_runner.py +0 -286
  196. sierra/core/pipeline/stage3/imagizer.py +0 -149
  197. sierra/core/pipeline/stage3/run_collator.py +0 -317
  198. sierra/core/pipeline/stage3/statistics_calculator.py +0 -478
  199. sierra/core/pipeline/stage4/graph_collator.py +0 -320
  200. sierra/core/pipeline/stage4/inter_exp_graph_generator.py +0 -240
  201. sierra/core/pipeline/stage4/intra_exp_graph_generator.py +0 -317
  202. sierra/core/pipeline/stage4/model_runner.py +0 -168
  203. sierra/core/pipeline/stage4/rendering.py +0 -283
  204. sierra/core/pipeline/stage4/yaml_config_loader.py +0 -103
  205. sierra/core/pipeline/stage5/inter_scenario_comparator.py +0 -328
  206. sierra/core/pipeline/stage5/intra_scenario_comparator.py +0 -989
  207. sierra/core/platform.py +0 -493
  208. sierra/core/plugin_manager.py +0 -369
  209. sierra/core/root_dirpath_generator.py +0 -241
  210. sierra/plugins/hpc/adhoc/plugin.py +0 -125
  211. sierra/plugins/hpc/local/plugin.py +0 -81
  212. sierra/plugins/hpc/pbs/__init__.py +0 -9
  213. sierra/plugins/hpc/pbs/plugin.py +0 -126
  214. sierra/plugins/hpc/slurm/__init__.py +0 -9
  215. sierra/plugins/hpc/slurm/plugin.py +0 -130
  216. sierra/plugins/platform/__init__.py +0 -9
  217. sierra/plugins/platform/argos/__init__.py +0 -9
  218. sierra/plugins/platform/argos/generators/platform_generators.py +0 -383
  219. sierra/plugins/platform/argos/plugin.py +0 -337
  220. sierra/plugins/platform/argos/variables/arena_shape.py +0 -145
  221. sierra/plugins/platform/argos/variables/cameras.py +0 -243
  222. sierra/plugins/platform/argos/variables/constant_density.py +0 -136
  223. sierra/plugins/platform/argos/variables/exp_setup.py +0 -113
  224. sierra/plugins/platform/argos/variables/population_constant_density.py +0 -175
  225. sierra/plugins/platform/argos/variables/population_size.py +0 -102
  226. sierra/plugins/platform/argos/variables/population_variable_density.py +0 -132
  227. sierra/plugins/platform/argos/variables/rendering.py +0 -104
  228. sierra/plugins/platform/ros1gazebo/__init__.py +0 -9
  229. sierra/plugins/platform/ros1gazebo/cmdline.py +0 -213
  230. sierra/plugins/platform/ros1gazebo/generators/platform_generators.py +0 -137
  231. sierra/plugins/platform/ros1gazebo/plugin.py +0 -335
  232. sierra/plugins/platform/ros1gazebo/variables/__init__.py +0 -10
  233. sierra/plugins/platform/ros1gazebo/variables/population_size.py +0 -204
  234. sierra/plugins/platform/ros1robot/__init__.py +0 -9
  235. sierra/plugins/platform/ros1robot/cmdline.py +0 -175
  236. sierra/plugins/platform/ros1robot/generators/platform_generators.py +0 -112
  237. sierra/plugins/platform/ros1robot/plugin.py +0 -373
  238. sierra/plugins/platform/ros1robot/variables/__init__.py +0 -10
  239. sierra/plugins/platform/ros1robot/variables/population_size.py +0 -146
  240. sierra/plugins/robot/__init__.py +0 -9
  241. sierra/plugins/robot/turtlebot3/__init__.py +0 -9
  242. sierra/plugins/robot/turtlebot3/plugin.py +0 -194
  243. sierra_research-1.3.11.data/data/share/man/man1/sierra-cli.1 +0 -2349
  244. sierra_research-1.3.11.data/data/share/man/man7/sierra-examples.7 +0 -508
  245. sierra_research-1.3.11.data/data/share/man/man7/sierra-exec-envs.7 +0 -331
  246. sierra_research-1.3.11.data/data/share/man/man7/sierra-glossary.7 +0 -285
  247. sierra_research-1.3.11.data/data/share/man/man7/sierra-platforms.7 +0 -358
  248. sierra_research-1.3.11.data/data/share/man/man7/sierra-usage.7 +0 -729
  249. sierra_research-1.3.11.data/data/share/man/man7/sierra.7 +0 -78
  250. sierra_research-1.3.11.dist-info/METADATA +0 -492
  251. sierra_research-1.3.11.dist-info/RECORD +0 -133
  252. sierra_research-1.3.11.dist-info/top_level.txt +0 -1
  253. {sierra_research-1.3.11.dist-info → sierra_research-1.5.0.dist-info}/entry_points.txt +0 -0
  254. {sierra_research-1.3.11.dist-info → sierra_research-1.5.0.dist-info/licenses}/LICENSE +0 -0
@@ -2,9 +2,9 @@
2
2
  #
3
3
  # SPDX-License-Identifier: MIT
4
4
 
5
- """Classes for the ``--exp-setup`` cmdline option for ROS1 platforms.
5
+ """Classes for the ``--exp-setup`` cmdline option for ROS1 engines.
6
6
 
7
- See :ref:`ln-sierra-vars-expsetup` for usage documentation.
7
+ See :ref:`usage/vars/expsetup` for usage documentation.
8
8
 
9
9
  """
10
10
 
@@ -16,106 +16,115 @@ import implements
16
16
 
17
17
  # Project packages
18
18
  from sierra.core.variables.base_variable import IBaseVariable
19
- from sierra.core.experiment import xml
19
+ from sierra.core.experiment import definition
20
20
  from sierra.core import config
21
- from sierra.core.variables.exp_setup import Parser
21
+ from sierra.core.variables import exp_setup
22
22
 
23
23
 
24
24
  @implements.implements(IBaseVariable)
25
- class ExpSetup():
25
+ class ExpSetup:
26
26
  """
27
27
  Defines the experimental setup for ROS experiments.
28
28
 
29
29
  Attributes:
30
-
31
30
  n_secs_per_run: The :term:`Experimental Run` duration in seconds, NOT
32
31
  :term:`Ticks <Tick>` or timesteps.
33
32
 
34
- n_datapoints: How many datapoints to capture during the experimental
35
- run.
36
-
37
33
  n_ticks_per_sec: How many times per second robot controllers will be
38
34
  run.
39
35
 
40
36
  """
41
37
 
42
- def __init__(self,
43
- n_secs_per_run: int,
44
- n_datapoints: int,
45
- n_ticks_per_sec: int,
46
- barrier_start: bool,
47
- robots_need_timekeeper: bool) -> None:
38
+ def __init__(
39
+ self,
40
+ n_secs_per_run: int,
41
+ n_ticks_per_sec: int,
42
+ barrier_start: bool,
43
+ robots_need_timekeeper: bool,
44
+ ) -> None:
48
45
  self.n_secs_per_run = n_secs_per_run
49
- self.n_datapoints = n_datapoints
50
46
  self.n_ticks_per_sec = n_ticks_per_sec
51
47
  self.barrier_start = barrier_start
52
48
  self.robots_need_timekeeper = robots_need_timekeeper
53
49
 
54
- self.tag_adds = None
50
+ self.element_adds = None
55
51
 
56
- def gen_attr_changelist(self) -> tp.List[xml.AttrChangeSet]:
52
+ def gen_attr_changelist(self) -> tp.List[definition.AttrChangeSet]:
57
53
  return []
58
54
 
59
- def gen_tag_rmlist(self) -> tp.List[xml.TagRmList]:
55
+ def gen_tag_rmlist(self) -> tp.List[definition.ElementRmList]:
60
56
  return []
61
57
 
62
- def gen_tag_addlist(self) -> tp.List[xml.TagAddList]:
63
- if not self.tag_adds:
64
- adds = xml.TagAddList(
65
- xml.TagAdd("./master/group/[@ns='sierra']",
66
- "param",
67
- {
68
- "name": "experiment/length",
69
- "value": str(self.n_secs_per_run),
70
- },
71
- True),
72
- xml.TagAdd("./master/group/[@ns='sierra']",
73
- "param",
74
- {
75
- "name": "experiment/ticks_per_sec",
76
- "value": str(self.n_ticks_per_sec),
77
- },
78
- True),
79
- xml.TagAdd("./master/group/[@ns='sierra']",
80
- "param",
81
- {
82
- "name": "experiment/barrier_start",
83
- "value": str(self.barrier_start).lower(),
84
- },
85
- True),
86
- xml.TagAdd("./master/group/[@ns='sierra']",
87
- "node",
88
- {
89
- "name": "sierra_timekeeper",
90
- "pkg": "sierra_rosbridge",
91
- "type": "sierra_timekeeper.py",
92
- "required": "true",
93
- # Otherwise rospy prints nothing
94
- "output": "screen"
95
- },
96
- True),
97
-
98
- xml.TagAdd("./robot/group/[@ns='sierra']",
99
- "param",
100
- {
101
- "name": "experiment/length",
102
- "value": str(self.n_secs_per_run),
103
- },
104
- True),
105
- xml.TagAdd("./robot/group/[@ns='sierra']",
106
- "param",
107
- {
108
- "name": "experiment/ticks_per_sec",
109
- "value": str(self.n_ticks_per_sec),
110
- },
111
- True),
112
- xml.TagAdd("./robot/group/[@ns='sierra']",
113
- "param",
114
- {
115
- "name": "experiment/barrier_start",
116
- "value": str(self.barrier_start).lower()
117
- },
118
- True)
58
+ def gen_element_addlist(self) -> tp.List[definition.ElementAddList]:
59
+ if not self.element_adds:
60
+ adds = definition.ElementAddList(
61
+ definition.ElementAdd(
62
+ "./master/group/[@ns='sierra']",
63
+ "param",
64
+ {
65
+ "name": "experiment/length",
66
+ "value": str(self.n_secs_per_run),
67
+ },
68
+ True,
69
+ ),
70
+ definition.ElementAdd(
71
+ "./master/group/[@ns='sierra']",
72
+ "param",
73
+ {
74
+ "name": "experiment/ticks_per_sec",
75
+ "value": str(self.n_ticks_per_sec),
76
+ },
77
+ True,
78
+ ),
79
+ definition.ElementAdd(
80
+ "./master/group/[@ns='sierra']",
81
+ "param",
82
+ {
83
+ "name": "experiment/barrier_start",
84
+ "value": str(self.barrier_start).lower(),
85
+ },
86
+ True,
87
+ ),
88
+ definition.ElementAdd(
89
+ "./master/group/[@ns='sierra']",
90
+ "node",
91
+ {
92
+ "name": "sierra_timekeeper",
93
+ "pkg": "sierra_rosbridge",
94
+ "type": "sierra_timekeeper.py",
95
+ "required": "true",
96
+ # Otherwise rospy prints nothing
97
+ "output": "screen",
98
+ },
99
+ True,
100
+ ),
101
+ definition.ElementAdd(
102
+ "./robot/group/[@ns='sierra']",
103
+ "param",
104
+ {
105
+ "name": "experiment/length",
106
+ "value": str(self.n_secs_per_run),
107
+ },
108
+ True,
109
+ ),
110
+ definition.ElementAdd(
111
+ "./robot/group/[@ns='sierra']",
112
+ "param",
113
+ {
114
+ "name": "experiment/ticks_per_sec",
115
+ "value": str(self.n_ticks_per_sec),
116
+ },
117
+ True,
118
+ ),
119
+ definition.ElementAdd(
120
+ "./robot/group/[@ns='sierra']",
121
+ "param",
122
+ {
123
+ "name": "experiment/barrier_start",
124
+ "value": str(self.barrier_start).lower(),
125
+ },
126
+ True,
127
+ ),
119
128
  )
120
129
  if self.robots_need_timekeeper:
121
130
  # Robots also need the timekeeper when they are real and not
@@ -133,29 +142,30 @@ class ExpSetup():
133
142
  # most 1 dependent node will be active at a given time. Plus,
134
143
  # it's just sloppy to leave that sort of thing hanging around
135
144
  # after a run exits.
136
- adds.append(xml.TagAdd("./robot/group/[@ns='sierra']",
137
- "node",
138
- {
139
- "name": "sierra_timekeeper",
140
- "pkg": "sierra_rosbridge",
141
- "type": "sierra_timekeeper.py",
142
- "required": "true",
143
- # Otherwise rospy prints nothing
144
- "output": "screen"
145
- },
146
- True)
147
- )
148
- self.tag_adds = adds
149
-
150
- return [self.tag_adds]
145
+ adds.append(
146
+ definition.ElementAdd(
147
+ "./robot/group/[@ns='sierra']",
148
+ "node",
149
+ {
150
+ "name": "sierra_timekeeper",
151
+ "pkg": "sierra_rosbridge",
152
+ "type": "sierra_timekeeper.py",
153
+ "required": "true",
154
+ # Otherwise rospy prints nothing
155
+ "output": "screen",
156
+ },
157
+ True,
158
+ )
159
+ )
160
+ self.element_adds = adds
161
+
162
+ return [self.element_adds]
151
163
 
152
164
  def gen_files(self) -> None:
153
165
  pass
154
166
 
155
167
 
156
- def factory(arg: str,
157
- barrier_start: bool,
158
- robots_need_timekeeper: bool) -> ExpSetup:
168
+ def factory(arg: str, barrier_start: bool, robots_need_timekeeper: bool) -> ExpSetup:
159
169
  """Create an :class:`ExpSetup` derived class from the command line definition.
160
170
 
161
171
  Arguments:
@@ -163,26 +173,22 @@ def factory(arg: str,
163
173
  arg: The value of ``--exp-setup``.
164
174
 
165
175
  """
166
- parser = Parser({'n_secs_per_run': config.kROS['n_secs_per_run'],
167
- 'n_ticks_per_sec': config.kROS['n_ticks_per_sec'],
168
- 'n_datapoints': config.kExperimentalRunData['n_datapoints_1D']})
169
- attr = parser(arg)
170
-
171
- def __init__(self: ExpSetup) -> None:
172
- ExpSetup.__init__(self,
173
- attr["n_secs_per_run"],
174
- attr['n_datapoints'],
175
- attr['n_ticks_per_sec'],
176
- barrier_start,
177
- robots_need_timekeeper)
178
-
179
- return type(attr['pretty_name'],
180
- (ExpSetup,),
181
- {"__init__": __init__}) # type: ignore
182
-
183
-
184
- __api__ = [
185
- 'ExpSetup',
186
-
187
-
176
+ attr = exp_setup.parse(
177
+ arg,
178
+ {
179
+ "n_secs_per_run": config.kROS["n_secs_per_run"],
180
+ "n_ticks_per_sec": config.kROS["n_ticks_per_sec"],
181
+ },
182
+ )
183
+
184
+ return ExpSetup(
185
+ attr["n_secs_per_run"],
186
+ attr["n_ticks_per_sec"],
187
+ barrier_start,
188
+ robots_need_timekeeper,
189
+ )
190
+
191
+
192
+ __all__ = [
193
+ "ExpSetup",
188
194
  ]
sierra/core/startup.py CHANGED
@@ -18,31 +18,31 @@ import subprocess
18
18
  from sierra.core import types
19
19
 
20
20
 
21
- kOSXPackages = types.OSPackagesSpec('darwin',
22
- 'OSX',
23
- pkgs={
24
- 'parallel': True,
25
- 'mactex': True,
26
- 'xquartz': False,
27
- 'pssh': False
28
- })
21
+ kOSXPackages = types.OSPackagesSpec(
22
+ "darwin",
23
+ "OSX",
24
+ pkgs={"parallel": True, "mactex": False, "xquartz": False, "pssh": False},
25
+ )
29
26
  """
30
27
  The required/optional Homebrew packages.
31
28
  """
32
29
 
33
- kDebianPackages = types.OSPackagesSpec('linux',
34
- 'debian',
35
- pkgs={
36
- 'parallel': True,
37
- 'cm-super': True,
38
- 'texlive-fonts-recommended': True,
39
- 'texlive-latex-extra': True,
40
- 'dvipng': True,
41
- 'psmisc': True,
42
- 'pssh': False,
43
- 'ffmpeg': False,
44
- 'xvfb': False
45
- })
30
+ kDebianPackages = types.OSPackagesSpec(
31
+ "linux",
32
+ "debian",
33
+ pkgs={
34
+ "parallel": True,
35
+ "cm-super": False,
36
+ "texlive-fonts-recommended": False,
37
+ "texlive-latex-extra": False,
38
+ "dvipng": False,
39
+ "psmisc": True,
40
+ "pssh": False,
41
+ "ffmpeg": False,
42
+ "xvfb": False,
43
+ "iputils-ping": False,
44
+ },
45
+ )
46
46
  """
47
47
  The required/optional .deb packages for debian-based distributions.
48
48
  """
@@ -52,14 +52,14 @@ def startup_checks(pkg_checks: bool) -> None:
52
52
  logging.debug("Performing startup checks")
53
53
 
54
54
  # Check python version
55
- if sys.version_info < (3, 8):
56
- raise RuntimeError("Python >= 3.8 must be used to run SIERRA!")
55
+ if sys.version_info < (3, 9):
56
+ raise RuntimeError("Python >= 3.9 must be used to run SIERRA!")
57
57
 
58
58
  # Check packages
59
59
  if sys.platform == "linux":
60
60
  if pkg_checks:
61
61
  _linux_pkg_checks()
62
- elif sys.platform == 'darwin':
62
+ elif sys.platform == "darwin":
63
63
  if pkg_checks:
64
64
  _osx_pkg_checks()
65
65
  else:
@@ -67,33 +67,48 @@ def startup_checks(pkg_checks: bool) -> None:
67
67
 
68
68
 
69
69
  def _linux_pkg_checks() -> None:
70
- """Check that all the packages required by SIERRA are installed on Linux.
71
-
72
- """
73
- import distro # will fail on OSX
70
+ """Check that all the packages required by SIERRA are installed on Linux."""
71
+ # This will fail on OSX if at global scope
72
+ import distro # pylint: disable=import-outside-toplevel
74
73
 
75
74
  dist = distro.id()
76
75
  os_info = distro.os_release_info()
77
- if any(candidate in os_info['id'] for candidate in ['debian',
78
- 'ubuntu']):
76
+ if any(
77
+ candidate in os_info["id"] for candidate in ["debian", "ubuntu", "linuxmint"]
78
+ ):
79
79
  _apt_pkg_checks(dist)
80
80
  else:
81
- logging.warning(("Unknown Linux distro '%s' detected: skipping package "
82
- "check"),
83
- dist)
84
- logging.warning(("If SIERRA crashes it might be because you don't have "
85
- "all the required packages installed"))
81
+ logging.warning(
82
+ "Unknown Linux distro '%s' detected: skipping package check", dist
83
+ )
84
+ logging.warning(
85
+ (
86
+ "If SIERRA crashes it might be because you don't have "
87
+ "all the required packages installed"
88
+ )
89
+ )
86
90
 
87
91
 
88
92
  def _apt_pkg_checks(dist: str) -> None:
93
+ if sys.prefix != sys.base_prefix:
94
+ logging.debug("Running in virtual environment")
89
95
  try:
90
- import apt # pytype: disable=import-error
96
+ # This will fail on OSX if at global scope
97
+ import apt # pytype: disable=import-error # pylint: disable=import-outside-toplevel
91
98
 
92
99
  except ImportError:
93
- logging.warning(("Cannot check for required .deb packages: 'apt' "
94
- "module not found. Maybe '%s' != OS python version, "
95
- "or in virtualenv?"),
96
- sys.version)
100
+ logging.warning(
101
+ "Failed to import apt python module: Cannot check for required .deb packages."
102
+ )
103
+ logging.warning(
104
+ (
105
+ "This can happen when:\n"
106
+ "- Running in a venv where the python version != system python "
107
+ "version.\n"
108
+ "- No apt python module is installed at the system/user level "
109
+ "outside the venv."
110
+ )
111
+ )
97
112
  return
98
113
 
99
114
  cache = apt.Cache()
@@ -104,50 +119,65 @@ def _apt_pkg_checks(dist: str) -> None:
104
119
  if pkg not in cache or not cache[pkg].is_installed:
105
120
  missing.append(pkg)
106
121
 
107
- if missing:
108
- if required:
109
- raise RuntimeError((f"Required .deb packages {missing} missing on "
110
- f"Linux distribution '{dist}'. Install all "
111
- "required packages before running SIERRA! "
112
- "(Did you read the \"Getting Started\" docs?)"))
113
-
114
- logging.debug(("Recommended .deb packages %s missing on Linux "
115
- "distribution '%s'. Some SIERRA functionality will "
116
- "not be available. "),
117
- missing,
118
- dist)
122
+ if missing:
123
+ if required:
124
+ raise RuntimeError(
125
+ (
126
+ f"Required .deb packages {missing} missing on "
127
+ f"Linux distribution '{dist}'. Install all "
128
+ "required packages before running SIERRA! "
129
+ '(Did you read the "Getting Started" docs?)'
130
+ )
131
+ )
132
+
133
+ logging.debug(
134
+ (
135
+ "Recommended .deb packages %s missing on Linux "
136
+ "distribution '%s'. Some SIERRA functionality will "
137
+ "not be available. "
138
+ ),
139
+ missing,
140
+ dist,
141
+ )
119
142
 
120
143
 
121
144
  def _osx_pkg_checks() -> None:
122
- """Check that all the packages required by SIERRA are installed on OSX.
123
-
124
- """
145
+ """Check that all the packages required by SIERRA are installed on OSX."""
125
146
  missing = []
126
147
 
127
148
  for pkg, required in kOSXPackages.pkgs.items():
128
- logging.trace("Checking for homebrew package '%s'", # type: ignore
129
- pkg)
130
- p1 = subprocess.Popen(f'brew list | grep {pkg}',
131
- shell=True,
132
- stderr=subprocess.DEVNULL,
133
- stdout=subprocess.DEVNULL)
134
- p2 = subprocess.Popen(f'brew list --cask | grep {pkg}',
135
- shell=True,
136
- stderr=subprocess.DEVNULL,
137
- stdout=subprocess.DEVNULL)
149
+ logging.trace("Checking for homebrew package '%s'", pkg) # type: ignore
150
+ p1 = subprocess.Popen(
151
+ f"brew list | grep {pkg}",
152
+ shell=True,
153
+ stderr=subprocess.DEVNULL,
154
+ stdout=subprocess.DEVNULL,
155
+ )
156
+ p2 = subprocess.Popen(
157
+ f"brew list --cask | grep {pkg}",
158
+ shell=True,
159
+ stderr=subprocess.DEVNULL,
160
+ stdout=subprocess.DEVNULL,
161
+ )
138
162
  p1.wait()
139
163
  p2.wait()
140
164
 
141
165
  if p1.returncode != 0 and p2.returncode != 0:
142
166
  missing.append(pkg)
143
-
144
- if missing:
145
- if required:
146
- raise RuntimeError((f"Required brew package {missing} missing on "
147
- "OSX. Install all required packages before "
148
- "running SIERRA! (Did you read the \"Getting "
149
- "Started\" docs?)"))
150
-
151
- logging.debug(("Recommended brew package %s missing on OSX. "
152
- "Some SIERRA functionality will not be available."),
153
- pkg)
167
+ if required:
168
+ raise RuntimeError(
169
+ (
170
+ f"Required brew package {missing} missing on "
171
+ "OSX. Install all required packages before "
172
+ 'running SIERRA! (Did you read the "Getting '
173
+ 'Started" docs?)'
174
+ )
175
+ )
176
+
177
+ logging.debug(
178
+ (
179
+ "Recommended brew package %s missing on OSX. "
180
+ "Some SIERRA functionality will not be available."
181
+ ),
182
+ pkg,
183
+ )
@@ -21,8 +21,8 @@ class conf95:
21
21
 
22
22
  Applicable to:
23
23
 
24
- - :class:`~sierra.core.graphs.stacked_line_graph.StackedLineGraph`
25
- - :class:`~sierra.core.graphs.summary_line_graph.SummaryLineGraph`
24
+ - :func:`~sierra.core.graphs.stacked_line`
25
+ - :func:`~sierra.core.graphs.summary_line`
26
26
 
27
27
  """
28
28
  @staticmethod
@@ -65,8 +65,7 @@ class bw:
65
65
 
66
66
  Applicable to:
67
67
 
68
- - :class:`~sierra.core.graphs.stacked_line_graph.StackedLineGraph`
69
- - :class:`~sierra.core.graphs.summary_line_graph.SummaryLineGraph`
68
+ - :func:`~sierra.core.graphs.summary_line`
70
69
  """
71
70
  @staticmethod
72
71
  def from_groupby(groupby: pd.core.groupby.generic.DataFrameGroupBy) -> tp.Dict[str, pd.DataFrame]:
@@ -162,7 +161,7 @@ def _fillna(df_like: tp.Union[pd.DataFrame, np.float64, float]) -> tp.Union[pd.D
162
161
  raise TypeError(f"Unknown type={type(df_like)}, value={df_like}")
163
162
 
164
163
 
165
- __api__ = [
164
+ __all__ = [
166
165
  'conf95',
167
166
  'mean',
168
167
  'bw'
sierra/core/storage.py CHANGED
@@ -2,55 +2,36 @@
2
2
  #
3
3
  # SPDX-License-Identifier: MIT
4
4
  """
5
- Terminal interfare for the various storage plugins that come with SIERRA.
5
+ Trampoline bindings for the various storage plugins that come with SIERRA.
6
6
 
7
- See :ref:`ln-sierra-tutorials-plugin-storage` for more details.
7
+ See :ref:`tutorials/plugin/storage` for more details.
8
8
  """
9
9
 
10
10
  # Core packages
11
11
  import pathlib
12
- import typing as tp
13
12
 
14
13
  # 3rd party packages
15
14
  import pandas as pd
16
15
 
17
16
  # Project packages
18
- import sierra.core.plugin_manager as pm
17
+ import sierra.core.plugin as pm
18
+ from sierra.core.trampoline import cmdline_parser # noqa: F401
19
19
 
20
20
 
21
- class DataFrameWriter():
21
+ def df_read(path: pathlib.Path, medium: str, **kwargs) -> pd.DataFrame:
22
22
  """
23
- Dispatcher to write a dataframe to the filesystem.
23
+ Dispatch "read from storage" request to active ``--storage`` plugin.
24
24
  """
25
+ storage = pm.pipeline.get_plugin_module(medium)
26
+ return storage.df_read(path, **kwargs) # type: ignore
25
27
 
26
- def __init__(self, medium: str):
27
- self.medium = medium
28
28
 
29
- def __call__(self,
30
- df: pd.DataFrame,
31
- path: tp.Union[pathlib.Path, str],
32
- **kwargs) -> None:
33
- storage = pm.pipeline.get_plugin_module(self.medium)
34
- return storage.df_write(df, path, **kwargs) # type: ignore
35
-
36
-
37
- class DataFrameReader():
29
+ def df_write(df: pd.DataFrame, path: pathlib.Path, medium: str, **kwargs) -> None:
38
30
  """
39
- Dispatcher to read a dataframe from the filesystem.
40
-
31
+ Dispatch "write to storage" request to active ``--storage`` plugin.
41
32
  """
42
-
43
- def __init__(self, medium: str):
44
- self.medium = medium
45
-
46
- def __call__(self,
47
- path: tp.Union[pathlib.Path, str],
48
- **kwargs) -> pd.DataFrame:
49
- storage = pm.pipeline.get_plugin_module(self.medium)
50
- return storage.df_read(path, **kwargs) # type: ignore
33
+ storage = pm.pipeline.get_plugin_module(medium)
34
+ return storage.df_write(df, path, **kwargs) # type: ignore
51
35
 
52
36
 
53
- __api__ = [
54
- 'DataFrameWriter',
55
- 'DataFrameReader'
56
- ]
37
+ __all__ = ["df_read", "df_write"]