| 606 | } |
| 607 | |
| 608 | void Graph::SanitizeGraph(void) |
| 609 | { |
| 610 | int node_number = seq_nodes.size(); |
| 611 | |
| 612 | std::vector<Node*> new_seq; |
| 613 | std::vector<int> access_flag(node_number, 0); |
| 614 | |
| 615 | /* make sure the node index is correct first */ |
| 616 | for(int i = 0; i < node_number; i++) |
| 617 | seq_nodes[i]->SetNodeIndex(i); |
| 618 | |
| 619 | BFSVisit(this, output_nodes, graph_visit_t([&](Graph* graph, Node* node) { |
| 620 | new_seq.insert(new_seq.begin(), node); |
| 621 | access_flag[node->GetNodeIndex()] = 1; |
| 622 | })); |
| 623 | |
| 624 | for(unsigned int i = 0; i < input_nodes.size(); i++) |
| 625 | { |
| 626 | int input_index = input_nodes[i]->GetNodeIndex(); |
| 627 | |
| 628 | if(!access_flag[input_index]) |
| 629 | { |
| 630 | access_flag[input_index] = 1; |
| 631 | new_seq.insert(new_seq.begin(), input_nodes[i]); |
| 632 | } |
| 633 | } |
| 634 | |
| 635 | auto ir = seq_nodes.begin(); |
| 636 | |
| 637 | // removing node that can not be visited |
| 638 | for(int i = 0; i < node_number; i++) |
| 639 | { |
| 640 | if(access_flag[i]) |
| 641 | { |
| 642 | ir++; |
| 643 | continue; |
| 644 | } |
| 645 | |
| 646 | Node* node = (*ir); |
| 647 | |
| 648 | ir = seq_nodes.erase(ir); |
| 649 | |
| 650 | if(!RemoveNode(node)) |
| 651 | break; |
| 652 | } |
| 653 | |
| 654 | seq_nodes = new_seq; |
| 655 | |
| 656 | for(unsigned int i = 0; i < seq_nodes.size(); i++) |
| 657 | { |
| 658 | Node* node = seq_nodes[i]; |
| 659 | |
| 660 | node->SetNodeIndex(i); |
| 661 | } |
| 662 | |
| 663 | RemoveNoChildTensor(); |
| 664 | } |
| 665 | |