#include "autodiff.h" namespace autodiff { std::vector> topoSort(const std::vector>& scalars) { std::vector> sorted; std::vector> frontier; std::unordered_map, int> degree; for (auto it: scalars) { if (it->degree == 0) { frontier.push_back(it); } else { degree.insert({it, it->degree}); } } while (!frontier.empty()) { auto back = frontier.back(); sorted.push_back(back); for (auto &it: degree) { if (it.second > 0 && it.first == back) { it.second--; if (it.second == 0) { frontier.push_back(it.first); } } } } return sorted; } }