#include <array>
#include <iostream>
int main() {
std::cout << "Example 1: Linear dependency chain (A -> B -> C)\n";
{
std::array<int, 3> values = {0, 0, 0};
values[0] = 1;
std::cout << " Node A: set values[0] = 1\n";
});
values[1] = values[0] * 2;
std::cout << " Node B: set values[1] = values[0] * 2 = " << values[1] << "\n";
});
values[2] = values[1] + 10;
std::cout << " Node C: set values[2] = values[1] + 10 = " << values[2] << "\n";
});
setAllNodesIncomplete(graph);
executor(taskSet, graph);
std::cout << " Final values: " << values[0] << ", " << values[1] << ", " << values[2] << "\n";
}
std::cout << "\nExample 2: Diamond dependency pattern\n";
{
std::array<float, 5> r = {0, 0, 0, 0, 0};
r[0] = 1.0f;
std::cout << " A: r[0] = " << r[0] << "\n";
});
r[1] = r[0] * 2.0f;
std::cout << " B: r[1] = r[0] * 2 = " << r[1] << "\n";
});
r[2] = r[0] + 5.0f;
std::cout << " C: r[2] = r[0] + 5 = " << r[2] << "\n";
});
r[3] = r[1] + r[2];
std::cout << " D: r[3] = r[1] + r[2] = " << r[3] << "\n";
});
setAllNodesIncomplete(graph);
executor(taskSet, graph);
std::cout << " Expected r[3] = 2 + 6 = 8, got: " << r[3] << "\n";
}
std::cout << "\nExample 3: Re-executing a graph\n";
{
int counter = 0;
counter++;
std::cout << " Executed, counter = " << counter << "\n";
});
(void)node;
std::cout << " First execution:\n";
setAllNodesIncomplete(graph);
executor(taskSet, graph);
std::cout << " Second execution (after setAllNodesIncomplete):\n";
setAllNodesIncomplete(graph);
executor(taskSet, graph);
std::cout << " Final counter = " << counter << " (expected: 2)\n";
}
std::cout << "\nExample 4: Using subgraphs\n";
{
std::array<float, 4> r = {0, 0, 0, 0};
setAllNodesIncomplete(graph);
executor(taskSet, graph);
std::cout << " r[0]=" << r[0] << ", r[1]=" << r[1] << ", r[2]=" << r[2] << ", r[3]=" << r[3]
<< "\n";
std::cout << " Expected r[3] = (10+20)*2 = 60\n";
}
std::cout << "\nExample 5: Partial graph re-evaluation\n";
{
std::array<int, 3> data = {1, 0, 0};
std::array<int, 3> execCount = {0, 0, 0};
data[0] = data[0] * 2;
execCount[0]++;
});
data[1] = data[0] + 10;
execCount[1]++;
});
data[2] = data[1] + 100;
execCount[2]++;
});
setAllNodesIncomplete(graph);
executor(taskSet, graph);
std::cout << " After first run: data = [" << data[0] << ", " << data[1] << ", " << data[2]
<< "]\n";
propagator(graph);
data[0] = 5;
executor(taskSet, graph);
std::cout << " After partial run: data = [" << data[0] << ", " << data[1] << ", " << data[2]
<< "]\n";
std::cout << " Execution counts: A=" << execCount[0] << ", B=" << execCount[1]
<< ", C=" << execCount[2] << "\n";
}
std::cout << "\nAll Graph examples completed successfully!\n";
return 0;
}
SubgraphT< N > & addSubgraph()
bool setIncomplete() const
void dependsOn(Ns &... nodes)