roby 0.8.0 → 3.0.0

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 (644) hide show
  1. checksums.yaml +7 -0
  2. data/.deep-cover.rb +3 -0
  3. data/.gitattributes +1 -0
  4. data/.gitignore +24 -0
  5. data/.simplecov +10 -0
  6. data/.travis.yml +17 -0
  7. data/.yardopts +4 -0
  8. data/Gemfile +15 -0
  9. data/README.md +11 -0
  10. data/Rakefile +47 -177
  11. data/benchmark/{alloc_misc.rb → attic/alloc_misc.rb} +2 -2
  12. data/benchmark/{discovery_latency.rb → attic/discovery_latency.rb} +19 -19
  13. data/benchmark/{garbage_collection.rb → attic/garbage_collection.rb} +9 -9
  14. data/benchmark/{genom.rb → attic/genom.rb} +0 -0
  15. data/benchmark/attic/transactions.rb +62 -0
  16. data/benchmark/plan_basic_operations.rb +28 -0
  17. data/benchmark/relations/graph.rb +63 -0
  18. data/benchmark/ruby/identity.rb +18 -0
  19. data/benchmark/ruby/set_intersect_vs_hash_merge.rb +39 -0
  20. data/benchmark/ruby/yield_vs_block.rb +35 -0
  21. data/benchmark/run +5 -0
  22. data/benchmark/synthetic_plan_modifications_with_transactions.rb +79 -0
  23. data/benchmark/transactions.rb +99 -51
  24. data/bin/roby +38 -197
  25. data/bin/roby-display +14 -0
  26. data/bin/roby-log +3 -176
  27. data/doc/guide/{src → attic}/abstraction/achieve_with.page +1 -1
  28. data/doc/guide/{src → attic}/abstraction/forwarding.page +1 -1
  29. data/doc/guide/{src → attic}/abstraction/hierarchy.page +1 -1
  30. data/doc/guide/{src → attic}/abstraction/index.page +1 -1
  31. data/doc/guide/{src → attic}/abstraction/task_models.page +1 -1
  32. data/doc/guide/{overview.rdoc → attic/cycle/api_overview.rdoc} +6 -1
  33. data/doc/guide/{src → attic}/cycle/cycle-overview.png +0 -0
  34. data/doc/guide/{src → attic}/cycle/cycle-overview.svg +0 -0
  35. data/doc/guide/attic/cycle/error_handling.page +98 -0
  36. data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.png +0 -0
  37. data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.svg +0 -0
  38. data/doc/guide/{src/cycle/error_handling.page → attic/cycle/error_sources.page} +46 -89
  39. data/doc/guide/{src → attic}/cycle/garbage_collection.page +1 -1
  40. data/doc/guide/{src → attic}/cycle/index.page +1 -1
  41. data/doc/guide/{src → attic}/cycle/propagation.page +11 -1
  42. data/doc/guide/{src → attic}/cycle/propagation_diamond.png +0 -0
  43. data/doc/guide/{src → attic}/cycle/propagation_diamond.svg +0 -0
  44. data/doc/guide/attic/plans/building_plans.page +89 -0
  45. data/doc/guide/attic/plans/code.page +192 -0
  46. data/doc/guide/{src/basics → attic/plans}/events.page +3 -4
  47. data/doc/guide/attic/plans/index.page +7 -0
  48. data/doc/guide/{plan_modifications.rdoc → attic/plans/plan_modifications.rdoc} +5 -3
  49. data/doc/guide/{src/basics → attic/plans}/plan_objects.page +2 -1
  50. data/doc/guide/attic/plans/querying_plans.page +5 -0
  51. data/doc/guide/{src/basics → attic/plans}/tasks.page +20 -20
  52. data/doc/guide/config.yaml +7 -4
  53. data/doc/guide/ext/extended_menu.rb +29 -0
  54. data/doc/guide/ext/init.rb +6 -0
  55. data/doc/guide/ext/rdoc_links.rb +7 -6
  56. data/doc/guide/src/advanced_concepts/history.page +5 -0
  57. data/doc/guide/src/advanced_concepts/index.page +11 -0
  58. data/doc/guide/src/advanced_concepts/recognizing_patterns.page +83 -0
  59. data/doc/guide/src/advanced_concepts/scheduling.page +87 -0
  60. data/doc/guide/src/advanced_concepts/transactions.page +5 -0
  61. data/doc/guide/src/advanced_concepts/unreachability.page +42 -0
  62. data/doc/guide/src/base.template +96 -0
  63. data/doc/guide/src/basics_shell_header.txt +5 -7
  64. data/doc/guide/src/building/action_coordination.page +96 -0
  65. data/doc/guide/src/building/actions.page +124 -0
  66. data/doc/guide/src/building/file_layout.page +71 -0
  67. data/doc/guide/src/building/index.page +50 -0
  68. data/doc/guide/src/building/patterns.page +86 -0
  69. data/doc/guide/src/building/patterns_forwarding.png +0 -0
  70. data/doc/guide/src/building/patterns_forwarding.svg +277 -0
  71. data/doc/guide/src/building/runtime.page +95 -0
  72. data/doc/guide/src/building/task_models.page +94 -0
  73. data/doc/guide/src/building/tasks.page +284 -0
  74. data/doc/guide/src/concepts/error_handling.page +100 -0
  75. data/doc/guide/src/concepts/exception_propagation.png +0 -0
  76. data/doc/guide/src/concepts/exception_propagation.svg +445 -0
  77. data/doc/guide/src/concepts/execution.page +85 -0
  78. data/doc/guide/src/concepts/execution.png +0 -0
  79. data/doc/guide/src/concepts/execution.svg +573 -0
  80. data/doc/guide/src/concepts/execution_cycle.png +0 -0
  81. data/doc/guide/src/concepts/garbage_collection.page +57 -0
  82. data/doc/guide/src/concepts/index.page +27 -0
  83. data/doc/guide/src/concepts/plans.page +101 -0
  84. data/doc/guide/src/concepts/policy.page +31 -0
  85. data/doc/guide/src/concepts/reactor.page +61 -0
  86. data/doc/guide/src/concepts/simple_plan_example.png +0 -0
  87. data/doc/guide/src/concepts/simple_plan_example.svg +376 -0
  88. data/doc/guide/src/default.template +9 -74
  89. data/doc/guide/src/event_relations/forward.page +71 -0
  90. data/doc/guide/src/event_relations/index.page +12 -0
  91. data/doc/guide/src/event_relations/scheduling_constraints.page +43 -0
  92. data/doc/guide/src/event_relations/signal.page +55 -0
  93. data/doc/guide/src/event_relations/temporal_constraints.page +77 -0
  94. data/doc/guide/src/htmldoc.metainfo +21 -8
  95. data/doc/guide/src/index.page +8 -3
  96. data/doc/guide/src/{introduction/install.page → installation/index.page} +37 -25
  97. data/doc/guide/src/installation/publications.page +14 -0
  98. data/doc/guide/src/{introduction → installation}/videos.page +14 -7
  99. data/doc/guide/src/interacting/index.page +16 -0
  100. data/doc/guide/src/interacting/run.page +33 -0
  101. data/doc/guide/src/interacting/shell.page +95 -0
  102. data/doc/guide/src/plugins/creating_plugins.page +72 -0
  103. data/doc/guide/src/plugins/index.page +27 -5
  104. data/doc/guide/src/plugins/{fault_tolerance.page → standard_plugins/fault_tolerance.page} +2 -2
  105. data/doc/guide/src/plugins/standard_plugins/index.page +11 -0
  106. data/doc/guide/src/plugins/{subsystems.page → standard_plugins/subsystems.page} +2 -2
  107. data/doc/guide/src/style_screen.css +687 -0
  108. data/doc/guide/src/task_relations/dependency.page +107 -0
  109. data/doc/guide/src/task_relations/executed_by.page +77 -0
  110. data/doc/guide/src/task_relations/index.page +12 -0
  111. data/doc/guide/src/task_relations/new_relations.page +119 -0
  112. data/doc/guide/src/task_relations/planned_by.page +46 -0
  113. data/doc/guide/src/tutorial/app.page +117 -0
  114. data/doc/guide/src/{basics → tutorial}/code_examples.page +6 -5
  115. data/doc/guide/src/{basics → tutorial}/dry.page +15 -15
  116. data/doc/guide/src/{basics → tutorial}/errors.page +43 -68
  117. data/doc/guide/src/tutorial/events.page +195 -0
  118. data/doc/guide/src/{basics → tutorial}/hierarchy.page +53 -52
  119. data/doc/guide/src/tutorial/index.page +13 -0
  120. data/doc/guide/src/tutorial/log_replay/goForward_1.png +0 -0
  121. data/doc/guide/src/tutorial/log_replay/goForward_2.png +0 -0
  122. data/doc/guide/src/tutorial/log_replay/goForward_3.png +0 -0
  123. data/doc/guide/src/{basics → tutorial}/log_replay/goForward_4.png +0 -0
  124. data/doc/guide/src/tutorial/log_replay/goForward_5.png +0 -0
  125. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_1.png +0 -0
  126. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_2.png +0 -0
  127. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_3.png +0 -0
  128. data/doc/guide/src/tutorial/log_replay/moveto_code_error.png +0 -0
  129. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_1.png +0 -0
  130. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_2.png +0 -0
  131. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_3.png +0 -0
  132. data/doc/guide/src/tutorial/log_replay/plan_repair_4.png +0 -0
  133. data/doc/guide/src/tutorial/log_replay/roby_log_main_window.png +0 -0
  134. data/doc/guide/src/{basics → tutorial}/log_replay/roby_log_relation_window.png +0 -0
  135. data/doc/guide/src/{basics → tutorial}/log_replay/roby_replay_event_representation.png +0 -0
  136. data/doc/guide/src/tutorial/relations_display.page +153 -0
  137. data/doc/guide/src/{basics → tutorial}/roby_cycle_overview.png +0 -0
  138. data/doc/guide/src/tutorial/shell.page +121 -0
  139. data/doc/guide/src/{basics → tutorial}/summary.page +1 -1
  140. data/doc/guide/src/tutorial/tasks.page +374 -0
  141. data/lib/roby.rb +102 -47
  142. data/lib/roby/actions.rb +17 -0
  143. data/lib/roby/actions/action.rb +80 -0
  144. data/lib/roby/actions/interface.rb +45 -0
  145. data/lib/roby/actions/library.rb +23 -0
  146. data/lib/roby/actions/models/action.rb +224 -0
  147. data/lib/roby/actions/models/coordination_action.rb +58 -0
  148. data/lib/roby/actions/models/interface.rb +22 -0
  149. data/lib/roby/actions/models/interface_base.rb +294 -0
  150. data/lib/roby/actions/models/library.rb +12 -0
  151. data/lib/roby/actions/models/method_action.rb +90 -0
  152. data/lib/roby/actions/task.rb +114 -0
  153. data/lib/roby/and_generator.rb +125 -0
  154. data/lib/roby/app.rb +2795 -829
  155. data/lib/roby/app/autotest_console_reporter.rb +138 -0
  156. data/lib/roby/app/base.rb +21 -0
  157. data/lib/roby/app/cucumber.rb +2 -0
  158. data/lib/roby/app/cucumber/controller.rb +439 -0
  159. data/lib/roby/app/cucumber/helpers.rb +280 -0
  160. data/lib/roby/app/cucumber/world.rb +32 -0
  161. data/lib/roby/app/debug.rb +136 -0
  162. data/lib/roby/app/gen.rb +2 -0
  163. data/lib/roby/app/rake.rb +178 -38
  164. data/lib/roby/app/robot_config.rb +9 -0
  165. data/lib/roby/app/robot_names.rb +115 -0
  166. data/lib/roby/app/run.rb +3 -2
  167. data/lib/roby/app/scripts.rb +72 -0
  168. data/lib/roby/app/scripts/autotest.rb +173 -0
  169. data/lib/roby/app/scripts/display.rb +2 -0
  170. data/lib/roby/app/scripts/restart.rb +52 -0
  171. data/lib/roby/app/scripts/results.rb +17 -8
  172. data/lib/roby/app/scripts/run.rb +155 -24
  173. data/lib/roby/app/scripts/shell.rb +147 -62
  174. data/lib/roby/app/scripts/test.rb +107 -22
  175. data/lib/roby/app/test_reporter.rb +74 -0
  176. data/lib/roby/app/test_server.rb +159 -0
  177. data/lib/roby/app/vagrant.rb +47 -0
  178. data/lib/roby/backports.rb +16 -0
  179. data/lib/roby/cli/display.rb +190 -0
  180. data/lib/roby/cli/exceptions.rb +17 -0
  181. data/lib/roby/cli/gen/actions/class.rb +5 -0
  182. data/lib/roby/cli/gen/actions/test.rb +6 -0
  183. data/lib/roby/cli/gen/app/.yardopts +6 -0
  184. data/lib/roby/cli/gen/app/README.md +28 -0
  185. data/lib/roby/cli/gen/app/Rakefile +15 -0
  186. data/{app → lib/roby/cli/gen/app}/config/app.yml +29 -39
  187. data/lib/roby/cli/gen/app/models/.gitattributes +1 -0
  188. data/{app → lib/roby/cli/gen/app/scripts}/controllers/.gitattributes +0 -0
  189. data/{app/data/.gitattributes → lib/roby/cli/gen/app/test/.gitignore} +0 -0
  190. data/lib/roby/cli/gen/class/class.rb +6 -0
  191. data/lib/roby/cli/gen/class/test.rb +7 -0
  192. data/lib/roby/cli/gen/helpers.rb +203 -0
  193. data/lib/roby/cli/gen/module/module.rb +5 -0
  194. data/lib/roby/cli/gen/module/test.rb +6 -0
  195. data/lib/roby/cli/gen/roby_app/config/init.rb +17 -0
  196. data/lib/roby/cli/gen/roby_app/config/robots/robot.rb +40 -0
  197. data/lib/roby/cli/gen/task/class.rb +44 -0
  198. data/lib/roby/cli/gen/task/test.rb +6 -0
  199. data/lib/roby/cli/gen_main.rb +120 -0
  200. data/lib/roby/cli/log.rb +276 -0
  201. data/lib/roby/cli/log/flamegraph.html +499 -0
  202. data/lib/roby/cli/log/flamegraph_renderer.rb +88 -0
  203. data/lib/roby/cli/main.rb +153 -0
  204. data/lib/roby/coordination.rb +60 -0
  205. data/lib/roby/coordination/action_script.rb +25 -0
  206. data/lib/roby/coordination/action_state_machine.rb +125 -0
  207. data/lib/roby/coordination/actions.rb +106 -0
  208. data/lib/roby/coordination/base.rb +145 -0
  209. data/lib/roby/coordination/calculus.rb +40 -0
  210. data/lib/roby/coordination/child.rb +28 -0
  211. data/lib/roby/coordination/event.rb +29 -0
  212. data/lib/roby/coordination/fault_handler.rb +25 -0
  213. data/lib/roby/coordination/fault_handling_task.rb +13 -0
  214. data/lib/roby/coordination/fault_response_table.rb +110 -0
  215. data/lib/roby/coordination/models/action_script.rb +64 -0
  216. data/lib/roby/coordination/models/action_state_machine.rb +224 -0
  217. data/lib/roby/coordination/models/actions.rb +191 -0
  218. data/lib/roby/coordination/models/arguments.rb +55 -0
  219. data/lib/roby/coordination/models/base.rb +176 -0
  220. data/lib/roby/coordination/models/capture.rb +86 -0
  221. data/lib/roby/coordination/models/child.rb +35 -0
  222. data/lib/roby/coordination/models/event.rb +41 -0
  223. data/lib/roby/coordination/models/exceptions.rb +42 -0
  224. data/lib/roby/coordination/models/fault_handler.rb +219 -0
  225. data/lib/roby/coordination/models/fault_response_table.rb +77 -0
  226. data/lib/roby/coordination/models/root.rb +22 -0
  227. data/lib/roby/coordination/models/script.rb +283 -0
  228. data/lib/roby/coordination/models/task.rb +184 -0
  229. data/lib/roby/coordination/models/task_from_action.rb +50 -0
  230. data/lib/roby/coordination/models/task_from_as_plan.rb +33 -0
  231. data/lib/roby/coordination/models/task_from_instanciation_object.rb +31 -0
  232. data/lib/roby/coordination/models/task_from_variable.rb +27 -0
  233. data/lib/roby/coordination/models/task_with_dependencies.rb +48 -0
  234. data/lib/roby/coordination/models/variable.rb +32 -0
  235. data/lib/roby/coordination/script.rb +200 -0
  236. data/lib/roby/coordination/script_instruction.rb +12 -0
  237. data/lib/roby/coordination/task.rb +45 -0
  238. data/lib/roby/coordination/task_base.rb +69 -0
  239. data/lib/roby/coordination/task_script.rb +293 -0
  240. data/lib/roby/coordination/task_state_machine.rb +308 -0
  241. data/lib/roby/decision_control.rb +33 -21
  242. data/lib/roby/distributed_object.rb +76 -0
  243. data/lib/roby/droby.rb +17 -0
  244. data/lib/roby/droby/droby_id.rb +6 -0
  245. data/lib/roby/droby/enable.rb +153 -0
  246. data/lib/roby/droby/event_logger.rb +189 -0
  247. data/lib/roby/droby/event_logging.rb +57 -0
  248. data/lib/roby/droby/exceptions.rb +14 -0
  249. data/lib/roby/droby/identifiable.rb +22 -0
  250. data/lib/roby/droby/logfile.rb +141 -0
  251. data/lib/roby/droby/logfile/client.rb +176 -0
  252. data/lib/roby/droby/logfile/file_format.md +97 -0
  253. data/lib/roby/droby/logfile/index.rb +117 -0
  254. data/lib/roby/droby/logfile/reader.rb +139 -0
  255. data/lib/roby/droby/logfile/server.rb +199 -0
  256. data/lib/roby/droby/logfile/writer.rb +114 -0
  257. data/lib/roby/droby/marshal.rb +264 -0
  258. data/lib/roby/droby/marshallable.rb +12 -0
  259. data/lib/roby/droby/null_event_logger.rb +25 -0
  260. data/lib/roby/droby/object_manager.rb +205 -0
  261. data/lib/roby/droby/peer_id.rb +6 -0
  262. data/lib/roby/droby/plan_rebuilder.rb +373 -0
  263. data/lib/roby/droby/rebuilt_plan.rb +160 -0
  264. data/lib/roby/droby/remote_droby_id.rb +6 -0
  265. data/lib/roby/droby/timepoints.rb +205 -0
  266. data/lib/roby/droby/timepoints_ctf.metadata.erb +101 -0
  267. data/lib/roby/droby/timepoints_ctf.rb +125 -0
  268. data/lib/roby/droby/v5.rb +14 -0
  269. data/lib/roby/droby/v5/builtin.rb +120 -0
  270. data/lib/roby/droby/v5/droby_class.rb +45 -0
  271. data/lib/roby/droby/v5/droby_constant.rb +81 -0
  272. data/lib/roby/droby/v5/droby_dump.rb +1026 -0
  273. data/lib/roby/droby/v5/droby_id.rb +44 -0
  274. data/lib/roby/droby/v5/droby_model.rb +82 -0
  275. data/lib/roby/droby/v5/peer_id.rb +10 -0
  276. data/lib/roby/droby/v5/remote_droby_id.rb +42 -0
  277. data/lib/roby/event.rb +79 -957
  278. data/lib/roby/event_constraints.rb +835 -0
  279. data/lib/roby/event_generator.rb +1047 -0
  280. data/lib/roby/event_structure/causal_link.rb +6 -0
  281. data/lib/roby/event_structure/forwarding.rb +6 -0
  282. data/lib/roby/event_structure/precedence.rb +7 -0
  283. data/lib/roby/event_structure/signal.rb +8 -0
  284. data/lib/roby/event_structure/temporal_constraints.rb +640 -0
  285. data/lib/roby/exceptions.rb +446 -152
  286. data/lib/roby/executable_plan.rb +549 -0
  287. data/lib/roby/execution_engine.rb +1997 -950
  288. data/lib/roby/filter_generator.rb +26 -0
  289. data/lib/roby/gui/chronicle_view.rb +225 -0
  290. data/lib/roby/gui/chronicle_widget.rb +925 -0
  291. data/lib/roby/gui/dot_id.rb +11 -0
  292. data/lib/roby/gui/exception_view.rb +44 -0
  293. data/lib/roby/gui/log_display.rb +273 -0
  294. data/lib/roby/gui/model_views.rb +2 -0
  295. data/lib/roby/gui/model_views/action_interface.rb +53 -0
  296. data/lib/roby/gui/model_views/task.rb +47 -0
  297. data/lib/roby/gui/model_views/task.rhtml +41 -0
  298. data/lib/roby/gui/object_info_view.rb +89 -0
  299. data/lib/roby/gui/plan_dot_layout.rb +427 -0
  300. data/lib/roby/gui/plan_rebuilder_widget.rb +357 -0
  301. data/lib/roby/gui/qt4_toMSecsSinceEpoch.rb +8 -0
  302. data/lib/roby/gui/relations_view.rb +278 -0
  303. data/lib/roby/gui/relations_view/relations.ui +139 -0
  304. data/lib/roby/gui/relations_view/relations_canvas.rb +1088 -0
  305. data/lib/roby/gui/relations_view/relations_config.rb +292 -0
  306. data/lib/roby/gui/relations_view/relations_view.ui +53 -0
  307. data/lib/roby/gui/scheduler_view.css +24 -0
  308. data/lib/roby/gui/scheduler_view.rb +46 -0
  309. data/lib/roby/gui/scheduler_view.rhtml +53 -0
  310. data/lib/roby/gui/stepping.rb +93 -0
  311. data/lib/roby/gui/stepping.ui +181 -0
  312. data/lib/roby/gui/styles.rb +81 -0
  313. data/lib/roby/gui/task_display_configuration.rb +42 -0
  314. data/lib/roby/gui/task_state_at.rb +38 -0
  315. data/lib/roby/hooks.rb +26 -0
  316. data/lib/roby/interface.rb +136 -469
  317. data/lib/roby/interface/async.rb +20 -0
  318. data/lib/roby/interface/async/action_monitor.rb +188 -0
  319. data/lib/roby/interface/async/interface.rb +498 -0
  320. data/lib/roby/interface/async/job_monitor.rb +213 -0
  321. data/lib/roby/interface/async/log.rb +238 -0
  322. data/lib/roby/interface/async/new_job_listener.rb +79 -0
  323. data/lib/roby/interface/async/ui_connector.rb +183 -0
  324. data/lib/roby/interface/client.rb +553 -0
  325. data/lib/roby/interface/command.rb +24 -0
  326. data/lib/roby/interface/command_argument.rb +16 -0
  327. data/lib/roby/interface/command_library.rb +92 -0
  328. data/lib/roby/interface/droby_channel.rb +174 -0
  329. data/lib/roby/interface/exceptions.rb +22 -0
  330. data/lib/roby/interface/interface.rb +655 -0
  331. data/lib/roby/interface/job.rb +47 -0
  332. data/lib/roby/interface/rest.rb +10 -0
  333. data/lib/roby/interface/rest/api.rb +29 -0
  334. data/lib/roby/interface/rest/helpers.rb +24 -0
  335. data/lib/roby/interface/rest/server.rb +212 -0
  336. data/lib/roby/interface/server.rb +154 -0
  337. data/lib/roby/interface/shell_client.rb +468 -0
  338. data/lib/roby/interface/shell_subcommand.rb +24 -0
  339. data/lib/roby/interface/subcommand_client.rb +35 -0
  340. data/lib/roby/interface/tcp.rb +168 -0
  341. data/lib/roby/models/arguments.rb +112 -0
  342. data/lib/roby/models/plan_object.rb +83 -0
  343. data/lib/roby/models/task.rb +835 -0
  344. data/lib/roby/models/task_event.rb +62 -0
  345. data/lib/roby/models/task_service.rb +78 -0
  346. data/lib/roby/or_generator.rb +88 -0
  347. data/lib/roby/plan.rb +1751 -864
  348. data/lib/roby/plan_object.rb +611 -0
  349. data/lib/roby/plan_service.rb +200 -0
  350. data/lib/roby/promise.rb +332 -0
  351. data/lib/roby/queries.rb +23 -0
  352. data/lib/roby/queries/and_matcher.rb +32 -0
  353. data/lib/roby/queries/any.rb +27 -0
  354. data/lib/roby/queries/code_error_matcher.rb +58 -0
  355. data/lib/roby/queries/event_generator_matcher.rb +9 -0
  356. data/lib/roby/queries/execution_exception_matcher.rb +165 -0
  357. data/lib/roby/queries/index.rb +165 -0
  358. data/lib/roby/queries/localized_error_matcher.rb +149 -0
  359. data/lib/roby/queries/matcher_base.rb +107 -0
  360. data/lib/roby/queries/none.rb +27 -0
  361. data/lib/roby/queries/not_matcher.rb +30 -0
  362. data/lib/roby/queries/op_matcher.rb +8 -0
  363. data/lib/roby/queries/or_matcher.rb +30 -0
  364. data/lib/roby/queries/plan_object_matcher.rb +363 -0
  365. data/lib/roby/queries/query.rb +188 -0
  366. data/lib/roby/queries/task_event_generator_matcher.rb +86 -0
  367. data/lib/roby/queries/task_matcher.rb +344 -0
  368. data/lib/roby/relations.rb +42 -678
  369. data/lib/roby/relations/bidirectional_directed_adjacency_graph.rb +492 -0
  370. data/lib/roby/relations/directed_relation_support.rb +268 -0
  371. data/lib/roby/relations/event_relation_graph.rb +19 -0
  372. data/lib/roby/relations/fork_merge_visitor.rb +154 -0
  373. data/lib/roby/relations/graph.rb +533 -0
  374. data/lib/roby/relations/models/directed_relation_support.rb +11 -0
  375. data/lib/roby/relations/models/graph.rb +75 -0
  376. data/lib/roby/relations/models/task_relation_graph.rb +18 -0
  377. data/lib/roby/relations/space.rb +380 -0
  378. data/lib/roby/relations/task_relation_graph.rb +20 -0
  379. data/lib/roby/robot.rb +85 -38
  380. data/lib/roby/schedulers/basic.rb +155 -25
  381. data/lib/roby/schedulers/null.rb +20 -0
  382. data/lib/roby/schedulers/reporting.rb +31 -0
  383. data/lib/roby/schedulers/state.rb +129 -0
  384. data/lib/roby/schedulers/temporal.rb +91 -0
  385. data/lib/roby/singletons.rb +87 -0
  386. data/lib/roby/standalone.rb +4 -2
  387. data/lib/roby/standard_errors.rb +405 -82
  388. data/lib/roby/state.rb +6 -3
  389. data/lib/roby/state/conf_model.rb +5 -0
  390. data/lib/roby/state/events.rb +181 -95
  391. data/lib/roby/state/goal_model.rb +77 -0
  392. data/lib/roby/state/open_struct.rb +591 -0
  393. data/lib/roby/state/open_struct_model.rb +68 -0
  394. data/lib/roby/state/pos.rb +45 -45
  395. data/lib/roby/state/shapes.rb +11 -11
  396. data/lib/roby/state/state_model.rb +303 -0
  397. data/lib/roby/state/task.rb +43 -0
  398. data/lib/roby/support.rb +88 -148
  399. data/lib/roby/task.rb +1361 -1750
  400. data/lib/roby/task_arguments.rb +428 -0
  401. data/lib/roby/task_event.rb +127 -0
  402. data/lib/roby/task_event_generator.rb +337 -0
  403. data/lib/roby/task_service.rb +6 -0
  404. data/lib/roby/task_structure/conflicts.rb +104 -0
  405. data/lib/roby/task_structure/dependency.rb +932 -0
  406. data/lib/roby/task_structure/error_handling.rb +118 -0
  407. data/lib/roby/task_structure/executed_by.rb +234 -0
  408. data/lib/roby/task_structure/planned_by.rb +90 -0
  409. data/lib/roby/tasks/aggregator.rb +37 -0
  410. data/lib/roby/tasks/external_process.rb +275 -0
  411. data/lib/roby/tasks/group.rb +27 -0
  412. data/lib/roby/tasks/null.rb +19 -0
  413. data/lib/roby/tasks/parallel.rb +43 -0
  414. data/lib/roby/tasks/sequence.rb +88 -0
  415. data/lib/roby/tasks/simple.rb +21 -0
  416. data/lib/roby/{thread_task.rb → tasks/thread.rb} +50 -24
  417. data/lib/roby/tasks/timeout.rb +17 -0
  418. data/lib/roby/tasks/virtual.rb +55 -0
  419. data/lib/roby/template_plan.rb +7 -0
  420. data/lib/roby/test/aruba_minitest.rb +74 -0
  421. data/lib/roby/test/assertion.rb +16 -0
  422. data/lib/roby/test/assertions.rb +490 -0
  423. data/lib/roby/test/common.rb +368 -591
  424. data/lib/roby/test/dsl.rb +149 -0
  425. data/lib/roby/test/error.rb +18 -0
  426. data/lib/roby/test/event_reporter.rb +83 -0
  427. data/lib/roby/test/execution_expectations.rb +1134 -0
  428. data/lib/roby/test/expect_execution.rb +151 -0
  429. data/lib/roby/test/minitest_helpers.rb +166 -0
  430. data/lib/roby/test/roby_app_helpers.rb +200 -0
  431. data/lib/roby/test/run_planners.rb +155 -0
  432. data/lib/roby/test/self.rb +112 -0
  433. data/lib/roby/test/spec.rb +198 -0
  434. data/lib/roby/test/tasks/empty_task.rb +4 -4
  435. data/lib/roby/test/tasks/goto.rb +28 -27
  436. data/lib/roby/test/teardown_plans.rb +100 -0
  437. data/lib/roby/test/testcase.rb +239 -307
  438. data/lib/roby/test/tools.rb +159 -155
  439. data/lib/roby/test/validate_state_machine.rb +75 -0
  440. data/lib/roby/transaction.rb +1125 -0
  441. data/lib/roby/transaction/event_generator_proxy.rb +63 -0
  442. data/lib/roby/transaction/plan_object_proxy.rb +99 -0
  443. data/lib/roby/transaction/plan_service_proxy.rb +43 -0
  444. data/lib/roby/transaction/proxying.rb +120 -0
  445. data/lib/roby/transaction/task_event_generator_proxy.rb +19 -0
  446. data/lib/roby/transaction/task_proxy.rb +135 -0
  447. data/lib/roby/until_generator.rb +30 -0
  448. data/lib/roby/version.rb +5 -0
  449. data/lib/roby/yard.rb +169 -0
  450. data/lib/yard-roby.rb +1 -0
  451. data/manifest.xml +32 -6
  452. data/roby.gemspec +59 -0
  453. metadata +788 -587
  454. data/Manifest.txt +0 -321
  455. data/NOTES +0 -4
  456. data/README.txt +0 -166
  457. data/TODO.txt +0 -146
  458. data/app/README.txt +0 -24
  459. data/app/Rakefile +0 -8
  460. data/app/config/ROBOT.rb +0 -5
  461. data/app/config/init.rb +0 -33
  462. data/app/config/roby.yml +0 -3
  463. data/app/controllers/ROBOT.rb +0 -2
  464. data/app/planners/ROBOT/main.rb +0 -6
  465. data/app/planners/main.rb +0 -5
  466. data/app/scripts/distributed +0 -3
  467. data/app/scripts/generate/bookmarks +0 -3
  468. data/app/scripts/replay +0 -3
  469. data/app/scripts/results +0 -3
  470. data/app/scripts/run +0 -3
  471. data/app/scripts/server +0 -3
  472. data/app/scripts/shell +0 -3
  473. data/app/scripts/test +0 -3
  474. data/app/tasks/.gitattributes +0 -0
  475. data/app/tasks/ROBOT/.gitattributes +0 -0
  476. data/bin/roby-shell +0 -25
  477. data/doc/guide/src/basics/app.page +0 -139
  478. data/doc/guide/src/basics/index.page +0 -11
  479. data/doc/guide/src/basics/log_replay/goForward_1.png +0 -0
  480. data/doc/guide/src/basics/log_replay/goForward_2.png +0 -0
  481. data/doc/guide/src/basics/log_replay/goForward_3.png +0 -0
  482. data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
  483. data/doc/guide/src/basics/log_replay/plan_repair_4.png +0 -0
  484. data/doc/guide/src/basics/log_replay/roby_log_main_window.png +0 -0
  485. data/doc/guide/src/basics/relations_display.page +0 -203
  486. data/doc/guide/src/basics/shell.page +0 -102
  487. data/doc/guide/src/default.css +0 -319
  488. data/doc/guide/src/introduction/index.page +0 -29
  489. data/doc/guide/src/introduction/publications.page +0 -14
  490. data/doc/guide/src/relations/dependency.page +0 -89
  491. data/doc/guide/src/relations/index.page +0 -12
  492. data/ext/droby/dump.cc +0 -175
  493. data/ext/droby/extconf.rb +0 -3
  494. data/ext/graph/algorithm.cc +0 -746
  495. data/ext/graph/extconf.rb +0 -7
  496. data/ext/graph/graph.cc +0 -575
  497. data/ext/graph/graph.hh +0 -183
  498. data/ext/graph/iterator_sequence.hh +0 -102
  499. data/ext/graph/undirected_dfs.hh +0 -226
  500. data/ext/graph/undirected_graph.hh +0 -421
  501. data/lib/roby/app/scripts/generate/bookmarks.rb +0 -162
  502. data/lib/roby/app/scripts/replay.rb +0 -31
  503. data/lib/roby/app/scripts/server.rb +0 -18
  504. data/lib/roby/basic_object.rb +0 -151
  505. data/lib/roby/config.rb +0 -14
  506. data/lib/roby/distributed.rb +0 -36
  507. data/lib/roby/distributed/base.rb +0 -448
  508. data/lib/roby/distributed/communication.rb +0 -875
  509. data/lib/roby/distributed/connection_space.rb +0 -616
  510. data/lib/roby/distributed/distributed_object.rb +0 -206
  511. data/lib/roby/distributed/drb.rb +0 -62
  512. data/lib/roby/distributed/notifications.rb +0 -531
  513. data/lib/roby/distributed/peer.rb +0 -555
  514. data/lib/roby/distributed/protocol.rb +0 -529
  515. data/lib/roby/distributed/proxy.rb +0 -343
  516. data/lib/roby/distributed/subscription.rb +0 -311
  517. data/lib/roby/distributed/transaction.rb +0 -498
  518. data/lib/roby/external_process_task.rb +0 -225
  519. data/lib/roby/graph.rb +0 -160
  520. data/lib/roby/log.rb +0 -3
  521. data/lib/roby/log/chronicle.rb +0 -303
  522. data/lib/roby/log/console.rb +0 -74
  523. data/lib/roby/log/data_stream.rb +0 -275
  524. data/lib/roby/log/dot.rb +0 -279
  525. data/lib/roby/log/event_stream.rb +0 -161
  526. data/lib/roby/log/file.rb +0 -396
  527. data/lib/roby/log/gui/basic_display.ui +0 -83
  528. data/lib/roby/log/gui/basic_display_ui.rb +0 -89
  529. data/lib/roby/log/gui/chronicle.rb +0 -26
  530. data/lib/roby/log/gui/chronicle_view.rb +0 -40
  531. data/lib/roby/log/gui/chronicle_view.ui +0 -70
  532. data/lib/roby/log/gui/chronicle_view_ui.rb +0 -90
  533. data/lib/roby/log/gui/data_displays.rb +0 -171
  534. data/lib/roby/log/gui/data_displays.ui +0 -155
  535. data/lib/roby/log/gui/data_displays_ui.rb +0 -146
  536. data/lib/roby/log/gui/notifications.rb +0 -26
  537. data/lib/roby/log/gui/relations.rb +0 -269
  538. data/lib/roby/log/gui/relations.ui +0 -123
  539. data/lib/roby/log/gui/relations_ui.rb +0 -120
  540. data/lib/roby/log/gui/relations_view.rb +0 -185
  541. data/lib/roby/log/gui/relations_view.ui +0 -149
  542. data/lib/roby/log/gui/relations_view_ui.rb +0 -144
  543. data/lib/roby/log/gui/replay.rb +0 -366
  544. data/lib/roby/log/gui/replay_controls.rb +0 -206
  545. data/lib/roby/log/gui/replay_controls.ui +0 -282
  546. data/lib/roby/log/gui/replay_controls_ui.rb +0 -249
  547. data/lib/roby/log/gui/runtime.rb +0 -130
  548. data/lib/roby/log/hooks.rb +0 -186
  549. data/lib/roby/log/logger.rb +0 -203
  550. data/lib/roby/log/notifications.rb +0 -244
  551. data/lib/roby/log/plan_rebuilder.rb +0 -468
  552. data/lib/roby/log/relations.rb +0 -1084
  553. data/lib/roby/log/server.rb +0 -547
  554. data/lib/roby/log/sqlite.rb +0 -47
  555. data/lib/roby/log/timings.rb +0 -233
  556. data/lib/roby/plan-object.rb +0 -371
  557. data/lib/roby/planning.rb +0 -13
  558. data/lib/roby/planning/loops.rb +0 -309
  559. data/lib/roby/planning/model.rb +0 -1012
  560. data/lib/roby/planning/task.rb +0 -180
  561. data/lib/roby/query.rb +0 -655
  562. data/lib/roby/relations/conflicts.rb +0 -67
  563. data/lib/roby/relations/dependency.rb +0 -358
  564. data/lib/roby/relations/ensured.rb +0 -19
  565. data/lib/roby/relations/error_handling.rb +0 -22
  566. data/lib/roby/relations/events.rb +0 -7
  567. data/lib/roby/relations/executed_by.rb +0 -208
  568. data/lib/roby/relations/influence.rb +0 -10
  569. data/lib/roby/relations/planned_by.rb +0 -63
  570. data/lib/roby/state/information.rb +0 -55
  571. data/lib/roby/state/state.rb +0 -367
  572. data/lib/roby/task-operations.rb +0 -186
  573. data/lib/roby/task_index.rb +0 -80
  574. data/lib/roby/test/distributed.rb +0 -230
  575. data/lib/roby/test/tasks/simple_task.rb +0 -23
  576. data/lib/roby/transactions.rb +0 -507
  577. data/lib/roby/transactions/proxy.rb +0 -325
  578. data/plugins/fault_injection/History.txt +0 -4
  579. data/plugins/fault_injection/README.txt +0 -34
  580. data/plugins/fault_injection/Rakefile +0 -12
  581. data/plugins/fault_injection/TODO.txt +0 -0
  582. data/plugins/fault_injection/app.rb +0 -52
  583. data/plugins/fault_injection/fault_injection.rb +0 -89
  584. data/plugins/fault_injection/test/test_fault_injection.rb +0 -78
  585. data/plugins/subsystems/README.txt +0 -37
  586. data/plugins/subsystems/Rakefile +0 -13
  587. data/plugins/subsystems/app.rb +0 -182
  588. data/plugins/subsystems/test/app/README +0 -24
  589. data/plugins/subsystems/test/app/Rakefile +0 -8
  590. data/plugins/subsystems/test/app/config/app.yml +0 -71
  591. data/plugins/subsystems/test/app/config/init.rb +0 -12
  592. data/plugins/subsystems/test/app/config/roby.yml +0 -3
  593. data/plugins/subsystems/test/app/planners/main.rb +0 -20
  594. data/plugins/subsystems/test/app/scripts/distributed +0 -3
  595. data/plugins/subsystems/test/app/scripts/replay +0 -3
  596. data/plugins/subsystems/test/app/scripts/results +0 -3
  597. data/plugins/subsystems/test/app/scripts/run +0 -3
  598. data/plugins/subsystems/test/app/scripts/server +0 -3
  599. data/plugins/subsystems/test/app/scripts/shell +0 -3
  600. data/plugins/subsystems/test/app/scripts/test +0 -3
  601. data/plugins/subsystems/test/app/tasks/services.rb +0 -15
  602. data/plugins/subsystems/test/test_subsystems.rb +0 -78
  603. data/test/distributed/test_communication.rb +0 -195
  604. data/test/distributed/test_connection.rb +0 -284
  605. data/test/distributed/test_execution.rb +0 -378
  606. data/test/distributed/test_mixed_plan.rb +0 -341
  607. data/test/distributed/test_plan_notifications.rb +0 -238
  608. data/test/distributed/test_protocol.rb +0 -525
  609. data/test/distributed/test_query.rb +0 -106
  610. data/test/distributed/test_remote_plan.rb +0 -491
  611. data/test/distributed/test_transaction.rb +0 -466
  612. data/test/mockups/external_process +0 -28
  613. data/test/mockups/tasks.rb +0 -27
  614. data/test/planning/test_loops.rb +0 -432
  615. data/test/planning/test_model.rb +0 -427
  616. data/test/planning/test_task.rb +0 -126
  617. data/test/relations/test_conflicts.rb +0 -42
  618. data/test/relations/test_dependency.rb +0 -324
  619. data/test/relations/test_ensured.rb +0 -38
  620. data/test/relations/test_executed_by.rb +0 -224
  621. data/test/relations/test_planned_by.rb +0 -56
  622. data/test/suite_core.rb +0 -29
  623. data/test/suite_distributed.rb +0 -10
  624. data/test/suite_planning.rb +0 -4
  625. data/test/suite_relations.rb +0 -8
  626. data/test/tasks/test_external_process.rb +0 -126
  627. data/test/tasks/test_thread_task.rb +0 -70
  628. data/test/test_bgl.rb +0 -528
  629. data/test/test_event.rb +0 -969
  630. data/test/test_exceptions.rb +0 -591
  631. data/test/test_execution_engine.rb +0 -987
  632. data/test/test_gui.rb +0 -20
  633. data/test/test_interface.rb +0 -43
  634. data/test/test_log.rb +0 -125
  635. data/test/test_log_server.rb +0 -133
  636. data/test/test_plan.rb +0 -418
  637. data/test/test_query.rb +0 -424
  638. data/test/test_relations.rb +0 -260
  639. data/test/test_state.rb +0 -432
  640. data/test/test_support.rb +0 -16
  641. data/test/test_task.rb +0 -1181
  642. data/test/test_testcase.rb +0 -138
  643. data/test/test_transactions.rb +0 -610
  644. data/test/test_transactions_proxy.rb +0 -216
