|
|
|
@@ -171,21 +171,41 @@ void Eliminate_Aux(const size_t node_index, const std::shared_ptr<Graph> graph, |
|
|
|
eli.push_back(graph->nodes[node_index].node_out[i]);
|
|
|
|
}
|
|
|
|
eli_list->push_back(eli);
|
|
|
|
for (auto input_index : graph->nodes[node_index].node_in) {
|
|
|
|
auto it = find(graph->nodes[input_index].node_out.begin(), graph->nodes[input_index].node_out.end(), node_index);
|
|
|
|
if (it != graph->nodes[input_index].node_out.end()) {
|
|
|
|
graph->nodes[input_index].node_out.erase(it);
|
|
|
|
for (auto output_index : graph->nodes[node_index].node_out) {
|
|
|
|
graph->nodes[input_index].node_out.push_back(output_index);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (size_t i = 0; i < graph->nodes[node_index].node_in.size(); i++) {
|
|
|
|
auto *incoming_outputs = &graph->nodes[graph->nodes[node_index].node_in[i]].node_out;
|
|
|
|
auto it = find(incoming_outputs->begin(), incoming_outputs->end(), node_index);
|
|
|
|
if (it != incoming_outputs->end()) {
|
|
|
|
it = incoming_outputs->erase(it);
|
|
|
|
incoming_outputs->insert(it, graph->nodes[node_index].node_out.begin(), graph->nodes[node_index].node_out.end());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (size_t i = 0; i < graph->nodes[node_index].node_in_aux.size(); i++) {
|
|
|
|
auto *aux_incoming_outputs = &graph->nodes[graph->nodes[node_index].node_in_aux[i]].node_out;
|
|
|
|
auto it = find(aux_incoming_outputs->begin(), aux_incoming_outputs->end(), node_index);
|
|
|
|
if (it != aux_incoming_outputs->end()) {
|
|
|
|
it = aux_incoming_outputs->erase(it);
|
|
|
|
aux_incoming_outputs->insert(it, graph->nodes[node_index].node_out.begin(),
|
|
|
|
graph->nodes[node_index].node_out.end());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for (auto output_index : graph->nodes[node_index].node_out) {
|
|
|
|
auto it = find(graph->nodes[output_index].node_in.begin(), graph->nodes[output_index].node_in.end(), node_index);
|
|
|
|
if (it != graph->nodes[output_index].node_in.end()) {
|
|
|
|
graph->nodes[output_index].node_in.erase(it);
|
|
|
|
for (auto input_index : graph->nodes[node_index].node_in) {
|
|
|
|
graph->nodes[output_index].node_in.push_back(input_index);
|
|
|
|
|
|
|
|
for (size_t i = 0; i < graph->nodes[node_index].node_out.size(); i++) {
|
|
|
|
auto *outgoing_inputs = &graph->nodes[graph->nodes[node_index].node_out[i]].node_in;
|
|
|
|
auto it = find(outgoing_inputs->begin(), outgoing_inputs->end(), node_index);
|
|
|
|
if (it != outgoing_inputs->end()) {
|
|
|
|
if (graph->nodes[node_index].node_in.size() > 0) {
|
|
|
|
outgoing_inputs->at(std::distance(outgoing_inputs->begin(), it)) = graph->nodes[node_index].node_in[0];
|
|
|
|
for (size_t j = 1; j < graph->nodes[node_index].node_in.size(); j++) {
|
|
|
|
graph->nodes[graph->nodes[node_index].node_out[i]].node_in_aux.push_back(graph->nodes[node_index].node_in[j]);
|
|
|
|
}
|
|
|
|
for (size_t j = 1; j < graph->nodes[node_index].node_in_aux.size(); j++) {
|
|
|
|
graph->nodes[graph->nodes[node_index].node_out[i]].node_in_aux.push_back(
|
|
|
|
graph->nodes[node_index].node_in_aux[j]);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
outgoing_inputs->erase(it);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@@ -206,10 +226,12 @@ std::shared_ptr<Graph> EliminateGraph(const std::shared_ptr<Graph> graph, |
|
|
|
Eliminate_Aux(node_index, graph, eli_list);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
index_list->reserve(graph->nodes.size());
|
|
|
|
for (size_t i = 0; i < (size_t)graph->nodes.size(); i++) {
|
|
|
|
index_list->push_back(i);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (size_t i = 0; i < (size_t)eli_list->size(); i++) {
|
|
|
|
if (eli_list->at(i)[0] >= index_list->size()) {
|
|
|
|
MS_LOG(EXCEPTION) << "Failure: Operators' elements out of range.";
|
|
|
|
@@ -219,6 +241,7 @@ std::shared_ptr<Graph> EliminateGraph(const std::shared_ptr<Graph> graph, |
|
|
|
index_list->at(j)--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
std::shared_ptr<Graph> new_graph(new Graph);
|
|
|
|
for (size_t i = 0; i < graph->nodes.size(); i++) {
|
|
|
|
if (index_list->at(i) > SIZE_MAX / 2) {
|
|
|
|
@@ -226,11 +249,13 @@ std::shared_ptr<Graph> EliminateGraph(const std::shared_ptr<Graph> graph, |
|
|
|
}
|
|
|
|
|
|
|
|
new_graph->nodes.push_back(graph->nodes[i]);
|
|
|
|
for (size_t j = 0; j < new_graph->nodes[index_list->at(i)].node_in.size(); j++) {
|
|
|
|
new_graph->nodes[index_list->at(i)].node_in[j] = index_list->at(new_graph->nodes[index_list->at(i)].node_in[j]);
|
|
|
|
auto *node_in = &new_graph->nodes[index_list->at(i)].node_in;
|
|
|
|
for (size_t j = 0; j < node_in->size(); j++) {
|
|
|
|
node_in->at(j) = index_list->at(node_in->at(j));
|
|
|
|
}
|
|
|
|
for (size_t j = 0; j < new_graph->nodes[index_list->at(i)].node_out.size(); j++) {
|
|
|
|
new_graph->nodes[index_list->at(i)].node_out[j] = index_list->at(new_graph->nodes[index_list->at(i)].node_out[j]);
|
|
|
|
auto *node_out = &new_graph->nodes[index_list->at(i)].node_out;
|
|
|
|
for (size_t j = 0; j < node_out->size(); j++) {
|
|
|
|
node_out->at(j) = index_list->at(node_out->at(j));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return new_graph;
|
|
|
|
|