Project

General

Profile

Data dependency graph

As of art 3, users can specify the '-g' program option (the long option is '--data-dependency-graph') to create a DOT file that represents all data dependencies. The dependencies are determined by the framework through the information provided by user modules whenever the produces and consumes calls are made. The DOT file also contains data dependencies from filters. Although not data-product dependencies, any modules that follow a filter do depend on the preceding filter's return value (pass, fail or ignore).

The generated DOT file can be rendered into an image by using the command (e.g.):

dot -Tpdf my_file.dot -O

art's data-dependency checking is implemented through this data-dependency graph.

The rules for retrieving products are described on the Allowed product lookups page.

Process disambiguation

If the process name is not specified in a 'consumes' call, the data-dependency checker is allowed to interpret the product as originating from the input source. This is an implementation detail that does not pertain to the actual product lookup--unless specified otherwise, the first process to be queried when retrieving products will be the current process. The data-dependency checker, however, makes this assignment because it is less restrictive than making an assumption that the product must originate from the current process. For example, if a user specifies a consumes call of:

consumes<int>(InputTag{"a1"});

but there is no module label a1 for the current process, it is still acceptable for that 'consumes' call to refer to a product from the input source. If you would like the dependency checker to be more strict, it is permitted to provide the 'current_process' or 'input_source' process names:

consumes<int>(InputTag{"a1::current_process"}); // 'a1' refers to a module label for the current process
consumes<int>(InputTag{"a2::input_source"});    // 'a2' refers to a module label from a previous process (the input source)

Example conventions

This page shows examples as to how the data-dependency graph is generated. In all examples below

produces: [["int", ""]]
consumes: [["int", "p1"]]

should be interpreted as if a user had specified in the C++ source code for their module:

produces<int>();
consumes<int>(InputTag{"p1"});

Examples