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.
- checksums.yaml +7 -0
- data/.deep-cover.rb +3 -0
- data/.gitattributes +1 -0
- data/.gitignore +24 -0
- data/.simplecov +10 -0
- data/.travis.yml +17 -0
- data/.yardopts +4 -0
- data/Gemfile +15 -0
- data/README.md +11 -0
- data/Rakefile +47 -177
- data/benchmark/{alloc_misc.rb → attic/alloc_misc.rb} +2 -2
- data/benchmark/{discovery_latency.rb → attic/discovery_latency.rb} +19 -19
- data/benchmark/{garbage_collection.rb → attic/garbage_collection.rb} +9 -9
- data/benchmark/{genom.rb → attic/genom.rb} +0 -0
- data/benchmark/attic/transactions.rb +62 -0
- data/benchmark/plan_basic_operations.rb +28 -0
- data/benchmark/relations/graph.rb +63 -0
- data/benchmark/ruby/identity.rb +18 -0
- data/benchmark/ruby/set_intersect_vs_hash_merge.rb +39 -0
- data/benchmark/ruby/yield_vs_block.rb +35 -0
- data/benchmark/run +5 -0
- data/benchmark/synthetic_plan_modifications_with_transactions.rb +79 -0
- data/benchmark/transactions.rb +99 -51
- data/bin/roby +38 -197
- data/bin/roby-display +14 -0
- data/bin/roby-log +3 -176
- data/doc/guide/{src → attic}/abstraction/achieve_with.page +1 -1
- data/doc/guide/{src → attic}/abstraction/forwarding.page +1 -1
- data/doc/guide/{src → attic}/abstraction/hierarchy.page +1 -1
- data/doc/guide/{src → attic}/abstraction/index.page +1 -1
- data/doc/guide/{src → attic}/abstraction/task_models.page +1 -1
- data/doc/guide/{overview.rdoc → attic/cycle/api_overview.rdoc} +6 -1
- data/doc/guide/{src → attic}/cycle/cycle-overview.png +0 -0
- data/doc/guide/{src → attic}/cycle/cycle-overview.svg +0 -0
- data/doc/guide/attic/cycle/error_handling.page +98 -0
- data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.png +0 -0
- data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.svg +0 -0
- data/doc/guide/{src/cycle/error_handling.page → attic/cycle/error_sources.page} +46 -89
- data/doc/guide/{src → attic}/cycle/garbage_collection.page +1 -1
- data/doc/guide/{src → attic}/cycle/index.page +1 -1
- data/doc/guide/{src → attic}/cycle/propagation.page +11 -1
- data/doc/guide/{src → attic}/cycle/propagation_diamond.png +0 -0
- data/doc/guide/{src → attic}/cycle/propagation_diamond.svg +0 -0
- data/doc/guide/attic/plans/building_plans.page +89 -0
- data/doc/guide/attic/plans/code.page +192 -0
- data/doc/guide/{src/basics → attic/plans}/events.page +3 -4
- data/doc/guide/attic/plans/index.page +7 -0
- data/doc/guide/{plan_modifications.rdoc → attic/plans/plan_modifications.rdoc} +5 -3
- data/doc/guide/{src/basics → attic/plans}/plan_objects.page +2 -1
- data/doc/guide/attic/plans/querying_plans.page +5 -0
- data/doc/guide/{src/basics → attic/plans}/tasks.page +20 -20
- data/doc/guide/config.yaml +7 -4
- data/doc/guide/ext/extended_menu.rb +29 -0
- data/doc/guide/ext/init.rb +6 -0
- data/doc/guide/ext/rdoc_links.rb +7 -6
- data/doc/guide/src/advanced_concepts/history.page +5 -0
- data/doc/guide/src/advanced_concepts/index.page +11 -0
- data/doc/guide/src/advanced_concepts/recognizing_patterns.page +83 -0
- data/doc/guide/src/advanced_concepts/scheduling.page +87 -0
- data/doc/guide/src/advanced_concepts/transactions.page +5 -0
- data/doc/guide/src/advanced_concepts/unreachability.page +42 -0
- data/doc/guide/src/base.template +96 -0
- data/doc/guide/src/basics_shell_header.txt +5 -7
- data/doc/guide/src/building/action_coordination.page +96 -0
- data/doc/guide/src/building/actions.page +124 -0
- data/doc/guide/src/building/file_layout.page +71 -0
- data/doc/guide/src/building/index.page +50 -0
- data/doc/guide/src/building/patterns.page +86 -0
- data/doc/guide/src/building/patterns_forwarding.png +0 -0
- data/doc/guide/src/building/patterns_forwarding.svg +277 -0
- data/doc/guide/src/building/runtime.page +95 -0
- data/doc/guide/src/building/task_models.page +94 -0
- data/doc/guide/src/building/tasks.page +284 -0
- data/doc/guide/src/concepts/error_handling.page +100 -0
- data/doc/guide/src/concepts/exception_propagation.png +0 -0
- data/doc/guide/src/concepts/exception_propagation.svg +445 -0
- data/doc/guide/src/concepts/execution.page +85 -0
- data/doc/guide/src/concepts/execution.png +0 -0
- data/doc/guide/src/concepts/execution.svg +573 -0
- data/doc/guide/src/concepts/execution_cycle.png +0 -0
- data/doc/guide/src/concepts/garbage_collection.page +57 -0
- data/doc/guide/src/concepts/index.page +27 -0
- data/doc/guide/src/concepts/plans.page +101 -0
- data/doc/guide/src/concepts/policy.page +31 -0
- data/doc/guide/src/concepts/reactor.page +61 -0
- data/doc/guide/src/concepts/simple_plan_example.png +0 -0
- data/doc/guide/src/concepts/simple_plan_example.svg +376 -0
- data/doc/guide/src/default.template +9 -74
- data/doc/guide/src/event_relations/forward.page +71 -0
- data/doc/guide/src/event_relations/index.page +12 -0
- data/doc/guide/src/event_relations/scheduling_constraints.page +43 -0
- data/doc/guide/src/event_relations/signal.page +55 -0
- data/doc/guide/src/event_relations/temporal_constraints.page +77 -0
- data/doc/guide/src/htmldoc.metainfo +21 -8
- data/doc/guide/src/index.page +8 -3
- data/doc/guide/src/{introduction/install.page → installation/index.page} +37 -25
- data/doc/guide/src/installation/publications.page +14 -0
- data/doc/guide/src/{introduction → installation}/videos.page +14 -7
- data/doc/guide/src/interacting/index.page +16 -0
- data/doc/guide/src/interacting/run.page +33 -0
- data/doc/guide/src/interacting/shell.page +95 -0
- data/doc/guide/src/plugins/creating_plugins.page +72 -0
- data/doc/guide/src/plugins/index.page +27 -5
- data/doc/guide/src/plugins/{fault_tolerance.page → standard_plugins/fault_tolerance.page} +2 -2
- data/doc/guide/src/plugins/standard_plugins/index.page +11 -0
- data/doc/guide/src/plugins/{subsystems.page → standard_plugins/subsystems.page} +2 -2
- data/doc/guide/src/style_screen.css +687 -0
- data/doc/guide/src/task_relations/dependency.page +107 -0
- data/doc/guide/src/task_relations/executed_by.page +77 -0
- data/doc/guide/src/task_relations/index.page +12 -0
- data/doc/guide/src/task_relations/new_relations.page +119 -0
- data/doc/guide/src/task_relations/planned_by.page +46 -0
- data/doc/guide/src/tutorial/app.page +117 -0
- data/doc/guide/src/{basics → tutorial}/code_examples.page +6 -5
- data/doc/guide/src/{basics → tutorial}/dry.page +15 -15
- data/doc/guide/src/{basics → tutorial}/errors.page +43 -68
- data/doc/guide/src/tutorial/events.page +195 -0
- data/doc/guide/src/{basics → tutorial}/hierarchy.page +53 -52
- data/doc/guide/src/tutorial/index.page +13 -0
- data/doc/guide/src/tutorial/log_replay/goForward_1.png +0 -0
- data/doc/guide/src/tutorial/log_replay/goForward_2.png +0 -0
- data/doc/guide/src/tutorial/log_replay/goForward_3.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/goForward_4.png +0 -0
- data/doc/guide/src/tutorial/log_replay/goForward_5.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_1.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_2.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_3.png +0 -0
- data/doc/guide/src/tutorial/log_replay/moveto_code_error.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_1.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_2.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_3.png +0 -0
- data/doc/guide/src/tutorial/log_replay/plan_repair_4.png +0 -0
- data/doc/guide/src/tutorial/log_replay/roby_log_main_window.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/roby_log_relation_window.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/roby_replay_event_representation.png +0 -0
- data/doc/guide/src/tutorial/relations_display.page +153 -0
- data/doc/guide/src/{basics → tutorial}/roby_cycle_overview.png +0 -0
- data/doc/guide/src/tutorial/shell.page +121 -0
- data/doc/guide/src/{basics → tutorial}/summary.page +1 -1
- data/doc/guide/src/tutorial/tasks.page +374 -0
- data/lib/roby.rb +102 -47
- data/lib/roby/actions.rb +17 -0
- data/lib/roby/actions/action.rb +80 -0
- data/lib/roby/actions/interface.rb +45 -0
- data/lib/roby/actions/library.rb +23 -0
- data/lib/roby/actions/models/action.rb +224 -0
- data/lib/roby/actions/models/coordination_action.rb +58 -0
- data/lib/roby/actions/models/interface.rb +22 -0
- data/lib/roby/actions/models/interface_base.rb +294 -0
- data/lib/roby/actions/models/library.rb +12 -0
- data/lib/roby/actions/models/method_action.rb +90 -0
- data/lib/roby/actions/task.rb +114 -0
- data/lib/roby/and_generator.rb +125 -0
- data/lib/roby/app.rb +2795 -829
- data/lib/roby/app/autotest_console_reporter.rb +138 -0
- data/lib/roby/app/base.rb +21 -0
- data/lib/roby/app/cucumber.rb +2 -0
- data/lib/roby/app/cucumber/controller.rb +439 -0
- data/lib/roby/app/cucumber/helpers.rb +280 -0
- data/lib/roby/app/cucumber/world.rb +32 -0
- data/lib/roby/app/debug.rb +136 -0
- data/lib/roby/app/gen.rb +2 -0
- data/lib/roby/app/rake.rb +178 -38
- data/lib/roby/app/robot_config.rb +9 -0
- data/lib/roby/app/robot_names.rb +115 -0
- data/lib/roby/app/run.rb +3 -2
- data/lib/roby/app/scripts.rb +72 -0
- data/lib/roby/app/scripts/autotest.rb +173 -0
- data/lib/roby/app/scripts/display.rb +2 -0
- data/lib/roby/app/scripts/restart.rb +52 -0
- data/lib/roby/app/scripts/results.rb +17 -8
- data/lib/roby/app/scripts/run.rb +155 -24
- data/lib/roby/app/scripts/shell.rb +147 -62
- data/lib/roby/app/scripts/test.rb +107 -22
- data/lib/roby/app/test_reporter.rb +74 -0
- data/lib/roby/app/test_server.rb +159 -0
- data/lib/roby/app/vagrant.rb +47 -0
- data/lib/roby/backports.rb +16 -0
- data/lib/roby/cli/display.rb +190 -0
- data/lib/roby/cli/exceptions.rb +17 -0
- data/lib/roby/cli/gen/actions/class.rb +5 -0
- data/lib/roby/cli/gen/actions/test.rb +6 -0
- data/lib/roby/cli/gen/app/.yardopts +6 -0
- data/lib/roby/cli/gen/app/README.md +28 -0
- data/lib/roby/cli/gen/app/Rakefile +15 -0
- data/{app → lib/roby/cli/gen/app}/config/app.yml +29 -39
- data/lib/roby/cli/gen/app/models/.gitattributes +1 -0
- data/{app → lib/roby/cli/gen/app/scripts}/controllers/.gitattributes +0 -0
- data/{app/data/.gitattributes → lib/roby/cli/gen/app/test/.gitignore} +0 -0
- data/lib/roby/cli/gen/class/class.rb +6 -0
- data/lib/roby/cli/gen/class/test.rb +7 -0
- data/lib/roby/cli/gen/helpers.rb +203 -0
- data/lib/roby/cli/gen/module/module.rb +5 -0
- data/lib/roby/cli/gen/module/test.rb +6 -0
- data/lib/roby/cli/gen/roby_app/config/init.rb +17 -0
- data/lib/roby/cli/gen/roby_app/config/robots/robot.rb +40 -0
- data/lib/roby/cli/gen/task/class.rb +44 -0
- data/lib/roby/cli/gen/task/test.rb +6 -0
- data/lib/roby/cli/gen_main.rb +120 -0
- data/lib/roby/cli/log.rb +276 -0
- data/lib/roby/cli/log/flamegraph.html +499 -0
- data/lib/roby/cli/log/flamegraph_renderer.rb +88 -0
- data/lib/roby/cli/main.rb +153 -0
- data/lib/roby/coordination.rb +60 -0
- data/lib/roby/coordination/action_script.rb +25 -0
- data/lib/roby/coordination/action_state_machine.rb +125 -0
- data/lib/roby/coordination/actions.rb +106 -0
- data/lib/roby/coordination/base.rb +145 -0
- data/lib/roby/coordination/calculus.rb +40 -0
- data/lib/roby/coordination/child.rb +28 -0
- data/lib/roby/coordination/event.rb +29 -0
- data/lib/roby/coordination/fault_handler.rb +25 -0
- data/lib/roby/coordination/fault_handling_task.rb +13 -0
- data/lib/roby/coordination/fault_response_table.rb +110 -0
- data/lib/roby/coordination/models/action_script.rb +64 -0
- data/lib/roby/coordination/models/action_state_machine.rb +224 -0
- data/lib/roby/coordination/models/actions.rb +191 -0
- data/lib/roby/coordination/models/arguments.rb +55 -0
- data/lib/roby/coordination/models/base.rb +176 -0
- data/lib/roby/coordination/models/capture.rb +86 -0
- data/lib/roby/coordination/models/child.rb +35 -0
- data/lib/roby/coordination/models/event.rb +41 -0
- data/lib/roby/coordination/models/exceptions.rb +42 -0
- data/lib/roby/coordination/models/fault_handler.rb +219 -0
- data/lib/roby/coordination/models/fault_response_table.rb +77 -0
- data/lib/roby/coordination/models/root.rb +22 -0
- data/lib/roby/coordination/models/script.rb +283 -0
- data/lib/roby/coordination/models/task.rb +184 -0
- data/lib/roby/coordination/models/task_from_action.rb +50 -0
- data/lib/roby/coordination/models/task_from_as_plan.rb +33 -0
- data/lib/roby/coordination/models/task_from_instanciation_object.rb +31 -0
- data/lib/roby/coordination/models/task_from_variable.rb +27 -0
- data/lib/roby/coordination/models/task_with_dependencies.rb +48 -0
- data/lib/roby/coordination/models/variable.rb +32 -0
- data/lib/roby/coordination/script.rb +200 -0
- data/lib/roby/coordination/script_instruction.rb +12 -0
- data/lib/roby/coordination/task.rb +45 -0
- data/lib/roby/coordination/task_base.rb +69 -0
- data/lib/roby/coordination/task_script.rb +293 -0
- data/lib/roby/coordination/task_state_machine.rb +308 -0
- data/lib/roby/decision_control.rb +33 -21
- data/lib/roby/distributed_object.rb +76 -0
- data/lib/roby/droby.rb +17 -0
- data/lib/roby/droby/droby_id.rb +6 -0
- data/lib/roby/droby/enable.rb +153 -0
- data/lib/roby/droby/event_logger.rb +189 -0
- data/lib/roby/droby/event_logging.rb +57 -0
- data/lib/roby/droby/exceptions.rb +14 -0
- data/lib/roby/droby/identifiable.rb +22 -0
- data/lib/roby/droby/logfile.rb +141 -0
- data/lib/roby/droby/logfile/client.rb +176 -0
- data/lib/roby/droby/logfile/file_format.md +97 -0
- data/lib/roby/droby/logfile/index.rb +117 -0
- data/lib/roby/droby/logfile/reader.rb +139 -0
- data/lib/roby/droby/logfile/server.rb +199 -0
- data/lib/roby/droby/logfile/writer.rb +114 -0
- data/lib/roby/droby/marshal.rb +264 -0
- data/lib/roby/droby/marshallable.rb +12 -0
- data/lib/roby/droby/null_event_logger.rb +25 -0
- data/lib/roby/droby/object_manager.rb +205 -0
- data/lib/roby/droby/peer_id.rb +6 -0
- data/lib/roby/droby/plan_rebuilder.rb +373 -0
- data/lib/roby/droby/rebuilt_plan.rb +160 -0
- data/lib/roby/droby/remote_droby_id.rb +6 -0
- data/lib/roby/droby/timepoints.rb +205 -0
- data/lib/roby/droby/timepoints_ctf.metadata.erb +101 -0
- data/lib/roby/droby/timepoints_ctf.rb +125 -0
- data/lib/roby/droby/v5.rb +14 -0
- data/lib/roby/droby/v5/builtin.rb +120 -0
- data/lib/roby/droby/v5/droby_class.rb +45 -0
- data/lib/roby/droby/v5/droby_constant.rb +81 -0
- data/lib/roby/droby/v5/droby_dump.rb +1026 -0
- data/lib/roby/droby/v5/droby_id.rb +44 -0
- data/lib/roby/droby/v5/droby_model.rb +82 -0
- data/lib/roby/droby/v5/peer_id.rb +10 -0
- data/lib/roby/droby/v5/remote_droby_id.rb +42 -0
- data/lib/roby/event.rb +79 -957
- data/lib/roby/event_constraints.rb +835 -0
- data/lib/roby/event_generator.rb +1047 -0
- data/lib/roby/event_structure/causal_link.rb +6 -0
- data/lib/roby/event_structure/forwarding.rb +6 -0
- data/lib/roby/event_structure/precedence.rb +7 -0
- data/lib/roby/event_structure/signal.rb +8 -0
- data/lib/roby/event_structure/temporal_constraints.rb +640 -0
- data/lib/roby/exceptions.rb +446 -152
- data/lib/roby/executable_plan.rb +549 -0
- data/lib/roby/execution_engine.rb +1997 -950
- data/lib/roby/filter_generator.rb +26 -0
- data/lib/roby/gui/chronicle_view.rb +225 -0
- data/lib/roby/gui/chronicle_widget.rb +925 -0
- data/lib/roby/gui/dot_id.rb +11 -0
- data/lib/roby/gui/exception_view.rb +44 -0
- data/lib/roby/gui/log_display.rb +273 -0
- data/lib/roby/gui/model_views.rb +2 -0
- data/lib/roby/gui/model_views/action_interface.rb +53 -0
- data/lib/roby/gui/model_views/task.rb +47 -0
- data/lib/roby/gui/model_views/task.rhtml +41 -0
- data/lib/roby/gui/object_info_view.rb +89 -0
- data/lib/roby/gui/plan_dot_layout.rb +427 -0
- data/lib/roby/gui/plan_rebuilder_widget.rb +357 -0
- data/lib/roby/gui/qt4_toMSecsSinceEpoch.rb +8 -0
- data/lib/roby/gui/relations_view.rb +278 -0
- data/lib/roby/gui/relations_view/relations.ui +139 -0
- data/lib/roby/gui/relations_view/relations_canvas.rb +1088 -0
- data/lib/roby/gui/relations_view/relations_config.rb +292 -0
- data/lib/roby/gui/relations_view/relations_view.ui +53 -0
- data/lib/roby/gui/scheduler_view.css +24 -0
- data/lib/roby/gui/scheduler_view.rb +46 -0
- data/lib/roby/gui/scheduler_view.rhtml +53 -0
- data/lib/roby/gui/stepping.rb +93 -0
- data/lib/roby/gui/stepping.ui +181 -0
- data/lib/roby/gui/styles.rb +81 -0
- data/lib/roby/gui/task_display_configuration.rb +42 -0
- data/lib/roby/gui/task_state_at.rb +38 -0
- data/lib/roby/hooks.rb +26 -0
- data/lib/roby/interface.rb +136 -469
- data/lib/roby/interface/async.rb +20 -0
- data/lib/roby/interface/async/action_monitor.rb +188 -0
- data/lib/roby/interface/async/interface.rb +498 -0
- data/lib/roby/interface/async/job_monitor.rb +213 -0
- data/lib/roby/interface/async/log.rb +238 -0
- data/lib/roby/interface/async/new_job_listener.rb +79 -0
- data/lib/roby/interface/async/ui_connector.rb +183 -0
- data/lib/roby/interface/client.rb +553 -0
- data/lib/roby/interface/command.rb +24 -0
- data/lib/roby/interface/command_argument.rb +16 -0
- data/lib/roby/interface/command_library.rb +92 -0
- data/lib/roby/interface/droby_channel.rb +174 -0
- data/lib/roby/interface/exceptions.rb +22 -0
- data/lib/roby/interface/interface.rb +655 -0
- data/lib/roby/interface/job.rb +47 -0
- data/lib/roby/interface/rest.rb +10 -0
- data/lib/roby/interface/rest/api.rb +29 -0
- data/lib/roby/interface/rest/helpers.rb +24 -0
- data/lib/roby/interface/rest/server.rb +212 -0
- data/lib/roby/interface/server.rb +154 -0
- data/lib/roby/interface/shell_client.rb +468 -0
- data/lib/roby/interface/shell_subcommand.rb +24 -0
- data/lib/roby/interface/subcommand_client.rb +35 -0
- data/lib/roby/interface/tcp.rb +168 -0
- data/lib/roby/models/arguments.rb +112 -0
- data/lib/roby/models/plan_object.rb +83 -0
- data/lib/roby/models/task.rb +835 -0
- data/lib/roby/models/task_event.rb +62 -0
- data/lib/roby/models/task_service.rb +78 -0
- data/lib/roby/or_generator.rb +88 -0
- data/lib/roby/plan.rb +1751 -864
- data/lib/roby/plan_object.rb +611 -0
- data/lib/roby/plan_service.rb +200 -0
- data/lib/roby/promise.rb +332 -0
- data/lib/roby/queries.rb +23 -0
- data/lib/roby/queries/and_matcher.rb +32 -0
- data/lib/roby/queries/any.rb +27 -0
- data/lib/roby/queries/code_error_matcher.rb +58 -0
- data/lib/roby/queries/event_generator_matcher.rb +9 -0
- data/lib/roby/queries/execution_exception_matcher.rb +165 -0
- data/lib/roby/queries/index.rb +165 -0
- data/lib/roby/queries/localized_error_matcher.rb +149 -0
- data/lib/roby/queries/matcher_base.rb +107 -0
- data/lib/roby/queries/none.rb +27 -0
- data/lib/roby/queries/not_matcher.rb +30 -0
- data/lib/roby/queries/op_matcher.rb +8 -0
- data/lib/roby/queries/or_matcher.rb +30 -0
- data/lib/roby/queries/plan_object_matcher.rb +363 -0
- data/lib/roby/queries/query.rb +188 -0
- data/lib/roby/queries/task_event_generator_matcher.rb +86 -0
- data/lib/roby/queries/task_matcher.rb +344 -0
- data/lib/roby/relations.rb +42 -678
- data/lib/roby/relations/bidirectional_directed_adjacency_graph.rb +492 -0
- data/lib/roby/relations/directed_relation_support.rb +268 -0
- data/lib/roby/relations/event_relation_graph.rb +19 -0
- data/lib/roby/relations/fork_merge_visitor.rb +154 -0
- data/lib/roby/relations/graph.rb +533 -0
- data/lib/roby/relations/models/directed_relation_support.rb +11 -0
- data/lib/roby/relations/models/graph.rb +75 -0
- data/lib/roby/relations/models/task_relation_graph.rb +18 -0
- data/lib/roby/relations/space.rb +380 -0
- data/lib/roby/relations/task_relation_graph.rb +20 -0
- data/lib/roby/robot.rb +85 -38
- data/lib/roby/schedulers/basic.rb +155 -25
- data/lib/roby/schedulers/null.rb +20 -0
- data/lib/roby/schedulers/reporting.rb +31 -0
- data/lib/roby/schedulers/state.rb +129 -0
- data/lib/roby/schedulers/temporal.rb +91 -0
- data/lib/roby/singletons.rb +87 -0
- data/lib/roby/standalone.rb +4 -2
- data/lib/roby/standard_errors.rb +405 -82
- data/lib/roby/state.rb +6 -3
- data/lib/roby/state/conf_model.rb +5 -0
- data/lib/roby/state/events.rb +181 -95
- data/lib/roby/state/goal_model.rb +77 -0
- data/lib/roby/state/open_struct.rb +591 -0
- data/lib/roby/state/open_struct_model.rb +68 -0
- data/lib/roby/state/pos.rb +45 -45
- data/lib/roby/state/shapes.rb +11 -11
- data/lib/roby/state/state_model.rb +303 -0
- data/lib/roby/state/task.rb +43 -0
- data/lib/roby/support.rb +88 -148
- data/lib/roby/task.rb +1361 -1750
- data/lib/roby/task_arguments.rb +428 -0
- data/lib/roby/task_event.rb +127 -0
- data/lib/roby/task_event_generator.rb +337 -0
- data/lib/roby/task_service.rb +6 -0
- data/lib/roby/task_structure/conflicts.rb +104 -0
- data/lib/roby/task_structure/dependency.rb +932 -0
- data/lib/roby/task_structure/error_handling.rb +118 -0
- data/lib/roby/task_structure/executed_by.rb +234 -0
- data/lib/roby/task_structure/planned_by.rb +90 -0
- data/lib/roby/tasks/aggregator.rb +37 -0
- data/lib/roby/tasks/external_process.rb +275 -0
- data/lib/roby/tasks/group.rb +27 -0
- data/lib/roby/tasks/null.rb +19 -0
- data/lib/roby/tasks/parallel.rb +43 -0
- data/lib/roby/tasks/sequence.rb +88 -0
- data/lib/roby/tasks/simple.rb +21 -0
- data/lib/roby/{thread_task.rb → tasks/thread.rb} +50 -24
- data/lib/roby/tasks/timeout.rb +17 -0
- data/lib/roby/tasks/virtual.rb +55 -0
- data/lib/roby/template_plan.rb +7 -0
- data/lib/roby/test/aruba_minitest.rb +74 -0
- data/lib/roby/test/assertion.rb +16 -0
- data/lib/roby/test/assertions.rb +490 -0
- data/lib/roby/test/common.rb +368 -591
- data/lib/roby/test/dsl.rb +149 -0
- data/lib/roby/test/error.rb +18 -0
- data/lib/roby/test/event_reporter.rb +83 -0
- data/lib/roby/test/execution_expectations.rb +1134 -0
- data/lib/roby/test/expect_execution.rb +151 -0
- data/lib/roby/test/minitest_helpers.rb +166 -0
- data/lib/roby/test/roby_app_helpers.rb +200 -0
- data/lib/roby/test/run_planners.rb +155 -0
- data/lib/roby/test/self.rb +112 -0
- data/lib/roby/test/spec.rb +198 -0
- data/lib/roby/test/tasks/empty_task.rb +4 -4
- data/lib/roby/test/tasks/goto.rb +28 -27
- data/lib/roby/test/teardown_plans.rb +100 -0
- data/lib/roby/test/testcase.rb +239 -307
- data/lib/roby/test/tools.rb +159 -155
- data/lib/roby/test/validate_state_machine.rb +75 -0
- data/lib/roby/transaction.rb +1125 -0
- data/lib/roby/transaction/event_generator_proxy.rb +63 -0
- data/lib/roby/transaction/plan_object_proxy.rb +99 -0
- data/lib/roby/transaction/plan_service_proxy.rb +43 -0
- data/lib/roby/transaction/proxying.rb +120 -0
- data/lib/roby/transaction/task_event_generator_proxy.rb +19 -0
- data/lib/roby/transaction/task_proxy.rb +135 -0
- data/lib/roby/until_generator.rb +30 -0
- data/lib/roby/version.rb +5 -0
- data/lib/roby/yard.rb +169 -0
- data/lib/yard-roby.rb +1 -0
- data/manifest.xml +32 -6
- data/roby.gemspec +59 -0
- metadata +788 -587
- data/Manifest.txt +0 -321
- data/NOTES +0 -4
- data/README.txt +0 -166
- data/TODO.txt +0 -146
- data/app/README.txt +0 -24
- data/app/Rakefile +0 -8
- data/app/config/ROBOT.rb +0 -5
- data/app/config/init.rb +0 -33
- data/app/config/roby.yml +0 -3
- data/app/controllers/ROBOT.rb +0 -2
- data/app/planners/ROBOT/main.rb +0 -6
- data/app/planners/main.rb +0 -5
- data/app/scripts/distributed +0 -3
- data/app/scripts/generate/bookmarks +0 -3
- data/app/scripts/replay +0 -3
- data/app/scripts/results +0 -3
- data/app/scripts/run +0 -3
- data/app/scripts/server +0 -3
- data/app/scripts/shell +0 -3
- data/app/scripts/test +0 -3
- data/app/tasks/.gitattributes +0 -0
- data/app/tasks/ROBOT/.gitattributes +0 -0
- data/bin/roby-shell +0 -25
- data/doc/guide/src/basics/app.page +0 -139
- data/doc/guide/src/basics/index.page +0 -11
- data/doc/guide/src/basics/log_replay/goForward_1.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_2.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_3.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
- data/doc/guide/src/basics/log_replay/plan_repair_4.png +0 -0
- data/doc/guide/src/basics/log_replay/roby_log_main_window.png +0 -0
- data/doc/guide/src/basics/relations_display.page +0 -203
- data/doc/guide/src/basics/shell.page +0 -102
- data/doc/guide/src/default.css +0 -319
- data/doc/guide/src/introduction/index.page +0 -29
- data/doc/guide/src/introduction/publications.page +0 -14
- data/doc/guide/src/relations/dependency.page +0 -89
- data/doc/guide/src/relations/index.page +0 -12
- data/ext/droby/dump.cc +0 -175
- data/ext/droby/extconf.rb +0 -3
- data/ext/graph/algorithm.cc +0 -746
- data/ext/graph/extconf.rb +0 -7
- data/ext/graph/graph.cc +0 -575
- data/ext/graph/graph.hh +0 -183
- data/ext/graph/iterator_sequence.hh +0 -102
- data/ext/graph/undirected_dfs.hh +0 -226
- data/ext/graph/undirected_graph.hh +0 -421
- data/lib/roby/app/scripts/generate/bookmarks.rb +0 -162
- data/lib/roby/app/scripts/replay.rb +0 -31
- data/lib/roby/app/scripts/server.rb +0 -18
- data/lib/roby/basic_object.rb +0 -151
- data/lib/roby/config.rb +0 -14
- data/lib/roby/distributed.rb +0 -36
- data/lib/roby/distributed/base.rb +0 -448
- data/lib/roby/distributed/communication.rb +0 -875
- data/lib/roby/distributed/connection_space.rb +0 -616
- data/lib/roby/distributed/distributed_object.rb +0 -206
- data/lib/roby/distributed/drb.rb +0 -62
- data/lib/roby/distributed/notifications.rb +0 -531
- data/lib/roby/distributed/peer.rb +0 -555
- data/lib/roby/distributed/protocol.rb +0 -529
- data/lib/roby/distributed/proxy.rb +0 -343
- data/lib/roby/distributed/subscription.rb +0 -311
- data/lib/roby/distributed/transaction.rb +0 -498
- data/lib/roby/external_process_task.rb +0 -225
- data/lib/roby/graph.rb +0 -160
- data/lib/roby/log.rb +0 -3
- data/lib/roby/log/chronicle.rb +0 -303
- data/lib/roby/log/console.rb +0 -74
- data/lib/roby/log/data_stream.rb +0 -275
- data/lib/roby/log/dot.rb +0 -279
- data/lib/roby/log/event_stream.rb +0 -161
- data/lib/roby/log/file.rb +0 -396
- data/lib/roby/log/gui/basic_display.ui +0 -83
- data/lib/roby/log/gui/basic_display_ui.rb +0 -89
- data/lib/roby/log/gui/chronicle.rb +0 -26
- data/lib/roby/log/gui/chronicle_view.rb +0 -40
- data/lib/roby/log/gui/chronicle_view.ui +0 -70
- data/lib/roby/log/gui/chronicle_view_ui.rb +0 -90
- data/lib/roby/log/gui/data_displays.rb +0 -171
- data/lib/roby/log/gui/data_displays.ui +0 -155
- data/lib/roby/log/gui/data_displays_ui.rb +0 -146
- data/lib/roby/log/gui/notifications.rb +0 -26
- data/lib/roby/log/gui/relations.rb +0 -269
- data/lib/roby/log/gui/relations.ui +0 -123
- data/lib/roby/log/gui/relations_ui.rb +0 -120
- data/lib/roby/log/gui/relations_view.rb +0 -185
- data/lib/roby/log/gui/relations_view.ui +0 -149
- data/lib/roby/log/gui/relations_view_ui.rb +0 -144
- data/lib/roby/log/gui/replay.rb +0 -366
- data/lib/roby/log/gui/replay_controls.rb +0 -206
- data/lib/roby/log/gui/replay_controls.ui +0 -282
- data/lib/roby/log/gui/replay_controls_ui.rb +0 -249
- data/lib/roby/log/gui/runtime.rb +0 -130
- data/lib/roby/log/hooks.rb +0 -186
- data/lib/roby/log/logger.rb +0 -203
- data/lib/roby/log/notifications.rb +0 -244
- data/lib/roby/log/plan_rebuilder.rb +0 -468
- data/lib/roby/log/relations.rb +0 -1084
- data/lib/roby/log/server.rb +0 -547
- data/lib/roby/log/sqlite.rb +0 -47
- data/lib/roby/log/timings.rb +0 -233
- data/lib/roby/plan-object.rb +0 -371
- data/lib/roby/planning.rb +0 -13
- data/lib/roby/planning/loops.rb +0 -309
- data/lib/roby/planning/model.rb +0 -1012
- data/lib/roby/planning/task.rb +0 -180
- data/lib/roby/query.rb +0 -655
- data/lib/roby/relations/conflicts.rb +0 -67
- data/lib/roby/relations/dependency.rb +0 -358
- data/lib/roby/relations/ensured.rb +0 -19
- data/lib/roby/relations/error_handling.rb +0 -22
- data/lib/roby/relations/events.rb +0 -7
- data/lib/roby/relations/executed_by.rb +0 -208
- data/lib/roby/relations/influence.rb +0 -10
- data/lib/roby/relations/planned_by.rb +0 -63
- data/lib/roby/state/information.rb +0 -55
- data/lib/roby/state/state.rb +0 -367
- data/lib/roby/task-operations.rb +0 -186
- data/lib/roby/task_index.rb +0 -80
- data/lib/roby/test/distributed.rb +0 -230
- data/lib/roby/test/tasks/simple_task.rb +0 -23
- data/lib/roby/transactions.rb +0 -507
- data/lib/roby/transactions/proxy.rb +0 -325
- data/plugins/fault_injection/History.txt +0 -4
- data/plugins/fault_injection/README.txt +0 -34
- data/plugins/fault_injection/Rakefile +0 -12
- data/plugins/fault_injection/TODO.txt +0 -0
- data/plugins/fault_injection/app.rb +0 -52
- data/plugins/fault_injection/fault_injection.rb +0 -89
- data/plugins/fault_injection/test/test_fault_injection.rb +0 -78
- data/plugins/subsystems/README.txt +0 -37
- data/plugins/subsystems/Rakefile +0 -13
- data/plugins/subsystems/app.rb +0 -182
- data/plugins/subsystems/test/app/README +0 -24
- data/plugins/subsystems/test/app/Rakefile +0 -8
- data/plugins/subsystems/test/app/config/app.yml +0 -71
- data/plugins/subsystems/test/app/config/init.rb +0 -12
- data/plugins/subsystems/test/app/config/roby.yml +0 -3
- data/plugins/subsystems/test/app/planners/main.rb +0 -20
- data/plugins/subsystems/test/app/scripts/distributed +0 -3
- data/plugins/subsystems/test/app/scripts/replay +0 -3
- data/plugins/subsystems/test/app/scripts/results +0 -3
- data/plugins/subsystems/test/app/scripts/run +0 -3
- data/plugins/subsystems/test/app/scripts/server +0 -3
- data/plugins/subsystems/test/app/scripts/shell +0 -3
- data/plugins/subsystems/test/app/scripts/test +0 -3
- data/plugins/subsystems/test/app/tasks/services.rb +0 -15
- data/plugins/subsystems/test/test_subsystems.rb +0 -78
- data/test/distributed/test_communication.rb +0 -195
- data/test/distributed/test_connection.rb +0 -284
- data/test/distributed/test_execution.rb +0 -378
- data/test/distributed/test_mixed_plan.rb +0 -341
- data/test/distributed/test_plan_notifications.rb +0 -238
- data/test/distributed/test_protocol.rb +0 -525
- data/test/distributed/test_query.rb +0 -106
- data/test/distributed/test_remote_plan.rb +0 -491
- data/test/distributed/test_transaction.rb +0 -466
- data/test/mockups/external_process +0 -28
- data/test/mockups/tasks.rb +0 -27
- data/test/planning/test_loops.rb +0 -432
- data/test/planning/test_model.rb +0 -427
- data/test/planning/test_task.rb +0 -126
- data/test/relations/test_conflicts.rb +0 -42
- data/test/relations/test_dependency.rb +0 -324
- data/test/relations/test_ensured.rb +0 -38
- data/test/relations/test_executed_by.rb +0 -224
- data/test/relations/test_planned_by.rb +0 -56
- data/test/suite_core.rb +0 -29
- data/test/suite_distributed.rb +0 -10
- data/test/suite_planning.rb +0 -4
- data/test/suite_relations.rb +0 -8
- data/test/tasks/test_external_process.rb +0 -126
- data/test/tasks/test_thread_task.rb +0 -70
- data/test/test_bgl.rb +0 -528
- data/test/test_event.rb +0 -969
- data/test/test_exceptions.rb +0 -591
- data/test/test_execution_engine.rb +0 -987
- data/test/test_gui.rb +0 -20
- data/test/test_interface.rb +0 -43
- data/test/test_log.rb +0 -125
- data/test/test_log_server.rb +0 -133
- data/test/test_plan.rb +0 -418
- data/test/test_query.rb +0 -424
- data/test/test_relations.rb +0 -260
- data/test/test_state.rb +0 -432
- data/test/test_support.rb +0 -16
- data/test/test_task.rb +0 -1181
- data/test/test_testcase.rb +0 -138
- data/test/test_transactions.rb +0 -610
- 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
|
-
|
data/ext/droby/dump.cc
DELETED
|
@@ -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
|
-
|
data/ext/droby/extconf.rb
DELETED
data/ext/graph/algorithm.cc
DELETED
|
@@ -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
|
-
|