-
Notifications
You must be signed in to change notification settings - Fork 2
Implement mechanism for subgraph replacement #233
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #233 +/- ##
==========================================
+ Coverage 83.97% 84.02% +0.04%
==========================================
Files 44 44
Lines 2665 2786 +121
Branches 1466 1544 +78
==========================================
+ Hits 2238 2341 +103
- Misses 219 229 +10
- Partials 208 216 +8 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
|
evaluate-model failure can be fixed by updating the branch |
| res_graph.makeConnection(lay, fcLayer3); | ||
|
|
||
| Graph res = changed_subgraphs(graph, subgraph); | ||
| // ASSERT_EQ(res, res_graph); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please, restore disabled checks in the tests (here and in other places )
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
we don't have operator== for graphs, which is why i can't uncomment this without creating it.
by the way i can use find_subgraphs to check isomorphism of these graphs
| throw std::out_of_range("Layer ID out of range"); | ||
| } | ||
| // remove inputs | ||
| for (int i = 0; i < V_; i++) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
removeSingleLayer удаляет сам узел и его ребра, но не удаляет id из in_edges_ всех соседей и не сдвигает хранящиеся там индексы после пере‑индексации. Уже после первого удаления граф остаётся с «висячими» id, поэтому areLayerNext, обход и трансформации начинают работать с мусорными индексами. Нужно чистить in_edges_ у всех вершин и декрементировать значения >id.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
тот же removeSingleLayer не корректирует start_/end_. При удалении вершины с id меньше входа/выхода вы оставляете указатели на неверный слой; при удалении самого входа/ выхода они вообще становятся висячими. Нужно обновлять start_/end_ (или запрещать удаление этих вершин) после смещения индексов.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
removeConnection вычищает все связи с другими вершинами, так что там все представление графа чинится на каждом шаге, чтобы избежать замусоривания в процессе.
start_ и end_ действительно скорректирую
| } | ||
|
|
||
| Graph changed_subgraphs(const Graph& graph, const Graph& subgraph_from) { | ||
| Graph new_graph = graph; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
копия Graph new_graph = graph; переносит сырое поле outtenres_ на внешний буфер исходного графа. Возвращённый граф будет писать вывод в старый тензор или в dangling‑указатель, что ломает требуемую «новую» граф‑структуру. Нужен свой выходной тензор и вызов setOutput для new_graph.
| for (size_t i = 0; i < subs.size(); i++) { | ||
| bool flag = false; | ||
| // don't change already changed subgraph | ||
| for (size_t j = 0; j < i; j++) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
для проверки пересечений используется subs_c, но после каждого удаления сдвигаются id только в subs; subs_c остаётся со старыми номерами. В результате пересекающиеся подграфы могут быть признаны «непересекающимися» и удалены/заменены повторно. Обновляйте subs_c синхронно или считайте пересечения по актуальным данным.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
subs_c нужен, чтобы проверять пересечения в изначальном графе, потому что удаление подграфа делает id в предыдущих subs невалидными. Нельзя будет адекватно поймать пересечения, если этих вершин не существует или они были заменены другими.
К тому же я не смог найти пример, когда замена подграфа порождает новое пересечение подграфов
| if (flag) { | ||
| continue; | ||
| } | ||
| std::shared_ptr<Layer> layer = std::make_shared<EWLayer>("relu"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
«особые» корни (имеющие внешние выходы) вы оставляете в графе, но всё равно подключаете их входы к новому узлу (roots_inps_final). Это дублирует путь: исходный корень остаётся и параллельно появляется новый EW‑узел с теми же входами. Для корней, которые вы сохраняете, не должно происходить переподключения их входов к новой вершине.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Если не переподключать к новой вершине, мы же потеряем один из путей в подграфе, оставив лишь внешнюю ветвь. Новая вершина очевидно должна не иметь внешних ветвей, однако обрабатывать их как-то надо, поэтому они остаются
Closes #219
Additional changes:
Currently replacing subgraph to single node EWLayer("relu")