27 std::function<void(IAlgorithm*,std::set<IAlgorithm*>&,
bool)> func;
32 func = [&](IAlgorithm* alg, std::set<IAlgorithm*>& thealgs,
bool isAdding) {
33 isAdding = (isAdding || std::regex_search( std::string(alg->nameKey()) , sequenceNameRegex) );
37 if(
auto seq =
dynamic_cast<Gaudi::Sequence*
>( alg )) {
38 auto subalgs = seq->subAlgorithms();
39 for(
auto thisAlg : *subalgs) {
40 func(thisAlg,thealgs,isAdding);
47 std::set<IAlgorithm*> subalgs;
48 for ( IAlgorithm* ialgoPtr : algos ) {
49 func(ialgoPtr,subalgs,
false);
53 DataObjIDColl globalInp, globalOutp;
54 std::map<std::string, DataObjIDColl> algosOutputDependenciesMap;
55 std::map<std::string, DataObjIDColl> algosInputDependenciesMap;
57 for ( IAlgorithm* ialgoPtr : subalgs ) {
58 if(ialgoPtr->isSequence())
continue;
60 Gaudi::Algorithm* algoPtr =
dynamic_cast<Gaudi::Algorithm*
>( ialgoPtr );
61 if ( !algoPtr )
continue;
62 DataObjIDColl algoOutputs;
63 for (
const auto &
id : algoPtr->outputDataObjs() ) {
64 globalOutp.insert(
id );
65 algoOutputs.insert(
id );
71 DHHVisitor avis( i1, i2 );
72 algoPtr->acceptDHVisitor( &avis );
74 DataObjIDColl algoDependencies;
75 for (
const DataObjID&
id : algoPtr->inputDataObjs() ) {
76 algoDependencies.insert(
id );
77 globalInp.insert(
id );
80 std::string algoName = ialgoPtr->nameKey();
81 if(ialgoPtr->type()!= algoName) {
82 algoName = ialgoPtr->type() +
"/" + algoName;
85 algosInputDependenciesMap[algoName] = std::move(algoDependencies);
86 algosOutputDependenciesMap[algoName] = std::move(algoOutputs);
92 std::ofstream stream{
m_fileName, std::ofstream::out };
93 stream <<
"digraph datadeps {\n rankdir=\"LR\";\n";
95 auto addNode = [&](std::string_view id, std::string_view name, std::string_view shape=
"box", std::string_view textcol=
"" ) {
96 stream <<
" " <<
id <<
" [label=\"" << name <<
"\"";
97 if(!textcol.empty()) stream <<
", fontcolor=\"" << textcol <<
"\"";
98 stream <<
";shape=" << shape <<
"];\n";
100 auto addEdge = [&](std::string_view srcId, std::string_view tgtId, std::string_view
label ) {
101 stream <<
" " << srcId <<
" -> " << tgtId <<
" [label=\"" <<
label <<
"\"];\n";
105 std::map<std::string,std::pair<std::set<std::string>,std::set<std::string>>> deps;
110 std::map<std::string,std::string> inputTypes;
112 for (
const auto& [algName, ideps] : algosInputDependenciesMap ) {
113 for (
const auto &dep: ideps) {
114 deps[dep.key()].second.insert(algName);
116 inputTypes[dep.key()] = dep.className();
119 for (
const auto& [algName, odeps] : algosOutputDependenciesMap ) {
120 for (
const auto &dep: odeps) {
121 deps[dep.key()].first.insert(algName);
125 std::size_t algoIndex = 0ul;
126 std::map<std::string,std::string> keyToName;
127 std::string inputs,outputs;
129 for(
auto& [dep, pcs] : deps) {
130 auto& [producers,consumers] = pcs;
131 if(producers.empty()) {
132 std::string algIndex =
"Input_" + std::to_string( algoIndex );
133 addNode( algIndex, inputTypes[dep]+
"/"+dep.substr(dep.find(
"+")+1),
"plaintext", (dep.find(
"ConditionStore")==0) ?
"blue" :
"" );
134 keyToName[dep] = algIndex;
136 producers.insert(dep);
137 inputs += algIndex +
"; ";
138 }
else if(consumers.empty()) {
139 std::string algIndex =
"Output_" + std::to_string( algoIndex );
140 addNode( algIndex, dep.substr(dep.find(
"+")+1),
"plaintext" );
141 keyToName[dep] = algIndex;
143 consumers.insert(dep);
144 outputs += algIndex +
"; ";
148 for (
const auto& [algName, ideps] : algosInputDependenciesMap ) {
149 std::string algIndex =
"Alg_" + std::to_string( algoIndex );
150 addNode( algIndex, algName,
"box" );
151 keyToName[algName] = std::move(algIndex);
155 for(
const auto& [dep, pcs] : deps) {
156 auto& [producers,consumers] = pcs;
157 for(
auto& producer : producers) {
158 for(
auto& consumer: consumers) {
159 addEdge(keyToName.at(producer),keyToName.at(consumer),dep!=producer && dep!=consumer ? (inputTypes[dep]+
"/"+dep.substr(dep.find(
"+")+1)) :
" ");
164 if(!inputs.empty()) {
165 stream <<
" { rank = same; " << inputs <<
"}\n";
167 if(!outputs.empty()) {
168 stream <<
" { rank = same; " << outputs <<
"}\n";
174 return StatusCode::SUCCESS;