@@ -1,29 +0,0 @@
1
- ---
2
- title: What is Roby?
3
- routed_title: Introduction
4
- sort_info: 0
5
- --- pipeline:rdoc
6
-
7
- Roby is a plan manager: it allows to represent, execute and adapt a plan, which
8
- is a representation of the past, present and future activities of a robot along
9
- with the information needed to verify that their executin is going well, and to
10
- manage errors.
11
-
12
- Roby is:
13
- * a task/event model in which one can represent the activities (Roby::Task) and
14
- the noticeable situations during execution (Roby::EventGenerator,
15
- Roby::Task.event).
16
- * a set of task relations describing the interactions between the activities
17
- (Roby::TaskStructure).
18
- * a set of event relations describing the reaction the system should have in
19
- response to some situations (Roby::EventStructure).
20
- * error management tools which allow to catch errors during execution and
21
- repair them (i.e. let the system manage the error).
22
- * a mean to modify the plan as it is being executed (Roby::Transaction)
23
- * (G)UI tools for interacting/controlling the living system.
24
- * all of that in a multi-robot context.
25
-
26
- Roby is the result of my PhD. As such, my PhD thesis can be considered as a
27
- design document for the system. If you want an overview of the principles, you
28
- can also refer to the publications I did.
29
-
@@ -1,14 +0,0 @@
1
- ---
2
- title: Publications
3
- sort_info: 300
4
- --- pipeline:tags,rdoc
5
- These are the papers which present Roby that I published the last years.
6
-
7
- * A Software Component for Plan Management in Robotics
8
- ({PhD thesis}[http://roby.rubyforge.org/papers/thesis-en.pdf], slides[http://roby.rubyforge.org/papers/thesis-slides.pdf])
9
- * A Software Component for Simultaneous Plan Execution and Adaptation -
10
- IROS2007 ({paper}[http://roby.rubyforge.org/papers/roby-2007-iros.pdf])
11
- * A Plan Manager for Multi-Robot Systems - FSR2007
12
- ({paper}[http://roby.rubyforge.org/papers/roby-2007-fsr.pdf], {slides}[http://roby.rubyforge.org/papers/roby-2007-fsr-slides.pdf])
13
-
14
-
@@ -1,89 +0,0 @@
1
- ---
2
- title: TaskStructure::Dependency
3
- sort_info: 100
4
- --- name:content pipeline:tags,rdoc,blocks
5
-
6
- == Semantics
7
- The dependency relation is is a <i>dependency</i> relation. If task t1 is a
8
- parent of task t2 in that relation, it means that the successful execution of
9
- t1 requires the successful execution of t2.
10
-
11
- To add a new dependency relation between two tasks +t1+ and +t2+, simply do
12
- t1.depends_on t2
13
-
14
- More specifically, the dependency relation expresses that +t2+ must achieve a
15
- specific thing for +t1+. In Roby, such an achievement is of course defined by a
16
- set of events.
17
-
18
- So, in Roby terms, _depends\_on_ specifies that +t2+ should achieve a specific
19
- thing for +t1+. By default, that achievement is the _success_ of the child task.
20
- That can be changed through the +:success+ option of _depends\_on_. By default,
21
- that set is <tt>:success</tt> (i.e. +t1+ requires a successful execution of
22
- +t2+). As another example, the following
23
- t1.depends_on t2, :success => [:updated]
24
-
25
- specifies that +t1+ needs +t2+ to emit its _updated_ event at least once. The
26
- default is obviously equivalent to
27
- t1.depends_on t2, :success => [:success]
28
-
29
- A different constraint that can be specified is that some events <b>should
30
- not</b> be emitted. That is specified through the +:failure+ option. For
31
- instance, if it is required that +t2+ does not stop while +t1+ is running, do
32
- t1.depends_on t2, :success => [], :failure => [:stop]
33
-
34
- Note that it does _not_ specify that +t2+ should run as long as +t1+ runs: to do
35
- that, you would need to specify that +t2+ must be started when +t1+ is started
36
- with (for instance):
37
- t1.on :start, t2, :start
38
-
39
- The relation constraint is one-shot: if any of the success events have already
40
- been emitted, then the failure events do not matter anymore. For instance, if
41
- the following relation is added:
42
- t1.depends_on t2, :success => [:updated], :failure => [:success]
43
-
44
- Then as soon as +:updated+ is emitted, the emission of +:success+ is not a
45
- failure anymore. In a same way, as soon as +:success+ is emitted then the
46
- emission of +:updated+ will not be considered as a success anymore.
47
-
48
- == Manipulation
49
- A dependency relation is added with the #depends_on call. Apart from the
50
- +:success+ and +:failure+ options described above, one other option is
51
- available: the +:remove_when_done+ option. If set to true, as for instance
52
- t1.depends_on t2, :remove_when_done => true
53
-
54
- then the relation is automatically removed as soon as it is not useful anymore
55
- (i.e. one of the success events is emitted).
56
-
57
- A dependency relation is removed with #remove_child
58
- t1.remove_child t2
59
-
60
- Children are enumerated with
61
- t1.each_child { |t2, options| ... }
62
- t1.children => enumerator
63
-
64
- and parents with
65
- t2.each_parent { |t1| ... }
66
- t2.parents => enumerator
67
-
68
- Moreover, dependency relationship between two tasks can be tested with the
69
- following predicates:
70
- t2.depended_upon_by?(t1)
71
- returns true if t2 is a dependency of t1: t2 is a direct child of t1.
72
- t1.depends_on?(t2)
73
- returns true if t1 depends on t2 in one way or the other, i.e. that t2 is a
74
- child or a grandchild or a grand-grandchild or ... of t1.
75
- t1.depends_on?(t2, false)
76
- returns true if t1 directly depends on t2: t1 is a direct parent of t2.
77
-
78
- == Errors
79
-
80
- The two types of errors that can occur in the context of a dependency relation
81
- are:
82
- * no success event will ever be emitted (see event
83
- unreachability:"/objects/events")
84
- * one of the failure events is emitted
85
-
86
- In both cases, a {rdoc_class: ChildFailedError} exception is generated. In the
87
- first case, the failure point is the success event generator that is
88
- unreachable. In the second case, it is the event that triggered the failure.
89
-
@@ -1,12 +0,0 @@
1
- ---
2
- title: Task and Event Relations
3
- sort_info: 0
4
- --- name:content pipeline:tags,markdown,blocks
5
-
6
- This section is a reference for the task and event relations. As you should
7
- already know now, these relations are used to build the plans that are executed
8
- by Roby.
9
-
10
- Look at the main menu on the right, and pick the relation you more information
11
- on !
12
-
@@ -1,175 +0,0 @@
1
- #include <ruby.h>
2
- #include <intern.h>
3
- #include <st.h>
4
- #include <set>
5
-
6
- static VALUE mRoby;
7
- static VALUE mRobyDistributed;
8
- static VALUE cDRbObject;
9
- static VALUE cSet;
10
- static VALUE cValueSet;
11
- static ID id_droby_dump;
12
- static ID id_remote_id;
13
- static ID id_append;
14
-
15
- /*
16
- * Document-class: Roby::Distributed
17
- */
18
-
19
- /* call-seq:
20
- * format(object, peer) => formatted_object
21
- *
22
- * Formats +object+ so that it is ready to be dumped by Marshal.dump for
23
- * sending to +peer+. This means that if the object has a droby_dump method, it
24
- * is called to get a marshallable object which represents +object+. Moreover,
25
- * if +peer+ responds to #incremental_dump?(object), this is called to
26
- * determine wether a full dump is required or if sending a
27
- * Roby::Distributed::RemoteID for remote reference is enough.
28
- *
29
- * If the object is not a DRbObject and does not define a #droby_dump method,
30
- * it is proxied through a DRbObject if it present in
31
- * Distributed.allow_remote_access. Otherwise, we will try to dump it as-is.
32
- */
33
- static VALUE droby_format(int argc, VALUE* argv, VALUE self)
34
- {
35
- VALUE object, destination;
36
- rb_scan_args(argc, argv, "11", &object, &destination);
37
-
38
- if (RTEST(rb_obj_is_kind_of(object, cDRbObject)))
39
- return object;
40
-
41
- if (RTEST(rb_respond_to(object, id_droby_dump)))
42
- {
43
- if (!NIL_P(destination) && RTEST(rb_funcall(destination, rb_intern("incremental_dump?"), 1, object)))
44
- return rb_funcall(object, id_remote_id, 0);
45
- return rb_funcall(object, id_droby_dump, 1, destination);
46
- }
47
-
48
- VALUE remote_access = rb_iv_get(self, "@allowed_remote_access");
49
- int i;
50
- for (i = 0; i < RARRAY(remote_access)->len; ++i)
51
- {
52
- if (rb_obj_is_kind_of(object, RARRAY(remote_access)->ptr[i]))
53
- return rb_class_new_instance(1, &object, cDRbObject);
54
- }
55
-
56
- return object;
57
- }
58
-
59
- typedef struct DROBY_DUMP_ITERATION_ARG
60
- {
61
- VALUE result;
62
- VALUE dest;
63
- } DROBY_DUMP_ITERATION_ARG;
64
-
65
- static VALUE array_dump_element(VALUE element, DROBY_DUMP_ITERATION_ARG* arg)
66
- {
67
- VALUE args[2] = { element, arg->dest };
68
- rb_ary_push(arg->result, droby_format(2, args, mRobyDistributed));
69
- return Qnil;
70
- }
71
-
72
- // call-seq:
73
- // droby_dump(dest) => dumped_array
74
- //
75
- // Creates a copy of this Array with all its values formatted for marshalling
76
- // using Distributed.format.
77
- static VALUE array_droby_dump(VALUE self, VALUE dest)
78
- {
79
- VALUE result = rb_ary_new();
80
- struct RArray* array = RARRAY(self);
81
- int i;
82
-
83
- VALUE el[2] = { Qnil, dest };
84
- for (i = 0; i < array->len; ++i)
85
- {
86
- el[0] = array->ptr[i];
87
- rb_ary_push(result, droby_format(2, el, mRobyDistributed));
88
- }
89
-
90
- return result;
91
- }
92
-
93
- static int hash_dump_element(VALUE key, VALUE value, DROBY_DUMP_ITERATION_ARG* arg)
94
- {
95
- VALUE args_key[2] = { key, arg->dest };
96
- key = droby_format(2, args_key, mRobyDistributed);
97
- VALUE args_value[2] = { value, arg->dest };
98
- value = droby_format(2, args_value, mRobyDistributed);
99
- rb_hash_aset(arg->result, key, value);
100
- return ST_CONTINUE;
101
- }
102
-
103
- // call-seq:
104
- // droby_dump => dumped_hash
105
- //
106
- // Creates a copy of this Hash with all its values formatted for marshalling
107
- // using Distributed.format. The keys are not modified.
108
- static VALUE hash_droby_dump(VALUE self, VALUE dest)
109
- {
110
- DROBY_DUMP_ITERATION_ARG arg = { rb_hash_new(), dest };
111
- rb_hash_foreach(self, (int(*)(ANYARGS)) hash_dump_element, (VALUE)&arg);
112
- return arg.result;
113
- }
114
-
115
- static VALUE appendable_dump_element(VALUE value, DROBY_DUMP_ITERATION_ARG* arg)
116
- {
117
- VALUE args[2] = { value, arg->dest };
118
- rb_funcall(arg->result, id_append, 1, droby_format(2, args, mRobyDistributed));
119
- return Qnil;
120
- }
121
-
122
- // Creates a copy of this Set with all its values formatted for marshalling
123
- // using Distributed.format
124
- static VALUE set_droby_dump(VALUE self, VALUE dest)
125
- {
126
- DROBY_DUMP_ITERATION_ARG arg = { rb_class_new_instance(0, 0, cSet), dest };
127
- rb_iterate(rb_each, self, RUBY_METHOD_FUNC(appendable_dump_element), (VALUE)&arg);
128
- return arg.result;
129
- }
130
-
131
- // Creates a copy of this ValueSet with all its values formatted for
132
- // marshalling using Distributed.format
133
- static VALUE value_set_droby_dump(VALUE self, VALUE dest)
134
- {
135
- VALUE result = rb_class_new_instance(0, 0, cValueSet);
136
- std::set<VALUE>* result_set;
137
- Data_Get_Struct(result, std::set<VALUE>, result_set);
138
-
139
- std::set<VALUE> const * source_set;
140
- Data_Get_Struct(self, std::set<VALUE>, source_set);
141
-
142
- VALUE el[2] = { Qnil, dest };
143
- for (std::set<VALUE>::const_iterator it = source_set->begin(); it != source_set->end(); ++it)
144
- {
145
- el[0] = *it;
146
- result_set->insert(droby_format(2, el, mRobyDistributed));
147
- }
148
-
149
- return result;
150
- }
151
-
152
- extern "C" void Init_roby_marshalling()
153
- {
154
- id_droby_dump = rb_intern("droby_dump");
155
- id_remote_id = rb_intern("remote_id");
156
- id_append = rb_intern("<<");
157
-
158
- cDRbObject = rb_const_get(rb_cObject, rb_intern("DRbObject"));
159
- cValueSet = rb_const_get(rb_cObject, rb_intern("ValueSet"));
160
- cSet = rb_const_get(rb_cObject, rb_intern("Set"));
161
-
162
- /* */
163
- mRoby = rb_define_module("Roby");
164
- /* */
165
- mRobyDistributed = rb_define_module_under(mRoby, "Distributed");
166
-
167
- rb_define_method(rb_cArray , "droby_dump" , RUBY_METHOD_FUNC(array_droby_dump) , 1);
168
- rb_define_method(rb_cHash , "droby_dump" , RUBY_METHOD_FUNC(hash_droby_dump) , 1);
169
- rb_define_method(cSet , "droby_dump" , RUBY_METHOD_FUNC(set_droby_dump) , 1);
170
- rb_define_method(cValueSet , "droby_dump" , RUBY_METHOD_FUNC(value_set_droby_dump) , 1);
171
-
172
- rb_define_singleton_method(mRobyDistributed, "format", RUBY_METHOD_FUNC(droby_format), -1);
173
-
174
- }
175
-
@@ -1,3 +0,0 @@
1
- require 'mkmf'
2
- create_makefile("roby_marshalling")
3
-
@@ -1,746 +0,0 @@
1
- #include "graph.hh"
2
- #include <boost/graph/depth_first_search.hpp>
3
- #include <boost/graph/breadth_first_search.hpp>
4
- #include <boost/iterator/transform_iterator.hpp>
5
- #include <boost/iterator/filter_iterator.hpp>
6
- #include <boost/graph/connected_components.hpp>
7
- #include <boost/graph/topological_sort.hpp>
8
- #include <boost/bind.hpp>
9
- #include <boost/graph/reverse_graph.hpp>
10
- #include "undirected_graph.hh"
11
- #include "undirected_dfs.hh"
12
- #include <queue>
13
- #include <functional>
14
-
15
- typedef RubyGraph::vertex_iterator vertex_iterator;
16
- typedef RubyGraph::vertex_descriptor vertex_descriptor;
17
- typedef RubyGraph::edge_iterator edge_iterator;
18
- typedef RubyGraph::edge_descriptor edge_descriptor;
19
-
20
- static VALUE graph_view_of(VALUE self)
21
- { return rb_iv_get(self, "@__bgl_real_graph__"); }
22
-
23
- using namespace boost;
24
- using namespace std;
25
-
26
- static ID id_new;
27
- static VALUE utilrbValueSet;
28
-
29
- template<typename T>
30
- struct Queue : std::queue<T>
31
- {
32
- T& top() { return this->front(); }
33
- T const& top() const { return this->front(); }
34
- };
35
-
36
- namespace details {
37
- // Reverse graphs do not have an adjacency_iterator
38
- template<typename Graph>
39
- struct vertex_range< boost::reverse_graph<Graph, Graph&>, false>
40
- {
41
- typedef typename Graph::adjacency_iterator iterator;
42
- typedef std::pair<iterator, iterator> range;
43
-
44
- static range get(RubyGraph::vertex_descriptor v,
45
- boost::reverse_graph<Graph, Graph&> const& graph)
46
- { return adjacent_vertices(v, graph.m_g); }
47
- };
48
-
49
- template<typename Graph>
50
- struct vertex_range< boost::reverse_graph<Graph, Graph const&>, false>
51
- {
52
- typedef typename Graph::adjacency_iterator iterator;
53
- typedef std::pair<iterator, iterator> range;
54
-
55
- static range get(RubyGraph::vertex_descriptor v,
56
- boost::reverse_graph<Graph, Graph const&> const& graph)
57
- { return adjacent_vertices(v, graph.m_g); }
58
- };
59
- }
60
-
61
- /* If +key+ is found in +assoc+, returns its value. Otherwise, initializes
62
- * +key+ to +default_value+ in +assoc+ and returns it
63
- */
64
- template<typename Key, typename Value>
65
- Value& get(map<Key, Value>& assoc, Key const& key, Value const& default_value)
66
- {
67
- typename map<Key, Value>::iterator it = assoc.find(key);
68
- if (it != assoc.end())
69
- return it->second;
70
-
71
- tie(it, tuples::ignore) = assoc.insert( make_pair(key, default_value) );
72
- return it->second;
73
- }
74
-
75
- /* If +key+ is found in +assoc+, returns its value. Otherwise, returns +default_value+
76
- */
77
- template<typename Key, typename Value>
78
- Value const& get(map<Key, Value> const& assoc, Key const& key, Value const& default_value)
79
- {
80
- typename map<Key, Value>::const_iterator it = assoc.find(key);
81
- if (it != assoc.end())
82
- return it->second;
83
-
84
- return default_value;
85
- }
86
-
87
- /* ColorMap is a map with default value */
88
- class ColorMap : private map<vertex_descriptor, default_color_type>
89
- {
90
- template<typename Key, typename Value>
91
- friend Value& get(map<Key, Value>&, Key const&, Value const&);
92
-
93
- default_color_type const default_value;
94
-
95
- typedef map<vertex_descriptor, default_color_type> Super;
96
-
97
- public:
98
-
99
- typedef Super::key_type key_type;
100
- typedef Super::value_type value_type;
101
-
102
- Super::clear;
103
-
104
- ColorMap()
105
- : default_value(color_traits<default_color_type>::white()) {}
106
-
107
- default_color_type& operator[](vertex_descriptor key)
108
- {
109
- default_color_type& c = get(*this, key, default_value);
110
- return c;
111
- }
112
-
113
- };
114
-
115
- typedef list<vertex_descriptor> vertex_list;
116
-
117
- struct vertex_recorder : public default_dfs_visitor
118
- {
119
- public:
120
- set<VALUE>& component;
121
- vertex_recorder( set<VALUE>& component )
122
- : component(component) { }
123
-
124
- template<typename G>
125
- void discover_vertex(vertex_descriptor u, G const& g)
126
- { component.insert(g[u]); }
127
- };
128
-
129
-
130
- static std::set<VALUE>& rb_to_set(VALUE object)
131
- {
132
- if (!RTEST(rb_obj_is_kind_of(object, utilrbValueSet)))
133
- rb_raise(rb_eArgError, "expected a ValueSet");
134
-
135
- std::set<VALUE>* result_set;
136
- Data_Get_Struct(object, set<VALUE>, result_set);
137
- return *result_set;
138
- }
139
-
140
- /** Converts a std::set<VALUE> into a ValueSet object
141
- * After this method, +source+ is empty */
142
- static VALUE set_to_rb(set<VALUE>& source)
143
- {
144
- VALUE result = rb_funcall(utilrbValueSet, id_new, 0);
145
- set<VALUE>* result_set;
146
- Data_Get_Struct(result, set<VALUE>, result_set);
147
-
148
- result_set->swap(source);
149
- return result;
150
- }
151
-
152
- typedef std::set<VALUE> ValueSet;
153
- /* Adds in +result+ all components generated by the items in [it, end). We
154
- * assume that there is no component which includes more than one item in
155
- * [it, end) */
156
- template<typename Graph, typename Iterator>
157
- static void graph_components_i(std::list<ValueSet>& result, Graph const& g, Iterator it, Iterator end, bool include_singletons)
158
- {
159
- ColorMap colors;
160
-
161
- result.push_front(ValueSet());
162
- for (; it != end; ++it)
163
- {
164
- if (0 == *it) // elements not in +g+ are handled by graph_result_root_descriptor
165
- continue;
166
- if (colors[*it] != color_traits<default_color_type>::white())
167
- continue;
168
-
169
- ValueSet& component(*result.begin());
170
- depth_first_visit(g, *it, vertex_recorder(component), make_assoc_property_map(colors));
171
- if (component.size() > 1 || include_singletons)
172
- result.push_front(ValueSet());
173
- else
174
- component.clear();
175
- }
176
- result.pop_front();
177
- }
178
-
179
- /** If +v+ is found in +g+, returns the corresponding vertex_descriptor. Otherwise,
180
- * add a singleton component to +result+ and return NULL.
181
- */
182
- static vertex_descriptor graph_components_root_descriptor(std::list<ValueSet>& result, VALUE v, VALUE g, bool include_singletons)
183
- {
184
- vertex_descriptor d;
185
- bool exists;
186
- tie(d, exists) = rb_to_vertex(v, g);
187
- if (! exists)
188
- {
189
- if (include_singletons)
190
- {
191
- ValueSet component;
192
- component.insert(v);
193
- result.push_back(component);
194
- }
195
- return NULL;
196
- }
197
- return d;
198
- }
199
- template<typename Graph>
200
- static VALUE graph_do_generated_subgraphs(int argc, VALUE* argv, Graph const& g, VALUE self)
201
- {
202
- VALUE roots = Qnil, include_singletons;
203
- if (rb_scan_args(argc, argv, "11", &roots, &include_singletons) == 1)
204
- include_singletons = Qtrue;
205
-
206
- bool with_singletons = RTEST(include_singletons) ? true : false;
207
- std::list<ValueSet> result;
208
- if (NIL_P(roots))
209
- {
210
- RubyGraph::vertex_iterator it, end;
211
- tie(it, end) = vertices(g);
212
- // call graph_components_i with all root vertices
213
- // in +graph+
214
- graph_components_i(result, g,
215
- make_filter_iterator(
216
- bind(
217
- vertex_has_adjacent_i<Graph, false>,
218
- _1, ref(g)
219
- ), it, end
220
- ),
221
- make_filter_iterator(
222
- bind(
223
- vertex_has_adjacent_i<Graph, false>,
224
- _1, ref(g)
225
- ), end, end
226
- ), with_singletons
227
- );
228
- }
229
- else
230
- {
231
- std::set<VALUE>& root_set = rb_to_set(roots);
232
- std::set<VALUE>::const_iterator
233
- begin = root_set.begin(),
234
- end = root_set.end();
235
-
236
- // call graph_components_i with all vertices given in as argument
237
- graph_components_i(result, g,
238
- make_transform_iterator(begin,
239
- bind(graph_components_root_descriptor, ref(result), _1, self, with_singletons)
240
- ),
241
- make_transform_iterator(end,
242
- bind(graph_components_root_descriptor, ref(result), _1, self, with_singletons)
243
- ), with_singletons);
244
- }
245
-
246
- // Now convert the result into a Ruby array
247
- VALUE rb_result = rb_ary_new();
248
- for (std::list<ValueSet>::iterator it = result.begin(); it != result.end(); ++it)
249
- rb_ary_push(rb_result, set_to_rb(*it));
250
- return rb_result;
251
- }
252
- /*
253
- * call-seq:
254
- * graph.components(seeds = nil, include_singletons = true) => components
255
- *
256
- * Returns an array of vertex sets. Each set is a connected component of
257
- * +graph+. If a list of vertices +seeds+ is provided, returns only the
258
- * components the vertices are part of. The graph is treated as if it were not
259
- * directed.
260
- *
261
- * If +include_singletons+ is false and +seeds+ is non-nil, then +components+
262
- * will not include the singleton components { v } where v is in +seeds+
263
- */
264
- static VALUE graph_components(int argc, VALUE* argv, VALUE self)
265
- {
266
- VALUE seeds, include_singletons;
267
- rb_scan_args(argc, argv, "02", &seeds, &include_singletons);
268
- if (argc == 1)
269
- include_singletons = Qtrue;
270
-
271
- // Compute the connected components
272
- RubyGraph const& g = graph_wrapped(self);
273
-
274
- typedef std::map<vertex_descriptor, int> ComponentMap;
275
- ComponentMap component_map;
276
- ColorMap color_map;
277
- int count = connected_components(utilmm::make_undirected_graph(g),
278
- make_assoc_property_map(component_map),
279
- boost::color_map( make_assoc_property_map(color_map) ));
280
-
281
- VALUE ret = rb_ary_new2(count);
282
- std::vector<bool> enabled_components;
283
- std::vector<VALUE> components(count);
284
- if (0 == argc)
285
- enabled_components.resize(count, true);
286
- else
287
- {
288
- enabled_components.resize(count, false);
289
- std::set<VALUE>& seed_set = rb_to_set(seeds);
290
- for (std::set<VALUE>::const_iterator it = seed_set.begin(); it != seed_set.end(); ++it)
291
- {
292
- VALUE rb_vertex = *it;
293
-
294
- vertex_descriptor v; bool in_graph;
295
- tie(v, in_graph) = rb_to_vertex(rb_vertex, self);
296
- if (in_graph)
297
- {
298
- int v_c = component_map[v];
299
- enabled_components[v_c] = true;
300
- }
301
- else if (RTEST(include_singletons))
302
- rb_ary_push(ret, rb_ary_new3(1, rb_vertex));
303
- }
304
- }
305
-
306
- // Add empty array for all enabled components
307
- for (int i = 0; i < count; ++i)
308
- {
309
- if (! enabled_components[i]) continue;
310
- VALUE ary = components[i] = rb_ary_new();
311
- rb_ary_store(ret, i, ary);
312
- }
313
-
314
- // Add the vertices to their corresponding Ruby component
315
- for (ComponentMap::const_iterator it = component_map.begin(); it != component_map.end(); ++it)
316
- {
317
- int c = it->second;
318
- if (! enabled_components[c])
319
- continue;
320
-
321
- rb_ary_push(components[c], g[it->first]);
322
- }
323
-
324
- if (argc > 0 && !RTEST(include_singletons))
325
- {
326
- // Remove the remaining singletons
327
- for (int i = 0; i < count; ++i)
328
- {
329
- if (! enabled_components[i])
330
- continue;
331
- if (RARRAY(components[i])->len == 1)
332
- rb_ary_store(ret, i, Qnil);
333
- }
334
- }
335
-
336
- // Remove all unused component slots (disabled components)
337
- rb_funcall(ret, rb_intern("compact!"), 0);
338
- return ret;
339
- }
340
-
341
- /*
342
- * call-seq:
343
- * undirected_graph.components(seeds = nil, include_singletons = true) => components
344
- *
345
- * Returns an array of vertex sets. Each set is a connected component of +graph+. If
346
- * a list of vertices is provided, returns only the components the vertices are part of.
347
- * The graph is treated as if it were not directed. It is equivalent to graph.components.
348
- */
349
- static
350
- VALUE graph_undirected_components(int argc, VALUE* argv, VALUE self)
351
- { return graph_components(argc, argv, graph_view_of(self)); }
352
-
353
- /* call-seq:
354
- * graph.generated_subgraph([v1, v2, ...][, include_singletons]) => components
355
- *
356
- * Returns an array of vertex sets. Each set is the component that can be
357
- * reached from one of the given seed. If no initial vertex is given, the graph
358
- * roots are taken.
359
- */
360
- static VALUE graph_generated_subgraphs(int argc, VALUE* argv, VALUE self)
361
- { return graph_do_generated_subgraphs(argc, argv, graph_wrapped(self), self); }
362
-
363
- /* call-seq:
364
- * graph.generated_subgraph([v1, v2, ...]) => components
365
- *
366
- * Like Graph#generated_subgraph, but on the reverse graph of +graph+ (where edges has
367
- * been swapped)
368
- */
369
- static VALUE graph_reverse_generated_subgraphs(int argc, VALUE* argv, VALUE self)
370
- {
371
- VALUE real_graph = rb_iv_get(self, "@__bgl_real_graph__");
372
- return graph_do_generated_subgraphs(argc, argv, make_reverse_graph(graph_wrapped(real_graph)), real_graph);
373
- }
374
-
375
- static const int VISIT_TREE_EDGES = 1;
376
- static const int VISIT_BACK_EDGES = 2;
377
- static const int VISIT_FORWARD_OR_CROSS_EDGES = 4;
378
- static const int VISIT_NON_TREE_EDGES = 6;
379
- static const int VISIT_ALL_EDGES = 7;
380
-
381
- struct ruby_dfs_visitor : public default_dfs_visitor
382
- {
383
-
384
- int m_mode;
385
- ruby_dfs_visitor(int mode)
386
- : m_mode(mode) { }
387
-
388
- template<typename E, typename G>
389
- void tree_edge(E e, G const& graph)
390
- { yield_edge(e, graph, VISIT_TREE_EDGES); }
391
- template<typename E, typename G>
392
- void back_edge(E e, G const& graph)
393
- { yield_edge(e, graph, VISIT_BACK_EDGES); }
394
- template<typename E, typename G>
395
- void forward_or_cross_edge(E e, G const& graph)
396
- { yield_edge(e, graph, VISIT_FORWARD_OR_CROSS_EDGES); }
397
-
398
- template<typename E, typename G>
399
- void yield_edge(E e, G const& graph, int what)
400
- {
401
- if (!(what & m_mode))
402
- return;
403
-
404
- VALUE rb_source = graph[source(e, graph)];
405
- VALUE rb_target = graph[target(e, graph)];
406
- VALUE info = graph[e].info;
407
- rb_yield_values(4, rb_source, rb_target, info, INT2FIX(what));
408
- }
409
- };
410
-
411
- template<typename G>
412
- static bool search_terminator(vertex_descriptor u, G const& g)
413
- {
414
- VALUE thread = rb_thread_current();
415
- bool result = RTEST(rb_thread_local_aref(thread, rb_intern("@prune")));
416
- if (result)
417
- rb_thread_local_aset(thread, rb_intern("@prune"), Qfalse);
418
- return result;
419
- }
420
-
421
- /* call-seq:
422
- * graph.prune
423
- *
424
- * In #each_dfs, call this method to stop developing the current branch
425
- */
426
- static VALUE graph_prune(VALUE self)
427
- {
428
- VALUE thread = rb_thread_current();
429
- rb_thread_local_aset(thread, rb_intern("@prune"), Qtrue);
430
- return Qtrue;
431
- }
432
-
433
- template<typename Graph>
434
- static VALUE graph_each_dfs(VALUE self, Graph const& graph, VALUE root, VALUE mode)
435
- {
436
- rb_thread_local_aset(rb_thread_current(), rb_intern("@prune"), Qfalse);
437
-
438
- vertex_descriptor v; bool exists;
439
- tie(v, exists) = rb_to_vertex(root, self);
440
- if (! exists)
441
- return self;
442
-
443
- map<vertex_descriptor, default_color_type> colors;
444
- depth_first_visit(graph, v, ruby_dfs_visitor(FIX2INT(mode)),
445
- make_assoc_property_map(colors), &search_terminator<Graph>);
446
- return self;
447
- }
448
-
449
- /* call-seq:
450
- * graph.each_dfs(root, mode) { |source, dest, info, kind| ... }
451
- *
452
- * Enumerates edges of the graph following a depth-first search order.
453
- * +mode+ is a filter on the kind of edge which shall be enumerated (TREE,
454
- * FORWARD_OR_CROSS, BACK and ALL) and +root+ is the source of the search
455
- */
456
- static VALUE graph_direct_each_dfs(VALUE self, VALUE root, VALUE mode)
457
- {
458
- RubyGraph& graph = graph_wrapped(self);
459
- return graph_each_dfs(self, graph, root, mode);
460
- }
461
-
462
- /* call-seq:
463
- * graph.each_dfs(root, mode) { |source, dest, info, kind| ... }
464
- *
465
- * Enumerates edges of the graph following a depth-first search order.
466
- * +mode+ is a filter on the kind of edge which shall be enumerated (TREE,
467
- * NON_TREE and ALL) and +root+ is the source of the search
468
- */
469
- static VALUE graph_reverse_each_dfs(VALUE self, VALUE root, VALUE mode)
470
- {
471
- VALUE real_graph = graph_view_of(self);
472
- RubyGraph& graph = graph_wrapped(real_graph);
473
- return graph_each_dfs(real_graph, make_reverse_graph(graph), root, mode);
474
- }
475
-
476
- /* call-seq:
477
- * graph.each_dfs(root, mode) { |source, dest, info, kind| ... }
478
- *
479
- * Enumerates edges of the graph following a depth-first search order.
480
- * +mode+ is a filter on the kind of edge which shall be enumerated (TREE,
481
- * FORWARD_OR_CROSS, BACK and ALL) and +root+ is the source of the search
482
- */
483
- static VALUE graph_undirected_each_dfs(VALUE self, VALUE root, VALUE mode)
484
- {
485
- VALUE real_graph = graph_view_of(self);
486
- RubyGraph& graph = graph_wrapped(real_graph);
487
- typedef utilmm::undirected_graph<RubyGraph> Undirected;
488
- Undirected undirected(graph);
489
-
490
- vertex_descriptor v; bool exists;
491
- tie(v, exists) = rb_to_vertex(root, real_graph);
492
- if (! exists)
493
- return self;
494
-
495
- ColorMap colors;
496
- edge_iterator ei, ei_end;
497
- for(tie(ei, ei_end) = edges(graph); ei != ei_end; ++ei)
498
- graph[*ei].color = boost::white_color;
499
-
500
- rb_thread_local_aset(rb_thread_current(), rb_intern("@prune"), Qfalse);
501
- utilmm::undirected_depth_first_visit(undirected, v, ruby_dfs_visitor(FIX2INT(mode)),
502
- make_assoc_property_map(colors),
503
- utilmm::make_undirected_edge_map(get(&EdgeProperty::color, graph)),
504
- &search_terminator<Undirected>);
505
- return self;
506
- }
507
-
508
- struct ruby_reachable_visitor : default_dfs_visitor
509
- {
510
- bool& m_found;
511
- vertex_descriptor m_target;
512
-
513
- ruby_reachable_visitor(bool& found, vertex_descriptor target)
514
- : m_found(found), m_target(target) { m_found = false; }
515
-
516
- template<typename E, typename G>
517
- void tree_edge(E e, G const& graph)
518
- {
519
- if (m_target == target(e, graph))
520
- m_found = true;
521
- }
522
- };
523
-
524
- struct ruby_reachable_terminator
525
- {
526
- bool const& found;
527
- ruby_reachable_terminator(bool const& found)
528
- : found(found) { }
529
-
530
- template<typename G>
531
- bool operator()(vertex_descriptor u, G const& g) const { return found; }
532
- };
533
-
534
- /* call-seq:
535
- * graph.reachable?(v1, v2)
536
- *
537
- * Returns true if v2 can be reached from v1
538
- */
539
- VALUE graph_reachable_p(VALUE self, VALUE source, VALUE target)
540
- {
541
- RubyGraph& graph = graph_wrapped(self);
542
- vertex_descriptor s, t; bool exists;
543
- tie(s, exists) = rb_to_vertex(source, self);
544
- if (! exists)
545
- return Qfalse;
546
- tie(t, exists) = rb_to_vertex(target, self);
547
- if (! exists)
548
- return Qfalse;
549
-
550
- map<vertex_descriptor, default_color_type> colors;
551
- bool found;
552
- depth_first_visit(graph, s, ruby_reachable_visitor(found, t),
553
- make_assoc_property_map(colors), ruby_reachable_terminator(found));
554
-
555
- return found;
556
- }
557
-
558
-
559
- struct ruby_bfs_visitor : public default_bfs_visitor
560
- {
561
- int m_mode;
562
- ruby_bfs_visitor(int mode)
563
- : m_mode(mode) { }
564
-
565
- template<typename E, typename G>
566
- void tree_edge(E e, G const& graph)
567
- { yield_edge(e, graph, VISIT_TREE_EDGES); }
568
- template<typename E, typename G>
569
- void non_tree_edge(E e, G const& graph)
570
- { yield_edge(e, graph, VISIT_NON_TREE_EDGES); }
571
- template<typename E, typename G>
572
- void yield_edge(E e, G const& graph, int what)
573
- {
574
- if (!(what & m_mode))
575
- return;
576
-
577
- VALUE source_vertex = graph[source(e, graph)];
578
- VALUE target_vertex = graph[target(e, graph)];
579
- VALUE info = graph[e].info;
580
- rb_yield_values(4, source_vertex, target_vertex, info, INT2FIX(what));
581
- }
582
- };
583
-
584
- template<typename Graph>
585
- static VALUE graph_each_bfs(VALUE self, Graph const& graph, VALUE root, VALUE mode)
586
- {
587
- int intmode = FIX2INT(mode);
588
- if ((intmode & VISIT_NON_TREE_EDGES) && ((intmode & VISIT_NON_TREE_EDGES) != VISIT_NON_TREE_EDGES))
589
- rb_raise(rb_eArgError, "cannot use FORWARD_OR_CROSS and BACK");
590
-
591
- vertex_descriptor v; bool exists;
592
- tie(v, exists) = rb_to_vertex(root, self);
593
- if (! exists)
594
- return self;
595
-
596
- rb_thread_local_aset(rb_thread_current(), rb_intern("@prune"), Qfalse);
597
- map<vertex_descriptor, default_color_type> colors;
598
- Queue<vertex_descriptor> queue;
599
- breadth_first_search(graph, v, queue, ruby_bfs_visitor(intmode),
600
- make_assoc_property_map(colors));
601
- return self;
602
- }
603
-
604
- /* call-seq:
605
- * graph.each_bfs(root, mode) { |source, dest, info, kind| ... }
606
- *
607
- * Enumerates edges of the graph following a breadth-first search order.
608
- * +mode+ is a filter on the kind of edge which shall be enumerated (TREE,
609
- * NON_TREE and ALL) and +root+ is the source of the search
610
- */
611
- static VALUE graph_direct_each_bfs(VALUE self, VALUE root, VALUE mode)
612
- {
613
- RubyGraph& graph = graph_wrapped(self);
614
- return graph_each_bfs(self, graph, root, mode);
615
- }
616
-
617
- /* call-seq:
618
- * graph.each_bfs(root, mode) { |source, dest, info, kind| ... }
619
- *
620
- * Enumerates edges of the graph following a breadth-first search order.
621
- * +mode+ is a filter on the kind of edge which shall be enumerated (TREE,
622
- * NON_TREE and ALL) and +root+ is the source of the search
623
- */
624
- static VALUE graph_reverse_each_bfs(VALUE self, VALUE root, VALUE mode)
625
- {
626
- VALUE real_graph = graph_view_of(self);
627
- RubyGraph& graph = graph_wrapped(real_graph);
628
- return graph_each_bfs(real_graph, make_reverse_graph(graph), root, mode);
629
- }
630
-
631
- /* call-seq:
632
- * graph.each_bfs(root, mode) { |source, dest, info, kind| ... }
633
- *
634
- * Enumerates edges of the graph following a breadth-first search order.
635
- * +mode+ is a filter on the kind of edge which shall be enumerated (TREE,
636
- * NON_TREE and ALL) and +root+ is the source of the search
637
- */
638
- static VALUE graph_undirected_each_bfs(VALUE self, VALUE root, VALUE mode)
639
- {
640
- VALUE real_graph = graph_view_of(self);
641
- RubyGraph& graph = graph_wrapped(real_graph);
642
- return graph_each_bfs(real_graph, utilmm::make_undirected_graph(graph), root, mode);
643
- }
644
-
645
- /* call-seq:
646
- * graph.topological_sort => array
647
- *
648
- * Returns a topological sorting of this graph
649
- */
650
- static VALUE graph_topological_sort(int argc, VALUE* argv, VALUE self)
651
- {
652
- VALUE rb_result;
653
- rb_scan_args(argc, argv, "01", &rb_result);
654
- if (NIL_P(rb_result))
655
- rb_result = rb_ary_new();
656
- else
657
- rb_ary_clear(rb_result);
658
-
659
- RubyGraph& graph = graph_wrapped(self);
660
- typedef std::vector<RubyGraph::vertex_descriptor> Result;
661
- Result result;
662
-
663
- map<vertex_descriptor, default_color_type> colors;
664
- try
665
- {
666
- topological_sort(graph, std::back_inserter(result),
667
- boost::color_map(make_assoc_property_map(colors)));
668
-
669
- for (int i = result.size() - 1; i >= 0; --i)
670
- rb_ary_push(rb_result, graph[result[i]]);
671
- return rb_result;
672
- }
673
- catch(boost::not_a_dag) {}
674
- rb_raise(rb_eArgError, "the graph is not a DAG");
675
- }
676
-
677
- /**********************************************************************
678
- * Extension initialization
679
- */
680
-
681
- /*
682
- * Document-class: BGL
683
- *
684
- * The BGL module defines a Graph class and a Vertex module. The Graph class can
685
- * be used to manipulate graphs where vertices are referenced by a graph descriptor
686
- * (Graph#add_edge, Graph#add_vertex, ...). However, the preferred way to us BGL is
687
- * to mix Vertex in the vertex objects and use the associated methods:
688
- *
689
- * class MyNode
690
- * include BGL::Graph
691
- * end
692
- * graph = Graph.new
693
- * v1, v2 = MyNode.new, MyNode.new
694
- * graph.link(v1, v2, [])
695
- * ...
696
- * v1.each_child_object { ... }
697
- */
698
-
699
- /*
700
- * Document-class: BGL::Graph
701
- *
702
- * A directed graph between Ruby objects. See BGL documentation.
703
- */
704
-
705
- /*
706
- * Document-class: BGL::Vertex
707
- *
708
- * A module to be mixed in objects used as vertices in Graph. It
709
- * allows to use the same object in more than one graph.
710
- */
711
-
712
- void Init_graph_algorithms()
713
- {
714
- id_new = rb_intern("new");
715
-
716
- bglModule = rb_define_module("BGL");
717
- bglGraph = rb_define_class_under(bglModule, "Graph", rb_cObject);
718
- rb_define_const(bglGraph , "TREE" , INT2FIX(VISIT_TREE_EDGES));
719
- rb_define_const(bglGraph , "FORWARD_OR_CROSS" , INT2FIX(VISIT_FORWARD_OR_CROSS_EDGES));
720
- rb_define_const(bglGraph , "BACK" , INT2FIX(VISIT_BACK_EDGES));
721
- rb_define_const(bglGraph , "NON_TREE" , INT2FIX(VISIT_NON_TREE_EDGES));
722
- rb_define_const(bglGraph , "ALL" , INT2FIX(VISIT_ALL_EDGES));
723
-
724
- rb_define_method(bglGraph, "components", RUBY_METHOD_FUNC(graph_components), -1);
725
- rb_define_method(bglGraph, "generated_subgraphs", RUBY_METHOD_FUNC(graph_generated_subgraphs), -1);
726
- rb_define_method(bglGraph, "each_dfs", RUBY_METHOD_FUNC(graph_direct_each_dfs), 2);
727
- rb_define_method(bglGraph, "each_bfs", RUBY_METHOD_FUNC(graph_direct_each_bfs), 2);
728
- rb_define_method(bglGraph, "reachable?", RUBY_METHOD_FUNC(graph_reachable_p), 2);
729
- rb_define_method(bglGraph, "prune", RUBY_METHOD_FUNC(graph_prune), 0);
730
- rb_define_method(bglGraph, "topological_sort", RUBY_METHOD_FUNC(graph_topological_sort), -1);
731
-
732
- bglReverseGraph = rb_define_class_under(bglGraph, "Reverse", rb_cObject);
733
- rb_define_method(bglReverseGraph, "generated_subgraphs",RUBY_METHOD_FUNC(graph_reverse_generated_subgraphs), -1);
734
- rb_define_method(bglReverseGraph, "each_dfs", RUBY_METHOD_FUNC(graph_reverse_each_dfs), 2);
735
- rb_define_method(bglReverseGraph, "each_bfs", RUBY_METHOD_FUNC(graph_reverse_each_bfs), 2);
736
- rb_define_method(bglReverseGraph, "prune", RUBY_METHOD_FUNC(graph_prune), 0);
737
-
738
- bglUndirectedGraph = rb_define_class_under(bglGraph, "Undirected", rb_cObject);
739
- rb_define_method(bglUndirectedGraph, "generated_subgraphs", RUBY_METHOD_FUNC(graph_undirected_components), -1);
740
- rb_define_method(bglUndirectedGraph, "each_dfs", RUBY_METHOD_FUNC(graph_undirected_each_dfs), 2);
741
- rb_define_method(bglUndirectedGraph, "each_bfs", RUBY_METHOD_FUNC(graph_undirected_each_bfs), 2);
742
- rb_define_method(bglUndirectedGraph, "prune", RUBY_METHOD_FUNC(graph_prune), 0);
743
-
744
- utilrbValueSet = rb_define_class("ValueSet", rb_cObject);
745
- }
746
-